From 0967e0bfa2dfa85db659dbbb8286075657166041 Mon Sep 17 00:00:00 2001 From: Nicolas Duhamel Date: Sat, 24 Jul 2021 16:18:43 +0200 Subject: [PATCH] Fix available state --- src/citadel/devices/__init__.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/citadel/devices/__init__.py b/src/citadel/devices/__init__.py index 77e20dd..8ea1540 100644 --- a/src/citadel/devices/__init__.py +++ b/src/citadel/devices/__init__.py @@ -1,10 +1,16 @@ import typing +import logging from citadel.mqtt import Client class Light: - def __init__(self, _id: str, client: Client, **kwargs): + def __init__(self, _id: str, client: Client, logger: logging.Logger=None, **kwargs): + + if logger is None: + logger = logging.getLogger('devices.LightsGroup') + self.logger = logger + self._state = None self._change_callback = None self._available = False @@ -29,12 +35,11 @@ class Light: self._change_callback = callback def onLWTChange(self, client, userdata, msg): - state = msg.payload.decode() - if state == "Online": + available = msg.payload.decode() + if available == "Online": self._available = True - elif state == "Offline": + elif available == "Offline": self._available = False - self._state = False else: raise Exception("Unexpected value %s for LWT topic" % state) @@ -75,8 +80,13 @@ class Light: class LightsGroup: - def __init__(self, _id: str, client: Client, lights: [Light]): + def __init__(self, _id: str, client: Client, lights: [Light], logger: logging.Logger=None): """ Create a virtual mqtt device that handle multiple light """ + + if logger is None: + logger = logging.getLogger('devices.LightsGroup') + self.logger = logger + self._id = _id self._lights = lights @@ -89,6 +99,8 @@ class LightsGroup: self._previous_state = all([l.state for l in self._lights]) self._previous_available = all([l.available for l in self._lights]) + self.logger.info("Available %s" % self._previous_available) + self._client.add_on_connect_callback(self.on_connect) def on_connect(self, *args): @@ -108,6 +120,7 @@ class LightsGroup: def onLightStateChange(self, light): available = all([l.available for l in self._lights]) if available != self._previous_available: + self.logger.info('New available state %s for %s', available, self.id) self._previous_available = available self._client.publish('stat/devices/light/%s/AVAILABLE' % self.id, 'TRUE' if available else 'FALSE')