NEWS
BEV mit EPEX-Börsen-Strom laden
-
Versionierung
- V.91 - 13.09.2023 - Ersterstellung der Beschreibung
- V.92 - 17.09.2023 - Ergänzung um ein praktisches Beispiel, damit erst einmal klar wird, um was es genau geht
Einleitung
Die Sonne steht schon wieder tiefer und versteckt sich häufiger hinter Wolken, so dass nicht mehr alleine mit PV-Überschuss geladen werden kann. Was liegt also näher, als das BEV automatisch und zu den günstigsten EPEX-Strombörsen-Stunden zu laden.
Für alle Interessierten gibt es eine "umfangreiche" Beschreibung. Wer sich schon auskennt kann ja drüber lesen ;-). Wer tiefer einsteigen will findet vielleicht interessante Ansätze. Also, los geht's.... und natürlich freue ich mich auf Euer Feedback und Verbesserungsvorschläge
Überblick an einem Beispiel
Es ist jetzt ~19:30 Uhr, das BEV hat einen SoC von 31% und soll bis morgen früh um 06:59 auf einen SoC von 65% geladen werden. Sobald die Eckdaten in den Datenpunkten eingestellt wurden...
... wird das Ladekabel angesteckt und der Ladevorgang wie folgt geplant...
Der Benutzer erhält die Informationen entsprechend...
Und um 02:00 Uhr wird die Wallbox mit einer Ladeleistung von 11kW angesteuert...
Wie das Ganze funktioniert findet Ihr in den weiteren Ausführungen.Aufbauend auf
Dieser Thread baut auf der bisherigen Beschreibung Geräte zu Stundenpreisen (EPEX) oder PV-Überschuss betreiben auf. Es wird davoan ausgegangen, dass die EPEX-Daten wie beschrieben vorliegen. Es macht also Sinn, dort mal reinzulesenEingesetzte Komponenten
- RasperryPi 4B, 8GB mit INTENSO M.2 SSD
- Tinkerforge WARP V1 Wallbox ( Wall Attached Recharge Point)
mit nachträglichem Umbau zum 1-2-3phasigen Laden - SKODA Enyaq 80x
- TIBBER stundenbasierte Strompreise
Danksagung
- Wie immer mein Dank an Matthias Kleine @haus-automatisierung mit seinen exzellenten Informationen zum ioBroker, MQTT, Hardware und ich weiß nicht was alles. Ohne Matthias wäre ich nie soweit gekommen und hätte vermutlich auf dem Weg aufgegeben .
- @mickym und seine Hilfe im dazugehörigen Thread zu HTTP PUT. In der nächsten Version würde ich es dann auch gleich mit NodeRed lösen.
- Und an Max für seine Erläuterungen in seinem Beitrag zum Sortieren von Array-Werten.
1. Grundlegende Informationen
Folgende Anforderungen bildeten die Grundlage der Umsetzung- Möglichst wenig Daten sollen aus dem BEV-Portal verwendet werden.
Leider kommt es beim VW-Connect-Adapter häufig zu Verzögerungen und Nichterreichbarkeit, herstellerseitig. Aus diesem Grund sollte nur das Nötigste an Daten verwendet werden. - Die Ladevorgaben werden in der Lösung und nicht im BEV getroffen.
Sämtliche BEV-Ladevorgaben sind also FZG-seitig deaktiviert oder auf 100% gestellt. Ich will ja nicht jedesmal für eine Änderung ans Auto laufen. - Die Daten der Wallbox sollen direkt über HTTP abgeholt und geschrieben werden. Es soll kein IOB-Adapter zum Einsatz kommen.
Das wird deswegen erwähnt, weil durch diese Festlegung die Daten aus der Wallbox wiederkehrend ausgelesen und in Datenpunkte geschrieben werden müssen. Daher wird auch mit Intervallen gearbeitet, statt mit Triggern. Dazu später mehr. - Wenn kein BEV angestöpselt ist, soll nur in einem längeren Intervall auf eine BEV-Wallbox-Verbindung geprüft werden.
Die meiste Zeit ist ja kein FZG angestöpselt. Da muss dann auch nichts geprüft werden. - Abhängig von der Kapazität der BEV-Batterie, des aktuellen BEV_SoC, der gewünschten Lade-Ende-Zeit und der Verfügbarkeit der EPEX-Preise, soll eine Ladeplanung/-Kalkulation durchgeführt werden. Dabei ist zu berücksichtigen, dass es sein kann, dass nicht zu jeder gewünschten Lade-Ende-Zeit auch EPEX-Preise vorliegen.
Da die Preise für den Folgetag ja erst nachmittags des Vortages vorliegen, kann teilweise nicht "sofort" weiter geplant werden, als EPEX-Preise vorliegen. Es soll also entschieden werden können, ob eine Ladung bis zu den vorliegenden EPEX-Preis-Stunden stattfindet oder später, mit Vorliegen neuer EPEX-Preise, automatisch neu gestartet werden soll. - Die Kommunikation mit dem Fahrer soll per PushOver erfolgen.
- Eine grafische Bedieneroberfläche soll später erstellt werden.
2. Datenpunkte
Da ich meine Datenpunkte nicht ausschließlich für das EPEX-Laden, sondern auch für das PV-Überschuss-Laden verwende, können leider nicht nur die nötigen Datenpunkte aufgezeigt werden. Somit gibt es erst mal folgende Übersicht aller Datenpunkte, die auch heruntergeladen werden können.
2023-09-13_Datenpunkte_0_userdata.0.Warp.json- BEV_Kapazität
Kapazität der BEV-Batterie in kWh - BEV_SoC_min
noch ohne Verwendung - BEV_cP_max
cP = chargingPower in W
maximale Ladegeschwindigkeit des BEV bzw. der Wallbox. - BEV_cP_min
cP = chargingPower in W
minimale Ladegeschwindigkeit mit der das BEV aufgeladen werden soll.
Verwendung nur für PV-Überschuss - BEV_connected
Status, ob das BEV an die Wallbox angestöpselt wurde.
Datenpunkt wurde nur zur Visualisierung eingebunden. - EPEX_BEV_Ladezeit_ziel
Angabe der Stunde, zu der die EPEX-BEV-Ladung abgeschlossen sein soll.
Es wird nur die Stunde angegeben. "9" steht also für Stunde von 09:00 bis 09:59 Uhr.
Wenn keine definierte Lade-Endezeit gewünscht ist, kann "EPEX_BEV_Ladezeit_ziel" auf "99" gestellt werden. Damit wird die EPEX-Ladung bis zur letzten verfügbaren EPEX-Preis-Stunde kalkuliert. - EPEX_BEV_SoC_ziel
Bezeichnet den zu erreichenden "BEV_SoC" in "%", bei dem der Ladevorgang beendet werden soll. - EPEX_BEV_connected_Intervall
Gibt den zeitlichen Abstand in "Minuten" an, nachdem erneut auf eine BEV-Wallbox-Verbindung geprüft werden soll. Der Wert wird beim Variablen-Laden in ms umgerechnet. Sobald ein BEV angestöpselt wurde, wird das Intervall ge-viertelt.
Wenn z.B. "EPEX_BEV_connected_Intervall" = 4 ist, wird alle 4 Minuten geprüft, ob ein BEV angestöpselt wurde. Wenn dann ein BEV angestöpselt wurde, wird jede Minuten geprüft, ob der "EPEX_BEV_SoC_ziel" erreicht ist. Ist "EPEX_BEV_SoC_ziel" erreicht, wird wieder alle 4 Minuten geprüft. - EPEX_Kalkulation_bei_Übermorgen
Im oben erwähnte Script werden täglich um 16:00 Uhr die EPEX-Preise von TIBBER abgeholt und in 2 Datenpunkten ("Stundenpreise_heute" und "Stundenpreise_morgen") bereitgestellt. Nun ist die zeitliche Abfolge und Verfügbarkeit der Preise wichtig. "heute" um 16:10 Uhr zum Beispiel, liegen alle Preise von heute 00:00 bis 23:59 Uhr und auch die Preise von morgen 00:00 bis 23:59 Uhr vor. "morgen" um 08:05 zum Beispiel, liegen aber nur die Preise von morgen morgen 00:00 bis 23:59 Uhr vor (... natürlich auch noch die Preise von gestern, aber die interessieren ja nicht mehr).
Folgendes Beispiel dazu:
Unter "heute" verstehen wir: Mittwoch, 13.09.2023 und unter "morgen": Donnerstag, 14.09.2023. Wie soll nun der EPEX-Ladevorgang geplant werden, wenn z.B. das BEV "morgen 08:10" angestöpselt wird und und als "EPEX_BEV_Ladezeit_ziel" "06" (:59) festgelegt wird? Das BEV soll also von 08:10 bis nächsten Tag 06:59 geladen werden. Da aber "morgen" nur die Preise bis "morgen 23:59" vorliegen, muss festgelegt werden, wie der Ladevorgang geplant werden soll.
Genau dies entscheidet der Datenpunkt "EPEX_Kalkulation_bei_Übermorgen". Beim Wert "sofort = heute 23:59" beginnt der EPEX-Ladevorgang sofort und endet die Ladung am Tag "morgen" um 23:59 Uhr.
Beim Wert "warten = auf neue Preise warten" startet erstmal KEIN EPEX-Ladevorgang. Dafür wird um 16:35 Uhr der EPEX-Ladevorgang neu geplant, denn dann liegen die Preise für den Folgetag vor. - EPEX_Ladeenergie
Enthält die Menge Ladeenergie in W, des aktuellen Ladevorgangs.
Datenpunkt wurde nur zur Visualisierung eingebunden. - EPEX_Zählerstand_start
Enthält den Zählerstand des zugehörigen Wallbox-Stromzählers, um daran die "EPEX_Ladeenergie" zu ermitteln.
Datenpunkt wurde nur zur Visualisierung eingebunden. - Variablen in den Absschnitten PV-BAT und PVÜS werden an dieser Stelle erst mal nicht erläutert
- Variablen im Abschnitt WARP
Die aufgezeigten Variablen betreffen die angefragten/eingesetzten Phasen meiner Wallbox und wurden nur zur Visualisierung eingebunden.
Der vollständigkeithalber noch ein Abbild der aktuellen EPEX-Preise in der Variablen "Stundenpreise_heute".
Details dazu im Thread: Geräte zu Stundenpreisen (EPEX) oder PV-Überschuss betreiben.3. Script- und Ablaufbeschreibung
Im Script gelten folgende Konventionen:- Funktionen sind durchnummeriert und beginnen mit "FKT_#_".
- Intervalle sind durchnummeriert und beginnen mit "NTRV_#_".
- FLAGS beginnen mit "FLG_" und sind Script-Variablen, die nur 2 Werte enthalten können.
Sie werden für Entscheidungen verwendet. - Die Script-Variablen haben (fast alle) die Namen der Datenpunkte behalten.
Zuerst die Script-Teile als Screenshot mit zugehöriger Erläuterung und abschließend das Script zum Download, sowie eine Swimminglane zur Darstellung des Ablaufs.
Dieser Teil dient der Vorbereitung beim Script-Start. Variablen werden geladen und "FKT_0" (und damit wiederkehrende Prüfung, ob ein BEV angestöpselt wurde), werden erstmalig ausgeführt.
Der TRIGGER sorgt dafür, dass wenn im Betrieb Datenpunkte geändert werden, der EPEX-Ladevorgang abgebrochen und neu geplant wird. Ebenso wird die benötigte Energiemenge und die benötigte Ladedauer in Stunden ermittelt."FKT_0_BEV_connected_und_SoC_Prüfung" initiiert das Interval "NTRV_BEV_Prüfung". In diesem Intervall erfolgt die regelmäßige Kontrolle, ob ein BEV an- oder abgestöpselt wurde und ob der "EPEX_BEV_SoC_ziel" erreicht worden ist.
Das Intervall stoppt sich teils selbst, um sich gleich danach mit angepasster Intervalldauer neu zu starten. Beachte hierzu auch die Ausführungen zum Datenpunkt "EPEX_BEV_connected_Intervall".
Mit Anstöpseln des BEVs wird der Datenpunkt "BEV_connected" aktualisiert, wodurch der TRIGGER die Funktion "FKT_2_Hauptroutine" startet.
Die Funktionen "FKT_1.1_" und "FKT_1.2_" laden/aktualisieren die entsprechenden Datenpunkte bzw. Werte der Wallbox.
Die "FKT_2_Hauptroutine" wird von "FKT_0_BEV_connected_und_SoC_Prüfung" aufgerufen und ermittelt- welche EPEX-Stundenpreise gelten "EPEX_Preise_heute" oder "EPEX_Preise_morgen",
- lässt dann über "FKT_3_Ladezeitraum_ermitteln",
- lässt dann über "FKR_5_günstige_Preise_Stunden_zusammenstellen",
- und steuert die Wallbox, sofern die aktuelle Stunde, eine der günstigen EPEX-Stunden ist.
- Ebenso beendet die FKT den Ladevorgang, wenn die letzte EPEX-Ladestunde abgelaufen ist.
Die "FKT_2_Hauptroutine" wird aber auch aus "FKT_3_Ladezeitraum_ermitteln" aufgerufen, wenn um 16:35 Uhr mit neuen EPEX-Preisen neu geplant werden soll.
"FKT_3_Ladezeitraum_ermitteln" wird von "FKT_2_Hauptroutine" aufgerufen.
Die Funktion legt fest "von" wann "bis" wann der EPEX-Ladevorgang dauern darf.
Sobald der Zeitraum festgelegt wurde ruft die Funktion "FKT_4_Preise_und_Stunden_zusammenbauen" auf.
Die "FKT_3_" stellt auch fest, wenn der EPEX-Ladevorgang erst mit neuen EPEX-Preise erfolgen soll und startet dann "FKT_2_Hauptroutine" neu. Siehe Erläuterung zu Datenpunkt "EPEX_Kalkulation_bei_Übermorgen".
"FKT_3_Ladezeitraum_ermitteln"
"FKT_4_Preise_und_Stunden_zusammenbauen" wird von "FKT_3_Ladezeitraum_ermitteln" aufgerufen.
Die Funktion erstellt ein Array mit EPEX-Stundenpreis, Datum zum Preis, Stundenwert zum Preis und Sortierreihenfolge.
Beispiel einer EPEX-Preisliste mit Werten von "Stunde 17" bis "Stunde 23": Dieses Array stellt die Grundlage für die anschließende Sortierung und Eingrenzung durch "FKT_5_" dar.
"FKR_5_günstige_Preise_Stunden_zusammenstellen" wird von "FKT_3_" nach Ablauf von "FKT_4_" aufgerufen.
Die Funktion- sortiert zuerst die Werte der "EPEX-Preisliste" aus "FKT_4_" nach den günstigsten EPEX-Stundenpreisen,
- schneidet dann die nicht benötigten EPEX-Array-Werte ab, so dass nur noch die benötigte Anzahl an Stunden-Werten übrig bleibt,
- und sortiert diese dann nach der ursprünglichen Stundenreihenfolge.
Da teils über den Tageswechsel geplant/kalkuliert wird, kann es vorkommen, dass ein Stundenwert doppelt, (aber natürlich an verschiedenen Tagen) vorhanden ist. Daher kann nicht einfach nach dem Stundenwert sortiert werden. Dies ist der Grund warum nach einem zusätzlichen Sortierkriterium (der letzte Wert im Array) sortiert wird.
Bezogen auf den vorherigen Beispiel-Zeitraum ("FKT_4_") und 3 benötigten Ladestunden, ist dies das Ergebnis der Funktion
Da die Sortierung der Array-Werte nicht mit einem fertigen Blockly-Befehl durchgeführt werden kann, kommt dafür eine JS-Funktion zum Einsatz. An dieser Stelle vielen Dank an Max und seinen Erläuterungen in seinem Beitrag zum Sortieren von Array-Werten.
"FKT_6_auf_günstige_EPEX_Stunde_prüfen_und_WARP_ansteuern" wird von "FKT_2_" aufgerufen.
Nachdem nun die EPEX-Stunden, zu denen die Ladung erfolgen soll feststehen, wird über "FKT_6_" zu jedem Stundenanfang geprüft, ob die aktuelle Stunde eine EPEX-günstige-Stunde ist. In diesem Fall wird die maximale Ladeleistung "EPEX_BEV_cP_max" an die Wallbox übergeben.
Ist die aktuelle Stunde keine EPEX-günstige-Stunde, wird mitgeteilt zu welcher Stunde der EPEX-Ladevorgang fortgesetzt wird.
"FKT_7_WARP_Werte_schreiben" übergibt "EPEX_BEV_cP_max" per HTTP GET an die Wallbox.
Da der ioBroker keinen HTTP GET direkt ausführen kann (sondern nur PUT), wurde dies mit einer JS-Funktion realisiert.
An dieser Stelle vielen Dank an @mickym und seine Hilfe im dazugehörigen Thread. In der nächsten Version würde ich allerdings gleich eine Umsetzung mit NodeRed vornehmen.
Die Funktionen "FKT_8" und "FKT_9" benötigen glaube ich keine größere Erläuterung. Diese werden immer dann aufgerufen, wenn- der Ladevorgang abgeschlossen ist,
- die letzte EPEX-Stunde abgelaufen ist,
- bzw. das BEV von der Wallbox getrennt wurde.
2023-09-13_EPEX_BEV_Laden_Script.json
2023-09-13_EPEX_BEV_Laden.drawio.png4. Inbetriebnahme bzw. erstes aktives Kennenlernen
Um die Lösung in Betrieb zu nehmen, empfiehlt sich folgendes Vorgehen:- 0. Sicherstellen, dass die TIBBER-Preise wie beschrieben vorliegen.
- 1. Die Datenpunkte "BEV_Kapazität", "BEV_cP_max" und "BEV_cP_min" mit den eigenen Angaben pflegen.
- 2. Datenpunkt "EPEX_BEV_connected_Intervall" auf "1" setzen (also 1 Minute).
- 3. Datenpunkt "EPEX_BEV_Kalkulation_bei_Übermorgen" auf "heute bis 23:59" setzen.
- 4. Datenpunkt "EPEX_BEV_SoC_ziel" auf auf einen größeren Wert, als der aktuelle "BEV_SoC" setzen.
- 5. Datenpunkt "EPEX_BEV_Ladezeit_ziel" auf auf einen größeren Wert, als die aktuelle Stunde setzen.
- 6. Dann das Script starten und die Protokoll-Einträge und die Pushover-Nachrichten verfolgen.
- 7. Mit "EPEX_BEV_Ladezeit_ziel" und "EPEX_BEV_SoC_ziel" spielen und beobachten wie sich die Kalkulation verändert.
- 8. Mal einen kalkulierten Ladevorgang abwarten und die Meldungen zu jedem Stundenbeginn beobachten.
Abschließend eine Kalkulation über den Tageswechsel vornehmen. Könnte dann z.B. so aussehen:
Und ganz zum Schluss "EPEX_BEV_Kalkulation_bei_Übermorgen" auf "warten" setzen. Danach bis 16:35 abwarten und den Start der Neu-Kalkulation beobachten.