SMA Photovoltaik-Anlage mit Fibaro auslesen

Geschrieben von Kingfisher

Als Besitzer einer PV-Anlage ist es natürlich sehr interessant die Live-Daten der Anlage in Echtzeit in meiner Fibaro-Hausautomatisierung einzubinden.Wie das geht, erfährst du hier:

Fibaro VD - Livedaten des SMA Wechselrichter

Da ich mir eine PV-Anlage mit einem SMA Wechselrichter zugelegt habe erläutere ich das Vorgehen hier für die Anbindung an den Modbus meines SMA Sunny Tripower 7000TL-20 Wechselrichters. Bei anderen Wechselrichter-Anbietern wird das aber sehr ähnlich sein! Das Skript kann natürlich auch der erste Schritt sein um andere Programme damit zu basteln. Man könnte z.B. die Beschattung aufgrund der Sonneneinstrahlung steuern, oder Geräte wie z.B. eine Waschmaschine dann ersten starten wenn die Eigenproduktion an Strom ausreicht um sie kostenlos zu betreiben…

[alert variation="alert-warning"]ACHTUNG: Im folgenden erhaltet ihr Informationen über PV-Technik, Steuerungen, Elektrotechnik, Anwendungen, Schnittstellen usw. Die Informationen sind so gehalten, dass auch technische Laien zurechtkommen werden. Wir verweisen jedoch sicherheitshalber darauf, dass alle Eingriffe in die Elektrik, PV-Anlage, Arbeiten an Steuerungen, an Stromkreisen usw. durch eine Elektrofachkraft zu erfolgen haben. Diese Erläuterung soll also nur zum allgemeinen Verständnis beitragen. Das Befolgen der Erläuterung erfolgt ausschließlich auf eigene Gefahr![/alert]

Modbus am SMA Sunny Tripower aktivieren

SMA öffnete sich 2015 für Drittanbieter und stattet seit dem Wechselrichter mit der Modbus-Protokoll-Schnittstelle aus. Weitere Infos dazu hier:
https://www.sma-sunny.com/jetzt-moeglich-integration-von-sma-geraeten-durch-modbus/

Welche SMA Wechselrichter unterstützen überhaupt Modbus?
https://www.sma-sunny.com/servicetipp-welche-sma-wechselrichter-unterstuetzen-modbus-2/

An meinem SMA Sunny Tripower 7000TL-20 Wechselrichter kann man ab Firmware Version 2.55.03.R  vom Oktober 2016 die Modbus-Protokoll-Schnittstelle nutzen. Über die Schnittstelle kann der Wechselrichter abgefragt werden um so z.B. Informationen wie Energie und Leistung zu erhalten. Diese Funktion war bisher nicht verfügbar. Evtl. müsst ihr ein Firmwareupdate durchführen sofern ihr noch eine ältere Firmwareversion habt.
https://www.sma.de/service/downloads.html

Hier die Anleitung zum Firmwareupdate mit SD-Karte:
http://files.sma.de/dl/1348/NG_UpdSD-TB-de-32.pdf

Über das Programm Sunny Explorer von SMA kann man den Modbus aktivieren.
http://files.sma.de/dl/8494/SunnyExplorerSetup_v1_07_29_R.exe

Dazu muss man sich als Installateur einloggen. Im Reiter “Einstellungen” findet man unter „Anlagenkommunikation” zunächst die Einstellungen für die Speedwire (TCP/IP) Verbindung:

SMA Sunny Explorer- IP Adresse auslesen

Hier empfiehlt es sich die automatische Konfiguration (DHCP) mit „Nein“ anzuwählen, bzw. auszuschalten und eine feste IP-Adresse einzugeben damit Fibaro eine eindeutige gleichbleibende Adresse zur Verfügung hat. Die IP-Adresse müsst Ihr anhand eures eigenen Netzwerkes anpassen. Sie wird höchstwahrscheinlich von meinen Werten (192.168.178.6) abweichen! Diese bitte merken!

Kommunikation mit dem Wechselrichter

Unter „Externe Kommunikation“ aktiviert man nun den Modbus:

SMA Sunny Explorer - Externe Kommunikation des Wechselrichter

Merkt euch nun auch den „Port“ und die „Unit ID“! Es kann sein, dass ihr nun den Wechselrichter neu starten müsst. Dies macht ihr am Besten nachts, wenn keine Sonne scheint und somit keine Last auf dem System ist!

Modbus Verbindungstest

Nun könnt ihr die Verbindung zu eurem Wechselrichter testen. Dazu braucht ihr das Tool „Modbus Master Sim“ von Radzio, welches ihr hier runterladen könnt:

