Seit einiger Zeit habe ich eine Ecoflow Delta2 in Verbindung mit einem Ecoflow Powerstream im Einsatz. Über erste Erfahrungen mit der Powertream in Verbindung mit meiner Dach PV-Anlage hatte ich bereits berichtet. In einem weiteren Artikel hatte ich erläutert, wie man die offizielle Ecoflow API mit FHEM nutzen kann.
Mittels der MQTT API wollte ich eine möglichst vollautomatische Steuerung für das Laden der Powerstation und die Einspeisung ins Hausnetz mit dem Powerstream realisieren. Nach einigen Tests habe ich nun ein entsprechendes DOIF umgesetzt, welches dafür sorgt, dass die Lade- und Entladeleistung immer an den entsprechenden Bedarf angepasst wird.
Die Basis für die Steuerung der Ecoflow Geräte mit FHEM
Damit die Steuerung über FHEM funktioniert, muß ich natürlich immer den aktuellen Status des Speichers bzw. des Wechselrichters kennen. Diese Abfragen erfolgen über die offizielle Ecoflow Schnittstelle. Wie man diese in FHEM einbindet habe ich bereits erläutert und würde hier nicht mehr näher darauf eingehen. Leider ist die API nicht immer sehr stabil. Meist hängt das mit Updates von Ecoflow zusammen. Je nach Fehlersituation hilft es, die Credentials neu zu erzeugen und die Authentifizierung entsprechend anzupassen. Neulich lieferte der Powerstream nur einen Teil der Werte, was für meine Routine auch nicht sehr hilfreich war. Ich hoffe, dass die API zukünftig etwas stabiler läuft.
Die Batterie sowie den Wechselrichter habe ich jeweils über eine schaltbare Steckdose mit dem Hausnetz verbunden. Für die Einspeisung würde man normalerweise nicht zwingend eine Steckdose benötigen. Bei mir ist diese immer eingeschaltet und ich hatte sie anfangs genutzt, um den ausgespeisten Strom messen zu können.
Die Steckdose, die zum Laden der Powerstation benötigt wird ist durchaus hilfreich, da man die Powerstation damit aus dem Schlafmodus wecken kann. Ich habe die Ausschaltzeit auf 30 Minuten gesetzt, so dass die Powerstation irgendwann in den Schlafmodus gehen kann. Schaltet man dann die Steckdose ein, als ob man eine Ladung starten möchte, dann weckt man die Batterie damit wieder auf.
Diese Steckdose habe ich dann mit dem SMA Homemanager verknüpft, so dass dieser die Steckdose bei ausreichend Sonnenenergie einschalten kann. Damit sollte die Powerstation immer mit PV-Strom geladen werden. Ganz optimal ist das nicht, da der Homemanager nicht erkennt, wann die Batterie voll geladen ist. Er schaltet also auch immer dann, wenn es eigentlich nicht mehr nötig wäre und weckt die Powerstation damit unnötig auf. Aktuell teste ich eine andere Variante, bei der ich eine Steckdose über den Smart Appliance Enabler als Wallbox mit dem SMA Homemanager verknüpfe. Auf diese Weise bekomme ich dann immer auch Schaltbefehler mit entsprechender Stromhöhe. Damit könnte ich die Ladesteuerung über mein bisheriges DOIF entfernen. Erste Tests sind sehr vielversprechend und ich werde die Konstellation in einem weiteren Artikel erläutern.
Mit dieser Basis können wir uns nun gleich meine DOIF-Steuerung anschauen.
Meine Anforderungen an die Steuerung der Ecoflow Powerstation
Bevor ich auf mein DOIF eingehe, möchte ich nachfolgend noch ein paar Dinge erläutern, die meine Umsetzung etwas verständlicher machen. Es gibt ein paar Dinge, die man normalerweise nicht benötigt, in meiner persönlichen Umgebung aber Sinn machen. Ich habe mal alles drin gelassen, damit man vielleicht ein paar zusätzliche Anregungen für die eigene Steuerung bekommt.
So möchte ich beispielsweise vermeiden, dass eine Einspeisung stattfindet, während eines der E-Autos geladen wird. Aktuell startet die Einspeisung, wenn Netzstrom benötigt wird und der Akku nicht leer ist. Manchmal kann es sein, dass während des Ladens der E-Autos auch Netzstrom benötigt wird. Es soll also verhindert werden, dass ich indirekt von einem Speicher in den anderen den Strom transportiere.
Im Homemanager habe ich angegeben, dass der Schalter zum Laden der Powerstation immer mindestens 3 Minuten laufen sollte. Daher habe ich in meine Steuerung noch etwas eingebaut, dass bei höheren Netzbezügen auch vorzeitig das Laden beendet wird. Hier habe ich insbesondere für die Frühstückszeit eine Regel eingebaut, so dass beim Starten der Kaffemaschine ein mögliches Laden sofort beendet wird. Auch wenn es sich hier jeweils nur um sehr kurze Zeiträume handelt, möchte ich verhindern, dass die Powerstation mit so wenig Netzstrom, wie möglich beladen wird.
Was ich noch nicht umgesetzt habe, ist eine Einbindung von Tibber in die Steuerung. Dies ist aktuell auch noch nicht notwendig, da zurzeit genug Solarstrom zur Verfügung steht, um den kleinen Speicher zu befüllen. Für die Wintermonate werde ich dann noch eine Steuerung einbauen, so dass der Akku zu geringen Zeiten auch mit Netzstrom geladen wird, wenn nicht genug PV-Ertrag verfügbar ist.
Meine DOIF Regelung in FHEM zur Steuerung der Ecoflow Powerstation und Powerstream
So, nun kommen wir zum eigentlichen Code, den ich für meine Steuerung verwende. Nachfolgend noch kurz eine Erläuterung zu den einzelnen Befehlen:
- Das Gerät „myPowerstream“ ist das MQTT Gerät, welches sich mit dem Ecolfow Server verbindet
- Für die Powerstation habe ich noch ein weiteres MQTT Gerät erstellt („myDelta2Akku“)
- Die jeweiligen MQTT2_ Geräte sind die Devices, die die Werte der jeweiligen Geräte enthalten
- Das Gerät „kePowerstationIn“ ist meine Steckdose, an die das Ladegerät angeschlossen ist
- Der Parameter „permanentWatts“ gibt die Entladeleistung an. Leider kann die Batterie nur mit max. 600 Wh entladen werden, obwohl der Wechselrichter nun 800Wh kann. Die Angabe beim Parameter erfolgt als zehntel Wh.
- „MyGoE“ und „myWallbox“ sind die beiden Wallboxen, die ich im Einsatz habe
- Der „smaenergie“ ist der SMA Homemanager bei dem ich mit „SaldoWirkleistung“ einen positiven Wert erhalte, wenn eingespeist wird und einen negativen Wert, wenn Netzstrom bezogen wird
- Kommando 2 schaltet die Powerstation zur Haupteinspeisezeit ein, falls sie sich im Ruhemodus befindet. Durch das häufige Anschalten zum Laden, ist das allerdings eher die Ausnahme. Eigentlich müsste ich noch einen Code realisieren, der die Powerstation zu jeder Zeit weckt, wenn sie schläft und eine Einspeisung erfolgen soll.
- Mit „CmdID“ wird die ID für den MQTT Befehl hochgezählt, so dass immer eine eindeutige ID verwendet wird
- Dann habe ich noch das Reading „MaxLadeleistung“ definiert. Aktuell lade ich mit maximal 500Wh, was dem Akku wohl besonders gut tun soll. In den Monaten mit weniger Sonne würde ich den Wert wahrscheinlich etwas anheben, damit der Akku in kürzerer Zeit geladen wird.
Ansonsten sind die Kommentare hoffentlich eindeutig genug, damit man erkennt, was in der jeweiligen Bedingung passiert.
defmod diPowerStation DOIF ##\
## Verhindern, dass Laden und Entladen zufällig gleichzeitig passiert\
## (1)\
([myPowerstream] ne "disconnected" and [kePowerstationIn] eq "an" \
and ([MQTT2_myPowerstream:quota_param_permanentWatts] > 0 or [smaenergy:Saldo_Wirkleistung] <= -50))\
(set kePowerstationIn aus)\
\
## (set myPowerstream publish /open/open-cf8e9aaf1ff2432ab5dbb642604a22c2/HW51ZOH4SF765985/set \
## {"id": [$SELF:CmdID],"version": "1.0","cmdCode": "WN511_SET_PERMANENT_WATTS_PACK","params": \
## {"permanentWatts": 0}};;\
## set $SELF CmdID {([$SELF:CmdID]+1)})\
\
##\
## Abends anschalten, falls er im Ruhemodus ist\
## (2)\
DOELSEIF ([kePowerstationIn] eq "aus" and ([18:55]))\
(set kePowerstationIn an)(set kePowerstationIn aus)\
##\
## Einspeisung regeln\
## (3)\
DOELSEIF ([myPowerstream] ne "disconnected" and [MQTT2_myPowerstream:quota_param_supplyPriority] == 0 \
and [MQTT2_myDelta2Akku:Keller_quota_params_chgLinePlug] == 0 \
and [MQTT2_myDelta2Akku:Keller_quota_params_actSoc] > 10\
and (([MQTT2_myPowerstream:quota_param_permanentWatts] < 6000 and [smaenergy:Saldo_Wirkleistung] <= -50)\
or ([MQTT2_myPowerstream:quota_param_permanentWatts] > 0 and [smaenergy:Saldo_Wirkleistung] >= 50))\
and [myGoE:allow_charging] eq "0"\
and [myWallbox:Status_Ladevorgang] ne "Ladevorgang aktiv"\
and [kePowerstationIn] eq "aus")\
( set myPowerstream publish /open/user_id/seriennr/set \
{"id": [$SELF:CmdID],"version": "1.0","cmdCode": "WN511_SET_PERMANENT_WATTS_PACK","params": \
{"permanentWatts": {(min(6000, max(0,[MQTT2_myPowerstream:quota_param_permanentWatts]-([smaenergy:Saldo_Wirkleistung:d]*10))))}}};;\
set $SELF CmdID {([$SELF:CmdID]+1)})\
##\
## Ladeleistung regeln\
## (4)\
DOELSEIF ([myDelta2Akku] ne "disconnected"\
and [MQTT2_myPowerstream:quota_param_batSoc] < 100\
and ([MQTT2_myPowerstream:quota_param_supplyPriority] != 2 or [MQTT2_myDelta2Akku:Keller_quota_params_chgLinePlug] == 1) \
and [kePowerstationIn] eq "an" \
and (([MQTT2_myDelta2Akku:Keller_quota_params_cfgChgWatts:d] < [$SELF:MaxLadeleistung] and [smaenergy:Saldo_Wirkleistung:d] > 30)\
or ([MQTT2_myDelta2Akku:Keller_quota_params_cfgChgWatts:d] > 100 and [smaenergy:Saldo_Wirkleistung:d] < -30)))\
(set myDelta2Akku publish /open/user_id/seriennr/set \
{ "id":[$SELF:CmdID], "version":"1.0", "moduleType":5, "operateType":"acChgCfg", "params":\
{ "chgWatts":{(max(100,min([$SELF:MaxLadeleistung],([MQTT2_myDelta2Akku:Keller_quota_params_cfgChgWatts]+round([smaenergy:Saldo_Wirkleistung],0)))))}, "chgPauseFlag":0 } };;\
set $SELF CmdID {([$SELF:CmdID]+1)})\
##\
## Ladeleistung auf Minimum, wenn Ladung ausgeschaltet wird\
## (5)\
DOELSEIF ([myDelta2Akku] ne "disconnected" and 0 == 1\
and ([kePowerstationIn] eq "aus" or [MQTT2_myDelta2Akku:Keller_quota_params_chgLinePlug] == 0)\
and [MQTT2_myDelta2:quota_params_cfgChgWatts] != 100)\
(set myDelta2Akku publish /open/user_id/seriennr/set \
{ "id":[$SELF:CmdID], "version":"1.0", "moduleType":5, "operateType":"acChgCfg", "params":\
{ "chgWatts":100, "chgPauseFlag":0 } };;\
set $SELF CmdID {([$SELF:CmdID]+1)})\
##\
## Startet ein großer Verbraucher, wird die Ladung unterbrochen, wenn dieser nach 1 Minute immer noch läuft\
## (6)\
DOELSEIF ([smaenergy:Bezug_Wirkleistung:d] > 300 and [kePowerstationIn] eq "an")\
(set kePowerstationIn aus)\
\
##\
## Startet ein großer Verbraucher (Kaffeemaschine) zur Frühstückszeit, wird die Ladung sofort unterbrochen\
## (7)\
DOELSEIF ([smaenergy:Bezug_Wirkleistung:d] > 50 and [kePowerstationIn] eq "an"\
and [6:00-10:00] and [szeneHomeStatus] =~ m/Fruehstueck.*/ )\
(set kePowerstationIn aus)\
\
##\
## Einspeisung beenden, wenn der Speicher auf Minimum steht\
## (8)\
DOELSEIF ([myPowerstream] ne "disconnected" \
and [MQTT2_myPowerstream:quota_param_batSoc] <= 10\
and [MQTT2_myPowerstream:quota_param_supplyPriority] == 0\
and [MQTT2_myPowerstream:quota_param_permanentWatts] > 0)\
( set myPowerstream publish /open/user_id/seriennr/set \
{"id": [$SELF:CmdID],"version": "1.0","cmdCode": "WN511_SET_PERMANENT_WATTS_PACK","params": \
{"permanentWatts":0}};;\
set $SELF CmdID {([$SELF:CmdID]+1)})\
##\
## Falls Akku voll, keine Ladung mehr starten\
## (9)\
DOELSEIF([kePowerstationIn] eq "an" \
and [MQTT2_myDelta2Akku:Keller_quota_params_cfgChgWatts] > 0 \
and [MQTT2_myPowerstream:quota_param_batSoc] == 100)\
(set kePowerstationIn aus)
attr diPowerStation do always
attr diPowerStation readingList CmdID MaxLadeleistung
attr diPowerStation setList CmdID MaxLadeleistung:slider,150,10,1200
attr diPowerStation wait 0:0,30::15:::::::::
attr diPowerStation waitsame ::30:::60:::
Etwas tricky war der Versuch, eine Nulleinspeisung zu realisieren. Hierzu müsste man aber den Netzbezug bzw. den Solarertrag sekündlich ermitteln und möglichst zeitgleich einen Befehl an den Powerstream bzw. die Powerstation senden. Mein FHEM wäre damit aber völlig überfordert. Aktuell lese ich den Homemanager alle 10 Sekunden aus. Mit den aktuellen Werten für „wait“ bzw. „waitsame“ habe ich für mich eine relativ gute Lösung gefunden.
Bei den Tests dazu habe ich mir die Tibber App zu Hilfe genommen. Hier sieht man sofort, wie sich der Netzbezug ändert. Irritiert hat mich mein Fernseher, was mir zunächst in dem Ausmaß nicht bewußt war. Man glaubt gar nicht, wie schnell sich hier der Verbrauch verändert. In einer Sekunden sind es mal fast 400 Wh und kurz danach können es auch nur 150Wh sein. So schnell kann man dann gar nicht nachsteuern.