NEWS
E3DC Hauskraftwerk steuern
-
@ArnoD denke auch das proplanta genauer liegt... Hab nochmal genauer geschaut.. Die Kurve von proplanta passt generell zur prognose.. Ist halt bei mir zu hoch weil ich die nutzbare Energie messe.... Aber das geht ja mit dem korrekturfaktor klar...
Vlt.. Hilft aber zusaetzlich auch ein Kupfer Nagel... -
Neue Version 0.2.06 hochgeladen und neue View Stand 14.08.2020.
Änderungen:
Version: 0.2.06 Regelzeitraum Start, Ende und Ladezeitende werden jetzt nach der Formel von
Eberhard berechnet und je nach Einstellung in MEZ oder MESZ in VIS angezeigt. Es wird die Systemzeit vom IoBroker verwendet, da ich über Modbus keine Zeit vom E3DC bekomme.
Wenn diese beiden Zeiten nicht synchron sind, stimmen die Zeiten natürlich nicht. Die manuelle
Anwahl der 5 Einstellungen ist jetzt möglich, Danke an smartboart für seine Vorarbeit.Version: 0.2.05 Zeiten werden in MEZ umgerechnet und in eigenen States gespeichert:'Winterminimum_MEZ','Sommermaximum_MEZ','Sommerladeende_MEZ','HTon_MEZ','HToff_MEZ'. Fehler in der PrognoseBerechnung_kWh_heute korrigiert, durch die laufende Neuberechnung muss die bereits produzierte PV-Leistung von der Prognose Tag abgezogen werden und das Gleiche bei nEigenverbrauchTag in kWh. nKorrFaktor geändert, es wird jetzt der % Wert angegeben um den die Prognose reduziert werden soll.
Version: 0.2.04 Nach der Aktualisierung Proplanta wird die Function main() aufgerufen und neu berechnet
-
@ArnoD super... Komm heut nicht mehr dazu... Werds morgen gleich testen...
-
@ArnoD sagte in E3DC Hauskraftwerk steuern:
Version: 0.2.05 Zeiten werden in MEZ umgerechnet und in eigenen States
Hallo Arno...
Wenn ich das richtig deute, muss zwischen Sommerzeit und Winterzeit
über vis umgestellt werden...ich habe hierzu etwas um das zu automatisieren...siehe script unten..
https://forum.iobroker.net/topic/2730/sommerzeit-winterzeit-in-script-abfragen
es muss allerdings das npm modul is-it-bst im javascript adapter eingebunden werden.
const idSommerzeit ='javascript.1.PVAnlage.E3DC-Control.Allgemein.Anwahl_MEZ_MESZ'/*true = MESZ ,false = MEZ*/; // Sommerzeit ermitteln var dst = require('is-it-bst'); setState(idSommerzeit, dst()); // Script start if(LogAusgabe)log('MESZ Status '+dst); schedule("0 4 24-31 3,10 7", function() { setState("Sommerzeit", dst()); if(LogAusgabe)log('MESZ Status '+dst); });
das kommt dann zurück. siehe log..
-
@ArnoD
und noch ne kleine Änderung...
Hab hier noch ne Verzögerung eingebaut..
Besseres Handling und um Programmwahl nicht 2 mal ausführen zu müssen wenn die Automatik nicht schnell genug abgewählt wurde...on({id: instanz + PfadEbene1 + PfadEbene2[1] + 'EinstellungAnwahl'}, function(obj) { EinstellungAnwahl = getState(obj.id).val setState(instanz + PfadEbene1 + PfadEbene2[1]+'Automatik',false,true); if(LogAusgabe)log("Trigger manuelle Programmvorwahl"); setTimeout(function(){main();},200);//Automatik Abwahl Zeit geben bevor main ausgeführt wird });
-
@smartboart sagte in E3DC Hauskraftwerk steuern:
@ArnoD sagte in E3DC Hauskraftwerk steuern:
Version: 0.2.05 Zeiten werden in MEZ umgerechnet und in eigenen States
Hallo Arno...
Wenn ich das richtig deute, muss zwischen Sommerzeit und Winterzeit
über vis umgestellt werden...ich habe hierzu etwas um das zu automatisieren...siehe script unten..
https://forum.iobroker.net/topic/2730/sommerzeit-winterzeit-in-script-abfragen
es muss allerdings das npm modul is-it-bst im javascript adapter eingebunden werden.
const idSommerzeit ='javascript.1.PVAnlage.E3DC-Control.Allgemein.Anwahl_MEZ_MESZ'/*true = MESZ ,false = MEZ*/; // Sommerzeit ermitteln var dst = require('is-it-bst'); setState(idSommerzeit, dst()); // Script start if(LogAusgabe)log('MESZ Status '+dst); schedule("0 4 24-31 3,10 7", function() { setState("Sommerzeit", dst()); if(LogAusgabe)log('MESZ Status '+dst); });
das kommt dann zurück. siehe log..
Hatte die Umschaltung zuerst automatisch, doch dann war ich mir nicht sicher ob das international funktioniert.
Sollte aber zumindest in der Schweiz,Österreich und Italien funktionieren.
Werde es einbauen Danke. -
@smartboart sagte in E3DC Hauskraftwerk steuern:
@ArnoD
und noch ne kleine Änderung...
Hab hier noch ne Verzögerung eingebaut..
Besseres Handling und um Programmwahl nicht 2 mal ausführen zu müssen wenn die Automatik nicht schnell genug abgewählt wurde...on({id: instanz + PfadEbene1 + PfadEbene2[1] + 'EinstellungAnwahl'}, function(obj) { EinstellungAnwahl = getState(obj.id).val setState(instanz + PfadEbene1 + PfadEbene2[1]+'Automatik',false,true); if(LogAusgabe)log("Trigger manuelle Programmvorwahl"); setTimeout(function(){main();},200);//Automatik Abwahl Zeit geben bevor main ausgeführt wird });
Hatte es bei mir gestestet und keine Probleme festgestellt, musste die Verzögerung beim Aufruf der main() funktion nur bei der Abfrage der Proplanta Werte einbauen, da die Rückantwort zu langsam war. Aber es schadet generel nicht etwas zu warten und ich werde auch das übernehmen.
-
@ArnoD ich muss es nochmal los werden... Das ist wirklich wieder richtig Klasse Arbeit die du hier ablieferst..
-
Neue Version 0.2.07 hochgeladen
Änderungen:
Version: 0.2.07 Umschaltung MEZ oder MESZ wird automatisch ausgeführt. Man kann aber immer noch manuell umschalten.
Verzögerung beim Aufruf der main() function nach manueller Anwahl der Einstellungen 1-5.
Es muss das NPM-Module "is-it-bst" in der Javascript Instanz installiert werden. -
@ArnoD
Hallo Arno, ich habe ein script geschrieben, welches dein Script ohne source Analytics auskommen lässt.
Bei Sekunden Pollzeit des Modbusadapter, sollte das Script so genau sein wie source analytics.Je kleiner die Pollzeit vom modbus adapter desto genauer wird das Ergebnis sein...
Ich hoffe ich habe keinen Denkfehler, heute Abend weiß ich ob es ordentlich gezählt hat.
Habe vernommen, dass du ja auch auf den adapter verzichten möchtest?
Da es für die Prognose wohl doch besser ist mit dem Ertrag zu rechnen und nicht mit dem was entnommen wird, da der Verbrauch im Haus und Ladung bzw Batterieentnahme doch eher schwankt, habe ich das nun so gelöst.
Wenn du Interesse hast es zu übernehmen, kannst du mit testen wie genau es ist.. hier das Script...
createState('javascript.1.PVAnlage.PVArbeitE3DC.heute', 0, {name: 'PV Leistung Heute laufender Tag', type: 'number', unit: 'kWh' }); const idLeistung = 'modbus.1.holdingRegisters.40068_PV_Leistung'; const idPVErtrag = 'javascript.1.PVAnlage.PVArbeitE3DC.heute' var debug = false; var logging = true; var count = 0; var Summe = 0; // Zaehlem on(idLeistung, function(dp) { var Leistung = getState(idLeistung).val; if(Leistung >= 1){ count ++ Summe = Summe + Leistung; if(debug)log(['Summe: ' + Summe, ' Zaehler: '+count, ' Addition: + ' +Leistung ].join('')); } }); // jede minute in W/h umrechen W = P*t schedule ("* * * * *", function () { if(debug)log('minütlicher Schedule aktiv'); if(count >0 && Summe >0){ var PVErtrag = getState (idPVErtrag).val var Pmin = Summe/count; setState(idPVErtrag, PVErtrag + Pmin/60/1000,true);//kWh if(debug)log(['Schedule Umrechnen W = P*t. Minutenwert Leistung: '+ Pmin, ' Minutenwert Arbeit: ' + (Pmin/60/1000), ' Tageswert Ertrag: ' +PVErtrag ].join('')); setTimeout(function(){ count=0; Summe=0; if(debug)log(['verzögerter Reset: Count = '+ count, ' Summe = ' + Summe ].join('')); },100); } }); // jeden Tag um 23:59 Tageswert nullen. schedule({hour: 0, minute: 1}, function () { setState(idPVErtrag,0,true); if (logging)log('Tagesertragswert auf 0 gesetzt'); });
EDIT: hatte noch nen Fehler bei 0 Leistungswerten...
ist oben korrgiert.
Arbeite noch daran den minütlichen schedule zu stoppen wenn nicht mehr benötigt... -
und hier nochmal mit Aktivierung und Deaktivierung des minütlichen Schedule.
Somit werden der minütliche Schedule auch nur ausgeführt wenn es was zum Rechnen gibt...Hab es noch nicht testen können, also hier weiß ich erst morgen ob es klappt oder noch ne Kleinigkeit geändert werden muss...
createState('javascript.1.Test.E3DC.Ertrag_Heute', 0, {name: 'Ertrag Heute laufender Tag', type: 'number', unit: 'kWh' }); const idLeistung = 'modbus.1.holdingRegisters.40068_PV_Leistung'; const idPVErtrag = 'javascript.1.Test.E3DC.Ertrag_Heute' var debug = true; var logging = true; var count = 0; var Summe = 0; var Timer = null; var merker = false; // Zaehlem on(idLeistung, function(dp) { var Leistung = getState(idLeistung).val; if(Leistung >= 1){ if(merker)schedulestart(); merker = false; count ++ Summe = Summe + Leistung; if(debug)log(['Summe: ' + Summe, ' Zaehler: '+count, ' Addition: + ' +Leistung ].join('')); } }); //Skriptstart schedulestart() // jede minute in W/h umrechen W = P*t function schedulestart(){ if(debug)log('Funktion Schedulestart aktiv'); var AufDieMinute = '* * * * *'; Timer = schedule(AufDieMinute, function(){ if(debug)log('minuten Schedule aktiv'); var PVErtrag = getState (idPVErtrag).val; var Pmin = Summe/count; if(count>0 && Summe >0){ setState(idPVErtrag, PVErtrag + Pmin/60/1000,true);//kWh if(debug)log(['Schedule Umrechnen W = P*t. Minutenwert Leistung: '+ Pmin, ' Minutenwert Arbeit: ' + (Pmin/60/1000), ' Tageswert Ertrag: ' +PVErtrag ].join('')); setTimeout(function(){ count=0; Summe=0; if(debug)log(['Reset: Count = '+ count, ' Summe = ' + Summe ].join('')); },100); }else{ if(count===0 && Summe ===0){ clearSchedule(Timer); merker = true; if(logging)log('minuten Schedule gestoppt'); } } }); } // jeden Tag um 23:59 Tageswert nullen. schedule({hour: 0, minute: 1}, function () { setState(idPVErtrag,0,true); if (logging)log('Tagesertragswert auf 0 gesetzt'); });
-
Auch von meiner Seite nochmal ein großes DANKE!! für deine Arbeit.
So macht der E3DC gleich noch mehr Spaß.kurzer Hinweis zu der neuen Version 0.2.07, evtl sollte hier noch ein Hinweis ins Changelog, dass ein zusätzliches Javascript Modul "is-it-bst" notwendig ist.
-
@smartboart Das ist ja super.
Werde es heute integrieren und testen. -
@Abyss
Ja richtig, sollte auf alle Fälle drin stehen.
Danke. -
@Abyss habe es bei der Anleitung im ersten Post hier ergänzt und werde es auch ins Changelog eintragen.
-
Habe mir das Script jetzt mal angeschaut und verstehe nicht ganz wann dein merker auf true gesetzt wird.
Beim Start wird dieser auf false gesetzt und dürfte eigentlich nie true werden oder übersehe ich hier was. -
@ArnoD sagte in E3DC Hauskraftwerk steuern:
Habe mir das Script jetzt mal angeschaut und verstehe nicht ganz wann dein merker auf true gesetzt wird.
Beim Start wird dieser auf false gesetzt und dürfte eigentlich nie true werden oder übersehe ich hier was.if(count===0 && Summe ===0){ clearSchedule(Timer); merker = true; if(logging)log('minütlicher Schedule gestoppt');
-
oh ja...habe den scriptstart vergessen zu kopieren...
//skriptstart schedulestart();
habs oben geändert..
-
Ok habe dein Script jetzt mal übernommen und lass beide Zähler Parallel laufen, mal schauen wie groß der Unterschied ist.
Ich habe im Modbus Adapter Pol delay auf 1 sek, eingestellt um die Abtastrate zu erhöhen.
Das scheint aber source Analytics nicht weiter zu beeinflussen, vermute das dort eine andere Pol Zeit verwendet wird.
Über dein Script wird auf alle Fälle eine höherer PV Ertrag berechnet. -
1 Sekunde ist gut... Je kleiner desto genauer...Evtl. kann man die Pollzeit später etwas erhöhen sollte die Genauigkeit kaum darunter leiden...
Ich habe gerade meine beiden Varianten laufen seid heute morgen. Will sehen ob der Schedulestart und Stop sich negativ auswirkt. Was es eigentlich nicht sollte. Es sollten dennoch alle Änderungen berücksichtigt werden....Vergleichen muss man das mit den Leistungswerten Solarproduktion aus dem E3DC Portal...
Denke wenn sich das script nicht verzählt, sollte es ziehmlich genau sein...