@ponti92 sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
Da ich jetzt ein paar Tage unterwegs bin nur ganz Kurz...
@waly_de
Nach langen Debuggen und versuchen zu verstehen wie das Skript so funktioniert konnte ich den Übeltäter im Skript nun weiter eingrenzen.
An dieser Codestelle wird überprüft ob gewisse Zeitstempel größer/kleiner sind und dann ob Realtime sich in einem gewissen Zeitrahmen geändert hat.
Ich könnte mir vorstellen, dass das bei 2 PS nicht ganz funktioniert, da diese nicht synchron geregelt werden, sodass die Hauslast nur mit einer PS geregelt wird und die 2. auf einem beliebigen Wert stehen bleibt.
Sobald das Skript dann in Zeile 12 hinein kommt, returned es, bevor es den RealPower Value weiter unten schreiben kann.
Sehr gut analysiert Aber Du siehst, ich hab mir da einige Gedanken zu gemacht und verschiedenes Versucht. Das soll schon genau so sein.
Sinn: Wenn ich einen neuen Wert für die Einspeisung setzte, dann muss beim nächsten Messintervall der Wert für die Tatsächliche Eispeisung der PS (Das ist ja die Grundlage für die Berechnung des Bedarfs) Jünger sein als der Zeitpunkt des letzten SetAC. Wenn das nicht so ist, ist dieser Wert eigentlich Wertlos. Darum skipe ich und warte auf das nächste Intervall. Als Backup wird nach der halben Rückschauzeit mit dem alten Wert weiter gearbeitet. Das Funktioniert auch bei mehreren PS ganz gut. Natürlich nur so lage, wie der PS auch per MQTT Daten in die Cloud sendet. Tut er das nicht, kann das Script auch nichts mehr berechnen. Mein PS Legt sich definitiv komplett schlafen, wenn keine Solarenergie kommt und der Accu leer ist.
for (const item of ConfigData.seriennummern) { if (item.typ == "PS") { const asn = item.seriennummer; const LastACset = getState(ConfigData.statesPrefix + '.app_' + mqttDaten.UserID + '_' + asn + '_thing_property_set.setAC').ts; const invOutputWattsState = GetValAkt(ConfigData.statesPrefix + ".app_device_property_" + asn + ".data.InverterHeartbeat.invOutputWatts", 50, true); const invOutputWatts = Number(invOutputWattsState.val) / DIVISION_FACTOR; const lastOutset = invOutputWattsState.ts; if ((Number(lastOutset) < Number(LastACset)) && invOutputWatts !== 0) { const lastRealset = getState(ConfigData.statesPrefix + ".RealPower").ts; if (Number(lastRealset) > Date.now() - ((ConfigData.MinValueMin * 1000 * 60) / TOLERANCE_PERIOD_FACTOR)) { log("RealPower Set Warte auf aktuelle Daten von: " + asn + " lezter: " + new Date(lastOutset).toLocaleTimeString('de-DE') + " / ACset: " + new Date(LastACset).toLocaleTimeString('de-DE')); WorkInProz = false; return; } else { //log("Überspringe ab jetzt warten auf Daten von: " + asn + " und setzte Wert für Einspeisung auf 0 ") //setState(ConfigData.statesPrefix + ".app_device_property_" + asn + ".data.InverterHeartbeat.invOutputWatts", "0") Einspeisung += invOutputWatts; } } else { Einspeisung += invOutputWatts; } } } const RealPower = Number((Hausstrom + Einspeisung).toFixed(0)) if (RealPower + 100 < LastRealPower) { //log("PeakSkip Delta: " + (LastRealPower - RealPower) ) } else { setState(ConfigData.statesPrefix + ".RealPower", RealPower); } LastRealPower = RealPower WorkInProz = false;
Ich habe Zeile 12 wieder einkommentiert und nach einiger Zeit habe ich diese Logs auch bekommen:
2023-09-10 23:23:14.868 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:23:00 / ACset: 23:23:14 2023-09-10 23:23:20.192 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:23:00 / ACset: 23:23:14 2023-09-10 23:23:25.498 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:23:00 / ACset: 23:23:14 2023-09-10 23:23:30.836 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:23:01 / ACset: 23:23:27 2023-09-10 23:23:36.173 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:23:01 / ACset: 23:23:27 2023-09-10 23:23:41.494 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:23:01 / ACset: 23:23:27 2023-09-10 23:23:46.836 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:23:01 / ACset: 23:23:27 2023-09-10 23:23:52.227 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:23:01 / ACset: 23:23:27 2023-09-10 23:23:57.586 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:23:01 / ACset: 23:23:27 2023-09-10 23:24:03.187 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:23:01 / ACset: 23:23:27 2023-09-10 23:24:08.442 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:23:01 / ACset: 23:23:27 2023-09-10 23:24:13.942 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:23:01 / ACset: 23:23:27 2023-09-10 23:24:19.273 - info: javascript.0 (1259) script.js.Ecoflow3: Hausstrom: 27.19 2023-09-10 23:24:19.273 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower: 316 2023-09-10 23:24:19.274 - info: javascript.0 (1259) script.js.Ecoflow3: LastRealPower: 326 2023-09-10 23:24:19.274 - info: javascript.0 (1259) script.js.Ecoflow3: Einspeisung: 289.3 2023-09-10 23:24:24.676 - info: javascript.0 (1259) script.js.Ecoflow3: Hausstrom: 27.19 2023-09-10 23:24:24.678 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower: 318 2023-09-10 23:24:24.679 - info: javascript.0 (1259) script.js.Ecoflow3: LastRealPower: 316 2023-09-10 23:24:24.679 - info: javascript.0 (1259) script.js.Ecoflow3: Einspeisung: 290.4 2023-09-10 23:24:30.158 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:24:20 / ACset: 23:24:27 2023-09-10 23:24:35.525 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:24:20 / ACset: 23:24:27 2023-09-10 23:24:40.984 - info: javascript.0 (1259) script.js.Ecoflow3: RealPower Set Warte auf aktuelle Daten von: XXXXXXXXXXXXXXX lezter: 23:24:20 / ACset: 23:24:27
Zwischendrin kommen dann wieder Werte (Hausstrom, RealPower etc), aber das Skript hängt dann anschließend weiter in dieser Schleife und der Realpower Wert wird nur all 1 min 30s aktualisiert, was dann die Regelung komplett ruiniert.
aber du siehst an den Logs ja super, was das Problem ist. Es kommen einfach keine Daten mehr.
du kannst noch mit TOLERANCE_PERIOD_FACTOR spielen und den wert vergrößern , damit er schneller mit den alten Werten weiter macht.
EDIT:
Es sieht so aus, als ob die Daten vom ersten PS nicht richtig ankommen und er deshalb da hängenbleibt. Auch wenn ich das ganze auskommentiere und immer die Einspeisung schreibe, dann fehlt dort der Wert vom ersten PS. Irgendwie kann er die nicht mehr abrufen..
Das ist das Problem
Ich vermute es liegt doch irgendwie an der MQTT Verbindung und dem reconnect Zyklus in der Nacht. Da wird ja nur alle 15min reconnected, wenn beim PS nichts mehr ankommt. Tagsüber jede Minute. Muss es noch länger beobachten.
Jedenfalls konnte ich feststellen, dass bei einem Ausfall die Regelung wieder gestartet hat, nachdem ich die App geöffnet habe. Als ich dann die App komplett geschlossen habe, ist die Regelung wieder stehen geblieben. (Ein restart des Skripts hilft auch dabei, sich wieder mit dem Mqtt zu verbinden.)
Das ist immer so: App schließen beendet sofort alle Kommunikation per MQTT. Erst nach einem Reconnect gehts weiter.
Du kannst ja das Intervall für nächtliche Reconnects runter setzen. Aber ich denke der PS schläft einfach irgendwann. Dann kann man auch nichts mehr damit regeln. Vielleicht nutzt es etwas, wenn ich schlafende PS einfach skipe? Macht der PS denn noch was? Hat er noch Bat-Power, oder nur der, der noch zu erreichen ist?