Direkte Anbindung von Growatt, Solax X1 und X3, G4 Serie ohne Cloud

Begonnen von Tobias, 15 Oktober 2022, 13:06:24

Vorheriges Thema - Nächstes Thema

Tobias

Hi,
da sich das Protokoll der neuen G4 Serie von den bisherigen G3 bzw der X1-Minis unterscheidet und es bis dato keine Möglichkeit gibt diese in FHEM oder anderen openSource Tools anzubinden, habe ich (bzw bin gerade dabei) über einen ESP32 und einem RS485 Adapter die Solax X1/X3 über Modbus-RTU via MQTT an FHEM anzuschließen.
Dabei ist es oberstes Ziel den WR lokal und NICHT über die Cloud anzubinden. Ebenso soll der Solax Wechselrichter OHNE(!) WLAN Stick arbeiten, also völlig autark ohne Internetanbindung (Thema: China-Cloud). Der Solax X1 hat keinen Modbus TCP Anschluss und kann ausschließlich über Modbus-RTU seriell angesprochen werden.
Btw: Über den WLAN Stick und der Einbindung des WLAN Sticks im LAN kann man auch Daten auslesen, allerdings gibt es dann auch einen nicht abschaltbaren offene(!) WLAN Accesspoint sowie das Funken der Daten in die China-Cloud. Deshalb muss bei mir der WR ohne(!) Stick arbeiten.

Aktuell befindet sich das Projekt noch in der Entwicklungsphase, auf der Seriellen Konsole werden aber schon die ersten Parameter ausgegeben.
Testpersonen mit einem Solax X1 oder X3 sind herzlich willkommen.

Hier das Projekt:
https://github.com/tobiasfaust/SolaxModbusGateway/

Warum Solax X1 G4 5.0 D?
Ich habe eine Dach Ost- bzw Westseite mit je 3,5kwp (9x 410Wp). 3phasige Wechselrichter sind kaum zu bekommen, ganz im Gegensatz zu einphasigen die quasi sofort lieferbar sind. Bei meiner Ausrichtung komme ich nicht über die erlaubten 20A (4.6KW).
Weiterhin ist das Installateurkennwort überall bekannt, ganz im Gegensatz zu anderen WR wie zb. Kostal.
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

Tobias

#1
Hi,
das erste lauffähige Release ist fertig :)

https://github.com/tobiasfaust/SolaxModbusGateway
Binaries sind in der Releaseübersicht dort zu finden.

Es wäre schön wenn andere Solax Besitzer testen könnten


first runnable version:

    only with livedata
    configurable data in webfrontend
      Transmission Interval
      Modbus Client-ID
      Modbus Baudrate
      Wifi Credentials via Wifimanager
      MQTT Server, Port and optional Credentials
      MQTT Basepath and Hostname

    Status Overview at webpage
      IPAdresse
      WiFiName
      Wifi RSSI
      MQTT Status
      Uptime
      Free Memory

    And Buttons to:
      Reboot
      Reset
      WiFi Credentials Reset
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

Tobias

Die Software des Gateways ist jetzt fertig. Sollte jetzt alles funktionieren. Falls es keine Bugs gibt, gibt es erstmal keine Weitereintwicklung. Wüsste nicht was ;)

Da das RS-485 Protokoll der Growatt Wechselrichter fast identisch ist, ist es sehr einfach es auf Growatt zu erweitern, falls sich hier ein Growatt User findet der testen will :)

Am Einfachsten kann man die Firmware mit gitpod kompilieren, von dort herunterladen und dann auf den ESP uploaden. Im Wiki hab ich dazu eine eigene Seite erstellt: https://github.com/tobiasfaust/SolaxModbusGateway/wiki
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

Tobias

Dank eines Users aus dem openWB Forum ist jetzt auch der Growatt integriert.
Theoretisch kann jeder beliebe WR mit Modbus-RTU RS-485 integriert werden. Eine Anleitung dafür habe ich im Wiki veröffentlicht.

https://github.com/tobiasfaust/SolaxModbusGateway/wiki/adding-new-inverters-or-items

Die Ansteuerung einer openWB ist jetzt auch direkt implementiert
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

saller.net

Hi,

