Einbindung einer EcoFlow River 2 max in das FHEM-System

Begonnen von Susis_Strolch, 24 April 2023, 12:31:54

Vorheriges Thema - Nächstes Thema

Susis_Strolch

Nach dem wir uns eine Hobby-Photovoltaik-Anlage (ich mag den Begriff lieber als ,,Balkonkraftwerk", insbesondere wo ich gar keinen Balkon habe) zugelegt und festgestellt haben, dass bei unserem Grundverbrauch von 250-350 W selbst an bedeckteren Tagen leicht über 400 W erzeugt werden, die dann dem Netzbetreiber kostenlos überlassen werden, machten wir uns Gedanken darüber, wie man diesen geschenkten Teil reduzieren kann.

Insbesondere war uns klar, dass die Problematik im Sommer noch deutlich akuter sein wird.

Ein Zwischenspeicher musste her.

Während ein Zwischenspeicher wie für große Anlagen völliger Quatsch ist, sind die sogenannten Solarkraftwerke durchaus interessant. Letztlich läuft es auf ein System hinaus, das quasi wie eine USV (ohne deren schnellen Schaltzeiten) genutzt werden würde.
Wir haben uns also ein Gerät gesucht, das bei der bei uns üblichen Nutzung den Speicher einmal am Tag leeren würde, aber nicht so groß ist, dass unsere Hobbyanlage den Akku nicht durchschnittlich befüllt bekommen würde.

Die Entscheidung fiel auf unseren Fernseher, der am Tag ungefähr 350 Wh verbraucht. Der dazu passende Speicher muss nun folgende Eigenschaften aufweisen:

  • Den dazu passenden Strom liefern
  • Strom liefern, während er geladen wird
  • Per Software steuerbar

Auf die EcoFlow River 2 max traf das alles zu. Ihre auf dem Papierstehenden 512 Wh sind real ca. 370 Wh, sie liefert Strom während sie selbst geladen wird und es gibt eine App, mit der diverse Dinge eingestellt und abgerufen werden können.

Schon die ersten Tage zeigten: Wenn die EcoFLow permanent die 230 V AC bereitstellen soll, kann man regelrecht zuschauen, wie vom bloßen Nichtstun der Akku leer wird.

Es müssen also zwei Dinge getan werden:

  • Das Aufladen der Ecoflow soll  grundsätzlich nur in Zeiten eines Solarüberschusses oder eines Mindestertrages erfolgen.
  • Der AC Ausgang der Ecoflow muss sich gesteuert an- und ausschalten lassen

Der 1. Punkt wird mit einer Strommesssteckdose realisiert. Bei Stromüberschuss wird sie eingeschaltet und lädt die Eco und wenn sie nicht geladen werden soll, wird sie ausgeschaltet.

Ich habe mir einen Dummy definiert, dessen Readings ich als Variablenspeicher verwende. Ich speichere also den Solarertrag als Reading, Status-Werte und auch zum Testen kann man diesen Dummy wirklich gut gebrauchen. Einmal pro Minute wird der Dummy aktualisiert. Dazu dient eine at-Funktion.

Hier die der DEF-Teil der at Funktion (der Code kann so direkt in das Editor-Fensters bei DEF eingetragen werden):
+*00:01:00
{
#Aktualisierung der Werte aus der EcoFlow
fhem("set EcoFlowAPI reread");
#Festlegung der Ladestrategie der EcoFlow
my $Minute = $min;#ich speicher die Zeit zwischen. Ein Teil der Routine
my $Stunde = $hour;#soll um 18 Uhr ausgeführt werden, und falls die Routine mal länger dauert...
my $EcoFlowAPI_data_soc = ReadingsVal("EcoFlowAPI","data_soc",0);#Ladestand aus der Ecoflow
my $EcoFlowAPI_data_wattsInSum = ReadingsVal("EcoFlowAPI","data_wattsInSum",0);#Ladestrom der Ecoflow
my $EcoflowstromAnAus = ReadingsVal("Ecoflowstrom","state","off");#der Strommesschalter
my $EcoFlowBedingung = "leer";#Variable warum die Eco Lädt
my $SolarStrom = ReadingsVal("Solarstrom","ENERGY_Power",0);#die vom Solarpanel gelieferte Leistung
my $UngeladenZaehler = 0;#Tageszähler, nicht jeden Tag muss die Eco geladen werden

# Wenn Kapazität unter 30% sinkt und die Eco nicht schon lädt: Laden und zwar 30 min.
if (($EcoFlowAPI_data_soc<30) && ($EcoFlowAPI_data_wattsInSum<1))
{
    fhem("set Ecoflowstrom on-for-timer 1800");
    $EcoFlowBedingung = "Zwangsladung weil unter 30 Prozent";
    fhem("setreading EcoFlowAPI EcoFlowUrsprung $EcoFlowBedingung");
}

# Wenn die Kapazität der EcoFlow um 18 Uhr seit 3 Tagen in Folge unter 60% ist,
# wird sie geladen, bis die Kapazität 90% (über die App eingestellt) erreicht
# die Ecoflow schaltet dann automatisch ab
if (($Minute == 0) && ($Stunde == 18))
{
    if (($EcoFlowAPI_data_wattsInSum<1) && ($EcoFlowAPI_data_soc<60))
{
$UngeladenZaehler=ReadingsVal("EcoFlowAPI","TageUngeladen",0);
if ($UngeladenZaehler<2)
{
$UngeladenZaehler=$UngeladenZaehler+1;
fhem("setreading EcoFlowAPI TageUngeladen $UngeladenZaehler");
}
else
{
fhem("set Ecoflowstrom on-for-timer 0");#der Timer muss ausgeschaltet sein, fals er an ist
fhem("set Ecoflowstrom on");#laden bis die Eco von sich aus stoppt.
$EcoFlowBedingung = "18 Uhr und 3x unter 60%";
fhem("setreading EcoFlowAPI EcoFlowUrsprung $EcoFlowBedingung");
fhem("setreading EcoFlowAPI TageUngeladen 0
}
}
else
{
if ($EcoFlowAPI_data_soc>75)
{
fhem("setreading EcoFlowAPI TageUngeladen 0");#ausreichender Ladestand
}
}
}

# Wenn Solarstrom - Gesamtverbrauch (ohne Ecoflow) > 0 ist,
# dann wird geladen und zwar immer mind. 30 min
# aber die Kapazität muss unter 85% sein, sonst lohnt laden nicht.
# im Dummy PowerZaehler wird neben anderen Dingen
# auch gespeichert, ob mehr übers Panel kommt, als verbraucht wird
# es sind diverse Verbrauchsbereiche über die Bilanz gezogen wird.
if ((ReadingsVal("PowerZaehler","Power_Bilanz",0)<0) && ($EcoFlowAPI_data_soc<85))
{
    fhem("set Ecoflowstrom on-for-timer 1800");
    $EcoFlowBedingung = "Laden weil Solarüberschuss";
    fhem("setreading EcoFlowAPI EcoFlowUrsprung $EcoFlowBedingung");
}

# Wenn Solarstrom > 300 ist, dann wird immer geladen und zwar immer mind. 30 min
# aber die Kapazität muss unter 85% sein, sonst lohnt laden nicht.
if (($SolarStrom>=300) && ($EcoFlowAPI_data_soc<85))
{
    fhem("set Ecoflowstrom on-for-timer 1800");
    $EcoFlowBedingung = "Laden weil mindestens 300W";
    fhem("setreading EcoFlowAPI EcoFlowUrsprung $EcoFlowBedingung");
}


# Wenn die EcoFlow ab 89% Kapazität hat, wird sie immer programmgesteuert ausgeschaltet
if (($EcoflowstromAnAus eq "on") && ($EcoFlowAPI_data_soc>=89))
{
    fhem("set Ecoflowstrom on-for-timer 0");#Timer löschen     
    fhem("set Ecoflowstrom off");#Steckdose ausschalten
    $EcoFlowBedingung = "Ausgeschaltet, weil über 89 Prozent";
    fhem("setreading EcoFlowAPI EcoFlowUrsprung $EcoFlowBedingung");
fhem("setreading EcoFlowAPI TageUngeladen 0");
}
}

PowerZaehler ist der Dummy, der meine Variablen rund um das Thema Solar bereitstellt.

EcoflowAPI ist die Ecoflow deren Einrichtung hier folgt:

Der Hersteller Ecoflow stellt drei Werte zur Verfügung: Ladeleistung, Verbrauch und Ladezustand.

Um an diese Werte zu kommen, schreibt man den Kundensupport von Ecoflow an, übermittelt die Seriennummer der Ecoflow und den Benutzernamen, den man in der App verwendet.

Nach ein paar Tagen erhält man eine Applikation-Key und einen Secret-Key.

Damit kann man nun die Ecoflow ins System einbinden.

Hier die RAW-Definition:
defmod EcoFlowAPI HTTPMOD https://api.ecoflow.com/iot-service/open/api/device/queryDeviceQuota?sn=<Seriennummer> -H 'Content-Type: application/json' -H 'appKey: <Applikation-Key' -H 'secretKey: Secret-Key'
attr EcoFlowAPI DbLogExclude .*
attr EcoFlowAPI DbLogInclude data_soc,data_wattsInSum,data_wattsOutSum
attr EcoFlowAPI alias EcoFlow River 2 max
attr EcoFlowAPI bodyDecode auto
attr EcoFlowAPI cmdIcon reread:rc_MINUS
attr EcoFlowAPI event-on-change-reading data_soc,data_wattsInSum,data_wattsOutSum
attr EcoFlowAPI extractAllJSON 1
attr EcoFlowAPI group Allgemein
attr EcoFlowAPI readingMaxAgeReplacement -10
attr EcoFlowAPI readingMaxAgeReplacementMode text
attr EcoFlowAPI requestHeader01 Content-Type: application/json
attr EcoFlowAPI requestHeader02 appKey: 45aeb8b2e9b94240987a9e05ce1366de
attr EcoFlowAPI requestHeader03 secretKey: 6de999ded705422fa85ac804f4de09f4
attr EcoFlowAPI room Stromkosten,Systemware
attr EcoFlowAPI showError 1
attr EcoFlowAPI sortby 1
attr EcoFlowAPI stateFormat <b>Status:</b> message | <b>Ladeleistung:</b> data_wattsInSum W | <b>Verbrauch:</b> data_wattsOutSum W | <b>Ladezustand:</b> data_soc %
attr EcoFlowAPI timeout 60
attr EcoFlowAPI userReadings lastUpdate:message.* {ReadingsTimestamp($name, 'message', '')}
attr EcoFlowAPI verbose 3
attr EcoFlowAPI webCmd reread

Mit dieser Definition kann man nun das Laden der Ecoflow in Verbindung mit einer Schaltmesssteckdose ein oder ausschalten.

Aber, um nicht Leistung der Ecoflow sinnlos zu verballern, wie erwähnt verbraucht die Ecoflow bei eingeschaltetem AC Ausgang über den Tag fast den komplett gespeicherten Strom selbst, soll der AC Ausgang programmgesteuert erfolgen. Hintergrund ist, dass wir unseren Fernseher in Verbindung mit einer FireTV-Box per Sprache an und ausschalten konnten. Seit der Fernseher, und nur der Fernseher, an der Ecoflow hängt, geht das nicht mehr: Ist der AC Ausgang aus, ist es natürlich auch der Fernseher.

Also muss man mit ,,Fernseher an" nicht nur den Fernseher einschlaten können, sondern auch die Ecoflow.

Mit der bisherigen Einbindung der Ecoflow ist das aber nicht möglich.

Allerdings betreibt Ecoflow einen MQTT2-Server. Mit dem kommuniziert zum Beispiel die App und mit der kann man schliesslich den AC-Ausgang an- oder ausschalten.

Leider hat Ecoflow diese Schnittstelle nicht so richtig offengelegt. Das Folgende ist also ein inoffizieller Weg und könnte jederzeit wieder verbaut werden. Um diesen Weg zu realisieren, habe ich mir Infos hier aus dem Forum zusammengesammelt und möchte das an dieser Stelle komprimiert bringen (vielen Dank an alle, die diese inoffizielle Schnittstelle entdeckt und dokumentiert haben)
Man benötigt ein Script, das für einen ein paar Daten ermittelt. Ich habe es auf dem Linux-Rechner ausgeführt, auf dem auch FHEM läuft:
wget -O ecoflow_get_mqtt_login.sh https://raw.githubusercontent.com/mmiller7/ecoflow-withoutflow/main/cloud-mqtt/ecoflow_get_mqtt_login.sh
Unmittelbar danach sollte man das Script auch ausführen (sollten noch Programme oder Programmteile fehlen, dann sollte man die natürlich noch installieren)
bash ecoflow_get_mqtt_login.sh
Man muss sich mit seinem in der App verwendeten Usernamen und Userpasswort anmelden.
Das Script wirft einige wichtige Dinge aus:
Your MQTT client connection information is:
#
#  Protocol: mqtts://
#  Host:     mqtt.ecoflow.com
#  Port:     8883
#  Username: app-vieleZeichen
#  Password: ziemlich lang
#
#  A few valid unique client IDs for your account different MQTT clients:
#  ANDROID_6245EA8D-und noch viel mehr
#  ANDROID_8A6ECEF3-und noch viel mehr
#  ANDROID_D8F1490B-und noch viel mehr


Und etwas später noch eine <Numerical User-ID>
 
Alles, was das Script so ausgespuckt hat, sollte man schön für sich behalten und auf keinen Fall damit hausieren gehen. Denn es sind mit dem Account und dem Gerät verbundene persönliche Informationen.

Der ausgegebene Username und das Passwort sind andere Werte als man in der Ecoflow-App verwendet hat.

Nun wird in FHEM ein MQTT2_Client definiert.

Hier die RAW-Definition:
defmod ecoflow2mqtt MQTT2_CLIENT mqtt.ecoflow.com:8883
attr ecoflow2mqtt SSL 1
attr ecoflow2mqtt autocreate complex
attr ecoflow2mqtt clientId ANDROID_6245EA8DXXXXXXXXXXXXX
attr ecoflow2mqtt mqttVersion 3.1.1
attr ecoflow2mqtt room Systemware
attr ecoflow2mqtt subscriptions /app/device/property/<Seriennummer des Gerätes>
attr ecoflow2mqtt username app-xxxxxxxxxxx
attr ecoflow2mqtt verbose 3

Über den Set-Befehl in diesem Gerät wird das Passwort hinterlegt, welches das Script angezeigt hat. Zur Erinnerung: Username und Passwort sind NICHT die für die Anmeldung bei Ecoflow verwendeten Daten!

Wenn alles gut gegangen ist, hat das System bereits ein neues MQTT2_DEVICE angelegt.

Hier die RAW-Definition (ursprünglich hiess das Gerät mal anders, ich hab es später nach EcoFlowDirekt umbenannt):
defmod EcoFlowDirekt MQTT2_DEVICE ANDROID_6245EA8D_xxxxxxxxxxxxxx
attr EcoFlowDirekt DbLogExclude .*
attr EcoFlowDirekt autocreate 1
attr EcoFlowDirekt eventMap /AC_spareCharge_on:AC_spareCharge on/\
/AC_spareCharge_off:AC_spareCharge off/\
/Fan_autoSpeed_on:Fan_autoSpeed on/\
/Fan_autoSpeed_off:Fan_autoSpeed off/\
/X-Boost_on:X-Boost on/\
/X-Boost_off:X-Boost off/\
/230V_on:230V on/\
/230V_off:230V off/\
/USB_on:USB on/\
/USB_off:USB off/\
/12V_on:12V on/\
/12V_off:12V off/
attr EcoFlowDirekt group Ecoflow
attr EcoFlowDirekt jsonMap <Seriennummer>_params_pd.sysVer:0\
<Seriennummer>_params_bmsSlave1.sysVer:0\
<Seriennummer>_params_bmsMaster.sysVer:0\
<Seriennummer>_params_inv.sysVer:0\
<Seriennummer>_id:0\
<Seriennummer>_timestamp:0\
<Seriennummer>_version:0\
<Seriennummer>_params_bmsSlave1.bqSysStatReg:0\
<Seriennummer>_params_pd.typecUsedTime:0\
<Seriennummer>_params_pd.invUsedTime:0\
<Seriennummer>_params_pd.mpptUsedTime:0\
<Seriennummer>_params_pd.usbUsedTime:0\
<Seriennummer>_params_pd.carUsedTime:0\
<Seriennummer>_params_pd.usbqcUsedTime:0
attr EcoFlowDirekt readingList ANDROID_6245EA8D_XXXXXXXXXXX:/app/device/property/<Seriennummer>:.* { json2nameValue($EVENT, <Seriennummer>_', $JSONMAP) }
attr EcoFlowDirekt room Systemware
attr EcoFlowDirekt setList AC_spareCharge_on /app/<Numerical User-ID>/<Seriennummer>/thing/property/set {"from":"Android","id":"168501049","moduleType":0,"operateType":"TCP","params":{"workMode":1,"id":65},"version":"1.0"}\
\
AC_spareCharge_off /app/<Numerical User-ID>/<Seriennummer>/thing/property/set {"from":"Android","id":"146891045","moduleType":0,"operateType":"TCP","params":{"workMode":0,"id":65},"version":"1.0"}\
\
Fan_autoSpeed_on /app/<Numerical User-ID>/<Seriennummer>/thing/property/set {"from":"Android","id":"103432218","moduleType":0,"operateType":"TCP","params":{"fanMode":1,"id":73},"version":"1.0"}\
\
Fan_autoSpeed_off /app/<Numerical User-ID>/<Seriennummer>/thing/property/set {"from":"Android","id":"583372214","moduleType":0,"operateType":"TCP","params":{"fanMode":3,"id":73},"version":"1.0"}\
\
X-Boost_on /app/<Numerical User-ID>/<Seriennummer>/thing/property/set {"from":"Android","id":"422221059","moduleType":0,"operateType":"TCP","params":{"xboost":1,"id":66},"version":"1.0"}\
\
X-Boost_off /app/<Numerical User-ID>/<Seriennummer>/thing/property/set {"from":"Android","id":"452691063","moduleType":0,"operateType":"TCP","params":{"xboost":0,"id":66},"version":"1.0"}\
\
Soc_max /app/<Numerical User-ID>/<Seriennummer>/thing/property/set {"from":"Android","id":"177434020","moduleType":0,"operateType":"TCP","params":{"maxChgSoc":$EVTPART1,"id":49},"version":"1.0"}\
\
230V_on /app/<Numerical User-ID>/<Seriennummer>/thing/property/set {"from":"Android","id":"294622259","moduleType":5,"operateType":"acOutCfg","params":{"out_voltage":-1,"out_freq":255,"xboost":255,"enabled":1},"version":"1.0"}\
\
230V_off /app/<Numerical User-ID>/<Seriennummer>/thing/property/set {"from":"Android","id":"294622259","moduleType":5,"operateType":"acOutCfg","params":{"out_voltage":-1,"out_freq":255,"xboost":255,"enabled":0},"version":"1.0"}\
\
USB_on /app/<Numerical User-ID>/<Seriennummer>/thing/property/set {"from":"Android","id":"162052336","moduleType":1,"operateType":"dcOutCfg","params":{"enabled":1},"version":"1.0"}\
\
USB_off /app/<Numerical User-ID>/<Seriennummer>/thing/property/set {"from":"Android","id":"162052336","moduleType":1,"operateType":"dcOutCfg","params":{"enabled":0},"version":"1.0"}\
\
12V_on /app/<Numerical User-ID>/<Seriennummer>/thing/property/set {"from":"Android","id":"333722370","moduleType":5,"operateType":"mpptCar","params":{"enabled":1},"version":"1.0"}\
\
12V_off /app/<Numerical User-ID>/<Seriennummer>/thing/property/set {"from":"Android","id":"333722370","moduleType":5,"operateType":"mpptCar","params":{"enabled":0},"version":"1.0"}\

attr EcoFlowDirekt stateFormat <html>\
<style>TD.default {padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold;;}</style>\
<style>TD.value {padding-right:5px;;padding-left:5px;;}</style>\
<style>TD.blank {padding-right:5px;;padding-left:5px;;background-color:Gainsboro;;}</style>\
<table border=1 bordercolor="darkgreen" cellspacing=0>\
   <tr><td class="default">Ladestand                 </td><td class="value"><Seriennummer>_params_pd.soc %                     </td></tr>\
   <tr><td class="default">Maximal nutzbare Kapazität</td><td class="value"><Seriennummer>_params_bms_emsStatus.maxChargeSoc % </td></tr>\
   <tr><td class="default">Minimal nutzbare Kapazität</td><td class="value"><Seriennummer>_params_bms_emsStatus.minDsgSoc %    </td></tr>\
   <tr><td class="default">aktuelle Eingangsleistung </td><td class="value"><Seriennummer>_params_pd.wattsInSum W              </td></tr>\
   <tr><td class="default">aktuelle Ausgangsleistung </td><td class="value"><Seriennummer>_params_pd.wattsOutSum W             </td></tr>\
   <tr><td class="default">eingestellte Ladeleistung </td><td class="value"><Seriennummer>_params_mppt.cfgChgWatts W           </td></tr>\
   <tr><td class="default">Restzeit                  </td><td class="value"><Seriennummer>_params_pd.remainTime min            </td></tr>\
   <tr><td class="default">X-Boost(1=ja;; 0=nein)     </td><td class="value"><Seriennummer>_params_inv.cfgAcXboost              </td></tr>\
   <tr><td class="default">Lüfterstatus              </td><td class="value"><Seriennummer>_params_inv.fanState                 </td></tr>\
   <tr><td class="default">USB-C Ausgangsleistung    </td><td class="value"><Seriennummer>_params_pd.typec1Watts W             </td></tr>\
   <tr><td class="default">USB-A Ausgangsleistung    </td><td class="value"><Seriennummer>_params_pd.typec2Watts W             </td></tr>\
   <tr><td class="default">12V Ausgangsleistung      </td><td class="value"><Seriennummer>_params_pd.carWatts W                </td></tr>\
   <tr><td class="default">230V Ausgangsleistung     </td><td class="value"><Seriennummer>_params_mppt.outWatts W              </td></tr>\
   <tr><td class="default">Lade/Entladezyklen        </td><td class="value"><Seriennummer>_params_bms_bmsStatus.cycles         </td></tr>\
</table>\
</html>\

attr EcoFlowDirekt userReadings lastUpdate:.*_params_latestTimeStamp.*   { \
  ReadingsTimestamp($name, <Seriennummer>_params_latestTimeStamp', '') \
},\
\
remainTime_h:.*_params_latestTimeStamp.* { \
  if (ReadingsVal($name, <Seriennummer>_params_pd.wattsInSum', 0) <= 0) {\
    sprintf "%.2f", ReadingsVal($name, <Seriennummer>_params_pd.remainTime', 0)/60 \
  }\
  else {\
    99;;\
  }\
},\
\
remainLoadTime_h:.*_params_latestTimeStamp.* { \
  my $wis = ReadingsVal($name, <Seriennummer>_params_pd.wattsInSum',  0);;\
  my $wos = ReadingsVal($name, <Seriennummer>_params_pd.wattsOutSum', 0);;\
  \
  if ($wis > $wos) {\
    sprintf "%.2f", ReadingsVal($name, <Seriennummer>_params_pd.remainTime', 0)/60 \
  }\
  else {\
    0;;\
  }\
},
Damit ist der AC-Ausgang ein- und ausschaltbar. Wer die ganzen eigenschaften und Readings sich einmal genau anschaut, wird feststellen, dass man auch das Laden der Box mit dieser Definition steuern kann. Immerhin werden hier die Werte für Ladeleistung, Verbrauch und Ladezustand ebenfalls angezeigt. Aber die neue Gerätedefinition ist wesentlich umfangreicher und im Handling ein wenig sperriger, weshalb ich an meiner Solar-Lade-Steuerung nichts geändert habe (Never change an running system.)

Der Rest ist einfach. Es ist ein Dummy-Schalter zu definieren, mit dem der 230V-Ausgang geschaltet werden kann. Ein dazu passendes Notify  nimmt die notwendig Logik auf. Beim Dummy war wichtig, ihn mit einem passenden AlexaName zu belegen, da das für die noch zu definierende Routine in der Alexa-App benötigt wird.

Der Code im notify ist vergleichsweise simpel:

{
if (ReadingsVal("EcoFlowDirekt","SeriennummerEcoFlow_params_inv.cfgAcEnabled",0)==0)
{
fhem ("set EcoFlowDirekt 230V on");
}
else
{
fhem ("set EcoFlowDirekt 230V off");
}
}

Damit befinden wir uns auf der Zielgeraden. Es ist jetzt nur noch eine Routine in Alexa zu definieren. Zur Erinnerung: Wenn man an seinen Fernseher eine FireTV-Box angeschlossen hat und diese mit dem Fernseher verknüpft hat, muss man nun nur noch eine Routine zusammenstellen, die:
  • Die Ecoflow einschaltet (der Dummy auf den das obige notify reagiert, sollte in Alexa bekannt gemacht worden sein)
  • Eine Wartezeit von 10 Sekunden erzeugt
  • Den Fernseher einschaltet.

Der Trick ist tatsächlich die 10 sekündige Pause, solange dauert es, bis der Fernseher sicher aus dem ausgeschalteten Zustand in den Bereitschaftsmodus kommt.

Das Ausschalten erfolgt umgekehrt, ohne Wartepause mit einer weiteren Routine.

Susis_Strolch

EcoFlow hat Änderungen an der App vorgenommen.
Und prompt hat es nicht mehr funktioniert.

Aber es ist nicht sehr dramatisch:

1. Das Script mit "bash ecoflow_get_mqtt_login.sh" noch einmal starten
2. FHEM beenden!!!
3. In der Definition nach der mqtt-Adresse suchen. Sie lautet nun so: mqtt-e.ecoflow.com:8883
4. Die Client ID hat sich geändert. Das Script spuckt drei IDs aus, die mit ANDROID_ anfangen. Eine davon nimmt man und tauscht sie gegen die alte aus, ich will es nicht beschwören, es muss mindestens an drei Stellen geändert werden.
5. Dann startet man FHEM. Es wird ein neues MQTT2-Device angelegt.
6. Die Konfiguration speichern
7. FHEM beenden
8. Ich habe eigentlich nur die setuuid des neuen Gerätes ins alte kopiert.
9. Das neue Gerät löschen.
10. FHEM starten. Läuft alles wieder.

Susis_Strolch

Und es war mal wieder notwendig das Bash-Script laufen zu lassen. Die App-ID hat sich geändert.
Die Sonstige Konfiguraton ist wie beim letzten Mal Vorzunehmen, also rel.einfach.

Das sich etwas geändert hatte, hab ich daran gemerkt, dass man die EcoFlow zwar über FHEM noch einschalten konnte, das Ausschalten ging aber nicht mehr.

ohosch

Hallo,
Vielen Dank für das Zusammentragen und Aufbereiten der Information.
Die Steuerung der EcoFlow bekomme ich seitdem auch mit dem FHEM hin. :)

Allerdings bekomme ich über Mqtt keine Readings rein. Ich habe jetzt schon alle 3 ANDROID IDs ausprobiert, sogar ein neuen IO Device mit der ID, die für die Kommandozeile für die Status Messages gedacht ist erstellt.

Eigentlich müsste ich doch, wenn ich im IO Deive Show MQTT Traffic enable, auch die eingehende Richtung sehen. Da kommen dann aber nur die Set Requests, die ich absetzte.

Auf der Kommandozeile mit mosquitto_sup kommen die Werte rein.

Muss ich hier doch etwas abweichendes zu:
Zitatattr EcoFlowDirekt readingList ANDROID_6245EA8D_XXXXXXXXXXX:/app/device/property/<Seriennummer>:.* { json2nameValue($EVENT, <Seriennummer>_', $JSONMAP) }

einstellen? Natürchlich mit der richtigen AndroidID und Seriennummer

Vielen Dank,
Ohosch

RalfRog

Hallo Susis_Strolch
Als Anwendung und Lösung finde ich das echt interessant und ich schließe mich @ohoch an.

Aber so nebenbei:
     Das macht überschlägig bei einem Tagesbedarf von 350Wh ≙ 20ct und Kosten von 600 Eur für die EcoFlow ca. 3000 Tage Betrieb bis man das Geld wieder verdient hat
Ist das dann wirtschaftlich interessant, da die Kosten ja doch über Spielniveau liegen? Die Webseite spricht von 10 Jahren Nutzung und 3000 mal laden/entladen.

Erschreckend ist für mich allerdings:
Zitatwie erwähnt verbraucht die EcoFlow bei eingeschaltetem AC Ausgang über den Tag fast den komplett gespeicherten Strom selbst

  • Hast du mal eruiert wieviel Wh in die EcoFlow rein müssen um 350Wh raus zu holen? Bei der implementieren Abschaltung AC-Ausgang!
  • Arbeitet die EcoFlow effizienter wenn sie über die DC-Eingänge KFZ, USB, Solar) gespeist wird?

Gruß Ralf


FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

ohosch

Hallo Ralf,

Ich denke so eine Rechnung geht bei einem teuren Premium Produkt wie der EcoFlow Serien (ich habe die Delta2) nicht wirklich auf.

Ich habe sie gekauft, um im Camping Urlaub immer Strom zu haben. Da muss man sich halt überlegen, was einem ein klares Bier am Auto wert ist :)

Wenn man dann schon so ein schönes Spielzeug hat, kann man es ja auch noch anders einsetzen, und so insgesamt ein wenig besser amortisieren lassen.

Viele Grüße
Oliver

ohosch

Ich sehe gerade, dass er ein Device unter dem Namen der Android ID angelegt hat. Da kommen auch alle Readings rein. Mein Problem hat sich damit aufgelöst :)

PS:
@Ralf, der 12V Ausgang arbeitet um einiges sparsamer, als der 220V Ausgang. Der weggefallene Wechselrichter macht sich da sehr bemerkbar, vor allem im Standby.
Zu den Eingängen kann ich nichts sagen.

RalfRog

Zitat von: ohosch am 25 August 2023, 10:52:50Hallo Ralf,

Ich denke so eine Rechnung geht bei einem teuren Premium Produkt wie der EcoFlow Serien (ich habe die Delta2) nicht wirklich auf.

Ich habe sie gekauft, um im Camping Urlaub immer Strom zu haben. Da muss man sich halt überlegen, was einem ein klares Bier am Auto wert ist :)

