solax x1 mini

Begonnen von Tim Oltmanns, 24 September 2022, 15:13:29

Vorheriges Thema - Nächstes Thema

Tim Oltmanns

Moin,

seit kurzem bin ich stolzer Besitzer eines Balkonkraftwerkes mit einem Solax X1 Mini (600W) Wechselrichter. Natürlich besteht dann der Wunsch, diesen über FHEM auszulesen bzw. anzubinden, ohne Benutzung der Solax-Cloud. Da ich im Forum bisher keine Lösung gefunden habe, habe ich mich mal an diesem Thema selbst versucht, welches ich nun mit euch teilen möchte...

Zwecks Hardware-Anbindung des Wechselrichters an den RPI setze ich einen "RPI USB RS485" Adapter ein. Dieser ist kostengünstig zu bekommen und leistet hervorragende Dienste.
Die Verdrahtung habe ich gemäß Anleitung durchgeführt, Pin 4(A) und Pin 5(B) am WR (RJ45) auf die Klemmen des Adapters. Am WR muss dann noch die Modbus-Schnittstelle freigeschaltet werden (Modbus RTU enable) in den erweiterten Einstellungen (Passwort: 2014) und eine passende Adresse (ID) ausgewählt werden. Ich habe die ,,2" gewählt, da unter ,,1" ein ,,Smart-Meter" bei mir läuft (SDM630).

Zur Erstellung des FHEM-Moduls habe ich das ,,98_ModbusSDM630M.pm" mit den passenden Adressen (Objekte) abgewandelt und neu erstellt. Allerdings habe ich nur die lesenden Objekte des WR ermittelt, eine Änderung der Parameter-Einstellungen ist über dieses Modul nicht möglich.


Readings:
E-today
E-total
Factory
Frequency
Iac
Ipv
Mode
Module
Power
Power_PV
Serial_Nr
Temperature
Vac
Vpv
state

Ach so, das Modul setzt das Modbus-Modul im FHEM natürlich voraus und wird mittels   "define <name> ModbusSolaxX1Mini <ID> <Interval>"  in FHEM eingebunden.

Viel Spaß bei der Verwendung (Fragen und Anregungen sind immer willkommen)...

Gruß Tim

brainworx

Moin Tim.

Besten Dank für den Wink. Habe deine ModbusSolaxX1Mini.pm bei mir eingebunden. Funktioniert hervorragend an meinem X1-1.5.

Danke Brain

Tobias

Hi Tim,
hättest du Zeit und Lust mit deinem Solax Mini mein ModBusMQTT Gateway zu testen?
Es funktioniert bereits bestens mit den "normalen" Solax und Growatt Wechselrichtern, aber der Mini hat ein "spezielles Protokoll und ich würde den Mini gerne bei mir in die Kompatibilitätsliste aufnehmen.
Im Grunde muss ich nur eine angepasste Checksum Funktion einbauen, der Rest ist Konfigurationsarbeit im JSON bei mir. Leider habe keinen Mini und bräuchte hier Unterstützung.

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

Tim Oltmanns

Hallo Tobias,

danke für deine Nachricht. Gerne unterstütze ich dich beim Testen deines ModBusMQTT Gateway mit dem Solax X1 mini.
Nur zurzeit betreibe ich meine Anlage mit einem Growatt TL-X 1500 Wechselrichter. Diesen hatte ich günstig bekommen und habe dann nochmal gewechselt.

Den Mini habe ich aber noch und werde diesen demächst auch wieder einsetzen. Danach melde ich mich zwecks Test dann nochmal...

Gruß Tim

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 reading103JSON Data_6
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",""))\
}