Source code for shyft.dashboard.apps.start_bokeh_apps

from shyft.dashboard.apps.water_route_app.water_route_app import WaterRouteApp
from shyft.dashboard.util.find_free_port import find_free_port
from shyft.dashboard.base.app import start_bokeh_apps
from shyft.dashboard.apps.dtss_viewer.dtss_viewer_app import DtssViewerApp
from shyft.time_series import TimeAxis, TimeSeries, TsVector, utctime_now, point_interpretation_policy as ts_fx, \
    DtsServer, DtsClient, shyft_url, time
from tempfile import TemporaryDirectory
from pathlib import Path
import numpy as np
# -- CHANGE OF LOGGER FORMAT FOR DEBUGGING
import logging

log_fmt = logging.Formatter("in: %(filename)s -- %(funcName)s -- %(lineno)d \n")
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(log_fmt)
logger = logging.getLogger()
logger.addHandler(stream_handler)
logger.setLevel(logging.DEBUG)


[docs] def start_local_demo_dtss(root_container: Path, n_ts: int = 100, port: int = 0) -> DtsServer: s = DtsServer() s.set_listening_port(port) # could be 0, in that case, it selects a free port container_name = 'test' s.set_container(container_name, str(root_container)) port = s.start_async() # we pick the actual port here, either the supplied port, or auto selected print(f'Started demo dtss-server @{port} using ts-container test->{root_container}') # fill in some demo-data print(f'Filling up test ts-container with some {n_ts} time-series ') c = DtsClient(f'localhost:{port}', 1000) dt = time(3600) # hourly resolution n_days = 365 ta = TimeAxis(time('2020-01-01T00:00:00Z'), dt, 24 * n_days) t = ta.time_points_double[:-1] w_h = 2 * 3.1415 / 3600.0 tsv = TsVector() ts_name_parts=['temperature','precipitation','swe','sca','discharge','charge'] for i in range(100): rd = np.random.random() * 2.0 v = 1000.0 * (np.abs(np.sin(t * w_h / 24.0)) + rd + 5 * np.sin(t * w_h / (24.0 * 7)) + (10 + rd) * np.sin( t * w_h / (24 * n_days))) ts_name = ts_name_parts[i % len(ts_name_parts)] tsv.append(TimeSeries(shyft_url(container_name, f'ts-{ts_name}-{i}'), TimeSeries(ta, v, ts_fx.POINT_AVERAGE_VALUE))) t0 = utctime_now() c.store_ts(tsv, overwrite_on_write=True, cache_on_write=True) # replace existing, and cache it in memory for faster read-access t_used = utctime_now() - t0 c.close() print(f'Done creating demo test-series, n_days={n_days} hourly, used {t_used} to store&cache') return s, port
if __name__ == "__main__": import argparse available_apps = {'dtss_viewer_app': DtssViewerApp, 'water_route_app': WaterRouteApp} # add user name as in old bat scripts from sih default_port = find_free_port() parser = argparse.ArgumentParser(prog="start_bokeh_apps", formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument("-s", "--no-show", action="store_false", default=True, help="Don't show ltm bokeh apps in default browser") parser.add_argument("-a", "--apps", nargs="+", default=list(available_apps.keys()), dest='apps', help=f"Run one or more specific app(s): {list(available_apps.keys())}") parser.add_argument("-p", "--port", type=int, default=default_port, help="Port to run bokeh server [will crash if it is not free]") parser.add_argument('-d', '--debug', help="Print lots of debugging statements", action="store_const", dest="log_level", const=logging.DEBUG, default=logging.ERROR) parser.add_argument('-v', '--verbose', help="Be verbose", action="store_const", dest="log_level", const=logging.INFO) parser.add_argument("-l", "--logger_box", action="store_true", default=False, help="Enable logger box in application") parser.add_argument("-u", "--use-external-dtss", action="store_true", dest="use_external_dtss", default=False, help="Use external dtss, do *not* start local dtss for demo purposes") a = parser.parse_args() if not a.apps: raise RuntimeError(f"No apps defined, use -a to define apps! Possible apps are: {list(available_apps.keys())}") apps = [available_apps[k] for k in a.apps if k in available_apps] if not apps: raise RuntimeError( f"'-a : {a.apps}' unknown apps defined! possible apps are: {list(available_apps.keys())}") dtss = None with TemporaryDirectory() as root_dir: dtss_port = 0 app_kwargs = {} try: if not a.use_external_dtss: dtss, dtss_port = start_local_demo_dtss(root_container=root_dir) app_kwargs = {'dtss_host': 'localhost', 'dtss_port': dtss_port} start_bokeh_apps(apps=apps, show=a.no_show, port=a.port, log_level=a.log_level, show_logger_box=a.logger_box, app_kwargs=app_kwargs) finally: if dtss: dtss.clear()