added common smarthome mqtt classes
This commit is contained in:
parent
95dda53a55
commit
c2b3285212
59
smarthome.py
Normal file
59
smarthome.py
Normal file
@ -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)
|
Loading…
x
Reference in New Issue
Block a user