diff --git a/hub-server/config.py b/hub-server/config.py index 9b6bc11..9e81ec6 100644 --- a/hub-server/config.py +++ b/hub-server/config.py @@ -63,3 +63,4 @@ DEVICE_IDENTIFIERS = os.getenv("DEVICE_IDENTIFIERS", ["efergy"]) DEVICE_MANUFACTURER = os.getenv("DEVICE_MANUFACTURER", "Efergy") DEVICE_MODEL = os.getenv("DEVICE_MODEL", "Hub") +DEVICE_URL = os.getenv("DEVICE_URL", "https://github.com/DevOldSchool/powermeter_hub_server") diff --git a/hub-server/mqtt_manager.py b/hub-server/mqtt_manager.py index 6a7029d..0099951 100644 --- a/hub-server/mqtt_manager.py +++ b/hub-server/mqtt_manager.py @@ -2,6 +2,7 @@ import logging import time import paho.mqtt.client as mqtt +from __version__ import __version__ from config import ( MQTT_ENABLED, MQTT_BROKER, MQTT_PORT, MQTT_USER, MQTT_PASS, MQTT_BASE_TOPIC, HA_DISCOVERY, HA_DISCOVERY_PREFIX, @@ -11,12 +12,12 @@ POWER_UNIT_OF_MEASUREMENT_H3, POWER_VALUE_TEMPLATE_H3, ENERGY_NAME, ENERGY_ICON, ENERGY_DEVICE_CLASS, ENERGY_STATE_CLASS, ENERGY_UNIT_OF_MEASUREMENT, ENERGY_VALUE_TEMPLATE, - DEVICE_NAME, DEVICE_MODEL, DEVICE_IDENTIFIERS, DEVICE_MANUFACTURER + DEVICE_NAME, DEVICE_MODEL, DEVICE_IDENTIFIERS, DEVICE_MANUFACTURER, + DEVICE_URL ) ENERGY_SENSOR_LABEL = "energy_consumption" - def get_topic(label, sensor_type="power"): if sensor_type == "power": return f"{MQTT_BASE_TOPIC}/{label}/power" @@ -24,6 +25,7 @@ def get_topic(label, sensor_type="power"): return f"{MQTT_BASE_TOPIC}/{label}/energy" + class MQTTManager: def __init__(self, max_retries: int = 10, retry_interval: int = 5): self.enabled = MQTT_ENABLED @@ -32,6 +34,7 @@ def __init__(self, max_retries: int = 10, retry_interval: int = 5): self.max_retries = max_retries self.retry_interval = retry_interval self.connected = False + self.hub_version: str | None = None if not self.enabled: logging.debug("MQTT disabled via config.") @@ -113,6 +116,9 @@ def publish(self, topic: str, payload: dict, retain: bool = False): def publish_power_discovery(self, label: str, sid: str, topic: str, hub_version: str): if not self.enabled or not HA_DISCOVERY: return + if self.hub_version is None: + logging.warning("Energy discovery attempted without hub_version – skipped") + return config_topic = f"{HA_DISCOVERY_PREFIX}/sensor/{label}/config" @@ -145,7 +151,9 @@ def publish_power_discovery(self, label: str, sid: str, topic: str, hub_version: "name": DEVICE_NAME, "identifiers": DEVICE_IDENTIFIERS, "manufacturer": DEVICE_MANUFACTURER, - "model": DEVICE_MODEL + "model": DEVICE_MODEL, + "hw_version": f"{hub_version}", + "configuration_url": DEVICE_URL } } @@ -175,7 +183,8 @@ def publish_energy_discovery(self, topic: str): "name": DEVICE_NAME, "identifiers": DEVICE_IDENTIFIERS, "manufacturer": DEVICE_MANUFACTURER, - "model": DEVICE_MODEL + "model": DEVICE_MODEL, + "configuration_url": DEVICE_URL } } @@ -188,6 +197,11 @@ def publish_power(self, label: str, sid: str, hub_version: str, value: float): if not self.enabled: return + # Store hub version once + if self.hub_version is None: + self.hub_version = hub_version + logging.info(f"Detected hub version: {hub_version}") + logging.debug(f"Publishing power for {label} with value {value}") topic = get_topic(label, sensor_type="power")