NEWS
E3DC Hauskraftwerk steuern
-
Neue Version Charge-Control auf GitHub hochgeladen.
Version: 1.5.3
Änderungen:- Kleinere Optimierungen und Fehler behoben für das Tibber Skript.
- Neues Objekt
0_userdata.0.Charge_Control.Allgemein.EigenverbrauchDurchschnitt
erstellt, für die Anzeige vom Durchschnittsverbrauch Tag / Nacht in VIS. - Fehler behoben, dass die Berechnung Notstromreserve <0 sein konnte. (Danke an @MaLei für den Hinweis)
-
Habe nach Update auf 1.5.3 wieder den Fehler
javascript.0 17:45:31.220 info script.js.common.E3DC.Charge_Control: Fehler bei der Berechnung des reinen Hausverbrauchs: Cannot read properties of null (reading 'val')
-
@arnod
Danke für die VereinfachungenHab beide Scripte und auch Vis übernommen.
Soweit läuft alles.
Die Ladung startet allerdings nicht von alleine.
Wenn ich manuell "0_userdata.0.TibberSkript.OutputSignal.BatterieLaden" auf true setze, startet die Ladung.
Bei welcher Bedingung wird es normalerweise auf true gesetzt?Ich habe jetzt auch mal den Schedule auf "jede Minute" gestellt, damit ich nicht so lange warten muss, wenn ich was ändere.
-
@malei sagte in E3DC Hauskraftwerk steuern:
Fehler bei der Berechnung des reinen Hausverbrauchs: Cannot read properties of null (reading 'val')
Vermutlich auch hier eine Objekt-ID eingetragen, die ins Leere führt.
Prüfe mal bitte alle ID's im Script unter USER ANPASSUNGEN, ob die bei dir auch vorhanden sind. -
@psrelax
Wenn nach Wetterprognose, ausreichend PV-Leistung am Tag vorhanden ist, um die Batterie zu laden wird der Timer gelöscht.
Setze mal die Option "PV Module schneebedeckt." dann wir die Prognose ignoriert und 'BatterieLaden' sollte auf true gesetzt werden. -
Schneebedekt hat keine Auswirkung.
In der Debug Ausgabe wird trotz Schneebedekt=true folgendes ausgegeben (false):javascript.0 01:00:00.271 info script.js.E3DC_ChargeControl.Tibber: ******************* Debug LOG Tibber Skript ******************* javascript.0 01:00:00.271 info script.js.E3DC_ChargeControl.Tibber: timerIds1 = 158107952 timerIds2 = 158107971 javascript.0 01:00:00.271 info script.js.E3DC_ChargeControl.Tibber: timerTarget1 = Sat Aug 24 2024 14:00:00 GMT+0200 (Mitteleuropäische Sommerzeit) timerTarget2 = Sat Aug 24 2024 15:00:00 GMT+0200 (Mitteleuropäische Sommerzeit) javascript.0 01:00:00.271 info script.js.E3DC_ChargeControl.Tibber: blockpreisTimer = Infinity javascript.0 01:00:00.272 info script.js.E3DC_ChargeControl.Tibber: billigsterEinzelpreisBlock = Infinity javascript.0 01:00:00.272 info script.js.E3DC_ChargeControl.Tibber: minStrompreis_48h = 0.1336 javascript.0 01:00:00.272 info script.js.E3DC_ChargeControl.Tibber: minStrompreisUser = 0.33 javascript.0 01:00:00.272 info script.js.E3DC_ChargeControl.Tibber: schneeBedeckt = false javascript.0 01:00:00.272 warn script.js.E3DC_ChargeControl.Tibber: ProgrammAblauf = 1,4,3,3,
"minStrompreisUser " hab ich mal ganz hoch und mal ganz niedrig gesetzt.
-
@psrelax
Ok habe vergessen die ID anzupassen in Zeile 575, bitte bei 'id: /\Tibber' TibberSkript eintragen.
Werde das noch ändern, dass die Variable PfadEbene1 verwendet wird.
Sollte so aussehen:on({id: /\TibberSkript.USER_ANPASSUNGEN/, change: "ne"}, async function (obj){ if (bLock) return; bLock = true; setTimeout(() => bLock = false, 100); log(`-==== User Parameter ${obj.id.split('.')[4]} wurde in ${obj.state.val} geändert ====-`,'warn') if (obj.id.split('.')[4] == 'maxSOC_Batterie' ){maxBatterieSoC = obj.state.val} if (obj.id.split('.')[4] == 'maxLadeleistung' ){maxLadeleistungUser_W = obj.state.val} if (obj.id.split('.')[4] == 'minStrompreis' ){maxStrompreisUser = obj.state.val} if (obj.id.split('.')[4] == 'pvSchneebedeckt' ){schneeBedeckt = obj.state.val} await tibberSteuerungHauskraftwerk(); await createDiagramm(); });
Nachtrag:
bitte so abändern:
// Wird aufgerufen wenn sich an den States Tibber.User_Anpassungen was ändert const regexPatternTibber = new RegExp(`${PfadEbene1}.${PfadEbene2[3]}`); on({id: regexPatternTibber, change: "ne"}, async function (obj){ if (bLock) return; bLock = true; setTimeout(() => bLock = false, 100); log(`-==== User Parameter ${obj.id.split('.')[4]} wurde in ${obj.state.val} geändert ====-`,'warn') if (obj.id.split('.')[4] == 'maxSOC_Batterie' ){maxBatterieSoC = obj.state.val} if (obj.id.split('.')[4] == 'maxLadeleistung' ){maxLadeleistungUser_W = obj.state.val} if (obj.id.split('.')[4] == 'minStrompreis' ){maxStrompreisUser = obj.state.val} if (obj.id.split('.')[4] == 'pvSchneebedeckt' ){schneeBedeckt = obj.state.val} await tibberSteuerungHauskraftwerk(); await createDiagramm(); });
-
@arnod
Die Ladung startet immer noch nicht.
Aufgefallen ist, der "minstrompreisuser" ändert sich nur wenn ich das Script neu starte. -
Bitte diesen code bei dir einfügen:
// Wird aufgerufen wenn sich an den States Tibber.User_Anpassungen was ändert const regexPatternTibber = new RegExp(`${PfadEbene1}.${PfadEbene2[3]}`); on({id: regexPatternTibber, change: "ne"}, async function (obj){ if (bLock) return; bLock = true; setTimeout(() => bLock = false, 100); log(`-==== User Parameter ${obj.id.split('.')[4]} wurde in ${obj.state.val} geändert ====-`,'warn') if (obj.id.split('.')[4] == 'maxSOC_Batterie' ){maxBatterieSoC = obj.state.val} if (obj.id.split('.')[4] == 'maxLadeleistung' ){maxLadeleistungUser_W = obj.state.val} if (obj.id.split('.')[4] == 'maxStrompreisUser' ){maxStrompreisUser = obj.state.val} if (obj.id.split('.')[4] == 'pvSchneebedeckt' ){schneeBedeckt = obj.state.val} await tibberSteuerungHauskraftwerk(); await createDiagramm(); });
Habe hier die Änderung min zu maxStrompreisUser übersehen.
-
@arnod
minStrompreisUser wird immer noch nicht aktualisiert, wenn das Script nicht neu gestartet wird.
Zumindest startet das Laden nach dem Neustart. -
@psrelax
Habe eine neue Version 1.0.2 hochgeladen, bitte diese mal testen.
Die View hat sich auch noch mal geändert.
In der View ist jetzt für die Testphase im unteren Bereich ein Flot Diagramm, was die Zustände von BatterieLaden, eAutoLaden und BatterieEntladesperre im zeitlichen Verlauf anzeigt.
So kann man schnell erkennen, ob das Skript richtig funktioniert.Die Batterie Entladesperre sollte jetzt auch funktionieren.
Dafür ist eine neue Konstante im Skript Bereich User Anpassungen hinzugekommen "stromgestehungskosten" um den Selbstkostenpreis PV Strom berechnen zu können. (alle Kosten, die innerhalb der vorgesehenen Laufzeit (20 Jahre) entstehen addiert, dividiert durch den Ertrag an Solarstrom).
Es ist auch eine neue Objekt ID0_userdata.0.TibberSkript.USER_ANPASSUNGEN. Systemwirkungsgrad
erstellt worden um den Systemwirkungsgrad mit Batterie in % eintragen zu können. Bei mir z.B 88%Wenn alles richtig funktioniert, sollte das Entladen der Batterie immer dann verhindert werden (BatterieEntladesperre = true), wenn der berechnete Strompreis Batterie mit Speicherverluste höher ist als der aktuelle Strompreis Tibber.
-
@psrelax sagte in E3DC Hauskraftwerk steuern:
@arnod
minStrompreisUser wird immer noch nicht aktualisiert, wenn das Script nicht neu gestartet wird.
Zumindest startet das Laden nach dem Neustart.Ok, habe den Fehler auch korrigiert und das Skript noch mal hochgeladen.
-
@arnod
Lädt nicht.
javascript.0 19:44:00.077 info script.js.E3DC_ChargeControl.Tibber: ******************* Debug LOG Tibber Skript Version 1.0.2 ******************* javascript.0 19:44:00.077 info script.js.E3DC_ChargeControl.Tibber: timerIds1 = 199184573 timerIds2 = 199184598 javascript.0 19:44:00.077 info script.js.E3DC_ChargeControl.Tibber: timerTarget1 = Sun Aug 25 2024 13:00:00 GMT+0200 (Mitteleuropäische Sommerzeit) timerTarget2 = Sun Aug 25 2024 14:00:00 GMT+0200 (Mitteleuropäische Sommerzeit) javascript.0 19:44:00.077 info script.js.E3DC_ChargeControl.Tibber: blockpreisTimer = 0.2814 javascript.0 19:44:00.077 info script.js.E3DC_ChargeControl.Tibber: billigsterEinzelpreisBlock = 0 javascript.0 19:44:00.077 info script.js.E3DC_ChargeControl.Tibber: minStrompreis_48h = 0.1623 javascript.0 19:44:00.077 info script.js.E3DC_ChargeControl.Tibber: maxStrompreisUser = 0.8 javascript.0 19:44:00.077 info script.js.E3DC_ChargeControl.Tibber: schneeBedeckt = true javascript.0 19:44:00.077 info script.js.E3DC_ChargeControl.Tibber: strompreisBatterie = undefined javascript.0 19:44:00.077 info script.js.E3DC_ChargeControl.Tibber: bruttoPreisBatterie = undefined javascript.0 19:44:00.077 info script.js.E3DC_ChargeControl.Tibber: aktuellerPreisTibber = 0.295 javascript.0 19:44:00.077 info script.js.E3DC_ChargeControl.Tibber: bEntladenSperren = false javascript.0 19:44:00.078 warn script.js.E3DC_ChargeControl.Tibber: ProgrammAblauf = 1,4,3,3,
Die Stromgestehungskosten sind mir noch nicht ganz klar.
Du hast 0.1057 eingetragen. Ich würde auf 0,53 kommen.
Rechnung: 30000€ (ca.) / 56831,56kWh (bis heute)
Der Ertrag Solarstrom ändert sich allerdings täglich, wodurch das dann automatisch berechnet werden müsste.
Für was willst du die Stromgestehungskosten verwenden?Bezüglich des Flot Diagramms, bin ich noch recht ahnungslos, da ich es nicht verwende. Hab es mir jetzt installiert.
Gibts da vielleicht etwas fertiges zum importieren? Oder einen 2-Zeiler Crashkurs mit Screenshot von deiner Config? -
@psrelax sagte in E3DC Hauskraftwerk steuern:
Lädt nicht.
Das Bild und die LOG Ausgabe wurden aber nicht zur gleichen Zeit gemacht, oder?
Startzeitpunkt Bild heute 20:00 - 21:00 Uhr und im LOG Morgen 13:00 Uhr bis 14:00 Uhr
Bei beiden ist aber der Startzeitpunkt noch nicht erreicht und es kann somit noch nicht geladen werden.Die Stromgestehungskosten sind mir noch nicht ganz klar.
Du hast 0.1057 eingetragen. Ich würde auf 0,53 kommen.
Rechnung: 30000€ (ca.) / 56831,56kWh (bis heute)
Der Ertrag Solarstrom ändert sich allerdings täglich, wodurch das dann automatisch berechnet werden müsste.
Für was willst du die Stromgestehungskosten verwenden?Ich bin noch unschlüssig, ob diese überhaupt relevant sind.
Ich wollte für den geladenen PV-Strom in der Batterie nicht mit 0 € rechnen, da dieser ja auch was kostet.
Einfacher Ansatz ist alle Kosten für die PV-Anlage addieren, Kaufpreis +jährliche Wartung+ Reinigung usw. geteilt durch den erwarteten Ertrag über eine Laufzeit von 20 Jahren. Meine Anlage produziert ca. 16000 - 17000 kWh im Jahr, da habe einfach den minimal Ansatz gerechnet und 16000 *20 Jahre angenommen.Bezüglich des Flot Diagramms, bin ich noch recht ahnungslos, da ich es nicht verwende. Hab es mir jetzt installiert.
Gibts da vielleicht etwas fertiges zum importieren? Oder einen 2-Zeiler Crashkurs mit Screenshot von deiner Config?Konnte nichts finden, wie man Einstellungen im Flot Editor exportieren kann, dann muss es über Bilder gehen
Als Erstes im iobroker Admin Objekte bei den entsprechenden Objekten ganz rechts auf das Zahnrad klicken.
Dann aktiviert markieren und die entsprechenden Einstellungen machen:
Das für alle drei Objekte einzeln durchführen.
Dann zur Flot Instanz wechseln und den Flot Editor über das Viereck mit Pfeil starten:
Im Flot Editor drei neue Linien hinzufügen und die entsprechende ID auswählen und Einstellung wie auf Bild:
In der Spalte mehr auf das Symbol klicken:
und bei allen drei Linien die gleichen Einstellungen machen:
Oben auf den Reiter Zeit klicken und diese Einstellungen machen:
Dann oben auf den Reiter Optionen klicken und diese Einstellungen machen:
Dann das ganze speichern, indem du oben rechts neben Optionen auf Speichern klickst.
Den ganzen Link aus dem Fenster Link kopieren und darauf achten das wirklich alles markiert wird, dazu das Fenster nach unten scrollen.
Jetzt in den VIS Editor wechseln und das basic-iFrame Widget markieren, den kopierten Link bei Quelle einfügen:
-
@arnod
Doch war der gleiche Zeitraum. Siehst du am blauen Strich.
Flot schau ich mir gleich mal an. Danke für die Anleitung. -
@psrelax
Hast noch was geändert am Script ? -
@arnod
Nur wieder den Schedule auf ***** -
@psrelax
Lass den bitte auf einer Stunde zum Testen.
Jede Minute ist auch nicht sinnvoll, da sich da am Preis nichts ändert. -
@arnod
Ich hab den Schedule wieder zurück geändert.
Flot habe ich jetzt drin. Ich muss nur warten bis Daten gesammelt wurden. -
@ArnoD
Also heute wieder was Neues.
Kaum PV, Strom relativ günstig, SOC nur 15%. -> Entladesperre aktiv
javascript.0 2024-08-25 11:00:00.050 warn script.js.E3DC_ChargeControl.Tibber: ProgrammAblauf = 1,5, javascript.0 2024-08-25 11:00:00.050 info script.js.E3DC_ChargeControl.Tibber: bEntladenSperren = true javascript.0 2024-08-25 11:00:00.049 info script.js.E3DC_ChargeControl.Tibber: aktuellerPreisTibber = 0.1789 javascript.0 2024-08-25 11:00:00.049 info script.js.E3DC_ChargeControl.Tibber: bruttoPreisBatterie = 0.2115 javascript.0 2024-08-25 11:00:00.049 info script.js.E3DC_ChargeControl.Tibber: strompreisBatterie = 0.1861 javascript.0 2024-08-25 11:00:00.049 info script.js.E3DC_ChargeControl.Tibber: schneeBedeckt = false javascript.0 2024-08-25 11:00:00.049 info script.js.E3DC_ChargeControl.Tibber: maxStrompreisUser = 0.19 javascript.0 2024-08-25 11:00:00.049 info script.js.E3DC_ChargeControl.Tibber: minStrompreis_48h = 0.1623 javascript.0 2024-08-25 11:00:00.049 info script.js.E3DC_ChargeControl.Tibber: billigsterEinzelpreisBlock = 0 javascript.0 2024-08-25 11:00:00.049 info script.js.E3DC_ChargeControl.Tibber: blockpreisTimer = 0.17527500000000001 javascript.0 2024-08-25 11:00:00.049 info script.js.E3DC_ChargeControl.Tibber: timerTarget1 = undefined timerTarget2 = undefined javascript.0 2024-08-25 11:00:00.049 info script.js.E3DC_ChargeControl.Tibber: timerIds1 = undefined timerIds2 = undefined javascript.0 2024-08-25 11:00:00.049 info script.js.E3DC_ChargeControl.Tibber: ******************* Debug LOG Tibber Skript Version 1.0.2 ******************* javascript.0 2024-08-25 11:00:00.048 warn script.js.E3DC_ChargeControl.Tibber: Timer gelöscht javascript.0 2024-08-25 11:00:00.027 warn script.js.E3DC_ChargeControl.Charge_Control: -==== Tibber output signal aktuellerEigenverbrauch wurde in 879 W / 791 W geändert ====-
Ist das Verhalten so gewollt?
Geladen wird nicht, weil ...? Vielleicht wegen "strompreisBatterie" zu hoch. Wie wird "strompreisBatterie" berechnet?Im ChargeControl Script erhalte ich folgendes als Warning:
script.js.E3DC_ChargeControl.Charge_Control: -==== Tibber output signal JSON_Chart wurde in { "axisLabels": [ "25.08 - 00:00 Uhr", "25.08 - 01:00 Uhr", "25.08 - 02:00 Uhr", "25.08 - 03:00 Uhr", "25.08 - 04:00 Uhr", "25.08 - 05:00 Uhr", "25.08 - 06:00 Uhr", "25.08 - 07:00 Uhr", "25.08 - 08:00 Uhr", "25.08 - 09:00 Uhr", "25.08 - 10:00 Uhr", "25.08 - 11:00 Uhr", "25.08 - 12:00 Uhr", "25.08 - 13:00 Uhr", "25.08 - 14:00 Uhr", "25.08 - 15:00 Uhr", "25.08 - 16:00 Uhr", "25.08 - 17:00 Uhr", "25.08 - 18:00 Uhr", "25.08 - 19:00 Uhr", "25.08 - 20:00 Uhr", "25.08 - 21:00 Uhr", "25.08 - 22:00 Uhr", "25.08 - 23:00 Uhr" ], "graphs": [ { "data": [ 0.1866, 0.1861, 0.1857, 0.1849, 0.1851, 0.1856, 0.1861, 0.1861, 0.1861, 0.1845, 0.1789, 0.1741, 0.1677, 0.1623, 0.1625, 0.174, 0.1802, 0.1873, 0.2897, 0.317, 0.3283, 0.3117, 0.3048, 0.2962 ], "type": "line", "color": "gray", "line_pointSizeHover": 5, "line_pointSize": 2, "line_Tension": 0.2, "yAxis_show": false, "yAxis_gridLines_show": false, "yAxis_gridLines_ticks_length": 5, "yAxis_position": "left", "yAxis_appendix": "€", "yAxis_min": 0, "yAxis_max": 0.7, "yAxis_zeroLineWidth": 5, "yAxis_zeroLineColor": "white", "displayOrder": 0, "tooltip_AppendText": " €", "datalabel_color": "white", "datalabel_fontFamily": "RobotoCondensed-Light", "datalabel_rotation": 70, "datalabel_fontSize": 12, "datalabel_maxDigits": 4, "datalabel_show": "true", "line_PointColor": [ "#FFFFFF" ], "line_PointColorBorder": [ "#FFFFFF" ], "line_PointColorHover": [ "##FFFFFF" ], "line_PointColorBorderHover": [ "#FFFFFF" ], "use_gradient_color": true, "gradient_color": [ { "value": 0.1, "color": "#0FFA1366" }, { "value": 0.25, "color": "#fff90580" }, { "value": 0.2, "color": "#fff90580" }, { "value": 0.3, "color": "#FF004066" } ], "use_line_gradient_fill_color": true, "line_gradient_fill_color": [ { "value": 0.1, "color": "#0FFA1366" }, { "value": 0.25, "color": "#fff90580" }, { "value": 0.2, "color": "#fff90580" }, { "value": 0.3, "color": "#FF004066" } ] }, { "data": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], "type": "bar", "color": "#140CF2", "yAxis_min": 0, "yAxis_max": 1, "datalabel_show": false } ] } geändert ====-