diff options
-rw-r--r-- | kerbana/__init__.py | 5 | ||||
-rw-r--r-- | kerbana/config.py | 8 | ||||
-rw-r--r-- | kerbana/mqtt.py | 46 |
3 files changed, 58 insertions, 1 deletions
diff --git a/kerbana/__init__.py b/kerbana/__init__.py index ea7f5cf..8d47d35 100644 --- a/kerbana/__init__.py +++ b/kerbana/__init__.py @@ -4,7 +4,7 @@ from typing import Optional import flask import toml -from . import config +from . import config, mqtt def create_app(test_config: Optional[config.Config] = None): @@ -45,6 +45,9 @@ def create_app(test_config: Optional[config.Config] = None): else: app.config.from_object(test_config) + mqtt_client = mqtt.MQTTClient(app) + mqtt_client.connect() + @app.route('/') def root(): return "Hello World!" diff --git a/kerbana/config.py b/kerbana/config.py index 2ccaabc..93b0e54 100644 --- a/kerbana/config.py +++ b/kerbana/config.py @@ -3,6 +3,12 @@ class Config: SECRET_KEY = "dev" + MQTT_SERVER = "test.mosquitto.org" + MQTT_PORT = 1883 + MQTT_USER = None + MQTT_PASSWORD = None + MQTT_TOPIC = "kerbana/#" + class DefaultConfig(Config): pass @@ -10,3 +16,5 @@ class DefaultConfig(Config): class TestConfig(Config): TESTING = True + + MQTT_SERVER = "mqtt.invalid.org" diff --git a/kerbana/mqtt.py b/kerbana/mqtt.py new file mode 100644 index 0000000..9747de3 --- /dev/null +++ b/kerbana/mqtt.py @@ -0,0 +1,46 @@ +import paho.mqtt.client as mqtt +from flask import Flask + + +class MQTTClient: + def __init__(self, app: Flask): + self.app = app + self.reconnect = True + self.connected = False + + self.client = mqtt.Client() + self.client.on_connect = self.on_connect + self.client.on_disconnect = self.on_disconnect + self.client.on_message = self.on_message + + def connect(self): + try: + self.client.connect( + self.app.config["MQTT_SERVER"], + self.app.config["MQTT_PORT"], + 60, # TODO: make the keepalive configurable + ) + except OSError as e: + self.app.logger.warning("Could not connect to MQTT server") + self.app.logger.warning(e) + self.client.loop_start() + + def disconnect(self, reconnect: bool = True): + self.client.loop_stop() + self.client.disconnect() + self.reconnect = reconnect + + def on_connect(self, client, userdata, flags, rc): + self.app.logger.warning("Connected to MQTT") + self.connected = True + client.subscribe(self.app.config["MQTT_TOPIC"]) + + def on_disconnect(self, client, userdata, flags, rc): + self.connected = False + if self.reconnect: + self.connect() + + def on_message(self, client, userdata, msg): + self.app.logger.warning( + "Received msg %s %s", msg.topic, msg.payload.decode() + ) |