Ik wilde mijn oudere SolarEdge SE7K omvormer uit 2017 (de variant met LCD display) lokaal kunnen uitlezen en netjes softwarematig kunnen beperken bij negatieve stroomprijzen. De SolarEdge cloud/API werkt prima, maar ik wilde:
- geen afhankelijkheid van internet/cloud
- realtime lokale data
- integratie met Node-RED
- de omvormer automatisch kunnen curtailen bij negatieve prijzen
In eerste instantie ging ik er vanuit dat ik hiervoor de seriële RS485-poort moest aansluiten. Na wat verder onderzoek bleek echter dat deze oudere SE7K gewoon Modbus TCP ondersteunt via Ethernet. De netwerkkabel zat al aangesloten. Modbus TCP hoefde alleen nog aangezet te worden in het menu van de omvormer.
Modbus TCP kort uitgelegd
Modbus TCP is een simpel industrieel protocol waarbij registers gelezen en geschreven worden via TCP/IP.
De SolarEdge exposed intern een SunSpec registermap via Ethernet.
Dus:
- uitlezen van actuele productie
- temperatuur
- lifetime opbrengst
- netspanning
- status
- en zelfs active power limiting
Navigeren op de oude LCD SolarEdge
Deze oudere generatie heeft slechts één knop onder het display. De bediening werkt als volgt:
- korte druk = door menuopties bladeren
- lange druk = bevestigen / enter
Modbus TCP aanzetten
Via het LCD-menu:

- DC switch uit
- 1 minuut wachten
- AC uit
- AC aan
- DC aan
Daarna staat poort 502 open. Controleer dit met het onderstaande bash commando:
nc -vz 192.168.1.72 502
Python setup
Installeren:
pip3 install pymodbus
Actueel vermogen uitlezen
Bij mijn SE7K zit het actuele AC-vermogen op:
Address 83
Script:
from pymodbus.client import ModbusTcpClient
client = ModbusTcpClient("192.168.1.72", port=502)
rr = client.read_holding_registers(
address=83,
count=2,
device_id=1
)
power = rr.registers[0]
scale = rr.registers[1]
if scale > 32767:
scale -= 65536
print(power * (10 ** scale), "W")
client.close()
Voorbeeld output:
1838.0 W
Interessante registers voor de SE7K
| Functie | Address |
|---|---|
| AC vermogen | 83 |
| Lifetime energy | 93 |
| Temperatuur | 95 |
| Netfrequentie | 96 |
| AC voltage | 76 |
| DC voltage | 71 |
| Status | 107 |
Statuscodes:
| Waarde | Betekenis |
|---|---|
| 1 | Off |
| 2 | Sleeping |
| 4 | Producing |
| 5 | Production limited |
| 7 | Fault |
Curtailment / Active Power Limit
Curtailment betekent het bewust beperken van de zonneproductie.
Dus:
- panelen kunnen meer leveren
- maar de omvormer wordt softwarematig begrensd
Bijvoorbeeld:
- 100% = normaal
- 50% = halve productie
- 0% = praktisch uit
Handig bij negatieve stroomprijzen.
SolarEdge registers voor power limiting
Bij mijn SE7K werken deze registers:
| Register | Functie |
|---|---|
| 61762 | Advanced Power Control enable |
| 61441 | Active Power Limit (%) |
| 61696 | Commit/apply settings |
Omvormer op 0W zetten
Dit script zet de omvormer netjes softwarematig op 0% productie:
from pymodbus.client import ModbusTcpClient
import time
HOST = "192.168.1.72"
PORT = 502
DEVICE_ID = 1
# 0 = uit
# 50 = halve productie
# 100 = normaal
LIMIT_PERCENT = 0
client = ModbusTcpClient(HOST, port=PORT, timeout=5)
try:
print("Connect:", client.connect())
# Advanced Power Control enable
client.write_registers(
address=61762,
values=[0, 1],
device_id=DEVICE_ID
)
time.sleep(1)
# Active Power Limit
client.write_register(
address=61441,
value=LIMIT_PERCENT,
device_id=DEVICE_ID
)
time.sleep(1)
# Commit/apply
client.write_register(
address=61696,
value=1,
device_id=DEVICE_ID
)
time.sleep(10)
# Actueel vermogen uitlezen
rr = client.read_holding_registers(
address=83,
count=2,
device_id=DEVICE_ID
)
power = rr.registers[0]
scale = rr.registers[1]
if scale > 32767:
scale -= 65536
print("Limit set to:", LIMIT_PERCENT, "%")
print("Current AC power:", power * (10 ** scale), "W")
finally:
client.close()
Bij LIMIT_PERCENT = 0 ging mijn SE7K daadwerkelijk naar:
0 W
zonder harde uitschakeling van de omvormer.
