Compare commits

..

3 Commits

Author SHA1 Message Date
b7a075c873 Fix deploy
All checks were successful
continuous-integration/drone/push Build is passing
2021-07-24 16:19:16 +02:00
0967e0bfa2 Fix available state 2021-07-24 16:18:43 +02:00
903bbe0b01 Fix logging 2021-03-16 17:54:22 +01:00
3 changed files with 38 additions and 24 deletions

View File

@ -7,7 +7,7 @@ steps:
image: python
commands:
- apt-get update
- apt-get install python-systemd python3-systemd libsystemd-dev
- apt-get install -y python-systemd python3-systemd libsystemd-dev
- pip install pex
- pip install .
- pex ./ -m citadel.devices -o devices.pex

View File

@ -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')

View File

@ -16,6 +16,24 @@ def main(\
is_systemd: bool = typer.Option(False, help="Is running as systemd unit", envvar="LAUNCHED_BY_SYSTEMD")\
):
if is_systemd:
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger.addHandler(systemd.journal.JournalHandler())
else:
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to ch
ch.setFormatter(formatter)
# add ch to logger
logger.addHandler(ch)
client = Client()
client.setup(mqtt_host, mqtt_port, mqtt_user, mqtt_pwd)
@ -37,23 +55,6 @@ def main(\
CMND_TOPIC='cmnd/tasmota/light/{id}/POWER2')])
if is_systemd:
logger = logging.getLogger('')
logger.setLevel(logging.DEBUG)
logger.addHandler(systemd.journal.JournalHandler())
else:
logger = logging.getLogger('')
logger.setLevel(logging.DEBUG)
# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to ch
ch.setFormatter(formatter)
# add ch to logger
logger.addHandler(ch)
client.loop_forever()
if __name__ == "__main__":