openHAB – SMA Wechselrichter via Modbus anbinden





In dieser Anleitung will ich dir zeigen, wie du ein (oder mehrere) SMA Wechselrichter über Modbus an openHAB anbinden kannst.
So kannst du deine aktuellen Ertragswerte von openHAB ermitteln lassen und darüber z.B. andere Prozesse starten.
Da dies für Neueinsteiger durchaus ein schwieriges Unterfangen ist, möchte ich dir mit dieser Anleitung helfen.
Etwas Mitdenken ist allerdings erforderlich, damit am Ende sinnvolle Zahlen raus kommen.

Diese Anleitung wurde für SMA Wechselrichter erstellt, sollte aber genau so gut mit den korrekten Werten bei anderen Wechselrichtern funktionieren.

Was ist Modbus?
Um kurz das Notwendige Wissen zu übermitteln, hier eine Kurzfassung, was Modbus ist.
Es ist ein Netzwerkprotokoll, über welches sich Daten versenden als auch Empfangen lassen.
Es ist sehr simpel aufgebaut, braucht wenig Ressourcen und kann recht flexibel eingesetzt werden.
Die Datenströme werden mit Hilfe von IDs angegeben, um diese am Empfangsgerät auch korrekt abfangen zu können.
Zuerst wird ein Bereich definiert, in dem die gewünschten Datensätze vorhanden sind und anschließend wird dieser Bereich auf die gewünschte ID mit den Datensätzen gefiltert.
Da es sehr simpel aufgebaut ist, gibt es auch keine großen Schutzmechanismen, welche vor unerlaubtem Zugriff schützen.

Hinweis: Diese Anleitung basiert auf dem Wissen eines SMA Sunny Tripower STP 9000TL-20 und SMA Sunny Tripower STP 8000TL-20.
Mit anderen Modellen sollte es gehen, jedoch müssen ggf. andere Werte eingesetzt werden!

