Growatt Wechselrichter Daten über Modbus abfragen

Begonnen von ttiger47, 23 August 2021, 20:34:53

Vorheriges Thema - Nächstes Thema

ttiger47

Hallo,

da ich seit 2 Wochen eine Mini PV-Anlage auf dem Dach habe, wollte ich die in die Cloud gesendeten Daten, auch in mein FHEM einbinden. Nach dem Lesen verschiedener Foren und Forenbeiträgen, läuft bei mit seit gestern die Datenabfrage über Modbus. Die Daten der RS485 Schnittstelle meines Growatt MIC 600TL-X habe ich über ein USR-TCP232-304 per LAN in mein Heimnetz eingespeist. Es gibt aber auch RS485 zu Wlan-Adapter. Dafür müssen 2 Pole des Schnitstellenstecker mit dem USR-TCP Adapter verbunden werden. RS485A1 an A, RS485B1 an B.

Eine Übersicht der Verfügbaren Register findet man unter,
http://www.photovoltaicsolar.in/Growatt_Manual/MAX%20Series%20Modbus%20RTU%20Protocol.pdf
ab Seite 25

Sicherlich kann man das etwas schlanker in FHEM codieren und ich bin dankbar für Verbesserungsvorschläge, aber den angefügten Code habe ich mir zusammen gesucht und angepasst, wie es meinen jetziger FHEM Fähigkeiten entspricht.

