SMA Cluster Controller / Modbus

Hallo zusammen.

Ich bin neu hier und beschäftige mich seid kurzem mit OpenEMS. Ich würde gerne meinen SMA Cluster Controller und die daran angeschlossenen Wechselrichter (STP 20000TL-30) mit Modbus abfragen. Mit einem Python Skript funktioniert es. Hier bekomme ich die aktuelle Leistung angezeigt. In dem Skript musste ich das Register und die Slave ID der Wechselrichter angeben. Gibt es in OpenEMS auch die Möglichkeit? Die Wechselrichter kann ich nicht direkt ansprechen, da sie sich im Speedwire Netzwerk des Controllers befinden.

Vielen Dank

Hallo Matthias und willkommen in der Community!

Ich habe die Doku [1] nur ganz kurz überflogen, aber wenn ich das richtig sehe, werden die einzelnen Geräte hinter dem SMA Cluster Controller einfach unterschiedlichen Modbus Unit-IDs (oder “Slave IDs”) zugeordnet. Daher müsste es eigentlich reichen, wenn du folgendes konfigurierst:

  • Bridge Modbus/TCP
    • id: modbus0
    • ip: (IP des SMA Cluster Controllers)
  • PV-Inverter SMA Sunny Tripower
    • id: pvInverter0
    • modbus_id: modbus0 (nutzt die oben angegebene Bridge)
    • modbusUnitId: 3 (für den ersten Wechselrichter; 4 für den zweiten, etc.)

[1] https://files.sma.de/downloads/ClusterController_MODBUS-TI-de-18.pdf

Gruß,
Stefan

Guten Morgen Stefan,

vielen Dank. Das hatte ich schon getestet. leider ohne Erfolg.

Ich bekomme im Log dann folgendes:

Mai 21 08:00:34 ldems java[86888]: 2025-05-21T08:00:34,108 [modbus5 ] ERROR [e.modbus.api.task.AbstractTask] Execute failed FC3ReadHoldingRegisters [pvInverter5;unitid=3;priority=HIGH;ref=40000/0x9c40;length=2] ModbusSlaveException: Illegal Function

In meinem Python Skript rufe folgende Register ab:

30775 Aktuelle Leistung
30777 Leistung L1
30779 Leistung L2
30781 Leistung L3

Da bekomme ich Werte zurück.

Vielleicht liegt es daran.

Gruß Matthias

Hallo Matthias,

Das OpenEMS ruft, wie du an den Log-Ausgaben siehst, Register 40000 ab. Ich denke, du hast einfach die bestehende SMA-Komponente aktiviert?

Es gibt im SMA zwei Registersätze, einmal die Register 30000+ unter der Unit-ID 3 (und dann 4,5,6,…, wenn ich das richtig verstehe), und den Registersatz 40000+, der dem Sunspec-Protokoll folgt. Diesen erreichst du unter der Unit-ID 126 (127,128,…), also 123 zur andern Unit-ID addieren. Ich weiß nicht, ob du auch was im Wechselrichter konfigurieren muss, damit er diesen Registersatz freigibt. Aber kurz gesagt: Versuch mal, die Unit-ID auf 126 zu stellen.

Viele Grüße,
Thomas

Hallo Thomas,

danke für die Antwort. Ich habe ID3, ID 126 getestet. Beides funktioniert leider nicht. Es kommt die Meldung wie oben geschrieben. Execute failed FC3ReadHoldingRegisters…

Gruß Matthias

Vielleicht liegt es daran.

Ja. OpenEMS nutzt zum Auslesen von SMA PV-Wechselrichtern die SunSpec Modbus Spezifikation. Diese besagt, dass zuerst Adresse 40000 gelesen werden muss.

Die einzelnen Wechselrichter hinter einem SMA Cluster Controller scheinen aber kein echtes SunSpec zu unterstützen. In diesem Fall ist es dann leider notwendig die Modbus-Register manuell abzutippen und dafür eine neue OpenEMS-Komponente zu erstellen. Siehe → Implementing a device :: Open Energy Management System

Gruß,
Stefan

Hallo Stefan,

kurze Rückinfo. Ich habe einen neuen Wechselrichter erstellt. Mit dem kann ich jetzt die Werte abfragen. Die Modbus ID ist dann die Slave ID im Cluster Controller.

Gruß Matthias

1 Like

Ok super. Lust daraus einen Pull-Request zu machen? :slight_smile:

1 Like