NEWS
[Adapter] cloudfreie Auslesung von Deye-Invertern
-
@romeleitis 60 Sekunden sollten für den Sun2000 kein Problem sein. Wo stehen wir derzeit? Ich hab da gerade die Übersicht bei dir verloren.
-
@Rene55 Ich hatte ursprünglich einen Deye Sun 600. Dann bin ich auf einen Deye Sun 2000 G4 gewechselt. Die installierte Instanz hatte ich so in IOBroker belassen und habe nur die Register und Spulen so angepasst, wie es das deyeidc.Sun2000.json vorgibt.
Ich habe seitdem permanent die Meldungen im Log :deyeidc.0 2024-09-05 10:45:00.289 error TypeError: Cannot read properties of undefined (reading 'registerStart') | TypeError: Cannot read properties of undefined (reading 'registerStart') at idcCore.readCoils (/opt/iobroker/node_modules/iobroker.deyeidc/lib/idc-core.js:149:56) at Deyeidc.onData (/opt/iobroker/node_modules/iobroker.deyeidc/main.js:176:37) at Socket.<anonymous> (/opt/iobroker/node_modules/iobroker.deyeidc/main.js:154:10) at Socket.emit (node:events:519:28) at addChunk (node:internal/streams/readable:559:12) at readableAddChunkPushByteMode (node:internal/streams/readable:510:3) at Readable.push (node:internal/streams/readable:390:5) at TCP.onStreamRead (node:internal/stream_base_commons:191:23)
Stimmt da ggf. etwas nicht mit den Register und Spuleneinstellungen? Sind die beim G4 ggf. anders als im Vorgänger?
-
@romeleitis Ich bin nicht sicher, ob es einen grundsätzlichen Unterschied zwischen G3 und G4 gibt. Hardwaremäßig bestimmt, aber Firmwareseitig? Wir können ja mal die spasseshalber Versionsstände vom WR vergleichen.
Ich kann diesen Fehler tatsächlich produzieren, wenn zwei Instanzen auf den WR einwirken. Kann das bei dir auch sein? Muss ja nicht der Adapter sein, kann auch ein anderes Gerät sein, was darein 'fuscht'. -
Nach ca. 5 Monaten Betrieb der zwei Deye Sun-12K-SG04LP3-EU habe ich jetzt einige Daten sammeln können. Meine aktuellen Register sehen so aus:
{ "ipaddress": "192.168.100.4", "port": 8899, "logger": 2791138173, "pollInterval": 60, "registers": [ { "registerStart": 99, "registerEnd": 130 }, { "registerStart": 500, "registerEnd": 541 }, { "registerStart": 586, "registerEnd": 680 } ], "coils": [ { "register": 99, "rules": 1, "key": "Battery Equalization V", "name": "Equalization V", "unit": "V", "factor": 2, "nullable": false }, { "register": 100, "rules": 1, "key": "Battery Absorption V", "name": "Absorption V", "unit": "V", "factor": 2, "nullable": false }, { "register": 101, "rules": 1, "key": "Battery Float V", "name": "Float V", "unit": "V", "factor": 2, "nullable": false }, { "register": 104, "rules": 1, "key": "Zero Export power", "name": "Zero Export power", "unit": "", "factor": 0, "nullable": false }, { "register": 108, "rules": 1, "key": "Max A Charge", "name": "Max A Charge", "unit": "A", "factor": 0, "nullable": false }, { "register": 109, "rules": 1, "key": "Max A discharge", "name": "Max A discharge", "unit": "A", "factor": 0, "nullable": false }, { "register": 114, "rules": 1, "key": "Battery charging efficiency", "name": "Battery charging efficiency", "unit": "%", "factor": 1, "nullable": false }, { "register": 115, "rules": 1, "key": "Battery capacity ShutDown", "name": "battery capacity ShutDown", "unit": "%", "factor": 0, "nullable": false }, { "register": 116, "rules": 1, "key": "Battery capacity Restart", "name": "battery capacity Restart", "unit": "%", "factor": 0, "nullable": false }, { "register": 117, "rules": 1, "key": "Battery capacityLowBatt", "name": "battery capacityLowBatt", "unit": "%", "factor": 0, "nullable": false }, { "register": 127, "rules": 1, "key": "grid charging capacity point", "name": "grid charging capacity point", "unit": "%", "factor": 0, "nullable": false }, { "register": 128, "rules": 1, "key": "Grid charge the battery current", "name": "Grid charge the battery current", "unit": "A", "factor": 0, "nullable": false }, { "register": 130, "rules": 1, "key": "Grid is charged to enable", "name": "Grid is charged to enable", "unit": "", "factor": 0, "nullable": false }, { "register": 500, "rules": 1, "key": "health_state", "name": "run state", "unit": "", "factor": 0, "nullable": false }, { "register": 516, "rules": 1, "key": "Total charge of the battery", "name": "Gesamtladung der Batterie", "unit": "kWh", "factor": 1, "nullable": false }, { "register": 518, "rules": 1, "key": "Total discharge of the battery", "name": "Gesamtentladung der Batterie", "unit": "kWh", "factor": 1, "nullable": false }, { "register": 520, "rules": 1, "key": "Day_GridBuy_Power_Wh", "name": "gekaufte Leistung", "unit": "kWh", "factor": 1, "nullable": false }, { "register": 521, "rules": 1, "key": "Day_GridSell_Power_Wh", "name": "Einspeisung", "unit": "kWh", "factor": 1, "nullable": false }, { "register": 522, "rules": 1, "key": "Total_GridBuy_Power", "name": "Total_GridBuy_Power", "unit": "kWh", "factor": 1, "nullable": false }, { "register": 524, "rules": 1, "key": "Total_GridSell_Power", "name": "Total_GridSell_Power", "unit": "kWh", "factor": 1, "nullable": false }, { "register": 526, "rules": 1, "key": "Day_Load_Power_Wh", "name": "Electricity consumption for the day", "unit": "kWh", "factor": 1, "nullable": false }, { "register": 527, "rules": 1, "key": "Total_Load_Power", "name": "Total_Load_Power", "unit": "kWh", "factor": 1, "nullable": false }, { "register": 529, "rules": 2, "key": "Day_PV_Power_Wh", "name": "Total PV generation on the day", "unit": "kWh", "factor": 1, "nullable": false }, { "register": 534, "rules": 1, "key": "Total_PV_power_low", "name": "Erzeugte PV-Leistung", "unit": "kWh", "factor": 1, "nullable": false }, { "register": 540, "rules": 6, "key": "Temperature_DC_Transformer", "name": "Temperature DC Transformer", "unit": "°C", "factor": 1, "nullable": false }, { "register": 541, "rules": 6, "key": "Temperature_Heat_Sink", "name": "Temperature Heat Sink", "unit": "°C", "factor": 1, "nullable": false }, { "register": 586, "rules": 6, "key": "Temperature_Battery", "name": "Temperatur Battery", "unit": "°C", "factor": 1, "nullable": false }, { "register": 587, "rules": 1, "key": "Battery_Voltage", "name": "Battery Voltage", "unit": "V", "factor": 2, "nullable": false }, { "register": 588, "rules": 1, "key": "Battery_Level", "name": "Battery SOC", "unit": "%", "factor": 0, "nullable": false }, { "register": 590, "rules": 2, "key": "Battery_Output_Power", "name": "Battery Power", "unit": "W", "factor": 0, "nullable": false }, { "register": 591, "rules": 2, "key": "Battery_output_current", "name": "Battery Current", "unit": "A", "factor": 2, "nullable": false }, { "register": 598, "rules": 1, "key": "Grid phase voltage1", "name": "L1 Spannung", "unit": "U", "factor": 1, "nullable": false }, { "register": 599, "rules": 1, "key": "Grid phase voltage2", "name": "L2 Spannung", "unit": "U", "factor": 1, "nullable": false }, { "register": 600, "rules": 1, "key": "Grid phase voltage3", "name": "L3 Spannung", "unit": "U", "factor": 1, "nullable": false }, { "register": 607, "rules": 2, "key": "P_GRID_LD_TOTAL", "name": "Total active power from side to side of the grid", "unit": "W", "factor": 0, "nullable": false }, { "register": 610, "rules": 1, "key": "grid side inner current A", "name": "Strom L1", "unit": "A", "factor": 2, "nullable": false }, { "register": 611, "rules": 1, "key": "grid side inner current B", "name": "Strom L2", "unit": "A", "factor": 2, "nullable": false }, { "register": 612, "rules": 1, "key": "grid side inner current C", "name": "Strom L3", "unit": "A", "factor": 2, "nullable": false }, { "register": 613, "rules": 1, "key": "grid Out-of current A", "name": "Out-of-grid - current A", "unit": "A", "factor": 2, "nullable": false }, { "register": 619, "rules": 2, "key": "P_GRID_CT_TOTAL", "name": "Out-of-grid – total power", "unit": "W", "factor": 0, "nullable": false }, { "register": 630, "rules": 1, "key": "grid Inverter output phase", "name": "Inverter output phase", "unit": "A", "factor": 2, "nullable": false }, { "register": 643, "rules": 1, "key": "P_UPS_LOAD_TOTAL", "name": "UPS load-side total power", "unit": "W", "factor": 0, "nullable": false }, { "register": 653, "rules": 1, "key": "P_BACKUP_LOAD_TOTAL", "name": "Load total power", "unit": "W", "factor": 0, "nullable": false }, { "register": 672, "rules": 1, "key": "PV1_Leistung", "name": "PV1 - Leistung", "unit": "W", "factor": 0, "nullable": false }, { "register": 673, "rules": 1, "key": "PV2_Leistung", "name": "PV2 - Leistung", "unit": "W", "factor": 0, "nullable": false }, { "register": 676, "rules": 1, "key": "PV1_Spannung", "name": "PV1 - Spannung", "unit": "V", "factor": 1, "nullable": false }, { "register": 677, "rules": 1, "key": "PV1_Strom", "name": "PV1 - Strom", "unit": "A", "factor": 1, "nullable": false }, { "register": 678, "rules": 1, "key": "PV2_Spannung", "name": "PV2 - Spannung", "unit": "V", "factor": 1, "nullable": false }, { "register": 679, "rules": 1, "key": "PV2_Strom", "name": "PV2 - Strom", "unit": "A", "factor": 1, "nullable": false }, { "register": 535, "rules": 1, "key": "Total_PV_power_high", "name": "Erzeugte PV-Leistung", "unit": "kWh", "factor": 0, "nullable": false } ], "computes": [ { "values": "PV1_Leistung+PV2_Leistung", "key": "PV1_PV2_Leistung", "name": "PV1+PV2 - Leistung", "unit": "W", "factor": 0 }, { "values": "Day_PV_Power_Wh-Day_GridSell_Power_Wh", "key": "Day_Eigenverbrauch", "name": "Day Eigenverbrauch", "unit": "kWh", "factor": 0 } ] }
Grundsätzliche stellt der Master keine Summen zur Verfügung, d.h. jeder WR zeigt nur an, was er alleine ausgegeben hat.
Nicht alle Register machen sin, so geben die Register P_GRID_CT_TOTAL und P_GRID_LD_TOTAL sowie P_UPS_LOAD_TOTAL und P_BACKUP_LOAD_TOTAL die gleichen Werte aus.
Interessant schaut es bei den Total_xy_high und Total_xy_low aus. Diese zwei 16bit-Register sind eigentlich ein 32bit-Register nur das die Hälfte vertauscht ist, d.h. das low-Bit kommt vor dem high-Bit. -
@elektrofix-ol Das ist ja schön, dass mal Rückmeldungen kommen, die mir einfach nicht auffallen.
@elektrofix-ol sagte in [Adapter] cloudfreie Auslesung von Deye-Invertern:
Grundsätzliche stellt der Master keine Summen zur Verfügung
Ist das ist WR-spezifisch oder gibt es dafür keine Register?
@elektrofix-ol sagte in [Adapter] cloudfreie Auslesung von Deye-Invertern:
Diese zwei 16bit-Register sind eigentlich ein 32bit-Register
Welche Regel wendest du dafür an? Evtl muss ich Regeln anpassen oder hinzufügen.
Versuche hier mal auf Register 534 die Regel 3 oder 4 anzuwenden. -
@rene55 jeder WR (Master oder Slave) gibt nur die Werte raus, die bei ihm auch gemessen wurden.
Du hast sogar unterschiedliche Werte, so hat der Slave den Akku mehr geladen als der Master also ist die Total_charge_of_the_battery beim Slave höher als bei MasterDie Regel 3 und 4 passen nicht, das hatte ich schon im Mai ausprobiert. Die Regeln nehmen [16-High].[16Low] und der Daye gibt [16Low].[16High] raus. Der Daye müsst die Register 535 und 534 tauschen, dann würde es mit der Regel 3 oder 4 gehen.
Ich habe es jetzt mit einer Berechnung gelöst:
{ "values": "Total_PV_power_high*10000", "key": "Total_PV_power", "name": "PV Gesamtertrag WR", "unit": "kWh", "factor": 0 }, { "values": "Total_PV_power+Total_PV_power_low", "key": "Total_PV280", "name": "PV Gesamtertrag", "unit": "kWh", "factor": 0 }
Das High-Register*10000 ==> ZwischenSpeicher + low-Register ==> Total_PV280
Eleganter wäre, wenn Du das als Regel einbinden könntest, aber so geht's auch.Edit: Noch einmal ausprobiert mit der Regel 3+4: Es wir ein Wert von 7830,1 kWh ausgegeben es hätte aber 11276,5 kWh sein müssen.
-
@elektrofix-ol Bei den 'Summen' hatten wir uns wohl missverstanden. Klar kommt nur das raus, was drin ist. Ich dachte da mehr an die Aufsummierten Leistungen.
Zum Thema 16-bit-low/16-bit-high. Kannst du den Adapter bitte mal direkt von Github runterladen und dann für das Register 534 die Regel 13 versuchen. Vllt. kommt dann was sinnvolles raus.
-
@Rene55 Ich verstehe es nicht mehr. Ich hatte nun den Deye Adapter inkl. Instanzen gelöscht. Dann IOBroker neu gestartet. Adapter wieder installiert und nur IP und Seriennummer eingetragen. Abfrageintervall auf default (330 Sekunden).
Trotzdem tauchen weiterhin alle 30 Sekunden Fehler im Log auf (30 Sekunden hatte ich vor dem Löschen eingestellt) :
-
@romeleitis Dazu brauche ich mehr Infos. Welche Version, woher installiert, welche .json ist importiert?
-
@rene55
Habe es fix mal getestet, auf einer neuen Maschiene, Adapter neu installiert. Die Anzeigen bei Regel 13 wechseln immer zwischen:
Richtig mit Regel 1 bis auf 534 wäre
-
@elektrofix-ol SO ganz komm ich nicht hinterher. Was heißt 'wechselt immer zwischen' ?
Damit ich das nachrechnen kann: kannst du mir bitte mal die ermittelten Werte von 534 und 535 und den 'gewünschten' (=richtigen) Wert geben. Sollte doch zu schaffen sein.
-
@rene55 Ich habe IOBroker in der Version 7.2.0 auf einem Unraid Server als Container laufen. Es ist der Deye Adapter 0.1.0 installiert (über die Adaptersuche). Die yaml (https://github.com/raschy/ioBroker.deyeidc/blob/main/deyeidc.Sun2000.json) hatte ich nicht importiert (weiß nicht wie das geht), sondern hatte die Werte händisch hinzugefügt.
Was mich absolut verwundert ist, dass der Abfrageintervall auf 330 Sekunden steht :
Ich aber trotzdem alle 30 Sekunden Fehler erhalte (auf 30 Sekunden stand mal die ursprüngliche Einstellung, habe ich wie geschrieben alles weggelöscht und neu hinzugefügt) :
Und die Fehler treten auch auf ohne dass ich irgendetwas zusätzlich in den Registern, Spulen etc. eintrage -
@romeleitis Die 330 Sekunden hatte ich als Standard eingetragen, weil die Werte vom WR eh nicht öfters aktualisiert werden. Wenn trotzden alle 30 Sekunden ein Fehler kommt bestätigt das meine Vermutung, dass noch irgendwer anderes mit dem WR spricht, der Adapter die Antworten aber nicht deuten kann. Siehe "Register 153, 154, 155 . . ".
Auf Github liegt eine angepasste Version, die (hoffentlich) die nicht angeforderten Antworten ausblendet. Daher wäre es einen Versuch wert, den Adapter einmal direkt von Github zu installieren.
-
@rene55 wechseln bedeutet, das die Werte bei der einem AbfrageZyklus "ABC", und beim nächsten oder übernächsten AbfrageZyklus "DEF" sind. habe ich auch zu ersten mal gesehen.
In der Influx wurden mir die Werte 534 ansteigend bei Master bis den Wert 6550.849999999999 und beim Slave bis den Wert 6552.666666666667 geschrieben, dann fangen Sie wieder bei 0 an und der 535 bekam ein 1
Ich zeichne die Werte nur alle 30 Min auf.Die Anlage steht leider 70km von mir entfernt. Dauert, bis ich die Werte von Display bekomme.
-
@elektrofix-ol Ah, ok. Das 'wechseln' habe ich jetzt verstanden. Diesen Effekt kenne ich auch, wenn zwei Instanzen auf den gleichen WR zugreifen, aber die RegisterNr nicht übereinander passt. Dann kommt einmal der richtige Wert und beim nächsten mal ein völlig falscher.
Die Werte von Register 534 sind in etwa das was ich vermute. Der größte Wert der hier kommen könnte ist 6553.5. (Ich wusste gar nicht, dass da soviele Nachkommastellen rauskommen). Dann sollte im 535 die 1 erscheinen und 534 wieder langsam von 0 wieder hochwachsen. Von daher sollte das Auslesen des Registers mit der Regel 3 genau passen.
Du sprichst von Master und Slave. Wie muss ich das denn verstehen? Hast du zwei WR die ...ähm. Wohin Daten schicken? Erklär mir das bitte.
-
@rene55 Auf https://github.com/raschy/ioBroker.deyeidc/releases sehe ich nur die installierte Version 0.1.0. So steht denn die angepasste? Und wie installiere ich die?
-
@romeleitis Die Versionsnummer ist immer noch die gleiche. Im Expertenmodus mit der URL 'https://github.com/raschy/ioBroker.deyeidc/'.
-
@rene55 said in [Adapter] cloudfreie Auslesung von Deye-Invertern:
Du sprichst von Master und Slave. Wie muss ich das denn verstehen? Hast du zwei WR die ...ähm. Wohin Daten schicken? Erklär mir das bitte.
Die Anlage habe ich einen Arbeitskollegen gebaut und ist etwas größer als "Standart". Sie ist von mir 70km entfernt auf dem Land und hat zwei Deye Sun-12K-SG04LP3-EU, die Beide zusammen in zwei Akkupacks von je 14,4 kWh laden, bzw. entladen. Um das zu realisieren sind die beide Deye und auch beide Akkupacks als Master/Slave zusammengeschaltet. Der Daye-Master unterhält sich dann mit den Master-BMS des Akkupacks.
Die Daten von den zwei Deye Sun-12K-SG04LP3-EU werden mittels Deinem Adapter über die Deye-WLAN-Stick ausgelesen. Dabei stellt jeder Deye nur die Daten zur Verfügung, die er auch nur misst; alleine der SoC ist beim Deye Master und Daye Slave identisch, wobei nur der Deye Master am Master-BMS angeschlossen und den SoC erhalten kann. Wenn ich den wirklichen Total_GridSell_Power zum Netz haben will, muss ich die Werte von Deye-Master und Deye-Slave somit addieren, obwohl nur der Master die CT-Klemmen angeschlossen hat. Hier ein Schaubild des Aufbaus:
Die von den Deye's gesammelte Daten werden über den IoBroker in die InfluxDB geschrieben. Die Werte haben eine Blockzeit vom 30 Minuten, damit mir die Influx nicht ständig mit Daten vollläuft. Daduch sind die Daten jedoch nicht mehr so Zeitgenau und es kommen so viel Nachkommastellen zustande.
Ich habe die ganzen Daten auf Regel 3 umgestellt und nachgerechtet: Es fehlen mit ca. 1600kWh.
Erst hielt ich es für unplausibel und daher wollte ich die Regel 3 zu Anfang erst nicht trauen, aber es sind bei der Menge, die durch die Anlage gegangen sind nur 13% Verlust von DC nach AC, das ist nicht viel.Fazit: Die Regel 3 ist die richtige für die Total... Register
Hier die aktuelle Datei für den Adapter.
Sun-12K-SG04LP3-EU.json -
@elektrofix-ol Dann kann man also dieses/dein Problem als gelöst betrachten. Weiterhin bin ich froh, dass sich mal jemand die Mühe gemacht hat und die Regel 3 näher untersucht hat.
Eine Frage am Rande: Hast du auch einen Leistungszähler zwischen Grid und WR hängen? -
@rene55 So, habe das wie in deinem Screenshot getan :
Dadurch wurde allerdings noch keine neue Instanz hinzugefügt. Das habe ich danach getan.
Sieht auch gut aus, da die neue Checkbox "onlinecheck" nun hinzugekommen ist :
Sieht soweit im Log gut aus. (Compute Key 'DV1' not found, weil noch nicht definiert...)
Wie kann ich die Werte aus https://github.com/raschy/ioBroker.deyeidc/blob/main/deyeidc.Sun2000.json am einfachsten importieren oder muss ich die wirklich alle von Hand eintippen?