solax xHybrid Wechselrichter

Begonnen von stefan.apetz, 15 August 2017, 20:42:49

Vorheriges Thema - Nächstes Thema

emmes

Hallo Tobias,

ich habe ein anderes Breakout Board verwendet und seit dem kommen auch Werte an. Ich hatte bisher ein SP3485. Mit dem HW-0519 funktioniert es.
Die Werte sehen an manchen Stellen nicht plausibel aus. Ich habe an meiner Anlage einen Batteriespeicher installiert. Die Ausgabe zeigt aber 0% an. Ich habe 2 Screenshots angehangen.
Wie kann ich das korrigieren?
Ich besitze einen Wechselrichter X3-Hybrid-G4.

Danke und viele Grüße
ThomasDu darfst diesen Dateianhang nicht ansehen.

Tobias

Schau mal in mein Wiki. Da steht's wie man eigene Items findet bzw in deinem Fall korrigieren kann.
Schlussendlich brauche ich deine Ergebnisse damit ich sie in mein repo übernehmen kann
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

#62
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",""))\
}

Bitschubser

Hallo Tobias,
Habe dein Gateway mit meinem X3-Hybrid G4 verbunden. Bekomme auch die Werte in FHEM und kann sie verarbeiten. Funktioniert soweit super.
Auf "Off Grid Current L1" bekomme ich komische Werte: dort schwankt es zwischen -2400A und 3000A. Da würd es alle Kabel verglühen.  :)
Ist für mich eher unwichtig.
Viel interessanter:
Gibt es auch einen Rückkanal? Kann über FHEM der WR auch gesteuert werden? z.B. umschalten zwischen Eigenbedarf / Einspeisung, damit die Batterie nicht schon um 11 Uhr voll ist, sondern erst später geladen wird.

Danke, und schönen Gruß
Jens
FHEM in VM auf Proxmox, Homematic über 2x HM-Lan, Homematic-IP über Raspimatic in VM auf Proxmox, SMA-Wechselrichter, Pushover, TTS, Shelly + Sonoff über MQTT

hapege

Hi,
Die unplausiblen Werte für "Off Grid Current L1" hatte ich auch - nach einigem Experimentieren liegt es wohl daran, dass das jeweils letzte gelesene Register vom modbusGW nicht korrekt ausgewertet wird. Liest man 1 Register mehr, dann stimmt der Wert auch :)
Ich habe die Registerbereiche in der json so angepasst:
"RequestLiveData": [
        [
          "#ClientID",
          "0x04",
          "0x00",
          "0x00",
          "0x00",
          "0x55"
        ],
        [
          "#ClientID",
          "0x04",
          "0x00",
          "0x66",
          "0x00",
          "0x6B"
        ],
        [
          "#ClientID",
          "0x04",
          "0x00",
          "0xFF",
          "0x00",
          "0x23"
        ]
      ],
So liegt das jeweils letzte gelesene Register in einem ungenutzten Bereich ("REV" lt. Spec), und die Werte werden richtig angezeigt.
Der dritte Bereich oben gibt noch ein paar interessante Werte aus - zumindest bei meinem QVolt-HYP-G3-3P, der baugleich zum Solax X3 sein sollte.
Wenn man die Live Data Bereich so wie oben verwendet, müssen auch die "positions" in der json angepasst werden. Ich hänge mal meine json an, wie gesagt angepasst für den QCells, sollte aber auch beim Solax X3 funktionieren...
Du darfst diesen Dateianhang nicht ansehen.
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

Tobias

#65
Da lag glaub ich ein Denkfehler meinerseits vor. Ich bin gerade den ganzen Code durchgegangen, konnte aber kein Codingproblem feststellen.

Der "OffGridCurrent L1" liegt im Register 77. Da die Register aber mit 0 anfangen muss ich also folglich 78 register lesen um auch das 77er register zu lesen. Da in der Antwort als letztes immer ein CRC angehangen wird, wurde als  "OffGridCurrent L1" der CRC versucht auszuwerten.

Problem erkannt, Gefahr gebannt. Ich passe die register jsons an und übernehme deines als neues QCells modul.
Warum als eigenes? Dadurch das du 3 Aufrufe in der RequestLiveData hast, hast du zwar auch mehr an Daten aber auch das Limit auf 3sek angehoben. Jeder Request braucht 1sek. ;)

im Anhang die angepasst Solax-X3.json.
Kann die mal bitte jemand testen?
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