initial version

This commit is contained in:
tthden 2026-04-29 21:02:23 +02:00
parent ea2951da08
commit 5fc95e66a6

74
solar_edge_main.py Normal file
View File

@ -0,0 +1,74 @@
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()