diff --git a/custom_components/pstryk/evcc_mqtt.py b/custom_components/pstryk/evcc_mqtt.py new file mode 100644 index 0000000..21abf0b --- /dev/null +++ b/custom_components/pstryk/evcc_mqtt.py @@ -0,0 +1,67 @@ +# evcc_mqtt.py +import logging +import paho.mqtt.client as mqtt +import json +from homeassistant.util import dt as dt_util +from .const import ATTR_MQTT_HOST, ATTR_MQTT_PORT, ATTR_MQTT_USER, ATTR_MQTT_PASS, ATTR_MQTT_TOPIC + +_LOGGER = logging.getLogger(__name__) + +class EVCCMQTTBridge: + def __init__(self, hass, config): + self.hass = hass + self.config = config + self.client = None + self.connected = False + + async def connect(self): + def on_connect(client, userdata, flags, rc): + if rc == 0: + self.connected = True + _LOGGER.info("Connected to MQTT broker") + else: + self.connected = False + _LOGGER.error("MQTT connection failed: %s", rc) + + self.client = mqtt.Client() + self.client.on_connect = on_connect + + if self.config.get(ATTR_MQTT_USER): + self.client.username_pw_set( + self.config[ATTR_MQTT_USER], + self.config.get(ATTR_MQTT_PASS, "") + ) + + try: + await self.hass.async_add_executor_job( + self.client.connect, + self.config[ATTR_MQTT_HOST], + self.config.get(ATTR_MQTT_PORT, 1883), + 60 + ) + self.client.loop_start() + except Exception as e: + _LOGGER.error("MQTT connection error: %s", str(e)) + self.connected = False + + async def publish(self, data): + if not self.connected: + await self.connect() + + base_topic = self.config.get(ATTR_MQTT_TOPIC, "evcc/pstryk") + + try: + self.client.publish( + f"{base_topic}/grid", + json.dumps(data["grid"]), + retain=True + ) + self.client.publish( + f"{base_topic}/feedin", + json.dumps(data["feedin"]), + retain=True + ) + _LOGGER.debug("Published EVCC data to MQTT") + except Exception as e: + _LOGGER.error("Error publishing to MQTT: %s", str(e)) + self.connected = False