viri-leds-dmx-sacn/mqtt_queue.py

70 lines
2.2 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 12:48:18 +00:00
2023-08-07 11:39:15 +00:00
class MQTTQueue:
2023-08-07 18:05:20 +00:00
def __init__(self, config, queue):
self.config = config
2023-08-07 11:39:15 +00:00
self.client = mqtt.Client()
self.queue = queue
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)
2023-08-07 18:05:20 +00:00
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'])
add_to_queue = True
if self.config.alerts.filters:
add_to_queue = False
for f in self.config.alerts.filters:
if re.search(f, data['component'], re.IGNORECASE):
add_to_queue = True
break # no point in searching further
if add_to_queue:
self.queue.put(
(
data['level'].lower(),
data['component'],
text,
)
2023-08-07 12:48:18 +00:00
)
LOG.info(f'Put queue item: {data["level"].lower()} {data["component"]} : {text}')
else:
LOG.info(f'Ignoring message for {data["component"]} because it was filtered')
2023-08-07 11:39:15 +00:00
except Exception as e:
LOG.exception(msg.payload)