106 lines
3.2 KiB
Python
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({}))
|