NEWS
E3DC Hauskraftwerk steuern
-
@arnod
Hi Arno ich habe das Script Autonomiezeitberchnung aktualisiert und an die neuen Bedingungen / RSCP Adapter und deinem aktuellen Sript angepasst. Falls du oder andere es noch benutzten kann es hier kopiert werden./* E3DC dynamische Autonomiezeitberechnung bis zur eingestellten Reserve von Smartboard 28.09.2020 V0.0.1 -Dynamische Berechnung der Batterie Autonomiezeit bei Entladung anhand der Modbusinformationen BatSoc und Batterie_Leistung unter Berücksichtigung der Notstromreserve. Für anzeige in Vis.. Autonomiezeit in Vis auf Sichtbarkeit bei != 0 einstellen damit Diese nur bei Entnahme angezeigt wird. BatSoc in kwh 29.09.2020 V0.0.2 -Berechnung auf Durchschnittswert der Autonomiezeit erweitert, dadurch wird die Zeitanzeige ruhiger und gibt einen gemittelten Wert wieder, welcher auch aussagekräftiger ist. - Notstromreserve wird nun aus Sript E3DC Control von ArnoD eingelesen. Sowie unterscheidung zur manuellen Eingabe falls in E3DC eine Notstromreserve hinterlegt wurde. Somit bleibt die Autonomie Berechnung automatisch aktuell sollte in E3DC Control etwas angepasst werden. 30.09.2020 V0.0.3- Autonomiezeit Anzeige in Minuten wenn < 1 Stunde . State Autonomiezeit geändert von type numnber zu string. 03.10.2020 V0.0.4- debug überarbeitet für Anzeige im Log Adapter 07.10.2020 V0.0.6 - Berechnungsfehler, welche -Werte erzeugten wurden behoben. Ausgabe der 1. Autonomiezeitberechnung sofort anzeigen dann wird auf Durchschnittswert umgeschalte 20.10.2020 V0.0.7 - Hinweis stevie77 Wirkungsgrad in Berechnung einbeziehen. laut Datenblatt: max. Systemwirkungsgrad inkl. Batterie (%) > 88 Bei 13 KW 13 / 100 * 88 = 11.44 Bemerkung .Vermutlich kann hier 1 eingetragen werden, da im Verbrauchswert Watt schon die die Verluste inkludiert sind. 21.10.2020 V0.0.7 - Hinweis stevie77 Tiefenentladeschutz bei 10 % mit in Berechnung einbeziehen. V0.0.8 - Berücksichtung Notstrombetrieb: Im Normalbetrieb erfolgt die Autonomierzeitberechnung bis zur Notstromreserve . Im Notstrombetrieb wird die Autonomiezeit nun weiter berechnet und die Berechnung erfolgt dann bis zur Nettokapazitätsgrenze (Entladeschutz). Die Anzeige in kWh zeigt immer die Nettokapazität bis zum Entladeschutz. 13.11.2022 V0.0.9 - Notstromreserve nun aus E3DC-Charge-Control importiert. Lastabwurf ist entfallen 13.11.2022 v0.1.0 - Wirkungsgrad und Entladetiefe bei Autonomieberechnung entfernt, da dies zu Fehlberechnungen führt. Die Entnommene Leistung beinhaltet ja schon die Verluste, somit kann mit dem Brutto gerechnet werden. SOH einbezogen. 11.01.2023 v0.1.1 - Berechnungsformel Autonomiteit geändert. Anderer Rechenweg. */ //Konfiguration var debug = false; var SpeicherNetto = 18.525; // kw/h hier die Speichergröße in kwh abzügl der Sicherheitsreserve 5 % var cron1 = 6; // hier die Schedulezeit - Triggerhäufigkeit alle x Sekunden für Zeitberechnung eintragen var Counter = 10; // Hier die Anzahl der Zeitberechnungen eintragen um einen Durchschnitswert zu ermitteln const fC = false; const Statepfad = 'javascript.' + instance + '.PVAnlage.Autonomie.'; //Variable für Cronjob start stop var Timer = null; //Variable Hilfsmerker var Merker = true; //Variablen zur Berechnung der Zeiten var Autonomiezeit = 0;// bis Notstromreserve // Variablen für Durchschnittsberechnung var Count = 0; var Summe = 0; // Wert gleich anzeigen var Anzeige = false; // Variable für Bat Soc in kwh abzüglich Notstromreserve var BatSockWh = 0; var Entnahme = 0; var BatSoc = 0; var Speicher = 0; var Asoc1 = 0; var Asoc2 = 0; var Asoc = 0; //states to create Ergebnisse const idAutonomiezeit = Statepfad + 'Autonomiezeit'; const idBatSockWh = Statepfad + 'Batteriekapazitaet'; //Berechnungsgrundlagen const idAsoc1 = 'e3dc-rscp.0.BAT.BAT_0.ASOC'/*Alterungszustand*/ const idAsoc2 = 'e3dc-rscp.0.BAT.BAT_1.ASOC'/*Alterungszustand*/ const idBatEntnahme = 'modbus.1.holdingRegisters.40070_Batterie_Leistung'/*Batterie-Leistung in Watt*/; const idBatSoc = 'modbus.1.holdingRegisters.40083_Batterie_SOC'/*Batterie-SOC in Prozent*/; const idNotstrombetrieb = 'modbus.1.holdingRegisters.40084_Emergency_Power_Status'/*Emergency-Power Status*/; const idE3DCReserve = 'javascript.1.PVAnlage.E3DC-Control.Allgemein.Notstrom_akt'/*aktuell berechnete Notstromreserve*/; //states create // Autonomiezeit in Vis auf Sichtbarkeit bei != 0 einstellen damit nur Sichtbar bei Entnahme createState(idAutonomiezeit, 0, fC, { type: 'string', name: 'Autonomiezeit',role:'text'}); createState(idBatSockWh, 0, fC, { type: 'number', name: 'Batteriekapazität',role:'value', unit: ' kWh'}); if(fC && debug)log('force Creation Aktiv States angelegt oder überschrieben'); //Scriptstart setState(idAutonomiezeit, '0' ,true); setTimeout( function(){ Berechnung(); },500); // Trigger Berechnung Aktueller Bat Soc in kwh on(idBatSoc, function(dp) { if(debug)log('Batterie E3DC: Trigger BatSoc aktiv. BatSoc beträgt: '+ dp.state.val +' %'); Berechnung(); }); //Berechnung Aktueller Bat Soc in kwh und Wert in State schreiben function Berechnung(){ BatSoc = getState(idBatSoc).val; Asoc1 = getState(idAsoc1).val; Asoc2 = getState(idAsoc2).val; Asoc = (Asoc1+Asoc2)/2; Speicher = SpeicherNetto/100*Asoc; setState(idBatSockWh,Math.round(((Speicher/100) * BatSoc)*100)/100,true); if(debug)log('Batterie E3DC: Die Aktuell verfügbare Speicherkapazität ist: '+ getState(idBatSockWh).val+' kWh'); } // Schedule Berechnung Autonomiezeit starten bei Entnahme on(idBatEntnahme, function(dp) { if(dp.state.val < 0 ){ if(Merker)schedulestart(); Merker = false; if(debug)log('Batterie E3DC: Aktuelle Entnahmeleistung: ' + dp.state.val +' Watt'); } }); //Berechnung Autonomiezeit function schedulestart(){ if(debug)log('Batterie E3DC: Funktion Schedulestart aktiv'); var cronjob = "*/"+cron1+" * * * * *"; Timer = schedule(cronjob, function(){ if(debug)log('Batterie E3DC: Schedule cronjob aktiv'); Entnahme = getState (idBatEntnahme).val; BatSockWh = getState (idBatSockWh).val; BatSoc = getState(idBatSoc).val; var Reserve = getState(idE3DCReserve).val; var Notstrombetrieb = getState(idNotstrombetrieb).val; if (Notstrombetrieb !=2){ Reserve = 0; } setTimeout(function(){ if(Entnahme<0){ //BatSockWh = Math.round(BatSockWh - (Speicher/100*Reserve*100)/100); BatSockWh = BatSockWh/BatSoc*(BatSoc-Reserve); if(debug)log('Batterie E3DC: aktuelle Netto Gesamtkapazität abzüglich der Notstromreserve ist: '+ BatSockWh + ' kWh.'); setTimeout(function(){ Autonomiezeit = Math.round(BatSockWh*1000/Entnahme*-1*100)/100; Durchschnitt(); if(Anzeige === false && Autonomiezeit >0){ setState(idAutonomiezeit, Autonomiezeit +' h',true); Anzeige = true; } if(debug)log('Batterie E3DC: Autonomiezeit neu berechnet auf: '+ Autonomiezeit + ' h.'); },100); }else{ //Berechnung stoppen bei Entnahme 0 und Autonomiezeit auf 0 setzen if(Entnahme >=0){ clearSchedule(Timer); Merker = true; if(debug)log('Batterie E3DC: Schedule cronjob gestoppt weil keine Entnahme'); setState(idAutonomiezeit,'0',true); Anzeige = false; } } },100); }); } // Zaehlem für Durchschnittsberechnung function Durchschnitt(){ Count ++ Summe = Summe + Autonomiezeit; if(debug)log ('Summe: ' + Summe + ' Zaehler: '+Count+ ' Addition: + ' + Autonomiezeit); if(Count===Counter){ var Zeit= Summe/Count; setTimeout(function(){ if(debug)log('Batterie E3DC: Aktuelle Netto Speicherkapazität beträgt: '+ getState(idBatSockWh).val+' kWh, abzüglich der Notstromreserve '+BatSockWh+ ' kWh' ); if(Zeit>=1){ setState(idAutonomiezeit,+ Math.round(Zeit*100)/100 +' h',true); if(debug)log('Batterie E3DC: Autonomiezeit beträgt: '+ Math.round(Zeit*10)/10 + ' h'); } if(Zeit<1 && Zeit >0){ setState(idAutonomiezeit, + Math.round((Zeit*60)*100/100)+' min',true); if(debug)log('Batterie E3DC: Autonomiezeit bis Notstromreserve beträgt: '+Math.round((Zeit*60)*100/100) +' min.'); } if(Zeit < 0){ setState(idAutonomiezeit, '0' ,true); if(debug)log('Batterie E3DC: Autonomiezeit beträgt: 0 min.'); } Count=0; Summe=0; if(debug)log('Batterie E3DC: Reset: Count = '+ Count+ ' Summe = ' + Summe); },100); } }
-
@smartboart
Super, danke -
@smartboart
Danke für das Update des neuen Scriptes.
@ArnoD
Danke für das neue Charge-Control und die neue Art der Regelung.
Klasse Sache!!
Freue mich schon auf die Möglichkeit der manuellen Speicherladung.Nach langer Pause hab ich mich mal wieder drangesetzt um meine Systeme auf den aktuellen Stand zu bringen.
Bei deinem Autonomie-Script scheitere ich grad an folgender Zeile:
const idE3DCReserve = 'javascript.0.PVAnlage.E3DC-Control.Allgemein.Notstrom_akt'/aktuell berechnete Notstromreserve/;Wo kommt das Objekt her? das gibt es bei mir nicht und wird weder durch Charge-Control noch die Autonomiezeit erstellt?
Hab ich hier was verpasst?
Ohne das bekomme ich nur Fehlermeldungen und die Berechnung läuft nicht.Danke und Grüße
-
@abyss
Das Objekt legt Charge-Control an und befindet sich bei mir unter: '0_userdata.0.Charge_Control.Allgemein.Notstrom_akt'.Pfad ändern und geht
-
@abyss Ja sorry..eben erst gelesen...arnos Script legt alles unter userdata an..ich habe das bei mir geändert weil ich nie auf userdata umgestellt habe und vergessen darauf hinzuweisen...
-
Danke euch für den Hinweis.
Hab alles durchgeklickt aber an der Stelle wohl aktiv überlesen.
Jetzt sieht es deutlich besser aus.Danke nochmal!!
-
Neue Version Charge-Control auf GitHub hochgeladen.
Version: 1.1.6
Änderungen:- Bei der Abfragezeit der Daten von Solcast, werden die Minuten zufällig berechnet. Solcast Daten werden jetzt zwischen 4:01 Uhr und 4:59 Uhr abgerufen.
- Fehler in Funktion CheckPrognose() behoben. Die Variable Notstrom_SOC_Proz wurde hier auf Einstellwert zurückgesetzt.
-
@jans_ios Hi, wie bist Du auf die Website der Wallbox gekommen. Mir fehlt das Kennwort. Kannst Du mir bitte helfen?
Liebe Grüße Zorrokater -
@zorrokater probier mal wallbe7213
-
@ArnoD
Ich hatte (bis eben) den Wert "Unload" auf 32% stehen. Das führte heute Nacht und auch in einer vorherigen Nacht dazu, dass der Speicher ab 01:00 Uhr bis auf 32% ins Netz entladen wurde. Ich hatte es eigentlich so verstanden, dass dies erst bei PV-Produktions-Beginn passieren sollte, was ja auch Sinn machen würde - liegt hier ein Fehler vor? Ich schicke Dir mal per PN mein heutiges Log, da kann man das schön sehen.Außerdem: Besteht die Möglichkeit, den hier ins Netz eingespeisten Strom "umzulenken" bspw. zu einem MyPV-Heizstab in der Heizung? Das würde mir mehr bringen in Richtung Eigenverbrauch.
Danke!
Gruß, Jan
-
@jans_ios
Hallo Jan,
der Link zum Download funktioniert aktuell nicht, da bekomme ich immer eine Zeitüberschreitung.
Ich werde es aber später noch mal versuchen.Gruß Arno
-
@arnod
Mist, da habe ich wohl gerade ein kleineres Problem Schön, dass sowas immer dann auftritt, wenn man selbst nicht zuhause ist.
Ich poste hier mal ein paar relevante Zeilen. So beginnt es um 01:00 Uhr:2023-02-14 01:00:00.243 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" -==== Vor Regelbeginn ====- "}## 2023-02-14 01:00:00.243 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" -==== 1 M_Power: -261 = Math.round(((Unload_SOC_Proz:32 - Batterie_SOC_Proz:46)*Speichergroesse_kWh: 18*10*3600) / (tRegelbeginn:34750 - Zeit_aktuell_UTC_sek:0)) ====- "}## 2023-02-14 01:00:00.290 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" Entladeleistung M_Power=-261 "}## 2023-02-14 01:00:00.290 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" Entladeleistung PowerGrid =-730"}## 2023-02-14 01:00:00.342 - [33mwarn[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":"-==== Batterie entladen Schritt = 1 Set_Power_Mode = 2 entladen Set_Power_Value_W = -730 M_Power = -730 ====-"}## 2023-02-14 01:00:03.006 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" -==== 1 M_Power: -261 = Math.round(((Unload_SOC_Proz:32 - Batterie_SOC_Proz:46)*Speichergroesse_kWh: 18*10*3600) / (tRegelbeginn:34750 - Zeit_aktuell_UTC_sek:3)) ====- "}## 2023-02-14 01:00:03.054 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" Entladeleistung M_Power=-261 "}## 2023-02-14 01:00:03.055 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" Entladeleistung PowerGrid =-526"}## 2023-02-14 01:00:03.117 - [33mwarn[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":"-==== Batterie entladen Schritt = 1 Set_Power_Mode = 2 entladen Set_Power_Value_W = -526 M_Power = -526 ====-"}## 2023-02-14 01:00:06.008 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" -==== 1 M_Power: -261 = Math.round(((Unload_SOC_Proz:32 - Batterie_SOC_Proz:46)*Speichergroesse_kWh: 18*10*3600) / (tRegelbeginn:34750 - Zeit_aktuell_UTC_sek:6)) ====- "}## 2023-02-14 01:00:06.053 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" Entladeleistung M_Power=-261 "}## 2023-02-14 01:00:06.054 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" Entladeleistung PowerGrid =-927"}## 2023-02-14 01:00:06.068 - [33mwarn[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":"-==== Batterie entladen Schritt = 1 Set_Power_Mode = 2 entladen Set_Power_Value_W = -927 M_Power = -927 ====-"}## 2023-02-14 01:00:09.072 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" -==== 1 M_Power: -261 = Math.round(((Unload_SOC_Proz:32 - Batterie_SOC_Proz:46)*Speichergroesse_kWh: 18*10*3600) / (tRegelbeginn:34750 - Zeit_aktuell_UTC_sek:9)) ====- "}## 2023-02-14 01:00:09.157 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" Entladeleistung M_Power=-261 "}## 2023-02-14 01:00:09.157 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" Entladeleistung PowerGrid =-509"}## 2023-02-14 01:00:09.222 - [33mwarn[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":"-==== Batterie entladen Schritt = 1 Set_Power_Mode = 2 entladen Set_Power_Value_W = -509 M_Power = -509 ====-"}##
Und so endet es dann um 03:47 Uhr:
2023-02-14 03:47:12.050 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" Entladeleistung M_Power=-26 "}## 2023-02-14 03:47:12.050 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" Entladeleistung PowerGrid =-508"}## 2023-02-14 03:47:15.009 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" -==== 1 M_Power: -26 = Math.round(((Unload_SOC_Proz:32 - Batterie_SOC_Proz:33)*Speichergroesse_kWh: 18*10*3600) / (tRegelbeginn:34750 - Zeit_aktuell_UTC_sek:10035)) ====- "}## 2023-02-14 03:47:15.055 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" Entladeleistung M_Power=-26 "}## 2023-02-14 03:47:15.056 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" Entladeleistung PowerGrid =-519"}## 2023-02-14 03:47:18.012 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" -==== Laderegelung wird gestoppt ====- "}## 2023-02-14 03:47:18.058 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" -==== Regelung E3DC überlassen. Schritt = 1 SET_POWER_MODE = 0 normal ====- "}## 2023-02-14 03:47:21.010 - [32minfo[39m: javascript.0 (197) script.js.Eigene_Skripte.Energie.Charge_Control: ##{"from":"Charge-Control", "message":" -==== Laderegelung wird gestoppt ====- "}##
-
Welche Version vom Script hast du im Einsatz?
Der Fehler ist eigentlich, dass die Lade-\Entladefreigabe nicht deaktiviert wurde, warum auch immer.
Das sollte eigentlich mit der aktuellen Version nicht mehr passieren.Ich schaue mir das mal genauer an, ob ich da was übersehen habe.
Gruß Arno
-
@arnod
Ich habe die aktuelle 1.1.6 im Einsatz -
@jans_ios
Was ist bei dir aktuell für ein Notstrom SoC eingestellt? -
Neue Version Charge-Control auf GitHub hochgeladen.
Version: 1.1.7
Änderungen:- Fehler in behoben, dass auf Unload SoC entladen wurde, obwohl noch keine PV-Leistung vorhanden war.
-
@jans_ios
Kannst du mal bitte die Version 1.1.7 testen und schauen, ob damit das Problem behoben ist? -
@arnod
Klar, mache ich morgen, wenn ich wieder zuhause bin.Gibt es eine Möglichkeit, den Strom an ein Gerät wie meinen Heizstab zu schicken, statt einzuspeisen?
Danke für Deinen.Einsatz!
Gruß, Jan
-
@jans_ios
Wenn du eine Schnittstelle hast, über die du den Heizstab einschalten kannst, ist das kein Problem.
Ich bekomme nächste Woche meine Wärmepumpe und werde diese dann über Modbus einbinden, um möglichst viel am Tag zu verbrauchen.
Wird aber vermutlich ein eigenes Script, was die Wärmepumpe, Pool, Wallbox und Batterieladung E3DC steuern soll. -
@arnod
Der Heizstab (Elwa-E) kann einfach per Modbus angesteuert werden. Ich schreibe da eine W-Zahl rein und los läuft er. Ich hatte mir schon mal auf blockly-Ebene gebaut, was dann den Überschuss nahm und in den Wert überführte, jedoch war das dann immer eine Art Timing-Problem. Das Charge-Control-Skript sah einfach einen dadurch erhöhten Hausverbrauch und stellte um auf "Steurung durch E3DC", durch Zufall war dann zwischendurch mal sehr viel Überschuss vorhanden und der Heizstab wurde auf sein max. von 3kW hochgedreht und die Akku-Ladung brach ein etc.Man müsste also irgendwie im Charge-Control-Sktipt etwas bauen, welches verschiedene Stromabnehmer wie bspw. einen Heizstab oder eine Wärmepumpe entweder selbst steuert oder aber deren Verbräuche dem Überschuss zurechnet oder so.
Die 1.1.7 konnte ich übrigens mangels Sonne noch nicht intensiv testen, aber diese Woche sieht es so aus, als könnte ich auch mal mit einem randvollen Akku in den Abend gehen. Ich werde berichten!