Ich habe grade neu einen Solax X3-Hybrid-G4. Über die Solaxcloud.com API lässt er sich als HTTPMOD wunderbar in FHEM einbinden, aber dazu muss er ja ins Internet funken und die Daten sind nur alle 5 Minuten aktualisiert, wie ihr sicher eh wisst. Ich hab auch versucht, ihn auf alle erdenklichen Weisen über die lokale IP-Adresse einzubinden. Der LAN-Dongle lässt aber überhaupt gar keinen Zugang über http zu, der WLAN-Dongle nur um die TCP/IP Einstellungen bzw. den WLAN-AP einzustellen. Wenn man über das WLAN-Dongle eigene WLAN verbunden ist, kann man über 192.168.10.10 auch lokal Daten abfragen (zumindest über die SolaxCloud APP funktioniert das dann), allerdings möchte ich ja nicht in diesem WLAN verbleiben. Hierzu würde zwar eine WLAN Bridge (siehe RPI Projekte) helfen, das ist meiner Ansicht nach aber viel zu kompliziert und benötigt wieder zusätzliche Hardware. Genau wie das ModbusMQTT Gateway vom Tobias. Darum hätte ich eine Bitte/Frage: Anscheinend funkt der WLAN-Dongle auch im ModBus Protokoll am Port 502, zumindest bekomme ich auf diesem Port keine Fehlermeldung ERR_CONNECTION_REFUSED, sondern "nur" ERR_CONNECTION_RESET, vermutlich wegen eines Authentifzierungsproblem oder false Sub-Adresse. Könnte man hier nicht direkt die Daten über TCP/IP Abfragen, dann bräuchte man nicht noch die serielle Anbindung, oder versteh ich hier etwas falsch?

saller.net

