68 lines
2.1 KiB
Python
68 lines
2.1 KiB
Python
# 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
|