http://www.protoconvert.com/SoftwareTools/Modbus/ModbusMasterSimulator.aspx

Nun bei „Connection Settings“ als Protokoll „Modbus TCP“ wählen und dieselbe IP-Adresse und Port verwenden die ihr Abschnitt 1 „Modbus am SMA Sunny Tripower aktivieren“ im Sunny Explorer eingestellt habt.

Modbus Master

Des Weiteren könnt ihr im Modbus Master Sim über „New“ folgende Parameter eingeben:

  • IP Adress: Wie oben bereits festgelegt, entsprechend eurer eigenen Netzwerkeinstellungen!
  • TCP Port: Wie oben bereits festgelegt! Z.B. 502
  • Device ID: Wenn ihr in eurem SMA Wechselrichter einen original SMA Modbus verbaut habt ist die Unit ID = 3 bzw. die im letzten Schritt gemerkte Unit ID! Sollte es ein SunSpec Modbus sein, so ist die Unit ID wahrscheinlich = 126.
  • Address: Wir wollen hier beispielhaft die „Geräteklasse“ abfragen.
    Die steht im Register 30051!
  • Holding Register auswählen (les- und schreibbar).

Modbus Master

Nachdem ihr das Register abgefragt habt, erhaltet ihr die Antwort wie oben im Beispiel.

  • Register: 30051 (-> Abfrage = Geräteklasse)
  • Antwort: 8001 (-> Ausgabewert = Solar Wechselrichter)

Der Test sollte erfolgreich sein bevor ihr hier weiterlest!

Import des virtuellen Modules in Fibaro

Das virtuelle Modul kann hier heruntergeladen werden: VD FIBARO SMA Modus

Die Zip-Datei enthält das virtuelle Modul: „PV_Stromerzeugung.vfib“

Außerdem befinden sich noch einige Symbole im PNG-Format anbei die später grafisch die Leistung darstellen sollen. Alles muss in ein beliebiges Verzeichnis extrahiert werden.

Danach muss das virtuelle Modul in Fibaro importiert werden.

Fibaro Oberfläche - Import virtual Device

Modulkonfiguration

Anschließend müsst ihr im virtuellen Modul „PV Stromerzeugung“ dieselbe IP-Adresse und Port verwenden die ihr im Sunny Explorer eingestellt habt! Siehe dazu Abschnitt 1 „Modbus am SMA Sunny Tripower aktivieren“ dieser Beschreibung.

Anpassungen - Konfiguration des virtual Device

Symbole für das virtuelle Modul einrichten

Als nächstes müssen die Symbole alle in Fibaro eingefügt werden. Dazu auf „Symbol ändern“ klicken. Danach jedes Symbol einzeln hinzufügen! Nach dem Upload kommt ein wesentlicher Schritt den ich allerdings nur in Firefox erklären kann, da ich ausschließlich diesen Browser verwende. Bei anderen Browsern wird dies aber bestimmt ähnlich funktionieren. Ihr klickt nun mit der rechten Maustaste auf eines der Symbole. Nun erscheint im Menü der Punkt „Grafik-Info anzeigen“ welchen Ihr auswählt. Im folgenden Dialogfenster müsst Ihr nun alle Symbole einzeln anwählen und die Dateinamen anschauen.

Symbole dem VD zuweisen

Das erste hinzugefügte Bild heißt nun bei mir „User1001.png“. Bei euch wird es anders heißen. Wichtig ist die Nummer, hier bei mir eben: „1001“. Die brauchen wir später um die Bilder im LUA-Code auswählen zu können. Notiert euch nun alle Nummern zu den entsprechenden Symbolen.

  1. Erstes Bild: „User1001.png“ und somit: 1001
  2. Zweites Bild: „User1002.png“ und somit: 1002

usw., bis zum letzten (elften) Bild!

Virtuelles Modul anpassen (Einstellungen)

Im nächsten Schritt erkläre ich den LUA-Code zum virtuellen Modul.

Dazu müsst ihr im Modul oben rechts auf „Fortgeschritten“ klicken und ganz nach unten scrollen. Hier seht ihr den LUA-Code der „primären Schleife“. Diese wird permanent wiederholt und der LUA-Code ausgeführt.

Zuerst kommen wir zu den Einstellungen:

Ich bekomme 12.24 Cents pro verkaufter Kilowattstunde vergütet. Das müsst ihr mit euerem individuellen Vergütungssatz eures Netzbetreibers anpassen:

Als nächstes werden die Grunddaten der Anlage hinterlegt. Ich habe 26 PV-Module auf meinem Hausdach mit jeweils 290 Watt Leistung. Zusammengerechnet (26 x 290) ergibt sich eine Peak-Leistung von 7540 Wp:

Nun wollen wir noch festlegen wie oft über den Modbus aktualisiert werden soll.  (60* 5 = 5 min):

Modbus Register und Parameter

Zunächst einmal geht es in diesem Abschnitt nur um Variablen und Werte die wir vorab definieren und setzten werden.
In den nächsten Zeilen werden die eigene ID, IP-Adresse und Port in Variablen eingelesen. Diese hattet ihr bereits im Abschnitt „Modulkonfiguration“ dieser Beschreibung angegeben. Somit müsst ihr hier nichts ändern!!!!

Jede TCP Nachricht über den Modbus enthält einen Header (14 Bytes) mit den folgenden Daten:

  1. Transaction Identifier (2 Bytes)
  2. Protocol Identifier (2 Bytes)
  3. Bytes to follow (2 Bytes)
  4. Slave ID or Unit Identifier (2 Bytes)
  5. Function Code (2 Bytes)
  6. Register Adress (2 Bytes)
  7. Bytes to Read (2 Bytes)

Dieser Header kann bei anderen Wechselrichtern mit abweichender Modbus-Schnittstelle natürlich anders aufgebaut sein.
Der Modbus-Header wird nun mit Werten befüllt.

1. Der Transaction Identifier (2 Bytes) wird vom Client (Fibaro) gesetzt um eindeutig jede Anfrage zu identifizieren. Der Default Wert = 0.

2. Der Protocol Identifier (2 Bytes) wird vom Client gesetzt. Der Default Wert = 0.

3. Mit Bytes to follow (2 Bytes) legen wir fest wie viele Bytes  der Nachricht folgen. Der Default Wert = 6.

4. Die SlaveID Address (2 Bytes) ist die Adresse des Wechselrichters. Diese hattet ihr euch wie im Abschnitt 2 „Kommunikation mit dem Wechselrichter“ dieser Beschreibung gemerkt. Bei SMA Wechselrichtern ist dies meistens = 3. Der SunSpec Modbus hingegen = 126!

5. Der Function Code (2 Bytes) wird aus der folgenden Register-Tabelle entnommen. Sie veranschaulicht welche Funktion genutzt werden soll um zu lesen oder zu schreiben!

CODE FUNCTION REFERENCE
01 (01H) Read Coil (Output) Status 0xxxx
03 (03H) Read Holding Registers 4xxxx
04 (04H) Read Input Registers 3xxxx
05 (05H) Force Single Coil (Output) 0xxxx
06 (06H) Preset Single Register 4xxxx
08 (08H) Reset Slave Hidden
15 (0FH) Force Multiple Coils (Outputs) 0xxxx
16 (10H) Preset Multiple Registers 4xxxx
17 (11H) Report Slave ID Hidden

Da wir nur Daten lesen wollen (Read Input Registers = 3xxxx) ist hier der Default Wert = 3.

6. Die Register Adress (2 Bytes) ist die Datenadresse des Modbus Registers das uns interessiert. Dazu findet man Details im SMA Manual. Hier werden alle verfügbaren Register und viele weitere Informationen z.B. mögliche Rückgabewerte und deren Bedeutungen aufgelistet!

Beispiel: Beim Aufrufen der Register Adresse 30051 zum Feststellen des Gerätetyps kommt als Antwort 8001 zurück. Dies steht für Inverter bzw. Wechselrichter. Dies haben wir bereits schon einmal getestet mit dem Tool „Modbus Master Sim“ von Radzio, siehe oben!

Weiter Infos unter: http://files.sma.de/dl/2585/WEBBOX-MODBUS-TB-en-19.pdf

Auch hier gilt, andere Wechselrichter haben andere Register. Evtl. müsst ihr dies dann später bei der eigentlichen Interaktion mit dem Wechselrichter bedenken und die Register-Adressen entsprechend anpassen!

7. Mit Bytes to Read (2 Bytes) wird angegeben wie viele Register zusammengehörig angefordert werden. Hier ist der Default Wert immer = 2.

Somit sind nun alle Werte für den Header definiert!

High und Low Byte

Da die Werte bzw. Registeradressen zum Teil hohe numerische Werte sind und unsere Parameter in der Modbus-Nachricht immer nur 2 Bytes groß sind, müssen wir uns eines Tricks bedienen und die Parameter auftrennen:

  • das erste Parameter-Byte -> High Byte, und
  • das zweite Parameter-Byte -> Low Byte

Allgemein hat ein Byte = 8 bits und somit 2^8 = 256 verschiedene Zustände.
Zahlen die nun größer als 256 sind werden nun im nächsten höheren (higher) Byte dargestellt.