define pvAnlage ModbusAttr 1 30 192.168.xxx.yyy:23 RTU
attr pvAnlage userattr dev-h-defExpr dev-h-defLen dev-h-defUnpack obj-i00000-expr obj-i00000-format obj-i00000-poll obj-i00000-reading obj-i00000-unpack obj-i000000-expr obj-i00002-expr obj-i00002-format obj-i00002-poll obj-i00002-reading obj-i00002-unpack obj-i00003-expr obj-i00003-format obj-i00003-poll obj-i00003-reading obj-i00003-unpack obj-i00036-expr obj-i00036-format obj-i00036-poll obj-i00036-reading obj-i00036-unpack obj-i00037-expr obj-i00037-format obj-i00037-poll obj-i00037-reading obj-i00037-unpack obj-i00054-expr obj-i00054-format obj-i00054-poll obj-i00054-reading obj-i00054-unpack obj-i00056-expr obj-i00056-format obj-i00056-poll obj-i00056-reading obj-i00056-unpack obj-i00093-expr obj-i00093-format obj-i00093-poll obj-i00093-reading obj-i00093-unpack obj-i00113-expr obj-i00113-format obj-i00113-poll obj-i00113-reading obj-i00113-unpack obj-i00335-expr obj-i00335-format obj-i00335-poll obj-i00335-reading obj-i00335-unpack obj-i00347-expr obj-i00347-format obj-i00347-poll obj-i00347-reading obj-i00347-unpack obj-i00349-expr obj-i00349-format obj-i00349-poll obj-i00349-reading obj-i00349-unpack obj-i00376-expr obj-i00376-format obj-i00376-poll obj-i00376-reading obj-i00376-unpack obj-i00378-expr obj-i00378-format obj-i00378-poll obj-i00378-reading obj-i00378-unpack
attr pvAnlage dev-h-defExpr ModbusLD_ScanFormat($hash, $val)
attr pvAnlage dev-h-defLen 1
attr pvAnlage dev-h-defUnpack a2
attr pvAnlage event-on-change-reading .*
attr pvAnlage group PV-Anlage
attr pvAnlage obj-i00000-expr ("s>",$val/1)
attr pvAnlage obj-i00000-format %.0f
attr pvAnlage obj-i00000-poll 1
attr pvAnlage obj-i00000-reading inverter_state
attr pvAnlage obj-i00000-unpack s>
attr pvAnlage obj-i00002-expr ("s>",$val/10)
attr pvAnlage obj-i00002-format %.1f
attr pvAnlage obj-i00002-poll 1
attr pvAnlage obj-i00002-reading input_power
attr pvAnlage obj-i00002-unpack s>
attr pvAnlage obj-i00003-expr ("s>",$val/10)
attr pvAnlage obj-i00003-format %.1f
attr pvAnlage obj-i00003-poll 1
attr pvAnlage obj-i00003-reading input_voltage
attr pvAnlage obj-i00003-unpack s>
attr pvAnlage obj-i00036-expr ("s>",$val/10)
attr pvAnlage obj-i00036-format %.1f
attr pvAnlage obj-i00036-poll 1
attr pvAnlage obj-i00036-reading output_power
attr pvAnlage obj-i00036-unpack s>
attr pvAnlage obj-i00037-expr ("s>",$val/100)
attr pvAnlage obj-i00037-format %.2f
attr pvAnlage obj-i00037-poll 1
attr pvAnlage obj-i00037-reading grid_frequency
attr pvAnlage obj-i00037-unpack s>
attr pvAnlage obj-i00054-expr ("s>",$val/10)
attr pvAnlage obj-i00054-format %.1f
attr pvAnlage obj-i00054-poll 1
attr pvAnlage obj-i00054-reading today_generated_energy
attr pvAnlage obj-i00054-unpack s>
attr pvAnlage obj-i00056-expr ("s>",$val/10)
attr pvAnlage obj-i00056-format %.1f
attr pvAnlage obj-i00056-poll 1
attr pvAnlage obj-i00056-reading total_generated_energy
attr pvAnlage obj-i00056-unpack s>
attr pvAnlage obj-i00093-expr ("s>",$val/10)
attr pvAnlage obj-i00093-format %.1f
attr pvAnlage obj-i00093-poll 1
attr pvAnlage obj-i00093-reading inverter_temperature
attr pvAnlage obj-i00093-unpack s>
attr pvAnlage obj-i00113-expr ("s>",$val/1)
attr pvAnlage obj-i00113-format %.0f
attr pvAnlage obj-i00113-poll 1
attr pvAnlage obj-i00113-reading power_percentage
attr pvAnlage obj-i00113-unpack s>
attr pvAnlage obj-i00335-expr ("s>",$val/10)
attr pvAnlage obj-i00335-format %.1f
attr pvAnlage obj-i00335-poll 1
attr pvAnlage obj-i00335-reading lastDay_generated_energy
attr pvAnlage obj-i00335-unpack s>
attr pvAnlage obj-i00347-expr ("s>",$val/10)
attr pvAnlage obj-i00347-format %.1f
attr pvAnlage obj-i00347-poll 1
attr pvAnlage obj-i00347-reading actualMonth_generated_energy
attr pvAnlage obj-i00347-unpack s>
attr pvAnlage obj-i00349-expr ("s>",$val/10)
attr pvAnlage obj-i00349-format %.1f
attr pvAnlage obj-i00349-poll 1
attr pvAnlage obj-i00349-reading lastMonth_generated_energy
attr pvAnlage obj-i00349-unpack s>
attr pvAnlage obj-i00376-expr ("s>",$val/10)
attr pvAnlage obj-i00376-format %.1f
attr pvAnlage obj-i00376-poll 1
attr pvAnlage obj-i00376-reading actualYear_generated_energy
attr pvAnlage obj-i00376-unpack s>
attr pvAnlage obj-i00378-expr ("s>",$val/10)
attr pvAnlage obj-i00378-format %.1f
attr pvAnlage obj-i00378-poll 1
attr pvAnlage obj-i00378-reading lastYear_generated_energy
attr pvAnlage obj-i00378-unpack s>
attr pvAnlage openTimeout 2
attr pvAnlage queueDelay 0.05
attr pvAnlage queueMax 128
attr pvAnlage queueTimeout 20
attr pvAnlage retriesAfterTimeout 60
attr pvAnlage room Strom
attr pvAnlage stateFormat {sprintf("%.0f W", (ReadingsVal($name,"output_power",0) / 1) ) . " / ". sprintf("%.0f V", ReadingsVal($name,"input_voltage",0))}


