SolarEdge SE7K Modbus TCP

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:

Daarna rebooten (belangrijk, anders draait de Modbus service nog niet!):
  1. DC switch uit
  2. 1 minuut wachten
  3. AC uit
  4. AC aan
  5. 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.

Referenties