Die Umrechnungsformel dazu ist:

Dazu nun ein Beispiel:
Beim Aufrufen der Register Adresse 30051 zum Feststellen des Gerätetyps wird die 30051 in High und Low Byte zerlegt:

30051 = 177 * (256) + 99   nach der Formel oben!

Somit wird 30051 dargestellt als 117 High Byte und 99 Low Byte!

Nun legen wir Variablen fest, mit denen wir den Modbus-Header bestimmen können:

  • Transaction Identifier (2 Bytes)
  • Protocol Identifier (2 Bytes)
  • Bytes to follow (2 Bytes)
  • Register Adress (2 Bytes)
  • Bytes to Read (2 Bytes)
Als weitere Variable wird nun ein Teiler festgelegt. Den brauchen wir später um z.B. Watt und Kilowatt zu teilen.
Mögliche erlaubte Optionen: 1, 10, 100, 1000! Default Wert = 1

Funktionen

Die nächsten beiden Funktionen wandeln eine Zahl wie im letzten Abschnitt beschrieben sowohl in High Byte als auch in Low Byte um.

Diese Funktion wandelt einen String in einen lesbaren String um!

Modbus Interaktion

Nun wird das Modbus-Register mit der folgenden Funktion (readRegister) angesprochen und ein Rückgabewert ausgelesen.
Übergabeparameter sind die Adresse des Registers und ein etwaiger Teiler!
Wieder unser bereits getestetes Beispiel: Input readRegister (30051, 1) gibt modbusAnswerNr 8001 zurück!

Nun werden alle Daten aus dem Header in High Byte und Low Byte aufgeteilt:

Die TCP Verbindung zum Wechselrichter wird aufgebaut mit der vorher definierten IP-Adresse und Port. Wir bedienen uns dazu des Net-Frameworks:

Eine Nachricht wird erstellt entsprechend aller Daten die wir vorher im Header festgelegt haben:

Jetzt brauchen wir noch einen Timeout falls es nicht klappt:

Jetzt warten wir um sicher zu gehen, dass die Verbindung auch wirklich steht (1000 = 1 Sekunde).

Die erstellte Nachricht wird verschickt:

Jetzt warten wir um sicher zu gehen, dass der Modbus Zeit hat zu antworten (1000 = 1 Sekunde).

Die Antwort wird gelesen:

Der String wird aus der Antwort extrahiert und lesbar gemacht:

Die Verbindung zum Wechselrichter wird wieder getrennt:

Zum Schluss wird noch durch einen evtl. vorher festgelegten Faktor geteilt (zur Berechnung von z.B. Kilowatt & Watt) und dabei aber vermieden, dass einen Division durch Null stattfindet!

Hauptprogramm

Da das Hauptprogramm immer wieder mit Zeitverzögerung von vorne startet um eine kontinuierliche Abfrage der Werte zu gewährleisten bauen wir uns eine Endlosschleife:

Die Zeit der aktuellen Abfrage wird bestimmt um sie später mit auszugeben:

Als nächstes wollen wir die aktuelle Wechselstrom-Leistung in Watt über alle Phasen abrufen. Dazu nutzen wir das Register 30775. Siehe zu Registern auch im Abschnitt „Modbus Register und Parameter“!

Jetzt wollen wir noch überprüfen, ob der Rückgabe-Wert überhaupt Sinn macht. Bei Nacht und ohne PV-Produktion eliminieren wir hiermit falsche Ausgabe:

Der Wert der Variable PvPowerWatt sollte niemals 0 (Null) sein, damit nicht aus versehen eine Division durch Null passiert und das Programm sich aufhängt. Deswegen wird einfach ein sehr kleiner beliebiger Wert, hier 0,0001 gewählt.

Und nun geben wir den Wert aus:

Ein weiterer interessanter Wert den wir uns anschauen möchten ist die prozentuale Leistung der Photovoltaik-Anlage.
Der minimal Wert wäre bei fehlendem Sonnenschein = 0, und der maximale Wert wäre nun die maximal theoretische Spitzenleistung den die Anlage hergibt.

Als weiteren Wert interessiert uns der Tagesertrag in Kilowattstunden. Dafür wollen wir das Register 30535 abfragen. Da das Register Wh zurück gibt müssen wir mit dem Faktor 1000 teilen um kWh zu erhalten.

Nun wird der Tagesertrag abgerufen und die Variable „DayYieldWh“ geschrieben.

Zum Schluss wollen wir noch wissen wie viel Ertrag die PV-Anlage am heutigen Tag erwirtschaftet hat. Dazu nutzen wir die Vergütung pro kWh und multiplizieren Sie mit dem aktuellen Ertrag.

