#!/usr/bin/env python
from flask import Flask, flash, redirect, render_template_string
from flask import render_template, request, session, abort
import os
import uuid
app = Flask(__name__)
def make_id():
return uuid.uuid4()
def make_widget(template,
widget_type,
sub_topic=None,
extra_classes=None,
**kwargs):
def f():
_classes = ['widget'] + list(extra_classes or [])
_attrs = {}
if sub_topic:
_classes.append('subscriber')
_attrs['data-sub-topic'] = sub_topic
_classes.append(f'{widget_type}-widget')
kwargs['sub_topic'] = sub_topic
_attrs['class'] = ' '.join([c for c in _classes if c is not None])
attr_str = " ".join([f'{k}="{v}"' for k, v in _attrs.items()])
widget_template = f'
\n{template}\n
'
return render_template_string(widget_template, **kwargs)
return f
def button_widget(topic, label, pub_value):
template = '''
'''
return make_widget(
template, 'button', label=label, pub_value=pub_value, topic=topic)
def slider_widget(label,
topic,
sub_topic=None,
value_path=None,
unit='',
min_val=0,
max_val=255):
id_ = make_id()
sub_topic = sub_topic or topic
template = '''
- {{unit}}
{{label}}
'''
return make_widget(
template,
'slider',
sub_topic=sub_topic,
label=label,
min_val=min_val,
max_val=max_val,
value_path=value_path,
topic=topic,
unit=unit,
id_=id_)
def label_widget(topic, label, unit=''):
template = '''
-
{{unit}}
{{label}}
'''
return make_widget(
template,
'label',
sub_topic=topic,
topic=topic,
unit=unit,
label=label)
def log_widget(topic, label):
id_ = make_id()
template = '''
{{label}}
'''
return make_widget(
template, "log", sub_topic=topic, topic=topic, label=label, id_=id_)
def row_layout(title, *elems):
def f():
template = '''
{% if title %}
{{title}}
{% endif %}
{% for w in elems %}
{{w()|safe}}
{% endfor %}
'''
return render_template_string(template, title=title, elems=elems)
return f
def column_layout(title, *elems):
def f():
template = '''
{% if title %}
{{title}}
{% endif %}
{% for w in elems %}
{{w()|safe}}
{% endfor %}
'''
return render_template_string(template, title=title, elems=elems)
return f
@app.route('/')
def home():
return render_template(
'base.html',
widgets=[
column_layout(
"Light",
slider_widget(
"Küche",
"hue/set/lights/Ku",
"hue/status/lights/Ku",
value_path='val'),
slider_widget(
"WZ1",
"hue/set/lights/WZ1",
"hue/status/lights/WZ1",
value_path='val'),
slider_widget(
"WZ2",
"hue/set/lights/WZ2",
"hue/status/lights/WZ2",
value_path='val'),
slider_widget(
"Vorzimmer",
"hue/set/lights/Vorzimmer",
"hue/status/lights/Vorzimmer",
value_path='val'),
slider_widget("Schlafzimmer",
"home/devices/192.168.1.214/brightness")),
row_layout(
"Temperature",
label_widget("home/sensors/livingroom/temperature",
"Livingroom", "°C"),
label_widget("home/sensors/office/temperature", "Office",
"°C"),
label_widget("home/sensors/bedroom/temperature", "Bedroom",
"°C")),
row_layout("Device logs", log_widget("test", "test log"),
log_widget("test2", "test log 2")),
row_layout("Some buttons", button_widget("test", "set to 1", 1),
button_widget("test", "set to foo", 'foo'))
])
if __name__ == "__main__":
app.secret_key = os.urandom(12)
app.run(debug=True, host='0.0.0.0', port=4000)