Wenn man dann schon so ein schönes Spielzeug hat, kann man es ja auch noch anders einsetzen, und so insgesamt ein wenig besser amortisieren lassen.

Viele Grüße
Oliver

Na klar.
Wenn man ein Stromaggregat braucht (egal ob Benzin oder Batterie) muss man die Kosten tragen. Wenn es eine Zweitverwendung hat umso besser.

Aber eine Powerstation nur für den Zweck PV-Stromspeicher - da muss man schon überlegen.

Bleibt als interessant Frage überig um 300Wh raus zu holen muss ich wieviel reinstecken?
FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

RalfRog

Zitat von: RalfRog am 25 August 2023, 14:52:03Bleibt als interessant Frage überig um 300Wh raus zu holen muss ich wieviel reinstecken?

Hatte meine ct aus Mai (Nr 13) noch nicht fertig gelesen. da wurden 5 Solar-Generatoren getestet (nicht vor dem Hintergrund PV Speicher) und dabei geprüft wieviel man von der reingesteckten Energie wieder rausholen kann (AC-Batterie-AC).
Zum Teil erschreckend ernüchternd - aber auch eine große Spannbreite.
  • Anker 555 PowerHouse 36%
  • EcoFlow Delta 2  39%
  • Goal Zero Yeti 1500x  56%
  • Jackery Explorer 1000Pro  80%
  • Pearl HSG 1150 75%