Im letzten Schritt wird das Symbol entsprechend der Leistung in 10er Stufen prozentual angezeigt. Dazu müsst ihr nun die aus dem Abschnitt „Symbole für das virtuelle Modul einrichten“ notierten Nummern der Bilder hier einfügen. Zur Erinnerung, das erste Bild hieß „User1001.png“ und somit muss die Nummer "1001" für das erste Bild genutzt werden. Passt nun den folgenden Code entsprechend eurer Bildernummern an:

Die Symbole warden nun entsprechend der PV-Leistung in der App angezeigt.
Da wir das Fibaro System nicht unnötig überlasten wollen soll die ganze Schleif nur zeitverzögert weiter durchlaufen werden:

Viel Spaß wünsche ich beim Basteln und freue mich über Kommentare!

euer Kingfisher

Diesen Blogpost hat geschrieben ...

Kingfisher

13 Kommentare

  • Cool, gibt es auch eine Statistik, wie die Auslastung über die Zeit/Tag/Monat war? Außerdem wäre schön zu sehen, wie viel Strom aktuell abgegeben wird, also der Wert des virtuellen Gerätes berücksichtigt wird (optional).

    • Hallo Jeggy,
      danke erst mal, hat mich auch ein paar Tage arbeit gekostet ;-)
      Du willst wahrscheinlich wissen, wie hoch dein Eigenverbrauch contra Einspeisung ist?
      Du kannst die Eigenverbrauchsdaten vom SMA Wechselrichter leider nicht auslesen, weil er die gar nicht kennt. Wenn du per Modbus diese Daten haben möchtest, dann benötigst du einen Modbusfähiges Strommessgerät bzw. Energy-Meter, das du vor deinen Hausstromzähler hängst. Um dann die Daten in Fibaro zu nutzen bzw. Statistiken zu erhalten wäre wahrscheinlich das Aeon Labs Z-Wave 3 Zangenamperemeter (AEO_HEM3) interessant. Im Forum wurde bereits darüber diskutiert: https://www.siio.de/board/thema/aeon-labs-z-wave-3-zangenamperemeter-aeo_hem3/
      Grüße
      KF

      • Hi Kingfisher,
        danke für das Feedback,... sicher eine Idee,... Vielleicht noch ein paar Ideen für eine mögliche Erweiterung. Die Werte sind derzeit immer tagesbezogen. Der Wert vom Vortag ist nicht mehr sichtbar. Interessant wäre die Möglichkeit auf vergangene Tage z.B. Monat/Jahr zuzugreifen und eine mögliche Einbindung in die Fibaro Energiestatistik, sofern das Fibaro zulässt :)

    • Hi Jeggy,
      ja absolut. Allerdings ist das alles bei Fibaro sehr eingeschränkt. Leider interessiert bei Fibaro nur der Verbrauch. Es wäre sicher super, wenn man nicht nur Verbraucher darstellen könnte, sondern auch den Energie-"eingang"! Ich nutze zur Zeit für meine Energiestatistiken die von SMA bereitgestellten Daten aus dem Sunnyportal . Vielleicht wäre ein Ansatz zur Visualisierung der Energiewerte und Statistiken den iobroker zu nutzen. Die Visualisierungsmöglichkeiten sind da echt klasse!
      Grüße
      KF

  • Hi, zunächst mal danke für das tolle Modul. Das hätte ich mich nicht getraut selbst zu programmieren.
    Bei den aktuellen SMA WR scheint der Parameter für die Tagesleistung nicht mehr vorhanden zu sein, es gibt nur eine Gesamtleistung, was natürlich auch nett ist.
    Das System scheint sich jetzt stärker auf den Sunny Home Manager abzustützen, der die eingespeiste und selbst verbrauchte Leistung direkt am Zähler misst. Der WR holt die Daten vom Home Manager und stellt alles im Webinterface oder im Sunny Portal dar. Was ich nicht herausgefunden habe, ist ob man diese Informationen auch irgendwie per Modbus oder mit einem Webinterface abfragen kann. Es wäre natürlich extrem praktisch, wenn die Haussteuerung wüsste, wieviel zusätzliche PV Leistung zur Verfügung steht und die diversen z-wave Geräte entsprechend steuert.
    Hast Du eine Idee, wie man das realisieren könnte?

    Michael

  • Ich habe heute den VD in Betrieb genommen. Jedoch schmeißt der mir für den tagesertrag und die Vergütung enorm hohe Zahlen raus. Woran kann das liegen ?

Gib deinen Senf dazu!

Cookie Consent mit Real Cookie Banner