From ac106890ac7af8ffcc29541649717f6045103ca9 Mon Sep 17 00:00:00 2001 From: vuko Date: Fri, 27 Nov 2020 16:10:58 +0100 Subject: [PATCH] fix problems, add logging --- lights_web/__init__.py | 63 +++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/lights_web/__init__.py b/lights_web/__init__.py index 6f626b6..69aec11 100644 --- a/lights_web/__init__.py +++ b/lights_web/__init__.py @@ -1,3 +1,4 @@ +import logging import flask import threading import paho.mqtt as mqtt @@ -25,27 +26,35 @@ application = flask.Flask(__name__) application.msg="ab" application.lights = { lid: False for lid in config['lights'] } +application.logger.removeHandler(flask.logging.default_handler) +logging.basicConfig(level=logging.DEBUG) + + def on_message(client,userdata,message): c.acquire() - for lid, cfg in config['lights']: - if cfg.mqtt_path == message.topic: - if message.payload == "true": + for lid, cfg in config['lights'].items(): + if cfg['mqtt_path'] == message.topic: + if message.payload == b'true': application.lights[lid] = True - elif message.payload == "false": + elif message.payload == b'false': application.lights[lid] = False c.release() -def on_connect(client, userdata, rc): - for lid, cfg in config['lights']: +def on_connect(client, userdata, rc, l): + logging.info(f"connected") + for lid, cfg in config['lights'].items(): + logging.info(f"subscribing: {cfg}") client.subscribe(cfg['mqtt_path']) + mc = mqtt.client.Client() mc.username_pw_set(config['mqtt_rw_username'], config['mqtt_rw_password']) mc.on_connect = on_connect mc.on_message = on_message -mc.connect(config["mqtt_server"]) +mc.connect_async(config["mqtt_server"]) +mc.enable_logger() mc.loop_start() @@ -73,29 +82,37 @@ def get_config(): }) def publish(path, payload): - mqtt.publish.single( - path, - payload, - qos=1, - hostname=config["mqtt_server"], - auth = { - 'username':config["mqtt_rw_username"], - 'password':config["mqtt_rw_password"] - } - ) + mc.publish(path, payload, qos=1) @application.route('/light//on/set', methods=['POST']) def set_light(lid): - if lid in config["lights"]: - publish(config["lights"][lid]["mqtt_path"] + "/set", "true") - return flask.jsonify({"ok": True}) + try: + path = config["lights"][lid]["mqtt_path"] + except KeyError: + return flask.jsonify({"ok": False}) + + publish(path + '/set', "true") + return flask.jsonify({"ok": True}) @application.route('/light//on/toggle', methods=['POST']) def toggle_light(lid): - if lid in config["lights"]: - publish(config["lights"][lid]["mqtt_path"] + "/toggle", "true") - return flask.jsonify({"ok": True}) + try: + cfg = config["lights"][lid] + toggle = cfg.get('toggle', False) + path = cfg["mqtt_path"] + except KeyError: + print(config["lights"]) + logging.exception("toggle exception") + return flask.jsonify({"ok": False}) + + if toggle: + publish(path + '/toggle', "true") + elif application.lights[lid]: + publish(path + '/set', "false") + else: + publish(path + '/set', "true") + return flask.jsonify({"ok": True}) def run_development(): application.run(host='127.0.0.1',port=8000,debug=True)