Und dann gilt es offenbar wie Susis_Strolch schrieb noch das zu bedenken:
Zitat von: Susis_Strolch am 24 April 2023, 12:31:54Schon die ersten Tage zeigten: Wenn die EcoFLow permanent die 230 V AC bereitstellen soll, kann man regelrecht zuschauen, wie vom bloßen Nichtstun der Akku leer wird.

FHEM auf Raspi 2B mit nanoCUL, HM-MOD-RPI-PCB und über LAN MAX!Cube mit a-culFW (Stack 868 + 433)
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder

thymjan

Kommen bei Euch über MQTT dauerhaft Messwerte? Bei mir ist die Übertragung immer wieder unterbrochen. Kann sie über die App wieder anschieben. Z.T. hält sie dann einige Stunden oder hört nach Übertragung einer Messwertreihe sofort wieder auf.
Gibt es einen Trick die Werte von FHEM aus regelmäßig abzufragen?

TSchabba

Hallo zusammen,

ich habe das gleiche Problem wie thymjan, dass die Werte nicht mehr rein kommen, sobald ich die App auf dem Handy schließe (EcoFlow Delta Pro). Hat jemand eine Idee/Lösung? Einstellungen setzen funktioniert trotzdem problemlos, aber wenn ich den Zustand nicht auslesen kann ist das leider nur so halb sinnvoll...


Viele Grüße
Timo

fred_feuerstein

Hallo zusammen, ich habe das nun auch mal mit einer DeltaMax2000 probiert. Werte bekomme ich, aber schalten kann ich nichts.
Als Schalter gibt es ja bspw.
USB_on
USB_off

Der Befehl wäre dann ja zum Einschalten:
set EcoFlowDirekt USB_on

Allerdings passiert bei der DeltaMax nichts.

Läuft das aktuell bei euch allen noch?
Gruß, Fred

FHEM auf Raspberry PI 3B+ im 7Zoll TouchDisplay Gehäuse, OS: Bullseye, mit Z-Wave RaZberry-Modul, 868CUL (WMBUS), LaCrosseCUL (Temp) und knapp 300 Devices aller Art