#!/usr/bin/env python3 import dash import dash_bootstrap_components as dbc import dash_core_components as dcc import dash_html_components as html from dash.dependencies import Input, Output import time import requests URL_BASE="http://innocence:5000" def get_sensors(): ret = {} try: url = "%s/sensor/get" % URL_BASE res = requests.get(url) ret = res.json() except Exception as ex: print('Exception Type:%s, args:\n%s' % (type(ex).__name__, ex.args)) return ret def get_values(sensorId, min_ts, max_ts, limit): ret = {} if sensorId: try: url = "%s/sensor/get_values/%s?min_ts=%s&max_ts=%s&limit=%s" % (URL_BASE, sensorId, min_ts, max_ts, limit) res = requests.get(url) ret = res.json()[sensorId] except Exception as ex: print('Exception Type:%s, args:\n%s' % (type(ex).__name__, ex.args)) return ret sensors = get_sensors() sensor = next(iter(sensors), None) tabs = [] for s in sensors: sensorType = sensors[s]["sensorType"] tabs.append(dcc.Tab(label=sensorType, value=s)) external_stylesheets = [dbc.themes.BOOTSTRAP] meta_tags=[{"name": "viewport", "content": "width=device-width, initial-scale=1"}] app = dash.Dash(__name__, external_stylesheets=external_stylesheets, meta_tags=meta_tags) app.title = "dashboard.ykonni.de" app.layout = html.Div(children=[ html.H1(children='dashboard.ykonni.de'), dbc.Row([ dbc.Col(dcc.Tabs(id="tabs-select-sensor", value=sensor, children=tabs)) ]), dbc.Row([ dbc.Col( dcc.Graph( id='graph-sensor-values', figure={ 'data': [ {'x': [0], 'y': [0], 'mode': 'line', 'name': 'None'} ], 'layout': { 'title': 'initial values' } } ) ) ]), dbc.Row([ dbc.Col([ html.Div(id='slider-min-txt', style={'marginLeft': '5em', 'marginRight': '3em'}), html.Div([ dcc.Slider(id='slider-min', min=0, max=round(time.time()), step=600, value=0 ), ], style={'marginLeft': '5em', 'marginRight': '3em'} ), ]), dbc.Col([ html.Div(id='slider-max-txt', style={'marginLeft': '3em', 'marginRight': '3em'}), html.Div([ dcc.Slider(id='slider-max', min=0, max=round(time.time()), step=600, value=round(time.time())), ], style={'marginLeft': '3em', 'marginRight': '3em'} ), ]), dbc.Col([ html.Div(id='slider-limit-txt', style={'marginLeft': '3em', 'marginRight': '5em'}), html.Div([ dcc.Slider(id='slider-limit', min=0, max=1000, step=10, value=0 ), ], style={'marginLeft': '3em', 'marginRight': '5em'} ), ]), ]), ]) @app.callback( [Output('slider-min', 'min'), Output('slider-min', 'value'), Output('slider-max', 'min')], [Input('tabs-select-sensor', 'value')]) def update_slider_min(sensorId): res = get_values(sensorId, 0, int(time.time()), 1) min_ts = 0 sensorType = None if "values" in res: min_ts = int(res["values"][0]["ts"]) sensorType = res["sensorType"] return min_ts, min_ts, min_ts @app.callback( Output('slider-limit-txt', 'children'), [Input('slider-limit', 'value')]) def update_slider_limit(value): return "Limit: %s" % (value if value > 0 else None) @app.callback( Output('slider-min-txt', 'children'), [Input('slider-min', 'value')]) def update_slider_min(value): return "From: %s" % (time.strftime("%Y/%m/%d %H:%M", time.localtime(float(value))) if value > 0 else 0) @app.callback( Output('slider-max-txt', 'children'), [Input('slider-max', 'value')]) def update_slider_max(value): return "To: %s" % (time.strftime("%Y/%m/%d %H:%M", time.localtime(float(value)))) @app.callback( [Output('graph-sensor-values', 'figure'), Output('slider-min', 'max'), Output('slider-max', 'max')], [Input('tabs-select-sensor', 'value'), Input('slider-min', 'value'), Input('slider-max', 'value'), Input('slider-limit', 'value')]) def update_graph_sensor_values(sensorId, min_ts, max_ts, limit): res = get_values(sensorId, min_ts, max_ts, limit) if "values" in res: v = res["values"] s = res["sensorType"] x = [time.strftime("%m%d-%H%M", time.localtime(float(v[i]["ts"]))) for i in range(len(v))] y = [v[i]["value"] for i in range(len(v))] else: s = sensorId x = [0] y = [0] return { 'data': [ {'x': x, 'y': y, 'mode': 'line', 'name': "%s" % (s)} ], 'layout': { 'title': 'Data for sensor: %s (%d elements)' % (s, len(x)) } }, time.time(), time.time() if __name__ == '__main__': app.run_server(port=8081,debug=True)