Als Beispiel habe ich noch einen Plot von heute angefügt.

Gruß ttiger47

satprofi

Hallo.
welchen growatt nutzt du dafür? ich habe den 750s
gruss
-----------------------------------------------------------------------
beelink miniPC - Fhem 6.x CUL 868, FS20, NetIO230 CUL 433
HMLAN, HM-CC-RT-DN,Homematic Actoren,LD382A,Telegram

shorty1111

#2
Danke! Klappt bei mir prima mit nem Growatt 2500 mic tlx

Henno

Hat mal jemand versucht über FHEM und den Growatt MIV über Modbus Nulleinspeisung zu realisieren?
Für einen Modbus Zähler an den Growatt anzuschließen müsste ich zu viel Kabel ziehen....

pdp1173

Hallo,

für den Growatt SPH 3600 habe ich den Eastron SDM630 / TPM als Modbus via MQTT2 angebunden. Die Beispieldaten sind hier:

https://forum.fhem.de/index.php/topic,48170.msg1236002.html#msg1236002

Die MIN Serie sollte die gleichen Modbus Daten benutzten, es wird nach m.W. nur die Leistung ausgewertet (30013/30015/30017) . Zumindest die Anzeige im Shine Server Monitor stimmt überein.

Geht eigentlich ganz einfach, bitte ggf. den aktuellen Stand bei ChrisD im Github abholen (36_ModbusSlave.pm).

Viel Erfolg.

nexusplanet

@ttiger47

Danke für den Link zu der Registerbeschreibung.
Weißt Du zufällig, was der Unterschied zwischen low und high, zb. OutputPower(low), OutputPower(high), ist?

Nighthawk

Hier wäre noch eine recht einfache und günstige Alternative: https://github.com/otti/Growatt_ShineWiFi-S
Dafür benötigt man nur einen ESP8266 oder ESP32 und ein USB Kabel.

Wzut

Zitat von: ttiger47 am 23 August 2021, 20:34:53
Sicherlich kann man das etwas schlanker in FHEM codieren und ich bin dankbar für Verbesserungsvorschläge
Du kannst z.B. bei den Attributen stärker mit dev-i-defXY arbeiten und ersparst dir so es jedesmal pro Register zu wiederholen.
Bsp 
attr pvAnlage dev-i-defUnpack s> statt pro Register Bsp -> attr pvAnlage obj-i00000-unpack s>
ebenso Poll und Format , wenn def mal nicht passen sollte kann man es immer noch einzelnn überschreiben.
Deine vorhandene dev-h-def erscheinen mir dagegen überflüssig, da du gar keine h Register abfragst sondernn lediglich nur i 
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Tobias

Das Growatt Modbus Protokollformat sieht exakt so aus wie meines vom Solax.
Dementsprechend müsste mit Anpassung des Steuer JSON Auch mein ESP32 Solax MQTT Gateway Sketch funktionieren :)

Müsste mal jemand mit einem Growatt ausprobieren.
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

User_ohne_Zeit

#9
Hallo,

nachdem ich schon so einige Funktionen bei mir am Laufen habe, ohne selbst Mitglied zu sein, muss ich jetzt leider hier doch eine paar Fragen loswerden:
Ich habe auch zwei ebyte Ethernet auf RS485 erstanden.
Ziel ist es zunächst, die beiden zu nutzen um das SmartMeter mit dem Growatt Wechselrichter zu verbinden - das steht noch aus.
Als erstes habe ich jetzt eins der beiden mit dem Growatt WR verbunden.
Der Port fhem zu ebyte wird auch geöffnet, jedoch können keine Daten gelesen werden.
Ich habe die RX und TX Leitung entsprechend der Beschriftung von Growatt mit dem ebyte verbunden.
Im WR habe ich die RS485 Adresse auf 1 einstellt - entspricht vermutlich der ID in fhem MODBUSATTR Modul...

