homecontrol-dash/homecontrol-dash.py

159 lines
4.9 KiB
Python
Raw Normal View History

#!/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
2019-11-10 20:59:08 +01:00
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': 'markers', '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'), Output('slider-min', 'max')],
[Input('slider-min', 'value')])
def update_slider_min(value):
txt = "From: %s" % (time.strftime("%Y/%m/%d %H:%M", time.localtime(float(value))) if
value > 0 else 0)
t = time.time()
return txt, t
@app.callback(
[Output('slider-max-txt', 'children'), Output('slider-max', 'max')],
[Input('slider-max', 'value')])
def update_slider_max(value):
txt = "To: %s" % (time.strftime("%Y/%m/%d %H:%M", time.localtime(float(value))))
t = time.time()
return txt, t
@app.callback(
Output('graph-sensor-values', 'figure'),
[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))]
2019-11-10 20:59:08 +01:00
y = [v[i]["value"] for i in range(len(v))]
else:
s = sensorId
x = [0]
y = [0]
return {
'data': [ {'x': x, 'y': y, 'mode': 'markers', 'name': "%s" % (s)} ],
'layout': { 'title': 'Data for sensor: %s (%d elements)' % (s, len(x)) }
}
if __name__ == '__main__':
app.run_server(port=8081,debug=True)