viri-leds-dmx-sacn/mqtt_queue.py

61 lines
1.8 KiB
Python
Raw Normal View History

2023-08-07 11:39:15 +00:00
import json
import logging
import re
from queue import Queue
import paho.mqtt.client as mqtt
LOG = logging.getLogger("MQTTQueue")
2023-08-07 11:39:15 +00:00
2023-08-07 12:48:18 +00:00
2023-08-07 11:39:15 +00:00
class MQTTQueue:
def __init__(self, config, queues):
2023-08-07 18:05:20 +00:00
self.config = config
2023-08-07 11:39:15 +00:00
self.client = mqtt.Client()
self.queues = queues
2023-08-07 11:39:15 +00:00
self.client.on_connect = self.on_connect
self.client.on_disconnect = self.on_disconnect
self.client.on_message = self.on_mqtt_message
def start(self):
if self.config.mqtt.user and self.config.mqtt.password:
2023-08-07 18:05:20 +00:00
self.client.username_pw_set(
self.config.mqtt.user, self.config.mqtt.password
2023-08-07 18:05:20 +00:00
)
2023-08-07 11:39:15 +00:00
self.client.connect(self.config.mqtt.host, 1883, 60)
2023-08-07 11:39:15 +00:00
self.client.loop_start()
def stop(self):
self.client.loop_stop()
self.client.disconnect()
def on_connect(self, client, userdata, flags, rc):
LOG.info(f"Connected to {self.config.mqtt.host} with code {rc}")
2023-08-07 11:39:15 +00:00
self.client.subscribe(self.config.mqtt.topic)
LOG.info(f"Subscribed")
2023-08-07 11:39:15 +00:00
def on_disconnect(self, client, userdata, rc):
LOG.warning(f"Disconnected from {self.config.mqtt.host} with code {rc}")
2023-08-07 11:39:15 +00:00
def on_mqtt_message(self, client, userdata, msg):
try:
data = json.loads(msg.payload.decode("utf-8"))
text = re.sub(r"\<[a-z\/]+\>", "", data["msg"])
2023-08-07 11:39:15 +00:00
for queue in self.queues:
self.queues[queue].put(
(
data["level"].lower(),
data["component"],
text,
)
2023-08-07 12:48:18 +00:00
)
LOG.info(
f'Put queue {queue} item: {data["level"].lower()} {data["component"]} : {text}'
)
2023-08-07 11:39:15 +00:00
except Exception as e:
LOG.exception(msg.payload)