From ec584a804bc06b8d745edb75a3ec9c0222def3fc Mon Sep 17 00:00:00 2001 From: Piotr Dobrowolski Date: Sun, 2 Oct 2016 23:37:51 +0200 Subject: [PATCH] Initial commit --- main.py | 73 ++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 2 ++ templates/index.html | 37 ++++++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 main.py create mode 100644 requirements.txt create mode 100644 templates/index.html diff --git a/main.py b/main.py new file mode 100644 index 0000000..c9d1ae3 --- /dev/null +++ b/main.py @@ -0,0 +1,73 @@ +import flask +import paho.mqtt.client as mqtt +import logging +import json + +logging.basicConfig(level=logging.DEBUG, format='[%(asctime)-15s] %(name)-10s %(levelname)7s: %(message)s') + + +class SpejsiotDevice(object): + metadata = None + online = False + node_id = None + + def __init__(self, node_id): + self.node_id = node_id + + +class SpejsiotManager(mqtt.Client): + devices = dict() + logger = logging.getLogger('manager') + + def __init__(self): + super(SpejsiotManager, self).__init__() + + def run(self, broker, port): + self.connect(broker, port, 60) + self.loop_start() + + def on_connect(self, client, userdata, flags, rc): + self.logger.info('Connected, rc: %d', rc) + self.subscribe('iot/+/state') + self.subscribe('iot/+/metadata') + + def on_message(self, client, userdata, msg): + self.logger.info('Message received %s: %s', msg.topic, msg.payload) + _, node_id, topic = msg.topic.split('/', 2) + + if node_id not in self.devices.keys(): + self.devices[node_id] = SpejsiotDevice(node_id) + + if topic == 'state': + self.devices[node_id].online = msg.payload == 'online' + elif topic == 'metadata': + metadata = json.loads(msg.payload) + self.devices[node_id].metadata = metadata + self.devices[node_id].endpoints = { + e['name']: {'type': e['type'], 'value': None} + for e in metadata['endpoints'] + } + + for e in self.devices[node_id].endpoints.keys(): + self.subscribe('iot/%s/%s' % (node_id, e)) + + elif topic in self.devices[node_id].endpoints: + self.devices[node_id].endpoints[topic]['value'] = msg.payload + + +manager = SpejsiotManager() +app = flask.Flask(__name__) +app.config['TEMPLATES_AUTO_RELOAD'] = True + +@app.route('/') +def index(): + return flask.render_template('index.html', devices=manager.devices) + +@app.route('/api/1/devices') +def api_devices(): + return flask.jsonify({k: v.metadata for k, v in manager.devices.items()}) + + +if __name__ == "__main__": + manager.run('127.0.0.1', 1883) + app.run() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0db9323 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Flask==0.11.1 +paho-mqtt==1.2 diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..b9adc54 --- /dev/null +++ b/templates/index.html @@ -0,0 +1,37 @@ + + + + + + Bootswatch: Flatly + + + + + + +
+ {% for name, dev in devices.items() %} + {% for name, obj in dev.endpoints.items() %} + {% if obj['type'] != 'control' %} +
+
+
+

{{ dev.node_id }} / {{ dev.metadata['device_type'] }} {{ name }}

+
+
+

{{ obj['value'] }}unit

+
+
+
+ {% endif %} + {% endfor %} + {% endfor %} +
+ +