From c2b32852127bc1a3aca078a2dad3993f46cb81c2 Mon Sep 17 00:00:00 2001 From: Dirk Alders Date: Sat, 30 Aug 2025 15:53:27 +0200 Subject: [PATCH] added common smarthome mqtt classes --- smarthome.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 smarthome.py diff --git a/smarthome.py b/smarthome.py new file mode 100644 index 0000000..5630fe4 --- /dev/null +++ b/smarthome.py @@ -0,0 +1,59 @@ +import logging + + +try: + from config import APP_NAME as ROOT_LOGGER_NAME +except ImportError: + ROOT_LOGGER_NAME = 'root' + + +class common_base(dict): + DEFAULT_VALUES = {} + DEVICENAME = "DEFAULT" + + def __init__(self, default_values=None): + super().__init__(default_values or self.DEFAULT_VALUES) + # + self.__callback_list__ = [] + self.ch_names = {} + self.logger = logging.getLogger(ROOT_LOGGER_NAME).getChild("devices") + + def set_ch_name(self, key, name): + self.ch_names[key] = name + + def get_name(self, key, default=None): + return self.DEVICENAME + "." + self.ch_names.get(key, key) + " (" + ".".join(self.topic.split('/')[1:]) + ")" + + def add_callback(self, key, data, callback, on_change_only=False, init_now=False): + """ + key: key or None for all keys + data: data or None for all data + """ + cb_tup = (key, data, callback, on_change_only) + if cb_tup not in self.__callback_list__: + self.__callback_list__.append(cb_tup) + if init_now and self.get(key) is not None: + callback(self, key, self[key]) + + def set(self, key, data, block_callback=[]): + if key in self.keys(): + value_changed = self[key] != data + self[key] = data + for cb_key, cb_data, callback, on_change_only in self.__callback_list__: + if cb_key is None or key == cb_key: # key fits to callback definition + if cb_data is None or cb_data == self[key]: # data fits to callback definition + if value_changed or not on_change_only: # change status fits to callback definition + if not callback in block_callback: # block given callbacks + callback(self, key, self[key]) + else: + self.logger.warning("Unexpected key %s", key) + + +class mqtt_base(common_base): + def __init__(self, mqtt_client, topic, default_values=None): + super().__init__(default_values) + # + self.mqtt_client = mqtt_client + self.topic = topic + for entry in self.topic.split('/'): + self.logger = self.logger.getChild(entry)