import sunspec2.modbus.client as client import paho.mqtt.client as mqtt import time import logging from constants import mqtt_username, mqtt_password # --- Configuratie --- INVERTER_IP = "192.168.200.65" INVERTER_PORT = 502 # Probeer 1502 als 502 niet werkt MQTT_BROKER = "10.0.0.3" TOPIC_PREFIX = "solaredge/inverter" # Logging instellen voor foutopsporing logging.basicConfig(level=logging.INFO) logger = logging.getLogger("SolarEdgeService") def connect_mqtt(): c = mqtt.Client() c.username_pw_set(mqtt_username, mqtt_password) try: c.connect(MQTT_BROKER, 1883, 60) return c except Exception as e: logger.error(f"MQTT Verbinding mislukt: {e}") return None def read_and_publish(): inv_device = None mqtt_client = connect_mqtt() while True: try: # 1. Verbind met Inverter als dat nog niet is gebeurd if inv_device is None: logger.info("Verbinden met SolarEdge...") inv_device = client.SunSpecModbusClientDeviceTCP( slave_id=1, ipaddr=INVERTER_IP, ipport=INVERTER_PORT, timeout=5 ) inv_device.scan() # 2. Data lezen # Model 101/103 bevatten de inverter data # We zoeken dynamisch naar het juiste model itf = inv_device.inverter[0] itf.read() power_w = itf.W.get_value() energy_total = itf.WH.get_value() status = itf.St.get_value() # 3. Publiceren naar MQTT if mqtt_client: mqtt_client.publish(f"{TOPIC_PREFIX}/power", power_w) mqtt_client.publish(f"{TOPIC_PREFIX}/total_energy", energy_total) mqtt_client.publish(f"{TOPIC_PREFIX}/status", status) logger.info(f"Update verzonden: {power_w}W total_energy: {energy_total}Wh status: {status}") else: mqtt_client = connect_mqtt() # Herstel MQTT verbinding except Exception as e: logger.error(f"Fout tijdens uitlezen: {e}") # Forceer nieuwe verbinding bij de volgende poging if inv_device: inv_device.close() inv_device = None time.sleep(5) # Korte pauze bij fout om CPU te sparen time.sleep(15) # Wacht 15 seconden voor de volgende update if __name__ == "__main__": read_and_publish()