#5
Ich habe meinen Solax Wechselrichter jetzt über WLAN ins FHEM einbinden können und die meisten (zumindest die für mich relevanten) Daten entschlüsselt.
Du darfst diesen Dateianhang nicht ansehen.
Du darfst diesen Dateianhang nicht ansehen.
Mein Fehler war die ganze Zeit der abschließende Slash, wenn man den nicht beim DEF mit angibt, kommt bei den HttpUtils immer ein "malformed or unsupported URL" zurück. Außerdem lässt nur der WLAN-Dongle am Solax-Wechselrichter den Zugriff über http (ich vermute wegen der WLAN-Einbindungs-Möglichkeit ins eigene Netzwerk, beim LAN-Dongle kommt immer "Zugriff verweigert"). Außerdem laufen einige Werte (z.B. Batterieleistung und Einspeise-Leistung auch ins negative, was anscheinend bei dem von Solax zurückgegebenen Wert zu einem int-16-bit overflow führt, was man an den hohen Werten nahe 65.535 sehen kann. Das hab ich jetzt einfach so gelöst, dass ich bei Überschreiten des halben Puffers (also 65.535/2) einfach von 65.535 abziehe.

Hier ist mein aktueller Arbeitsstand der Mappings, solltet ihr andere Mappings finden/verwenden, gerne her damit:
defmod solax_local HTTPMOD <IP-Adress deines WLAN-Dongles mit abschließendem Slash, z.B. http://192.168.0.208/> 30
attr solax_local disable 0
attr solax_local extractAllJSON 1
attr solax_local group energy
attr solax_local reading101JSON Data_103
attr solax_local reading101Name result_soc
attr solax_local reading102JSON Information_0
attr solax_local reading102Name rated_capacity
attr solax_local reading103Name AC_Power1
attr solax_local reading103OExpr if ($val > 65535/2) {return $val-65535} else {return $val}
attr solax_local reading104JSON Data_7
attr solax_local reading104Name AC_Power2
attr solax_local reading104OExpr if ($val > 65535/2) {return $val-65535} else {return $val}
attr solax_local reading105JSON Data_8
attr solax_local reading105Name AC_Power3
attr solax_local reading105OExpr if ($val > 65535/2) {return $val-65535} else {return $val}
attr solax_local reading106JSON ver
attr solax_local reading106Name FW_Wifi
attr solax_local reading107JSON Data_34
attr solax_local reading107Name result_feedinpower
attr solax_local reading107OExpr if ($val > 65535/2) {return $val-65535} else {return $val}
attr solax_local reading108JSON Data_169
attr solax_local reading108Name BAT_Voltage
attr solax_local reading108OExpr $val/100
attr solax_local reading109JSON Data_14
attr solax_local reading109Name result_powerdc1
attr solax_local reading109OExpr if ($val > 65535/2) {return $val-65535} else {return $val}
attr solax_local reading110JSON Data_15
attr solax_local reading110Name result_powerdc2
attr solax_local reading110OExpr if ($val > 65535/2) {return $val-65535} else {return $val}
attr solax_local reading115JSON Information_2
attr solax_local reading115Name result_inverterSN
attr solax_local reading138JSON Data_2
attr solax_local reading138Name AC_Current1
attr solax_local reading138OExpr $val / 10
attr solax_local reading141JSON Data_44
attr solax_local reading141Name result_batPower
attr solax_local reading141OExpr if ($val > 65535/2) {return $val-65535} else {return $val}
attr solax_local reading142JSON sn
attr solax_local reading142Name result_sn
attr solax_local reading146JSON Data_0
attr solax_local reading146Name AC_Voltage1
attr solax_local reading146OExpr $val / 10
attr solax_local reading147JSON Data_1
attr solax_local reading147Name AC_Voltage2
attr solax_local reading147OExpr $val/10
attr solax_local reading148JSON Data_2
attr solax_local reading148Name AC_Voltage3
attr solax_local reading148OExpr $val/10
attr solax_local reading149JSON Data_3
attr solax_local reading149Name AC_Current1
attr solax_local reading149OExpr $val/10
attr solax_local reading150JSON Data_4
attr solax_local reading150Name AC_Current2
attr solax_local reading150OExpr $val/10
attr solax_local reading151JSON Data_5
attr solax_local reading151Name AC_Current3
attr solax_local reading151OExpr $val/10
attr solax_local reading159JSON Data_12
attr solax_local reading159Name DC_Current1
attr solax_local reading159OExpr $val / 10
attr solax_local reading160JSON Data_13
attr solax_local reading160Name DC_Current2
attr solax_local reading160OExpr $val/10
attr solax_local reading168Format %.3f
attr solax_local reading168JSON Data_70
attr solax_local reading168Name result_yieldtoday
attr solax_local reading168OExpr $val / 10
attr solax_local reading179JSON Data_10
attr solax_local reading179Name DC_Voltage1
attr solax_local reading179OExpr $val / 10
attr solax_local reading180JSON Data_11
attr solax_local reading180Name DC_Voltage2
attr solax_local reading180OExpr $val / 10
attr solax_local reading181JSON Data_75
attr solax_local reading181Name Data_75
attr solax_local reading193JSON Data_9
attr solax_local reading193Name result_acpower
attr solax_local reading193OExpr if ($val > 65535/2) {return $val-65535} else {return $val}
attr solax_local reading195JSON Data_47
attr solax_local reading195Name result_consumepower
attr solax_local reading195OExpr if ($val > 65535/2) {return $val-65535} else {return $val}
attr solax_local reading196JSON Data_68
attr solax_local reading196Name result_yieldtotal
attr solax_local reading196OExpr $val / 10
attr solax_local reading207JSON type
attr solax_local reading207Name Inverter_Type
attr solax_local reading90JSON Data_88
attr solax_local reading90Name result_consumeenergy
attr solax_local reading90OExpr $val/100
attr solax_local reading99JSON Data_105
attr solax_local reading99Name BAT_Temperature
attr solax_local requestData optType=ReadRealTimeData/?pwd=<SN deines WLAN-Dongles, QR-Code>
attr solax_local requestHeader1 Content-Type: application/json
attr solax_local requestHeader2 Accept: application/json
attr solax_local room energy
attr solax_local stateFormat {sprintf(\
"PV-Leistung (Solax DC): %i W <br>\
WR-Leistung (Solax AC): %i W <br>\
Einspeise-Leistung(Solax): %i W<br>\
Haus-Leistung (Solax): %i W<br>\
Batterie-Leistung: %i W<br>\
Batterie-Loading: %i %%<br>\
Yield (Heute/Gesamt): %.1f / %.1f kWh<br>\
SN (Dongle/WR): %s / %s",\
ReadingsVal($name,"result_powerdc1",0)+ReadingsVal($name,"result_powerdc2",0),\
ReadingsVal($name,"result_acpower",0),\
ReadingsVal($name,"result_feedinpower",0),\
ReadingsVal($name,"result_consumepower",0),\
ReadingsVal($name,"result_batPower",0),\
ReadingsVal($name,"result_soc",0),\
ReadingsVal($name,"result_yieldtoday",0),\
ReadingsVal($name,"result_yieldtotal",0),\
ReadingsVal($name,"result_sn",""),\
ReadingsVal($name,"result_inverterSN",""))\
}

Alternativ kann man den Solax Wechselrichter auch über die Internet-Web-Schnittstelle anbinden, dazu muss er aber im Internet hängen und die Daten werden nur alle 5 Minuten aktualisiert, da bekommt man auch wesentlich weniger Daten raus, genügt aber für den normalen Gebrauch, nur die Haushalts-Energie hab ich dort noch nicht gefunden, lässt sich aber auch einfach durch acpower-feedinpower ausrechnen:
defmod solax HTTPMOD https://www.solaxcloud.com/proxyApp/proxy/api/getRealtimeInfo.do?tokenId=<token über die solaxcloud generiert>&sn=<SN deines WLAN-Dongles, QR-Code> 60
attr solax extractAllJSON 1
attr solax group energy
attr solax requestHeader1 Content-Type: application/json
attr solax requestHeader2 Accept: application/json
attr solax room energy
attr solax stateFormat {sprintf(\
"PV-Leistung (Solax DC): %i W <br>\
WR-Leistung (Solax AC): %i W <br>\
Einspeise-Leistung(Solax) %i W<br>\
Haus-Leistung (Solax): %i W<br>\
Batterie-Leistung: %i W<br>\
Batterie-Loading: %i %%<br>\
Yield (Heute/Gesamt): %.1f / %.1f kWh<br>\
SN (Dongle/WR): %s / %s",\
ReadingsVal($name,"result_powerdc1",0)+ReadingsVal($name,"result_powerdc2",0),\
ReadingsVal($name,"result_acpower",0),\
ReadingsVal($name,"result_feedinpower",0),\
ReadingsVal($name,"result_acpower",0)-ReadingsVal($name,"result_feedinpower",0),\
ReadingsVal($name,"result_batPower",0),\
ReadingsVal($name,"result_soc",0),\
ReadingsVal($name,"result_yieldtoday",0),\
ReadingsVal($name,"result_yieldtotal",0),\
ReadingsVal($name,"result_sn",""),\
ReadingsVal($name,"result_inverterSN",""))\
}

maertelix

Hallo saller.net und danke für deine beiden Mappings.
Ich hab beide Möglichkeiten an einem Solax X3 probiert. Über die Internet-Web-Schnittstelle funktioniert - da kommt nur ab und zu ein Time-Out. Direkt über W-LAN kriege ich es nicht zum laufen. Da stehen immer diese Meldungen im log

2024.04.10 09:08:12 3: solax_local: Content-Type was  text/html
2024.04.10 09:08:12 3: solax_local: no parsed JSON structure available

Und wenn ich direkt aus dem Web-Browser die Adresse aufrufe, wird eine Anmeldung mit Passwort verlangt. Vielleicht liegt es daran. Aber ich weiß nicht wie diese sind - hab schon verschiedenes probiert.

Ist das Mapping noch aktuell? Hast du oder sonst jemand eine Idee?

Liebe Grüße

Tobias

Warum nutzt du nicht die lokale Modbus Schnittstelle? Kein WLAN, keine cloud und ein updateintervall ab 2sek.
In FHEM müssen dann nur noch die MQTT Nachrichten abonniert werden - und fertig.

Dafür hatte ich extra einen ESP Sketch geschrieben:
https://github.com/tobiasfaust/SolaxModbusGateway
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

maertelix

Ich hab den Fehler gefunden - sorry. Den Eintrag hatte ich vergessen: pwd=<SN deines WLAN-Dongles, QR-Code>

Aber über den script deiner (saller.net) plots würde ich mich freuen.

Liebe Grüße

maertelix

Hallo Tobias,
dein Projekt ist bestimmt super, und du hast das auch klasse beschrieben. Aber die Einbindung der mappings ist als "ungeübter Raspberry Pi User" und "wenig Englisch Versteher" doch wesentlich einfacher. Außerdem habe ich an der Modbus-Schnittstelle direkt einen My-PV-Heizstab eingebunden. Ich weiß nicht ob beides geht.

Vielleicht probiere ich es mal aus, wenn ich verstanden habe, wie ich dein Projekt auf den Raspberry bringe.