support multiple callbacks per topic

This commit is contained in:
Nicolas Duhamel 2021-07-27 14:52:18 +02:00
parent cdb8b5a222
commit 402cc28822

View File

@ -5,6 +5,7 @@ from collections.abc import Callable
from typing import NoReturn
import paho.mqtt.client as mqtt
from paho.mqtt.client import topic_matches_sub
class Configuration:
user: str
@ -20,8 +21,8 @@ class Client(mqtt.Client):
if self.logger is None:
self.logger = logging.getLogger('mqtt')
self._subscribe_callbacks = []
self._on_connect_callbacks = []
self._subscribe_callbacks = {}
self.on_connect = self._on_connect2
@ -43,11 +44,26 @@ class Client(mqtt.Client):
def subscribe_callback(self, topic: str, callback):
self.logger.info("Add callback %s for topic %s" % (callback, topic))
self._subscribe_callbacks.append((topic,callback))
self.message_callback_add(topic, callback)
if topic in self._subscribe_callbacks:
self._subscribe_callbacks[topic].append(callback)
else:
self._subscribe_callbacks[topic] = [callback]
#register our callback for storing multiple callback for one topic
self.message_callback_add(topic, self.on_subscribe_callback)
def on_subscribe_callback(self, client, userdata, msg):
self.logger.debug("Callback search for %s" % msg.topic)
for topic, callbacks in self._subscribe_callbacks.items():
if topic_matches_sub(topic, msg.topic):
for func in callbacks:
self.logger.debug("Call %s for topic %s" % (func, topic))
func(client, userdata, msg)
def _on_connect2(self, *args):
for (topic, callback) in self._subscribe_callbacks:
for topic in self._subscribe_callbacks.keys():
self.subscribe(topic)
for func in self._on_connect_callbacks:
func(self, *args)