NEWS
E3DC Hauskraftwerk steuern
-
@arnod den PV-Leistungszähler im Skript, es wird deutlich zu viel berechnet. Heute zum Beispiel wurden 182,92 kWh PV-Ertrag errechnet, das kann bei unserer 16 kWp Anlage nicht möglich sein.
Im E3DC-Portal werden nur 91 kWh Solarproduktion angezeigt. -
@chrischros
Die Funktionen werden bei Start vom Skript in Zeile 311 und 312 aufgerufenWh_Leistungsmesser0(); Wh_Leistungsmesser1();
Danach jede Minute über einen Timer in der Funktion.
function Wh_Leistungsmesser0(){ if(DebugAusgabe)log('Funktion Schedulestart aktiv'); let AufDieMinute = '* * * * *'; Timer0 = schedule(AufDieMinute, function(){ if(DebugAusgabe)log('minütlicher Schedule aktiv'); let PVErtrag = getState (sID_PVErtragLM0).val; let Pmin = Summe0/count0; if(count0>0 && Summe0 >0){ setState(sID_PVErtragLM0, PVErtrag + Pmin/60/1000,true);//kWh if(DebugAusgabe)log(['Schedule Umrechnen W = P*t. Minutenwert Leistung: '+ Pmin, ' Minutenwert Arbeit: ' + (Pmin/60/1000), ' Tageswert Ertrag: ' +PVErtrag ].join('')); setTimeout(function(){ count0=0; Summe0=0; if(DebugAusgabe)log(['Reset: Count = '+ count0, ' Summe = ' + Summe0 ].join('')); },100); }else{ if(count0===0 && Summe0 ===0){ clearSchedule(Timer0); Timer0 = null; if(DebugAusgabe)log('minütlicher Schedule gestoppt'); } } }); }
Die PV Leistung wird hier aufsummiert:
on(sID_PvLeistungLM0_W, function(obj) { let Leistung = getState(obj.id).val; if(Leistung > 0){ if(!Timer0)Wh_Leistungsmesser0(); count0 ++ Summe0 = Summe0 + Leistung; //if(DebugAusgabe)log(['Summe: ' + Summe0, ' Zaehler: '+count0, ' Addition: + ' +Leistung ].join('')); } });
Wenn das Skript stoppt, werden die Timer hier gelöscht:
onStop(function () { clearSchedule(Timer0); clearSchedule(Timer1); clearSchedule(Timer2); }, 100);
Wird zu viel oder zu wenig gezählt?
-
Wenn ich so darüber nachdenke, ist das eigentlich ein Relikt aus Zeiten vor dem Adapter e3dc-rscp.
Eigentlich könnte man jetzt den Zähler vom Adapter verwenden und hätte kein Problem mehr, außer mit der Leistung aller zusätzlichen Einspeiser, da gibt es keinen Zähler. -
@arnod said in E3DC Hauskraftwerk steuern:
Wenn ich so darüber nachdenke, ist das eigentlich ein Relikt aus Zeiten vor dem Adapter e3dc-rscp.
ich nutze ja auch noch das alte Skript mit E3DC-Control.
-
@arnod said in E3DC Hauskraftwerk steuern:
Wird zu viel oder zu wenig gezählt?
Es wird deutlich zu viel gezählt.
Heute z.B. laut Skript bisher 184,13 kWh. Wohingegen laut E3DC nur 91,22 kWh erzeugt wurden. -
Aktuell wird es in beiden Skripte so berechnet, aber nicht mehr lange
Prüf mal bitte, ob die PV-Leistung bei deinem
Modbus Instanz modbus.0.holdingRegisters.40068_PV_Leistung
richtig aktualisiert wird und auch wieder auf 0 gesetzt wird, wenn keine PV-Leistung vorhanden ist.
Der zweite Fehler könnte sein, dass du in anderen Skripte Timer einsetzt, die gleich benannt sind, also Timer0, Timer1. -
@arnod said in E3DC Hauskraftwerk steuern:
Prüf mal bitte, ob die PV-Leistung bei deinem Modbus Instanz modbus.0.holdingRegisters.40068_PV_Leistung richtig aktualisiert wird und auch wieder auf 0 gesetzt wird, wenn keine PV-Leistung vorhanden ist.
Die aktualisierung über Modbus scheint zu passen. Ob es auch 0 wird werde ich heute Abend noch mal überprüfen.
@arnod said in E3DC Hauskraftwerk steuern:
Der zweite Fehler könnte sein, dass du in anderen Skripte Timer einsetzt, die gleich benannt sind, also Timer0, Timer1.
Ich habe nur dein Skript am laufen von daher sollte da sich nichts in die quere kommen.
Das ganze verhalte habe ich auch erst seit ein paar Tagen aber Änderungen am System wurden in jüngster Zeit nicht durchgeführt.
Aktuell driften die Werte noch nicht wirklich auseinander.
ioBroker = 39,04 kWh
E3DC-Portal: 36,8 kWh -
@arnod said in E3DC Hauskraftwerk steuern:
und auch wieder auf 0 gesetzt wird, wenn keine PV-Leistung vorhanden ist.
Das Objekt wird korrekt aktualisiert und auch auf NULL gesetzt wenn keine PV-Leistung kommt.
Heute scheint die Berechnung geklappt zu haben, zumindest ist heute keine große Diskrepanz zwischen den Werten.
ioBroker: 72,65 kWh
E3DC: 72,2 kWhWarum das die letzten Tage so gesponnen hat, kann ich dir leider nicht sagen, werde es aber weiter beobachten.
-
@chrischros
Hast du das Skript vorher eventuell öfter neu gestartet?
Mir ist einmal aufgefallen, dass die Timer hier nicht zuverlässig gelöscht werden. -
@arnod nicht das ich wüsste.
Was ich aber gemacht habe, als mit aufgefallen ist das die Werte nicht stimmen, ist das Objekt0_userdata.0.E3DC-Control.Allgemein.IstPvErtragLM0_kWh
händisch mit dem Wert aus dem E3DC-Portal zu überschreiben.
-
@arnod So gestern war alles gut und heute schon wieder viel zu viel gezählt worden.
Ich habe keine Änderungen zu gestern vorgenommen, der Raspberry oder das Skript wurden nicht neu gestartet.
Ich lasse jetzt das Objekt "0_userdata.0.E3DC-Control.Allgemein.IstPvErtragLM0_kWh" in die History schreiben, eventuell kann man das was erkennen.Skript: 127,50 kWh
E3DC: 62,71 kWhDurch das zu viel zählen stellt das Skript automatisch auf Einstellung 1 um wodurch natürlich der Akku auf 100% SOC geladen wird, was er ja eigentlich nicht sollte.
UPDATE:
17:03 = 126,57 kWh
17:33 = 132,16 kWhalso irgendwie wird da falsch gezählt. Kann mir nicht vorstellen das ich mit meiner 16,16 kWp Anlage am späten Nachmittag innerhalb einer halben Stunde 5,5 kWh produziere.
-
@chrischros
Welche Version hast du bei dir am Laufen?Ist bei dir am Ende vom Skript bereits diese Funktion vorhanden?
//Bei Scriptende alle Timer löschen onStop(function () { clearSchedule(Timer0); clearSchedule(Timer1); clearSchedule(Timer2); }, 100);
Prüf mal bitte ob der State
0_userdata.0.E3DC-Control.Allgemein.IstPvErtragLM0_kWh
wirklich nur jede Minute aktualisiert wird.
Wenn das häufiger passiert, stimmt bei dir was mit dem Timer nicht. -
@arnod habe das Skript in der version 4.2.0 am laufen und darin ist die oben genannte Funktion schon enthalten.
Laut den History-Daten wir jede Minute 2 mal Werte geschrieben.
Welche Admin Version hast du am laufen?
-
@chrischros
Dann wurde der Timer0 zweimal gestartet.
Stoppe mal das Skript und warte eine Minute, bevor du es wieder startest.
Dann prüfe wieder, ob der State jede Minute aktualisiert wird. -
@ChrisChros
Admin 6.2.4 -
@arnod nach dem Neustart des Skripts wird nur noch einmal pro Minute ein Wert geschrieben.
Von der Admin-Version sind wir schon mal identisch, daran sollte es nicht liegen.
-
@chrischros
Das Problem sind die Timer, die nicht sauber bei Skript Abbruch beendet werden.
Dachte eigentlich das Problem gelöst zu haben mit der letzten Änderung, ist aber anscheinend nicht so.
Wenn man etwas wartet, bevor das Script wieder gestartet wird, werden auch die Timer beendet, warum das aber so ist konnte ich noch nicht herausfinden.Eventuell hilf beim Skript Start noch mal mit clearSchedule(Timer0); die Timer zu beenden, falls das beim Beenden vom Skript nicht funktioniert hat.
-
@arnod ich lass mal das Objekt weiter in die History schreiben, eventuell kann ich dann nachvollziehen wann der Timer wieder falsch läuft.
-
Habe eine neue Version Charge-Control auf GitHub hochgeladen.
Version: 1.0.8
Änderungen:
Wenn die Notstromreserve erreicht ist, wird auchDISCHARGE_START_POWER, MAX_CHARGE_POWER
undMAX_DISCHARGE_POWER
auf 0 gesetzt, damit der WR in den Standby-Modus wechselt und die Batterie nicht weiter entladen wird.
Aktualisierung desState SET_POWER_VALUE
auf 5 sek. reduziert und kleinere Fehler behoben.Habe das 8 Stunden getestet, ohne das sich die Batterie weiter entladen hat, müsste somit funktionieren.
-
Versuch mal diesen code vor den Funktion Bereich im Script einzufügen, sodass dieser beim Start vom Script durchlaufen wird:
const list = getSchedules(false); list.forEach(schedule => log('-==== Schedule war noch aktiv und wurde beendet ===-'+JSON.stringify(schedule),'warn')); list.forEach(schedule => clearSchedule(schedule));
Sollte beim Start vom Script ein Timer noch aktiv sein, wird eine Warnmeldung im LOG ausgegeben und der Timer beendet.
Wenn es funktioniert, kannst du folgende Zeilelist.forEach(schedule => log('-==== Schedule war noch aktiv und wurde beendet ===-'+JSON.stringify(schedule),'warn'));
wieder löschen, wenn die Warnmeldung im LOG nicht angezeigt werden soll.