class PowerWorker(HallonWorker): def __init__(self, config, workers): HallonWorker.__init__(self, config, workers, 120) self.whenPowerReported = Subject() self.whenNoPowerReported = Subject() broker = mqtt_utils.get_broker(config['mqtt']['broker']) self.mqtt_updater = MqttListener(broker, [config['mqtt']['topic']]) self.mqtt_updater.OnMessage.subscribe(self.handle_update) def watchdog_message(self): return "Power not reported:" + self.mqtt_updater._topics[0] def _init_worker(self): self.mqtt_updater.start() def handle_update(self, msg): try: self.msg_count += 1 # expected structure: tickPeriod:123|counter:5 data = json.loads(msg[1]) if "power_tick_period" in data: tick_period = data['power_tick_period'] else: logger.info(f"Could not read power message {msg}") return tp = int(tick_period) wh_per_hit = 1 / float(1000) * 1000 power = wh_per_hit * 3600 / float(tp / 1000) data['power'] = power self.whenPowerReported.on_next(data) except Exception as ex: logger.error("Exception in mqtt thread: " + str(ex))
class TemperatureWorker(HallonWorker): def __init__(self, config, workers): HallonWorker.__init__(self, config, workers, 120) self.whenTemperatureReported = Subject() self.whenMinMaxModified = Subject() self.whenNoTemperatureReported = Subject() broker = mqtt_utils.get_broker(config['mqtt']['broker']) self.mqtt_updater = MqttListener(broker, config['mqtt']['topics']) self.mqtt_updater.OnMessage.subscribe(self.handle_update) self.day = -1 self.todayMinValue = 0 self.todayMaxValue = 0 def _init_worker(self): self.mqtt_updater.start() def watchdog_message(self): return "Temp not reported:" + self.mqtt_updater._topics[0] def handle_update(self, msg): try: topic, msg = msg self.msg_count += 1 data = json.loads(msg) sensor_id = data['id'] temp = data["temp"] self.whenTemperatureReported.on_next({ 'sensor_id': sensor_id, 'temp': temp }) except Exception as ex: logger.error("Exception in mqtt thread: " + str(ex))
class RelayWorker(HallonWorker): def __init__(self, config, workers): HallonWorker.__init__(self, config, workers, 120) self.whenRelayReported = Subject() broker = mqtt_utils.get_broker(config['mqtt']['broker']) self.mqtt_updater = MqttListener(broker, [config['mqtt']['topic']]) self.mqtt_updater.OnMessage.subscribe(self.handle_update) def watchdog_message(self): return "Power not reported:" + self.mqtt_updater._topics[0] def _init_worker(self): self.mqtt_updater.start() def handle_update(self, msg): try: self.msg_count += 1 data = json.loads(msg[1]) if "state" in data: state = True if data['state'] == "ON" else False logger.info(f"STATE: {state}") self.whenRelayReported.on_next(state) else: logger.info(f"Could not read power message {msg}") return except Exception as ex: logger.error("Exception in mqtt thread: " + str(ex))
class WaterWorker(HallonWorker): def __init__(self, config, workers): HallonWorker.__init__(self, config, workers, 120) self.whenWaterReported = Subject() self.whenNoWaterReported = Subject() broker = mqtt_utils.get_broker(config['mqtt']['broker']) self.mqtt_updater = MqttListener(broker, [config['mqtt']['topic']]) self.mqtt_updater.OnMessage.subscribe(self.handle_update) def watchdog_message(self): return "Water not reported:" + self.mqtt_updater._topics[0] def _init_worker(self): self.mqtt_updater.start() def handle_update(self, msg): try: self.msg_count += 1 # expected structure: tickPeriod:123|counter:5 data = json.loads(msg[1]) if "consumption" in data and "t_diff" in data: consumption = data['consumption'] t_diff = data['t_diff'] else: logger.info(f"Could not read water message {msg}") return if t_diff < 10: logger.info(f"Strange water report. t_diff: {t_diff}") l_per_minute = consumption / (t_diff / 1000.0) * 60 data['l_per_minute'] = l_per_minute self.whenWaterReported.on_next(data) except Exception as ex: logger.error("Exception in mqtt thread: " + str(ex))
class DoorWorker(HallonWorker): def __init__(self, config, workers): HallonWorker.__init__(self, config, workers, 120) self.whenDoorReported = Subject() broker = mqtt_utils.get_broker(config['mqtt']['broker']) self.mqtt_updater = MqttListener(broker, config['mqtt']['topics']) self.mqtt_updater.OnMessage.subscribe(self.handle_update) def _init_worker(self): self.mqtt_updater.start() def watchdog_message(self): return "Door not reported:" + self.mqtt_updater._topics[0] def handle_update(self, msg): try: self.msg_count += 1 data = json.loads(msg[1]) for x in data: self.whenDoorReported.on_next(x) except Exception as ex: logger.error("Exception in mqtt thread: " + str(ex))