#!/usr/bin/env python3 import paho.mqtt.client as mqtt import re import __py_include from homekit.config import config from homekit.mqtt import MqttWrapper, MqttNode class MqttServer(Mqtt): def __init__(self): super().__init__(clean_session=False) self.database = SensorsDatabase() def on_connect(self, client: mqtt.Client, userdata, flags, rc): super().on_connect(client, userdata, flags, rc) self._logger.info("subscribing to hk/#") client.subscribe('hk/#', qos=1) def on_message(self, client: mqtt.Client, userdata, msg): super().on_message(client, userdata, msg) try: variants = '|'.join([s.name.lower() for s in TemperatureSensorLocation]) match = re.match(rf'hk/(\d+)/si7021/({variants})', msg.topic) if not match: return # FIXME string home_id must be supported home_id = int(match.group(1)) sensor = get_sensor_type(match.group(2)) payload = Temperature.unpack(msg.payload) self.database.add_temperature(home_id, payload.time, sensor, temp=int(payload.temp*100), rh=int(payload.rh*100)) except Exception as e: self._logger.exception(str(e)) if __name__ == '__main__': config.load_app('temphum_mqtt_receiver') mqtt = MqttWrapper(clean_session=False) node = MqttNode(node_id='+') node.load_module('temphum', write_to_database=True) mqtt.add_node(node) mqtt.connect_and_loop()