- an welchen Anschluss des Growatt Wechselrichters hast Du die RS485 Leitung angeschlossen? Ich habe jetzt RS485-3 genutzt
- welche Einstellung hast Du im WR vorgenommen unter RS485?
- welche Einstellungen zur Kommunkation hast Du im ebyte vorgenommen? 9600baud, 8bit usw..?
     -> OK, diese Frage konnte ich schonmal selbst beantworten, Du hast ja ein Bild Deiner Einstellung gepostet.

Vielen Dank für Deine Vorarbeit.

Grüße

PS: Das ist alles, was ich im Logging sehe:

2022.12.18 16:48:24 3: pvAnlage: Timeout waiting for a modbus response, read buffer empty,
request: id 1, read fc 4 i00000, len 1, master device pvAnlage, reading inverter_state (getUpdate for inverter_state len 1), queued 2.00 secs ago, sent 2.00 secs ago
2022.12.18 16:48:26 3: pvAnlage: Timeout waiting for a modbus response, read buffer empty,
request: id 1, read fc 4 i00000, len 1, master device pvAnlage, reading inverter_state (getUpdate for inverter_state len 1), queued 2.00 secs ago, sent 2.00 secs ago

ttiger47

Hallo User_ohne_Zeit,

nach einem Jahr mit meinem Growatt-Balkonkraftwerk habe ich auf eine große Anlage mit Huawei WR gewechselt und
das gelernte vom Growatt konnte ich gut übertragen. Somit kann ich hier jetzt nicht mehr viel nachschauen und weiter helfen.

Der Growatt hat für mich 740 kWh in 12 Monaten erzeugt, davon habe ich 700 selbst nutzen können.
Ein Balkonkraftwerk sollte eigentlich jeder haben oder eben mehr.

Gruß

User_ohne_Zeit

Hallo,

ich hab es jetzt geschafft alles soweit einzurichten.

Falls jemanden mein Setup mit RS485 zu Ethernet Konvertern interessiert, kann ich es gerne hier beschreiben.

Tatsächlich habe ich noch einen offenen Punkt: Ich versuche am SPH den aktuellen Stromverbrauch abzufragen, den dieser wiederum vom Smartmeter holt.
Weder im Register 40/41, noch 44/45 oder 48/49 war ich bisher damit erfolgreich. Diese sind immer 0.

Hat jemand dazu noch hilfreiche Ideen?

Danke sehr.

Tobias

Hi,
Benutzt du dieses Projekt? https://github.com/tobiasfaust/SolaxModbusGateway
Das setzen einige Growatt User bereits erfolgreich ein. Auch incl. Batterie.
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

User_ohne_Zeit

#13
Hallo,

danke für die Antwort.

Nein, das Projekt nutze ich nicht. Ich habe zwar auch einen RS485 zu Ethernet Konverter. Das FHEM ModbusAttr Plugin spricht aber direkt darüber.

So wie ich das von Dir referenzierte Projekt verstehe, stellt die dort vorhandenen SW per MQTT diverse, über Modbus ausgelesene, Werte zur Verfügung.

Ich sage jetzt mal vorsichtig das ist ein Umweg den ich nicht brauche, da ModbusAttr ja direkt über den RS485-zu-eth Adapter spricht.

Aber ich schaue dort mal, ob die den benötigten Wert gefunden haben.

Grüße

User_ohne_Zeit

Hallo,

leider kann ich den Wert dort auch nicht identifizieren.

Ich möchte ja den Wert haben, den der Growatt SPH vom Smartmeter liest. Dieser kann positiv oder negativ sein.

Schade. Vielleicht hat jemand noch einen Tipp.