Was brauchen wir?
– Ein SMA-Wechselrichter mit Modbus-Schnittstelle über RJ45
– Eine aktivierte Modbus-Schnittstelle über RJ45
– Eine aktuelle openHAB-Installation
– Eine aktuell Modbus-ID-Liste für deinen Wechselrichter (https://www.sma.de/en/products/product-features-interfaces/modbus-protocol-interface)

1. Aktiviere in deinem SMA Wechselrichter die Modbus-Schnittstelle
Da es hier verschiedene Modelle mit unterschiedlichen Zugriffsmöglichkeiten gibt, habe ich hier nur ein Screenshot meines Wechselrichters.
Ich kann daher nicht genau sagen, wo diese Option bei anderen Modellen steckt.
Schau mal in die Bedienungsanleitung, dort steht es drin.
Du benötigst auf jeden Fall das korrekte „Installateur“-Passwort, um diese Einstellungen ändern zu können!

2. Belasse die ID auf „3“

3. Lade das aktuelle Modbus-Datenblatt von SMA herunter und such die Seite für dein Wechselrichter heraus
Bei mir ist es die Seite „STP nn000TL-20, PKG 2.56“.

Wie lese ich die Adress-Liste?
Überfliege sie mal kurz.
Du wirst feststellen, das für diverse Dinge immer „Adressbereiche“ existieren.
Ich mach das ganze mal am Beispiel von meinem Wechselrichter.
Ab dem Adressbereich 30201 beginnen viele Werte die mit der aktuellen Energiegewinnung und den Zustand des Wechselrichters.
Dieser Blockt geht scheinbar bis 30247. Danach gehts mit viel höheren Zahlen weiter.
Also haben wir hier eine Länge des Adressbereiches von 46.
Damit hätten wir die korrekte Nummer für Schritt 6.

Jede einzelne Adresse steht hierbei für einen Wert.
Wert 30217 gibt hier z.B. den Status des Schützes an, welches den Netzzugang steuert.
Wir sehen bei der Beschreibung, dass hierbei Buchstaben und Zahlen ausgegeben werden.
Daraus können wir ermitteln, das es sich bei der Rückgabe um ein „String“ handelt.
Es gibt auch Werte (z.B. aktueller Ertrag) welche mit ganz normalen Nummern angegeben werden. Damit wir diese Nummern auch in das korrekte Format setzen können, steht dahinter immer eine Angabe wie Watt oder kWh.
Die Formatierung müssen wir in openHAB immer von Hand vornehmen. Das gibt Modbus nicht mit.

Als Format wird hier U32 angegeben, was „Unsigniert INT32“ bedeutet.
Das müssen wir in openHAB korrekt hinterlegen, damit die Zahl ausgelesen werden kann.
32 = 32bit | 64 = 64bit | S = Signiert

Dann gibt es noch das Feld „Access“.
Hier wird angegeben, ob das Feld nur lesbar (RO = Read only) oder auch beschreibbar (RW = Read + Write) ist.

Das sollte es mal mit dem kleinen Crashkurs gewesen sein. Ansonsten artet dies zu einer Doktorarbeit aus, was hier hier jetzt nicht wollen.

ACHTUNG: Manche Werte stimmen aus der Excel mit 100% überein oder werden überhaupt nicht vom Wechselrichter unterstützt. Falls wer Wert „NULL“ heraus kommt, prüfe ob du ein Fehler bei der Einrichtung gemacht hast. Wenn alles passen sollte, spuckt der Wechselrichter scheinbar hier nichts aus. Teste daher selbst was geht und was nicht.

4. Installiere in openHAB das „Modbus-Binding

5. Installiere in openHAB „JavaScript Transformation Service
Es schadet auch nicht, die Erweiterung „JavaScript Scripting“ zu installieren.

6. Füge bei „Things“ eine Modbus-Bridge hinzu.
Die Brücke stellt eine Verbindung zwischen dem Modbus-Protokoll und openHAB her.
+ → „Modbus Binding“ → „Modbus TCP Slave“
Unique ID: Gebe eine ID an oder belasse es bei der automatisch generierten ID
Label: Gebe ein Namen an wie z.B. „SMA WR Modbus Bridge“
IP Address or Hostname: Gebe hier die IP-Adresse des Wechselrichters ein (z.B. 192.168.0.123)
Port: 502 kann so belassen werden, es sei denn, du hast diesen im Wechselrichter umgestellt
Id: 3
Der Rest kann so belassen werden.

7. Füge nun ein Poller hinzu
Der Poller gibt nun den Datensatzbereich an, den wir abfangen möchten. Hier im Tutorial will ich den aktuellen Ertrag abrufen.
+ → „Modbus Binding“ → „Regular Poll“
Unique ID: Gebe eine ID an oder belasse es bei der automatisch generierten ID
Label: Gebe ein Namen an wie z.B. „SMA WR Modbus Poller 30769“
Bridge: Gebe hier die Bridge an, die du in Schritt 5 erstellt hast
Poll Interval: Hier kann ein Wert bestimmt werden, wie oft die Daten abgerufen werden sollen. 5 Sekunden – also 5000 – ist für mich ein guter Wert
Start: Gebe hier die Start-ID für das Modbus-Protokoll an. Bei mir ist es für die Leistungsdaten die ID 30769. Die Daten kannst du aus der SMA-Excel entnehmen.
Length: Gebe hier die Länge der Bytes an. Bei mir ist es 26 für die Leistungsdaten
Type: input register
Maximum Tries When Reading: 3

8. Füge nun ein Modbus-Data-Thing hinzu
Damit können wir nun die Daten ex filtrieren, um in openHAB damit zu arbeiten.
+ → „Modbus Binding“ → „Modbus Data“
Unique ID: Gebe eine ID an oder belasse es bei der automatisch generierten ID
Label: Gebe ein Namen an wie z.B. „SMA WR Modbus Data – Aktueller Ertrag (30775)“
Bridge: Gebe hier den Poller an, den du in Schritt 6 angelegt hast
Read Address: Gebe hier nun die passende Adresse für die Modbus-Daten an. Bei mir ist es für die aktuellen Leistungsdaten für die AC-Seite die ID 30775.
(OPTIONAL*) Read Transform: JS(sma-kein-negativ.js)
Read Value Type: Gebe hier den korrekten Typ des Datensatzes an. Dieser lässt sich auch aus der SMA-Excel entnehmen. Für mich ist es „32bit signed integer (int32)“ für die Leistungsdaten
Der Rest kann auf den Standardeinstellungen bleiben.
*Muss nur bei Zahlenwerte angegeben werden, um extreme Negativwerte zu unterbinden.

9. Füge ein Transformations-Script hinzu, um keine extremen negativen Zahlen zu haben
Ich habe hier ein einfaches JavaScript, welches die ausgelesen Werte etwas korrigiert. Denn wenn der Wechselrichter im Standby ist und keine Arbeit vollrichtet, sendet er extrem hohe Negativ-Werte über Modbus aus. Das sieht unschön in openHAB aus.
(-2147483648)

Füge daher DIESES JavaScript in folgenden Ordner in deiner openHAB-Installation hinzu:

/etc/openhab/transform

Das hier ist das Script:

(function(inputData) {
    if(inputData < 0) return "0";
    return parseFloat(inputData) ;
})(input)

Du musst openHAB nicht neu starten, damit es übernommen wird. Es steht sofort zur Verfügung.
Beispiel wenn man es nicht anpasst:

10. Wechsel nun in dein Model, um die Kanäle anzulegen

11. Erstelle von Hand ein neues Equipment an passender Stelle, wo deine Wechselrichter sitzen sollen
Wir machen dies von Hand, da gleich mehrere „Points“ eingefügt werden müssen.

12. Füge ein neuen „Point“ über „Create Points from Thing“ hinzu

13. Wähle bei „Thing“ nun das Thing aus, welches du in Schritt 7 angelegt hast
» SMA WR Modbus Data – Aktueller Ertrag (30775)

14. Wähle nun die Option „Value as Number“ aus, wenn es sich um ein Zahlenwert handelt
Label: Gebe ein schönen Namen an, der am Ende auch so in der Sitemap oder im Webinterface sichtbar ist. Ein gutes Beispiel hier: „SMA WR1 – Aktueller Ertrag AC“
Type: Number
Category: energy
Semantic Class: Point
Semantic Property: None

Nach wenigen Sekunden sollte nun dein Item den Wert des Datensatzes anzeigen. Da es sich um den „nackten“ Wert handelt, fehlen die Angaben. Du musst also wissen, ob es sich hierbei um Volt, Watt oder Amperé handelt.

Okay, du hast nun ein Wert in openHAB drin.
Wie geht es nun weiter?
Du hast das Prinzip nun von Modbus verstanden … oder durch Zufall alles sauber von meiner Anleitung übernommen.
Nun kannst du weitere Werte auslesen.
Sind die Werte in einem anderen Byte-Bereich?
Wiederhole alle Schritte ab Schritt 6, nur lass Schritt 9 aus..

Sind die Werte im gleichen Byte-Bereich?
Wiederhole alle Schritte ab Schritt 7, nur lass Schritt 9 aus.

Willst du den Schaltzustand des Schützes im Wechselrichter auslesen?
(Für nicht technisch versierte: Das Schütz ist der „Schalter“, welcher den Zugang zum Stromnetz aktiviert, wenn der Wechselrichter arbeiten kann.)
Lege in Schritt 12 statt eine „Number“ ein „Contact“ an und gebe als Type „Switch“ an.

Du hast mehrere Wechselrichter und willst die aktuelle Gesamtleistung ausrechnen?
Ich habe hier ein sehr simples Blockly-Script für dich, was genau das tut.

Du brauchst nur ein Item, welches als „Number“ definiert ist, um die Daten dort reinschreiben zu können.
Lass das Script einfach alle 5 Sekunden laufen.
Dazu musst du ganz normal die Quelle in openHAB einbinden und als Channel im Model hinzufügen.

Klicke im Modell selbst auf „Add Metadata“ für den betroffenen Wert.
Wähle dann in der Liste „State Description“ aus.

In der untersten Box kannst du nun deine Konvertierung hinterlegen.
Trage pro Zeile einen Wert ein, der über diesen Channel übermittelt werden könnte.
Das könnte dann z.B. so aussehen:

35=Fehler
303=Aus
307=Ok
455=Warnung
16777213=Information liegt nicht vor


Formatieren von Werten

Bei einigen Werten kann es sein, das eine Zahl ein Status ausgeben soll.
Eine 1 wäre vielleich ein AN, eine 0 soll ein AUS darstellen, oder was auch immer.
Damit die konvertierung funktioniert, kannst du in openHAB sehr einfach die Meta-Daten editieren.


Damit kommen wir auch zum Ende dieser Anleitung.
Ich hoffe du konntest deinen Wechselrichter erfolgreich einbinden.
Falls du es geschafft hast, deinen Wechselrichter erfolgreich anzubinden, schreib doch mal deine genutzten Adressen als Kommentar unten dazu. Gebe dazu auch den Adressbereich und den genutzten Wechselrichter an.
So können wir Neueinsteigern gemeinsam besser helfen!

4 Kommentare

  1. Sehr gute Anleitung.
    Vielen Dank dafür.
    Ich habe 2 Wechselrichter einen 10KW und einen 5KW.
    Den großen konnte ich ohne Probleme abfragen, doch beim kleinen kommt eine Fehlermeldung:
    Error with read: org.openhab.core.io.transport.modbus.internal.ModbusSlaveIOExceptionImpl: Modbus IO Error with cause=ModbusIOException, EOF=false, message=’I/O exception: EOFException null‘, cause2=null

    Hier vom Log:
    2023-07-23 13:59:01.317 [WARN ] [rt.modbus.internal.ModbusManagerImpl] – Try 1 out of 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_INPUT_REGISTERS, start=12999, length=78, maxTries=3]). Will try again soon. Error was I/O error, so resetting the connection. Error details: net.wimpi.modbus.ModbusIOException I/O exception: EOFException null [operation ID 5e14184f-c038-4cc1-92a1-d9c17a3d0789]
    2023-07-23 13:59:01.389 [WARN ] [rt.modbus.internal.ModbusManagerImpl] – Try 2 out of 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_INPUT_REGISTERS, start=12999, length=78, maxTries=3]). Will try again soon. Error was I/O error, so resetting the connection. Error details: net.wimpi.modbus.ModbusIOException I/O exception: EOFException null [operation ID 5e14184f-c038-4cc1-92a1-d9c17a3d0789]
    2023-07-23 13:59:01.470 [ERROR] [rt.modbus.internal.ModbusManagerImpl] – Last try 3 failed when executing request (ModbusReadRequestBlueprint [slaveId=1, functionCode=READ_INPUT_REGISTERS, start=12999, length=78, maxTries=3]). Aborting. Error was I/O error, so resetting the connection. Error details: net.wimpi.modbus.ModbusIOException I/O exception: EOFException null [operation ID 5e14184f-c038-4cc1-92a1-d9c17a3d0789]

    Was mach ich falsch? Ich hab mal alle Updates von Openhab installiert und bin jetzt auf Version: 3.4.4

    Wäre nett wenn Sie mir ein Tipp geben könnten.

    Vielen Dank im voraus.

    • Hi!
      Wenn der kleinere WR ein Modell der gleichen Serie ist, sollten die Abfragen genau so gut funktionieren.
      Eventuell ist Modbus dort noch deaktiviert?
      Leider kann ich aus der Fehlermeldung nichts weiteres entnehmen, als dass die Gegenstelle – also der WR – die Verbindung abgelehnt hat.
      Zur Not mal im openHAB-Forum um Hilfe bitten. Die können die Fehler besser deuten 🙂

  2. Hi,
    ja ist der baugleiche WR.
    Wenn ich die Modbus Brücke erstelle steht online da.
    Nur wenn ich den Poller erstelle kommt die Meldung.
    Daher denke ich die Modbus aktiviert.

    Aber guter Hinweis ich versuch mal mein Glück im openHAB Forum.

    Danke für die schnelle Antwort.

  3. Hi.
    Super Anleitung, vielen Dank dafür. Damit konnte ich problemlos meinen Wechselrichter auslesen.
    Bei Schritt 7 ist mir etwas aufgefallen. Müsste es anstatt „Length: Gebe hier die Länge der Bytes an.“ nicht eher „Anzahl der Register“ heißen? Zumindest steht es so im Erklärtext der openHAB-Weboberfläche bei der Konfiguration.
    Im konkreten Fall der Leistungsdaten ab Register 30775 wären es zwei Register aber 4 Bytes.
    Viele Grüße
    Martin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.