106 lines
3.2 KiB
Python

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({}))