import os import json import paho.mqtt.client as mqtt from devices import Device from data_class import Data from logger import get_logger topic_root = "homeassistant" logger = get_logger(__name__) client = mqtt.Client(client_id='atc_mithermometer_gateway') IP = os.getenv('MQTT_IP') PORT = os.getenv('MQTT_PORT') if IP and PORT: client.connect(IP, int(PORT), 60) def generate_json(device:Device): dev, data_obj, from_config = device return { "timestamp": data_obj.timestamp, "temperature": data_obj.temperature, "humidity": data_obj.humidity, "battery_percent": data_obj.battery_percent, "battery_volt": data_obj.battery_volt, "rssi": dev.rssi } def generate_config_payloads(device:Device): mac = '-'.join(device.mac.split(':')[3:]) state_topic = f"atc/device/{mac}/state" device_json = { "name": f"ATC {device.name}", "identifiers":[f"atc-{mac}"], } config_temperature_payload = { "name": f"{device.name} temperature", "unique_id": f"atc-{mac}-temperature", "state_topic": state_topic, "unit_of_measurement": "°C", "value_template": "{{ value_json.temperature}}", "device": device_json } config_humidity_payload = { "name": f"{device.name} humidity", "unique_id": f"atc-{mac}-humidity", "state_topic": state_topic, "unit_of_measurement": "%", "value_template": "{{ value_json.humidity}}", "device": device_json } config_battery_percent_payload = { "name": f"{device.name} battery", "unique_id": f"atc-{mac}-battery-percent", "state_topic": state_topic, "unit_of_measurement": "%", "value_template": "{{ value_json.battery_percent}}", "device": device_json } config_rssi_payload = { "name": f"{device.name} rssi", "unique_id": f"atc-{mac}-rssi", "state_topic": state_topic, "value_template": "{{ value_json.rssi}}", "device": device_json } return [config_temperature_payload, config_humidity_payload, config_battery_percent_payload, config_rssi_payload] def publish_device_state(device:Device): dev, data_obj, from_config = device data_obj: Data from_config: Device mac = '-'.join(from_config.mac.split(':')[3:]) state_topic = f"atc/device/{mac}/state" payload = generate_json(device) logger.info(f"Publishing {payload}") client.publish(state_topic, json.dumps(payload)) def publish_home_assistant_device_config(device:Device): dev, data_obj, from_config = device data_obj: Data from_config: Device mac = '-'.join(from_config.mac.split(':')[3:]) topic = f"{topic_root}/sensor/atc-{mac}/config" temperature_payload, humidity_payload, battery_percent, rssi_payload = generate_config_payloads(from_config) client.publish(f'{topic}-temperature/config', json.dumps(temperature_payload)) client.publish(f'{topic}-humidity/config', json.dumps(humidity_payload)) client.publish(f'{topic}-battery/config', json.dumps(battery_percent)) client.publish(f'{topic}-rssi/config', json.dumps(rssi_payload)) # client.publish(f'{topic}-temperature/config', json.dumps({})) # client.publish(f'{topic}-humidity/config', json.dumps({})) # client.publish(f'{topic}-battery/config', json.dumps({})) # client.publish(f'{topic}-rssi/config', json.dumps({}))