NEWS
Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden
-
Hallo,
erstmal vielen Dank für die Anleitung hier im Forum.
Gestern wurde mein SH10RT Hybridwechselrichter installiert. Leider will die Verbindung zum Iobroker nicht so recht klappen.Er holt sich genau einmal die Daten und auch nur eine Handvoll. Das keine Batteriedaten geliefert sind ist klar, da ich keine habe. Aber der komplette Netzbezug fehlt zum Beispiel.
Der Adapter geht auch immer nur ganz kurz auf grün um im Anschluss wieder auf gelb zu gehen.
Anbei ein Screenshot aus dem Protokoll:
Was mache ich falsch?
Vielen Dank und viele Grüße Henning
-
@gmt94 said in Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden:
Was mache ich falsch?
Ob da ein grundsätzlicher Fehler vorliegt kann ich nicht sagen. Aber diese Art Abbrüche hatte ich auch schon. Der Modbus Slave scheint recht sensibel zu sein und kommt nach einem "Fehler" von selbst nicht mehr in den Tritt. Welcher Art der Fehler sein kann weiß ich nicht sicher - aber ich hatte den Eindruck, dass er auftrat, wenn ich bei den Timeouts vom Vorschlag abwich.
Geholfen hat am Ende nur das Ausschalten und Wiedereinschalten.
Das geht natürlich physisch sowieso, aber auch theoretisch über die iSolarCloud (hat bei mir irgendwie nie funktioniert, die Funktion ist aber da) und über den Direktzugang WiNet-S. -
So habe die Beiträge alle durchgeackert und verschiedene Konfiguration getestet. Nun läuft es. Habe jetzt auch die passenden IDs für meinen wechselrichter gefunden. Und es werden alle notwendigen Infos übertragen.
Vg Henning
-
Hallo,
ich habe alles nach der Anleitung istalliert und die neue Liste wie @MRaioBroker verwendet. Damit bekomme ich schon werte aus meinem Sungrow WR.
Leider erhallte ich ca. alle 5 sekunden einen Fehler im Protokoll angezeigt. Folgende Fehler werden ausgegeben:
modbus.0 2023-01-25 17:01:31.937 warn Poll error count: 6 code: {"err":"timeout","timeout":5000} modbus.0 2023-01-25 17:01:31.936 error Client in error state. modbus.0 2023-01-25 17:01:31.936 error Request timed out. modbus.0 2023-01-25 17:01:31.935 warn Error: undefined
und
modbus.0 2023-01-25 17:01:07.909 warn Poll error count: 3 code: {"err":"timeout","timeout":5000} modbus.0 2023-01-25 17:01:07.908 error Client in error state. modbus.0 2023-01-25 17:01:07.907 error Request timed out. modbus.0 2023-01-25 17:01:07.905 warn Error: undefined modbus.0 2023-01-25 17:01:01.851 warn Poll error count: 2 code: "App Timeout" modbus.0 2023-01-25 17:00:56.663 warn Error in handler for 4: RangeError [ERR_BUFFER_OUT_OF_BOUNDS]: Attempt to access memory outside buffer bounds modbus.0 2023-01-25 17:00:55.597 warn Poll error count: 1 code: "ReadInputRegisters: Invalid FC 132"
Danach verbindet sich der Adapter jedes Mal neu.
Hat jemand eine Idee wie ich diesen Fehler beheben kann?
Vielen Dank!
-
@d-franz Ich würde behaupten du hast einen Fehler bei den Adressen vom Eingangsregister gemacht..
"warn Poll error count: 1 code: "ReadInputRegisters: Invalid FC 132" überprüf mal ob alle Adressen im gültigen Bereich liegen.
MFG
-
Ich hab bis her noch keine Code für die Aufschlüsselung des Registers 12999 - System_State gefunden.
Daher möchte ich gerne meinen Code zu Verfügung stellen (wie immer gilt das Ein- und Ausgänge & Pfade entsprechend angepasst werden müssen). Bei Verbesserungsvorschlägen immer raus mit der Spracheconst idVar = 'modbus.0.inputRegisters.12999_System_State'; var bez = 'javascript.0.scriptEnabled.Eigene_Skripte.Solar.G01_-_SH10RT.SystemState.SystemState'; var text = "" createState(bez,"", {name: 'SystemState', read: true, write: true, desc: "Automatisch erzeugt",type: "string", role: "state"}); function dec2text(dp) { switch (dp) { case 2: text = "Stop" break; case 8: text = "Standby" break; case 16: text = "Initial Standby" break; case 32: text = "Startup" break; case 64: text = "Running" break; case 256: text = "Fault" break; case 1024: text = "Running in maintain mode" break; case 2048: text = "Running in forced mode" break; case 4096: text = "Running in off-grid mode" break; case 9473: text = "Restarting" break; case 16384: text = "Running in External EMS mode" break; default: text = "Code = " + dp + " not defined!" break; } setState(bez, text, true); } dec2text(getState(idVar).val); //Frage Zustand bei Skriptstart ab on(idVar, function(dp) { // Triggern bei Wertänderung in idVar dec2text(dp.state.val); })
Als Grundlage beziehe ich mich auf die Sungrow "Communication Protocol of Residential Hybrid Inverter"
Ihr werdet parallelen zum Script von @ostseeskipper für den Running_State feststellen, dieses hab ich hierfür umgeschrieben.
-
@gombersiob said in Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden:
Zum Beispiel zeigt mir die iSolarCloud sogar Entladungen aus der Batterie in Richtung Netz aus.
Ich habe es als Problem an meine Installationsfirma gemeldet, dass:
- Strom exportiert wird, obwohl die Batterie noch nicht voll ist
- Die Batterie Strom exportiert (zumindest nach Aussage von iSolarCloud). Wie ich das mit den ModBus-Daten zeigen kann ist mir nicht klar. Woher weiß die iSolarCloud das also?
- Die Batterie importiert Strom aus dem Netz. Sie füllt sich, obwohl noch kein Strom überhaupt erzeugt wurde.
Gestern kam die Nachricht, dass dieses Verhalten bekannt sei und es inzwischen per Firmware-Upgrade behoben wurde.
Ich habe mir mit Blockly eine Überwachung geschrieben. Die hatte heute schon Alarm egschlagen. Es zeigt sich, dass heute 800 Wh exportiert, aber die Batterie nicht aufgeladen wurde. Der Installateur meint, diese Messtoleranz müsse einkalkuliert werden und solche Einspeisewerte seien unumgänglich. -
Hi, kann mir mal jemand sagen, welche Holdingregister ich beschreiben muss, um die Batterie zu einer bestimmten Zeit aus dem Netz zu laden oder um eine Zwangsladung sofort zu starten und zu beenden?
-
@blacksheep587
Kann ich zwar nicht sagen, es würde mich aber interessieren, warum man das tun wollte. Haben Sie irgendeinen Tarif in dem die Preise wechseln? -
@gombersiob
Meine Idee ist, zu Tibber zu wechseln. Der Tarif ist Börsenabhängig und wechselt stündlich den Preis.
Das bedeutet, ich könnte im Winter, wenn der Ertrag schlecht ist, meinen Speicher Nachts, wenn der Strom vielleicht nur 20Cent kostet, voll machen, und dann tagsüber, wenn der Preis 40Cent beträgt, meinen Speicher leer machen.
Meine Idealvorstellung ist dann, das ganze mit einer Ertragsprognose für den Folgetag noch "smart" zu machen, um bei einem kommenden Sonnentag nicht schon den Speicher voll zu haben.Gleiches funktioniert dann auch mit unserem E-Auto. Unsere Wallbox unterstützt Tibber hier schon ab Werk.
-
Hallo.
Danke @Atlantis für deine super Anleitung.
Ich hätte eine Frage an dich und euch.Besteht die Möglichkeit sich den DTS666 zu sparen und die Info über den aktuellen Stand des Netzes per Holding Register an den WR zu senden?
Ich habe die Information über den aktuellen Bezug/Einspeisung bereits im IObroker drin über das Auslesen des Zählers.
Somit wäre der DTS666 quasi doppelt, da er ja auch nur den aktuellen Stand ausliest.
Die Information, die mir ja bereits vorliegt, muss ich ja somit nur noch an den WR bekommen.
Ich habe es mit dem Holding Register 13085 bereits probiert, aber ohne Erfolg.
Oder seht ihr keine Möglichkeit außer tatsächlich den DTS666 einzubauen und darüber die Kommunikation zum WR aufzubauen?Danke
-
@atlantis said in Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden:
Wenn man z.B. mit 500 W Laden/ Entladen möchte muss man folgende Holdings beschreiben:
EMS Mode = 2 (Quasi Handsteuerung)
13084 Einmalig mit einem Startwert versehen
EMS Charge/Discharge Comand13050 wie folgt setzen:
170 (Dezimal) = AA (Hexadezimal) <=> Charge/ Laden;
187 (Dezimal) = BB: <=> Discharge / Entladen;
204 (Dezimal) 0xCC <=> Stop (Anhalten/ Default );Ich habe es mal so versucht:
13049 EMS Mode 2
13083 statt 13084 2000W
13050 170 (Dezimal) = AA (Hexadezimal) <=> Charge/ Laden;Es tut sich aber leider nix. Müssen die Werte "bestätigt" sein?
-
@gombersiob sagte in Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden:
Nur die Adresswerte sollten Sie in Ihrem Post noch anpassen (13002 statt 1302, z.B.)
Vielen Dank für den Hinweis, korrigiert
-
@gombersiob sagte in Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden:
Strom exportiert wird, obwohl die Batterie noch nicht voll ist
Ebenfalls erlebt und an Solarteur gemeldet (Nachdem ich netzunabhängigen Modus mit 25% SOC (state of charge) und Zwangsladung SOC 25% einstellte). Akku ging nicht mehr über 25% und Energie ins Netz.
Firmwareupdate hatte ich vorher schon gemacht (Anleitung im Netz zu finden).
Irgendwann gings dann wieder einfach so...
Mittlerweile SOC Sollwerte wieder auf 0 gesetzt, weil wohl auch im Januar an einem sonnigen Tag der Akku sonst "überläuft". -
@ostseeskipper sagte in Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden:
Kurze Frage: Woran macht ihr es fest das der WR die Battarie lädt oder nicht?
In #13021 wird ja leider kein Vorzeichen mitgeliefert woran man erkennt ob geladen oder entladen wird.
Lt Kommunikationsprotokoll versteckt sich der Status "Laden" oder "Entladen" in #130000 Running State. Das ist zwar U16 aber die Interpretation muss auf Bit Ebene im Bit 1 und 2 stattfinden.
Gibts dafür schon ne Lösung nur das Bit 1 und 2 als Status auszulesen ?Wurde das Problem hier schon aufgelöst? Ich kann in EVCC sonst nicht über den IO-Broker arbeiten...
Ggf hat hier jemand schon was über ein Blockly gebastelt?
Wenn ja gerne mal hier auflösen.
#13000 Running State-> gibt es da schon eine Liste was die Angaben da bedeuten? -
Hallo
und erstmal vielen Dank für Eure Arbeit .
Ich bin erst neu hier, habe aber von Euch schon sehr profitiert.
Deshalb möchte ich eine Kleinigkeit zurück geben.
In der Registertabelle steht als Einheit "Kwh" müsste aber korrekterweise "kWh" heißen.
Kann das jemand in der Tabelle ändern?
Vielen Dank....
-
@mr1burns said in Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden:
#13000 Running State-> gibt es da schon eine Liste was die Angaben da bedeuten?
In der Sungrow Dkou steht:
-
@stealthangel said in Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden:
In der Registertabelle steht als Einheit "Kwh" müsste aber korrekterweise "kWh" heißen.
Kann das jemand in der Tabelle ändern?Das Problem ist mittlerweile festzustellen, in welcher der Tabellen hier im Thread sollte das geändert werden? Ich kenne mindestens 4 Beiträge in denen die Tabelle eingtragen ist.
Für mich habe ich die Unit auch gleich auf "kWh" geändert - und so manches andere. Die Codierung des Vorzeichens ist, wenn ich recht erinnere, nicht überall richtig. Außerdem gefällt mir nicht, dass die Groß und Kleinschreibung bei den Datenpunkten ziemlich zufällig ist. Aber das sind Sachen die jeder für sich im Abgleich mit der Sungrow-Angabe selber herausfinden kann. Wenn ich jetzt was hier rein stelle verbessert das nichts, weil jeder für sich doch klären muss, welche hier nun zu findenden Tabellen denn jetzt die Richtige ist.Wir müssten irgendwo eine Stelle finden, wo wir diese Tabellen tatsächlich pflegen. Vielleicht einen Thread der nicht so lang wird wie dieser hier. Nichtsdestotrotz stelle ich meine Version mal ein.
20230227-Eingangsregister_Stand_V1.1.37.txt
Beachte: In dem zweiten File (Differences.pdf) habe ich die Änderungen zu der ursprünglichen Liste die von Atlantis hier vorgestellt wurde, aufgezählt. Es sind nur die Änderungen zu sehen! Bei Gleichheit ist das entsprechende Feld leer. Unbeachtet sind die 6xxx-Adressen, die ich gar nicht pflege, da diese Adressen in meinem Wechselrichter nicht angeboten werden.
Beachte: Man kann meine Tabelle nicht ohne Weiteres anstelle einer Tabelle, die bisher verwendet wurde, benutzen. Da ich die Namen der Datenpunkte verändert habe, werden sie von Scripten (Blockly, JS oder TS) nicht mehr gefunden. Die Namen müssen also in den Scripten auch angepasst werden.
-
@mr1burns said in Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden:
Wurde das Problem hier schon aufgelöst?
Das würde mich auch sehr interessieren. Mich irritieren zum Beispiel die unerwarteten Ladevorgänge der Batterie, die mir von der iSolarCloud angezeigt werden. Ich würde sie gerne mit den ModBus-Daten auch "sehen" können.
Ich schreibe über mein RaspBerryPi die Modbus Daten alle 15 Minuten als XML lokal weg (mit einem selbstgeschriebenen Java-Programm, nicht mit ioBroker).
Da habe ich heute morgen um 9:20 Uhr diesen Screenshot von iSolarCloud gemacht:
Um 9:30 zog mein Programm u.A. diese Werte:
<details value="0" unit="" name="**Running State**" address="**13000**" description="Betriebsstatus"/> <details value="624" unit="W" name="Total DC Power" address="5016" description="PV-Leistung aktuell"/> <details value="193" unit="W" name="Load Power" address="13007" description="Wirkleistung gesamt"/> <details value="-558" unit="W" name="Export power" address="13009" description="Aktuelle Leistung am Übergabepunkt des Versorgungsnetzes"/> <details value="0.5" unit="kWh" name="Daily Battery Charge Energy from PV" address="13011" description="Energie in Speicher heute"/> <details value="988" unit="W" name="Battery Power" address="13021" description="Batterieladeleistung"/> <details value="3.1" unit="%" name="Battery Level" address="13022" description="Batteriekapazität"/> <details value="-365" unit="W" name="Total Active Power" address="13033" description="Eigenverbrauch aktuell"/> <details value="0.5" unit="kWh" name="Daily Charge Energy" address="13039" description="Batterie-Ladeenergie heute"/>
Der Running State ist 0 also ist auch Bit1 0. Trotzdem zeigt mir die iSolarCloud deutlich "Batterie Laden" an. (Es gibt eine zeitlich Diskrepanz zwischen Screenshot und den Daten. Leider habe ich nicht um 9:30 den ScreenShot gezogen. Trotzdem bin ich sicher, dass prinzipiell geladen wurde. Es zog sich hin und zeigte auch 9:45 noch ein ähnliches Bild).
Und es funktioniert auch logisch nicht anders.
Die PV-Anlage erzeugt 624W. Vom Netz kommen insgesamt 558W rein (-558). Den Eigenverbrauch von -365W verstehe ich nicht. Der Verbrauch ist normalerweise positiv. Wenn der Strom von der PV-Anlage komplett in diee Batterie geht, dann fehlen noch 364W (das sind ungefähr 365W - wie der Wert vom Eigenverbrauch, könnte passen). Das hiesse das Haus verbraucht 193W (558-365=193), den Wert finde ich auf Register 13007 (Load Power).Ich habe mir aus einem aktuellen Anlass mal die Zahlen zusammengesponnen. Ich krieg die Register nicht wirklich, auch nicht mit den Vorzeichen, auf die Reihe.
-
@gombersiob said in Sungrow WR SGH10RT erfolgreich mit MODBUS eingebunden:
Ich krieg die Register nicht wirklich, auch nicht mit den Vorzeichen, auf die Reihe.
Ich habe das jetzt nochmal mit einem aktuellen Fall von heute morgen 11:15 verglichen:
In derselben Minute hat mein Programm folgende Modbus-Daten gefunden
<details value="5935" unit="W" name="Total DC Power" address="5016" description="PV-Leistung aktuell"/> <details value="715" unit="W" name="Load Power" address="13007" description="Wirkleistung gesamt"/> <details value="4765" unit="W" name="Export power" address="13009" description="Aktuelle Leistung am Übergabepunkt des Versorgungsnetzes"/> <details value="454" unit="W" name="Battery Power" address="13021" description="Batterieladeleistung"/> <details value="98.9" unit="%" name="Battery Level" address="13022" description="Batteriekapazität"/> <details value="5480" unit="W" name="Total Active Power" address="13033" description="Eigenverbrauch aktuell"/>
Das sind nicht dieselben Werte (eine Minute hat 60 Sekunden) - aber vermutlich dieselben Trends.
Desweiteren habe ich noch ein Bild vom 17. Januar 8:43 Uhr:
und diesen Registereinträgen (von 8:45 Uhr):
<details value="214" unit="W" name="Total DC Power" address="5016" description="PV-Leistung aktuell"/> <details value="0" unit="" name="Running State" address="13000" description="Betriebsstatus"/> <details value="239" unit="W" name="Load Power" address="13007" description="Wirkleistung gesamt"/> <details value="-26" unit="W" name="Export power" address="13009" description="Aktuelle Leistung am Übergabepunkt des Versorgungsnetzes"/> <details value="0" unit="W" name="Battery Power" address="13021" description="Batterieladeleistung"/> <details value="0.0" unit="%" name="Battery Level" address="13022" description="Batteriekapazität"/> <details value="213" unit="W" name="Total Active Power" address="13033" description="Eigenverbrauch aktuell"/>
DIe Registereinträge passen m.E. nicht zum Bild. Im Bild wird die Batterie aus Netz und PV geladen, die Register deuten an, dass Haus aus PV und aus Netz beschickt werden. Beide Fälle sind interessant - aber ich kann gerade keinen Algorithmus daraus ableiten.
Nach meiner Meinung hat Register 13009 einen leicht irreführenden Namen, es sollte "Grid Power" heißen. Denn es ist ein zusammengesetzter Wert (Summe) aus Strom-Export (PV oder Batterie) oder Import in Batterie und Hausstrom. Die Beschreibung, die man in den Registertabellen hier im Thread findet. trifft es besser.
Wenn Register 13009 positiv oder 0 ist, wird Strom exportiert.
Der gesamte Hausverbrauch wird von der PV und/oder Batterie gedeckt.
Batterieladung ist dann: Battery Power(13021) = Total DC Power(5016)-Load Power(13007)-Export power(13009)private boolean isBatteryChargingFromPV( double pvPower, double loadPower, double exportPower, double batteryPower, double totalPower) { boolean isBatteryChargingFromPV = (pvPower > 0); isBatteryChargingFromPV &= (batteryPower > 0); if (exportPower < 0) { isBatteryChargingFromPV &= (pvPower > Math.abs(loadPower + exportPower)); } return isChargingFromPV;
Wenn Register 13009 negativ ist, dann wird Strom am Netzeingang importiert. Strom, der an der PV erzeugt wird, kann also nur ins Haus oder an die Batterie abgegeben werden.
Die Battery Power(13021) setzt sich dann wohl zusammen aus dem was vom Netz kommt (Export power(13009)-Load Power(13007) und dem Strom von der PV (Total DC Power(5016)-Load Power(13007))private boolean isBatteryChargingFromNet( double pvPower, double loadPower, double exportPower, double batteryPower, double totalPower) { boolean isChargingFromNet = (exportPower < 0); isChargingFromNet &= (Math.abs(loadPower) < Math.abs(exportPower)); return isChargingFromNet; }