FHEM Forum

FHEM - Energiemanagement und Energieerzeugung => Solaranlagen => Thema gestartet von: Neolux am 17 Februar 2025, 13:10:08

Titel: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 17 Februar 2025, 13:10:08
Da bei mir die MQTT2-Anbindung zur Ecoflow-API seit Wochen nichts mehr sendet, hab ich mich mal hingesetzt und angefangen, ein Modul für die Ecoflow-Komponenten zu schreiben.

Für die Anbindung benötigt ihr noch folgende Perl-Module:
Time::HiRes,Digest::SHA,URL::Encode

Und noch was: Das ist mein allererstes FHEM-Modul, wahrscheinlich ist noch nicht alles so, wie es soll. :)

Installation:
- Modul ins FHEM-Verzeichnis kopieren
- Developer-Zugang bei https://developer-eu.ecoflow.com beantragen
- AccessKey und Secret erstellen bei https://developer-eu.ecoflow.com/us/security
- Seriennummern der Ecoflow-Geräte aus der App bereithalten

Modul in FHEM definieren:
define <Name> Ecoflow <AccessKey> <SerialNr>

set <Name> SecretKey # Password/SecretKey für AccessKey eingeben
attr <Name> ecInterval <zahl> # Polling Intervall für HTTP-REST-API in Sekunden zwischen 60 und 600

Geräte-Spezifische Gets und Sets können in der Doku nachgeschlagen werden: https://developer-eu.ecoflow.com/us/document/ (https://developer-eu.ecoflow.com/us/document/)

Ich hoffe, das nützt jemandem. Ich hab einen Powerstream und eine Delta2Max, daher weiß ich noch nicht, was andere Komponenten so für Daten ausgeben. ;)

Hab die Unterstützung für die PowerOcean angefangen, einzubauen, hier ist anscheinend noch weitere Arbeit nötig. Geräte-Erkennung habe ich verbessert.
Unterstützung für die Delta Pro ist nun auch begonnen. Hier wurde ich etwas von der API überrascht, und konnte einiges an Code kürzen und optimieren.

Die aktuellste Version gibt es nun immer hier!


98_Ecoflow.pm Version 0.3.9.0 vom 12.09.2025
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 17 Februar 2025, 16:26:40
Hi. So ein Zufall! Super!
Ich verzweifle seit tagen an der MQQT2-Einbindung und bekomme einfach keinerlei Daten. Die Api von Ecoflow ist irgendwie...
Werde dein Modul später ausprobieren. Vielen Dank schonmal!
Bin gespannt, ob ich vom PowerOcean dann endlich Daten erhalte.

Viele Grüße
Mathias
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 17 Februar 2025, 16:28:58
Das sollten wir hinbekommen... etwas debuggen, dann kommen auch von dem Daten. ;)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 21 Februar 2025, 11:45:39
Update:
Status wird nicht mehr "hart" gesetzt, sondern beachtet jetzt "stateFmt".
Readings funktionieren jetzt ganz gut (zumindest bei meinen Komponenten Delta 2 Max und Powerstream), beim Setzen von Werten hab ich noch Probleme, obwohl das lt. API-Dokumentation korrekt sein sollte, das hab ich erstmal beiseite gelegt und mach da später nochmal einen neuen Ansatz.

Ich sehe jetzt erstmal zu, daß ich die verschiedenen Modelle einpflege.

(Aktuellste Version immer im 1. Post dieses Threads!)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: DeeSPe am 21 Februar 2025, 12:31:30
Nur zur Info wegen der Modulentwicklung:

Das Modul bitte nicht mit "99_" anfangen lassen da diese Module automatisch von FHEM geladen werden, egal ob es ein Device dazu gibt oder nicht.
Also z.B. einfach "98_" daraus machen.

Gruß
Dan
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 21 Februar 2025, 14:52:58
Okay. :)

(Aktuellste Version immer im 1. Post dieses Threads!)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Gunther am 26 Februar 2025, 21:41:14
Super, dass Du ein Modul baust...   :)

Zitat von: Neolux am 17 Februar 2025, 13:10:08Für die Anbindung benötigt ihr noch folgende Perl-Module:
WWW::Curl::Easy, Time::HiRes,Digest::SHA
Was muss ich hier tun?
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: MOLUSER am 27 Februar 2025, 21:26:30
Hallo zusammen,
ich stehe hier vor dem gleichen Problem, da meine Ecoflow API nicht mehr funktioniert.

Wie sind denn die Perl-Module zu installieren?
WWW::Curl::Easy, Time::HiRes,Digest::SHA
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 27 Februar 2025, 21:32:54
Kommt drauf an... entweder über Deine Distribution mit den Paketen libperl... (z.B. Debian oder Ubuntu, andere kenne ich nicht so gut) oder direkt über den ,,cpan"-Befehl auf der Kommandozeile.

https://linux.die.net/man/3/cpan
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 04 März 2025, 12:30:55
Hi.

Das funktioniert ganz gut auch mit der PowerOcean. Vielen Dank.
Wahnsinn, was da für eine Datenflut ankommt die man dann eindämmen muss. :)
Das Update habe ich allerdings verpasst, ich bin noch mit der ersten Version unterwegs.

Zitat von: Neolux am 21 Februar 2025, 11:45:39Update:
Status wird nicht mehr "hart" gesetzt, sondern beachtet jetzt "stateFmt".
Bin mal gespannt, wie sich das auswirkt. Muss ich heuteabend mal testen.

Grüße
Mathias

Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 04 März 2025, 17:35:46
Ich les mal mit und probiere das Modul aus, wenn ich mal wieder Zeit dazu habe.

Meine Delta2 habe ich super über MQTT (https://forum.fhem.de/index.php?topic=133322.msg1298851#msg1298851) im Griff. Steuern funktioniert immer. Werte auslesen nur, wenn die App mit der Cloud verbunden wird.

Der Powerstream lässt sich nicht per MQTT einbinden.  :'( 
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: tschimi am 07 März 2025, 10:32:15
Hi, ich hab das jetzt mal ausprobiert. Leider hat das Beantragen des Devzugangs ne Weile gedauert. Nun konnte ich auch alles installieren und die Defines in Fhem anlegen.
Beim Password gehe ich mal davon aus, das es sich um den SecretKey handelt.

Jetzt sagt aber leider die Message in meinem Ecoflow-device "no permission to do it".

Frage: Was habe ich übersehen??

Lg, tschimi

P.S.: Für alle die, die mit Cpan so ihre Probleme hatten... Versucht mal "sudo apt-get install libwww-curl-perl". Nur so hab ich WWW::Curl::Easy installiert bekommen bei meinem Debian
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 07 März 2025, 11:07:03
So, sorry, war eine Woche mal nicht zuhause.  ;)

Zitat von: tschimi am 07 März 2025, 10:32:15Hi, ich hab das jetzt mal ausprobiert. Leider hat das Beantragen des Devzugangs ne Weile gedauert. Nun konnte ich auch alles installieren und die Defines in Fhem anlegen.
Beim Password gehe ich mal davon aus, das es sich um den SecretKey handelt.

Jetzt sagt aber leider die Message in meinem Ecoflow-device "no permission to do it".

Frage: Was habe ich übersehen??
Richtig, Password ist der SecretKey. Ganke für die Rückmeldungen, ich kann das natürlich ändern, daß man statt "set <DeviceName> password <secretkey>" besser "<set DeviceName> secretkey <secretkey>" verwenden muss. Ist notiert.

"No permmission to do it" sagt mir so nichts. Am besten setzt Du mal "verbose" des Devices auf "5", dann "set <DeviceName> connect" und postest mal den Logauszug. Ich denke mal, AccessKey und SecretKey hast Du korrekt gesetzt.

Zitat von: KölnSolar am 04 März 2025, 17:35:46Der Powerstream lässt sich nicht per MQTT einbinden.  :'( 
Hm, bei mir ging beides wunderbar, hab die Anlage seit Juli '24, und ich konnte die Anlage über MQTT auslesen und über FHEM steuern. Seit Mitte Januar '25 schweigt die MQTT-Verbindung, und auch SET-Befehle werden nicht mehr angenommen.

Im übrigen kann man den Support von Ecoflow echt vergessen. Da kommen dann nur Vorschläge wie: Die Anlage komplett auseinanderstöpseln, stromlos machen und wieder zusammenstecken, und dann mal sehen.

Die SET-Befehle per HTTP-API liefern nach wie vor eine Fehlermeldung, obwohl die Signatur korrekt berechnet wird, was ich anhand der Beispiele aus der Doku geprüft habe, erhalte diesselbe Prüfsumme. Hier schweigt der Developer-Support.

Ich bin derzeit geneigt, dieses Modul einfach nur zum Auslesen zu nutzen, da die App immer umfangreicher wird, so daß ich dort auch viel automatisieren kann. Allerdings kann man da nicht so "schlaue" Sachen machen, wie täglich die Batterie erstmal auf 80% laden und dann die Stromversorgung priorisieren, sofern die Solareinspeisung unter dem Strombedarf liegt. oder so feinere Steuerungen. Das ginge mit FHEM echt smarter.

Wie auch immer, bin gespannt auf das Logfile (Bitte alles sicherheitsrelevante rauslöschen, ist ja klar) und bin auch neugierig, Screenshots zu sehen, ob die Geräte wie eine PowerOcean richtig erkannt werden, ich hab das ja nur "blind" aus der Doku übernommen.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 07 März 2025, 11:11:24
Zu den Perl-Modulen: Ich mach das bei mir mit CPAN:
sudo cpan -i WWW::Curl::Easy Time::HiRes Digest::SHA
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 07 März 2025, 12:06:30
Hi.

Hier mal das was die PowerOcean so auswirft.
Anlage: 10.235 kWp Bauer-Module, Ecoflow PowerOcean 10kW, 10kWh PowerOcean-Batterie (2 Module a 5 kWh)

Ich hoffe ich habe alles sicherheitsrelevante ausgeixxt und die Vorgehensweise "Copy for forum.fhem.de" ist so korrekt.
Leider aktualisieren sich die Daten nur, wenn ich parallel die App oder das Webportal aufrufe. Ich meine das war bei der ersten Version deines Moduls nicht so.

define PO2 Ecoflow SCy68xxxxxxxxxxxxxxxxxx HJ3xxxxxxxxxxxxxxx
attr PO2 ecInterval 10
attr PO2 group Energie
attr PO2 icon measure_photovoltaic_inst
attr PO2 room Energie
attr PO2 stateFormat Solarertrag: [$name:data_mpptPwr] W <br>Hausnetz: [$name:data_sysLoadPwr] W <br> Batterie: [$name:data_bpPwr] W <br>Ladestatus: [$name:data_bpSoc] % <br>Netzeinspeisung: [$name:data_sysGridPwr] W <br>Letzte Meldung: [$name:data_sysLoadPwr:t]
attr PO2 verbose 5
#  AccessKey  SCy68xxxxxxxxxxxxxxxxxxxxxxxxxx
#  DEF        SCy68xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#  FUUID      67c76xxxxxxxxxxxxxxxxxxxxxxxxxx
#  NAME      PO2
#  NR        801
#  NTFY_ORDER 50-PO2
#  Online    1
#  STATE      Solarertrag: 6350.0 W <br>Hausnetz: 1070.0 W <br> Batterie: 0.0 W <br>Ladestatus: 100 % <br>Netzeinspeisung: -5280.0 W <br>Letzte Meldung: 2025-03-07 11:53:42
#  SerialNo  HJ3xxxxxxxxxxxxxx
#  TYPE      Ecoflow
#  eventCount 40433
#  READINGS:
#    2025-03-06 18:24:25  code            0
#    2025-03-07 11:39:52  data_bpPwr      0.0
#    2025-03-07 11:39:51  data_bpSoc      100
#    2025-03-07 11:52:38  data_bp_addr.HJ3xxxxxxxxxxxxx {
#  "bpPwr": -0.64905936,
#  "bpSoc": 100,
#  "bpSoh": 100,
#  "bpTemp": [29.0, 31.0, 29.0, 30.0, 31.0, 28.0, 29.0, 29.0, 30.0],
#  "bpCellMaxVol": 3405.0,
#  "bpCellMinVol": 3355.0,
#  "bpRunSta": "RUNSTA_RUN",
#  "bpVol": 54.326,
#  "bpAmp": -0.01194749,
#  "bpBusVol": 832.07184,
#  "bpErrCode": 2,
#  "bpCellVol": [3395.0, 3399.0, 3398.0, 3395.0, 3399.0, 3404.0, 3401.0, 3404.0, 3355.0, 3402.0, 3405.0, 3402.0, 3401.0, 3401.0, 3397.0, 3403.0],
#  "bpDsrc": 1,
#  "bpSn": "Sxxxxxxxxxxxxxxxxxxxxxx",
#  "bpCycles": 28,
#  "bpBalanceState": 21589,
#  "bpHvMosTemp": 40.0,
#  "bpLvMosTemp": 38.0,
#  "bpPtcTemp": 31.0,
#  "bpHtsTemp": 38.0,
#  "bpBusNegTemp": 36.0,
#  "bpBusPosTemp": 39.0,
#  "bpEnvTemp": 37.0,
#  "bpAccuChgCap": 2637324,
#  "bpAccuDsgCap": 2571636,
#  "bpDesignCap": 100000,
#  "bpFullCap": 100000,
#  "bpMaxCellTemp": 31.0,
#  "bpMinCellTemp": 28.0,
#  "bpMaxMosTemp": 40.0,
#  "bpMinMosTemp": 38.0,
#  "bpBmsFault": 0,
#  "bpEcloundSoc": 65535,
#  "bpHeartbeatVer": 33,
#  "bpTimestamp": 1741344751,
#  "bpRealSoc": 99.0,
#  "bpRealSoh": 104.86778,
#  "bpGlobalProtect": 32,
#  "bpDownLimitSoc": 5,
#  "bpUpLimitSoc": 100,
#  "bpActiveCalReqStat": 0,
#  "bpActiveCalRunStat": 0,
#  "moduleProductInfo": 21251,
#  "moduleProgramSta": 1,
#  "moduleAplSwVer": 67176967,
#  "moduleLoaderSwVer": 67174401,
#  "bmsRunSta": "PB_BMS_STATE_DISCHARGEABLE",
#  "bmsChgDsgSta": "PB_STANDBY_STATE",
#  "dabModSta": "PB_MOD_STA_WARNNING",
#  "bpChgSop": 0,
#  "bpDsgSop": 80,
#  "bpRemainWatth": 5120.0,
#  "bpTargetSoc": 99.9,
#  "bpDiffSoc": 2.734375,
#  "bpMaxSoc": 100.0,
#  "bpMinSoc": 97.26585,
#  "bpLimitSoc": 0.5,
#  "bpCalendarSoh": 99.84766,
#  "bpCycleSoh": 99.84766,
#  "bpAcRechargeFlag": false,
#  "bpPtcHeatFlag": false,
#  "bpPtcExitEvent": "PB_PTC_OT_STATE",
#  "bpAccuChgEnergy": 142158,
#  "bpAccuDsgEnergy": 133496,
#  "bpPtcTemp2": 30.0,
#  "bpSysState": "NORMAL_STATE",
#  "bpAuxCellVol01": 3394.0
#}
#    2025-03-07 11:52:39  data_bp_addr.HJ3xxxxxxxxxxxxxxx {
#  "bpPwr": -0.3821171,
#  "bpSoc": 100,
#  "bpSoh": 100,
#  "bpTemp": [28.0, 31.0, 29.0, 30.0, 30.0, 27.0, 28.0, 28.0, 29.0],
#  "bpCellMaxVol": 3386.0,
#  "bpCellMinVol": 3370.0,
#  "bpRunSta": "RUNSTA_RUN",
#  "bpVol": 54.006,
#  "bpAmp": -0.007075456,
#  "bpBusVol": 831.59674,
#  "bpErrCode": 2,
#  "bpCellVol": [3370.0, 3373.0, 3372.0, 3380.0, 3379.0, 3378.0, 3382.0, 3377.0, 3382.0, 3382.0, 3382.0, 3382.0, 3386.0, 3381.0, 3385.0, 3380.0],
#  "bpDsrc": 2,
#  "bpSn": "SExxxxxxxxxxxxxxxxxxxx",
#  "bpCycles": 28,
#  "bpBalanceState": 0,
#  "bpHvMosTemp": 37.0,
#  "bpLvMosTemp": 35.0,
#  "bpPtcTemp": 29.0,
#  "bpHtsTemp": 35.0,
#  "bpBusNegTemp": 35.0,
#  "bpBusPosTemp": 36.0,
#  "bpEnvTemp": 34.0,
#  "bpAccuChgCap": 2663070,
#  "bpAccuDsgCap": 2595472,
#  "bpDesignCap": 100000,
#  "bpFullCap": 100000,
#  "bpMaxCellTemp": 31.0,
#  "bpMinCellTemp": 27.0,
#  "bpMaxMosTemp": 37.0,
#  "bpMinMosTemp": 35.0,
#  "bpBmsFault": 0,
#  "bpEcloundSoc": 65535,
#  "bpHeartbeatVer": 33,
#  "bpTimestamp": 1741344746,
#  "bpRealSoc": 100.0,
#  "bpRealSoh": 102.700005,
#  "bpGlobalProtect": 0,
#  "bpDownLimitSoc": 5,
#  "bpUpLimitSoc": 100,
#  "bpActiveCalReqStat": 0,
#  "bpActiveCalRunStat": 0,
#  "moduleProductInfo": 21251,
#  "moduleProgramSta": 1,
#  "moduleAplSwVer": 67176967,
#  "moduleLoaderSwVer": 67174401,
#  "bmsRunSta": "PB_BMS_STATE_DISCHARGEABLE",
#  "bmsChgDsgSta": "PB_STANDBY_STATE",
#  "dabModSta": "PB_MOD_STA_WARNNING",
#  "bpChgSop": 49,
#  "bpDsgSop": 80,
#  "bpRemainWatth": 5120.0,
#  "bpTargetSoc": 99.9,
#  "bpDiffSoc": 0.15625,
#  "bpMaxSoc": 100.0,
#  "bpMinSoc": 99.84404,
#  "bpLimitSoc": 0.5,
#  "bpCalendarSoh": 99.84766,
#  "bpCycleSoh": 99.84766,
#  "bpAcRechargeFlag": false,
#  "bpPtcHeatFlag": false,
#  "bpPtcExitEvent": "PB_PTC_OT_STATE",
#  "bpAccuChgEnergy": 143528,
#  "bpAccuDsgEnergy": 134706,
#  "bpPtcTemp2": 29.0,
#  "bpSysState": "NORMAL_STATE",
#  "bpAuxCellVol01": 3370.0
#}
#    2025-03-07 11:52:39  data_bp_addr.updateTime 2025-03-07 18:52:35
#    2025-03-04 21:36:19  data_ems_change_report.afciEn 0
#    2025-03-04 21:36:22  data_ems_change_report.afciEnSet 0
#    2025-03-04 21:36:20  data_ems_change_report.afciEnableCmdState 0
#    2025-03-04 21:36:20  data_ems_change_report.afciFaultClearState 0
#    2025-03-04 21:36:22  data_ems_change_report.afciFaultCntCh1 0
#    2025-03-04 21:36:22  data_ems_change_report.afciFaultCntCh2 0
#    2025-03-04 21:36:22  data_ems_change_report.afciFaultFlagCh1 0
#    2025-03-04 21:36:22  data_ems_change_report.afciFaultFlagCh2 0
#    2025-03-04 21:36:19  data_ems_change_report.afciFaultMaxValueCh1 0.0
#    2025-03-04 21:36:22  data_ems_change_report.afciFaultMaxValueCh2 0.0
#    2025-03-04 21:36:19  data_ems_change_report.afciFaultValueCh1 0.0
#    2025-03-04 21:36:20  data_ems_change_report.afciFaultValueCh2 0.0
#    2025-03-04 21:36:22  data_ems_change_report.afciIsExist 0
#    2025-03-04 21:36:19  data_ems_change_report.afciProtectValueCh1 0.0
#    2025-03-04 21:36:22  data_ems_change_report.afciProtectValueCh2 0.0
#    2025-03-04 21:36:22  data_ems_change_report.afciSelfTestCmdState 0
#    2025-03-04 21:36:21  data_ems_change_report.afciSellfTestResult 0
#    2025-03-04 21:36:20  data_ems_change_report.afciSwitchFreqCh1 0
#    2025-03-04 21:36:19  data_ems_change_report.afciSwitchFreqCh2 0
#    2025-03-04 21:36:19  data_ems_change_report.batRealyStatus 2
#    2025-03-04 21:36:22  data_ems_change_report.batRelayCloseFailFlag 0
#    2025-03-04 21:36:21  data_ems_change_report.batSoftRelayStatus 0
#    2025-03-07 11:39:52  data_ems_change_report.bpChgDsgSta 2
#    2025-03-04 21:36:22  data_ems_change_report.bpLineOffFlag 0
#    2025-03-04 21:36:21  data_ems_change_report.bpOnlineSum 2
#    2025-03-04 21:36:21  data_ems_change_report.bpRestartFlag 1
#    2025-03-04 21:36:19  data_ems_change_report.bpReverseFlag 0
#    2025-03-07 11:39:39  data_ems_change_report.bpSoc 100
#    2025-03-07 11:51:34  data_ems_change_report.bpTotalChgEnergy 274940
#    2025-03-07 09:51:32  data_ems_change_report.bpTotalDsgEnergy 258836
#    2025-03-04 21:36:21  data_ems_change_report.chgDsgMode 0
#    2025-03-04 21:36:20  data_ems_change_report.chgDsgPwr 700.0
#    2025-03-04 21:36:22  data_ems_change_report.devMaxPower 0
#    2025-03-04 21:36:22  data_ems_change_report.duration 0
#    2025-03-04 21:36:21  data_ems_change_report.emsBackupEvent 0
#    2025-03-04 21:36:21  data_ems_change_report.emsCtrlLedBright 10
#    2025-03-04 21:36:21  data_ems_change_report.emsCtrlLedType 1
#    2025-03-04 21:36:19  data_ems_change_report.emsFeedMode 1
#    2025-03-04 21:36:20  data_ems_change_report.emsFeedPwr 10000
#    2025-03-04 21:36:20  data_ems_change_report.emsFeedRatio 100
#    2025-03-04 21:36:20  data_ems_change_report.emsSgReadyEn false
#    2025-03-04 21:36:20  data_ems_change_report.emsSgRunStat 0
#    2025-03-04 21:36:22  data_ems_change_report.emsStopAll 0
#    2025-03-04 21:36:20  data_ems_change_report.emsWordMode WORKMODE_SELFUSE
#    2025-03-04 21:36:20  data_ems_change_report.emsWorkState 0
#    2025-03-04 21:36:21  data_ems_change_report.endTimestamp 0
#    2025-03-04 21:36:22  data_ems_change_report.ethWanStat 0
#    2025-03-04 21:36:19  data_ems_change_report.iot4gErr 7
#    2025-03-04 21:36:21  data_ems_change_report.iot4gOn 1
#    2025-03-04 21:36:19  data_ems_change_report.iot4gPdp -1
#    2025-03-06 21:51:48  data_ems_change_report.iot4gSta 2
#    2025-03-07 06:30:20  data_ems_change_report.mppt1FaultCode 0
#    2025-03-04 21:36:22  data_ems_change_report.mppt1WarningCode 0
#    2025-03-07 06:29:55  data_ems_change_report.mppt2FaultCode 0
#    2025-03-04 21:36:21  data_ems_change_report.mppt2WarningCode 0
#    2025-03-04 21:36:20  data_ems_change_report.parallelAllowState false
#    2025-03-04 21:36:20  data_ems_change_report.parallelType 0
#    2025-03-04 21:36:20  data_ems_change_report.parallelTypeCur 0
#    2025-03-04 21:36:21  data_ems_change_report.parallelTypeSet 0
#    2025-03-04 21:36:21  data_ems_change_report.pcs10minOverVol 253.0
#    2025-03-04 21:36:20  data_ems_change_report.pcs10minOverVolSwitch 1
#    2025-03-04 21:36:21  data_ems_change_report.pcs10minOverVolTime 100
#    2025-03-04 21:36:21  data_ems_change_report.pcsAcErrCode 0
#    2025-03-04 21:36:19  data_ems_change_report.pcsAcWarningCode 0
#    2025-03-04 21:36:21  data_ems_change_report.pcsActivePowerDeratingPercent 1.0
#    2025-03-04 21:36:21  data_ems_change_report.pcsActivePowerDeratingSwitch 0
#    2025-03-04 21:36:19  data_ems_change_report.pcsActivePowerGradient 0.0033
#    2025-03-04 21:36:19  data_ems_change_report.pcsActivePowerNormalRampUpRate 60.0
#    2025-03-04 21:36:19  data_ems_change_report.pcsActivePowerSoftStartRate 0.1
#    2025-03-04 21:36:21  data_ems_change_report.pcsActivePowerSoftstartSwitch 1
#    2025-03-04 21:36:20  data_ems_change_report.pcsActivePowerSoftstartTime 666
#    2025-03-04 21:36:20  data_ems_change_report.pcsAntiBackFlowSwitch 1
#    2025-03-04 21:36:19  data_ems_change_report.pcsAutoTestFlag 0
#    2025-03-04 21:36:21  data_ems_change_report.pcsAutoTestPercent 0
#    2025-03-04 21:36:20  data_ems_change_report.pcsAutoTestState 0
#    2025-03-04 21:36:22  data_ems_change_report.pcsAvgOvpProtectCnt 0
#    2025-03-04 21:36:19  data_ems_change_report.pcsAvgOvpProtectValue 0.0
#    2025-03-04 21:36:21  data_ems_change_report.pcsCospP1 0.1
#    2025-03-04 21:36:21  data_ems_change_report.pcsCospP2 0.5
#    2025-03-04 21:36:19  data_ems_change_report.pcsCospP3 1.0
#    2025-03-04 21:36:21  data_ems_change_report.pcsCospP4 0.0
#    2025-03-04 21:36:20  data_ems_change_report.pcsCospPf1 -1.0
#    2025-03-04 21:36:21  data_ems_change_report.pcsCospPf2 -1.0
#    2025-03-04 21:36:19  data_ems_change_report.pcsCospPf3 -0.9
#    2025-03-04 21:36:20  data_ems_change_report.pcsCospPf4 0.0
#    2025-03-04 21:36:19  data_ems_change_report.pcsDcErrCode 0
#    2025-03-04 21:36:22  data_ems_change_report.pcsFastCheck 0
#    2025-03-04 21:36:20  data_ems_change_report.pcsFaultRecoverHighFreqOnGrid 50.1
#    2025-03-04 21:36:19  data_ems_change_report.pcsFaultRecoverHighVolOnGrid 253.0
#    2025-03-04 21:36:22  data_ems_change_report.pcsFaultRecoverLowFreqOnGrid 47.53
#    2025-03-04 21:36:22  data_ems_change_report.pcsFaultRecoverLowVolOnGrid 195.5
#    2025-03-04 21:36:20  data_ems_change_report.pcsFaultRecoverOnGridWaitTime 60000
#    2025-03-04 21:36:20  data_ems_change_report.pcsFreqExternalSignal 0
#    2025-03-04 21:36:20  data_ems_change_report.pcsFreqLocalCommand 1
#    2025-03-04 21:36:21  data_ems_change_report.pcsFreqRecoverTime 1000
#    2025-03-04 21:36:19  data_ems_change_report.pcsFunctionEnable 0
#    2025-03-04 21:36:21  data_ems_change_report.pcsHighFreqOnGrid 50.1
#    2025-03-04 21:36:21  data_ems_change_report.pcsHighVolOnGrid 253.0
#    2025-03-04 21:36:22  data_ems_change_report.pcsHighVolRideThroughRecover 253.0
#    2025-03-04 21:36:21  data_ems_change_report.pcsHvrtLvrtSwitch 1
#    2025-03-04 21:36:21  data_ems_change_report.pcsIslandDetectSwitch 1
#    2025-03-04 21:36:20  data_ems_change_report.pcsLowFreq1 47.5
#    2025-03-04 21:36:19  data_ems_change_report.pcsLowFreq2 47.5
#    2025-03-04 21:36:20  data_ems_change_report.pcsLowFreqOnGrid 47.53
#    2025-03-04 21:36:22  data_ems_change_report.pcsLowFreqRecover 47.53
#    2025-03-04 21:36:21  data_ems_change_report.pcsLowFreqTime1 100
#    2025-03-04 21:36:19  data_ems_change_report.pcsLowFreqTime2 100
#    2025-03-04 21:36:20  data_ems_change_report.pcsLowVol1 184.0
#    2025-03-04 21:36:19  data_ems_change_report.pcsLowVol2 103.5
#    2025-03-04 21:36:19  data_ems_change_report.pcsLowVol3 57.5
#    2025-03-04 21:36:19  data_ems_change_report.pcsLowVolOnGrid 195.5
#    2025-03-04 21:36:20  data_ems_change_report.pcsLowVolRecover 195.5
#    2025-03-04 21:36:19  data_ems_change_report.pcsLowVolRideThroughProtectTime1 5200
#    2025-03-04 21:36:21  data_ems_change_report.pcsLowVolRideThroughProtectTime2 3000
#    2025-03-04 21:36:20  data_ems_change_report.pcsLowVolRideThroughProtectTime3 1000
#    2025-03-04 21:36:21  data_ems_change_report.pcsLowVolRideThroughRecover 195.5
#    2025-03-04 21:36:22  data_ems_change_report.pcsLowVolRideThroughStart1 184.0
#    2025-03-04 21:36:19  data_ems_change_report.pcsLowVolRideThroughStart2 103.5
#    2025-03-04 21:36:21  data_ems_change_report.pcsLowVolRideThroughStart3 34.5
#    2025-03-04 21:36:20  data_ems_change_report.pcsLowVolTime1 3000
#    2025-03-04 21:36:21  data_ems_change_report.pcsLowVolTime2 300
#    2025-03-04 21:36:20  data_ems_change_report.pcsLowVolTime3 240
#    2025-03-04 21:36:19  data_ems_change_report.pcsOfpProtectCnt 0
#    2025-03-04 21:36:19  data_ems_change_report.pcsOfpProtectValue 0.0
#    2025-03-04 21:36:19  data_ems_change_report.pcsOnGridWaitTime 60000
#    2025-03-04 21:36:22  data_ems_change_report.pcsOngridReconnectFlag 0
#    2025-03-04 21:36:19  data_ems_change_report.pcsOverFreq1 51.5
#    2025-03-04 21:36:21  data_ems_change_report.pcsOverFreq2 51.5
#    2025-03-04 21:36:20  data_ems_change_report.pcsOverFreqDeratingCutoffPower 0.0
#    2025-03-04 21:36:22  data_ems_change_report.pcsOverFreqDeratingEnd 50.2
#    2025-03-04 21:36:22  data_ems_change_report.pcsOverFreqDeratingEndDelay 0.0
#    2025-03-04 21:36:20  data_ems_change_report.pcsOverFreqDeratingFrozeSwitch 0
#    2025-03-04 21:36:22  data_ems_change_report.pcsOverFreqDeratingPowerBased 2.0
#    2025-03-04 21:36:19  data_ems_change_report.pcsOverFreqDeratingRecoverSlope 0.09
#    2025-03-04 21:36:19  data_ems_change_report.pcsOverFreqDeratingRecoverSlopeSwitch 1
#    2025-03-04 21:36:22  data_ems_change_report.pcsOverFreqDeratingSlope 0.4
#    2025-03-04 21:36:21  data_ems_change_report.pcsOverFreqDeratingStart 50.2
#    2025-03-04 21:36:20  data_ems_change_report.pcsOverFreqDeratingStartDelay 0.0
#    2025-03-04 21:36:21  data_ems_change_report.pcsOverFreqDeratingSwitch 0
#    2025-03-04 21:36:21  data_ems_change_report.pcsOverFreqRecover 50.1
#    2025-03-04 21:36:20  data_ems_change_report.pcsOverFreqTime1 100
#    2025-03-04 21:36:20  data_ems_change_report.pcsOverFreqTime2 100
#    2025-03-04 21:36:21  data_ems_change_report.pcsOverVol1 287.5
#    2025-03-04 21:36:19  data_ems_change_report.pcsOverVol2 287.5
#    2025-03-04 21:36:20  data_ems_change_report.pcsOverVol3 0.0
#    2025-03-04 21:36:22  data_ems_change_report.pcsOverVolDeratingDaleyTime 0.0
#    2025-03-04 21:36:19  data_ems_change_report.pcsOverVolDeratingEnd 257.6
#    2025-03-04 21:36:22  data_ems_change_report.pcsOverVolDeratingEndPower 0.0
#    2025-03-04 21:36:22  data_ems_change_report.pcsOverVolDeratingStart 253.0
#    2025-03-04 21:36:22  data_ems_change_report.pcsOverVolDeratingStartingPower 1.0
#    2025-03-04 21:36:22  data_ems_change_report.pcsOverVolDeratingSwitch 0
#    2025-03-04 21:36:20  data_ems_change_report.pcsOverVolDeratingTimeConst 10.0
#    2025-03-04 21:36:19  data_ems_change_report.pcsOverVolRecover 253.0
#    2025-03-04 21:36:22  data_ems_change_report.pcsOverVolRideThroughProtectTime1 5500
#    2025-03-04 21:36:21  data_ems_change_report.pcsOverVolRideThroughProtectTime2 1000
#    2025-03-04 21:36:20  data_ems_change_report.pcsOverVolRideThroughStart1 265.65
#    2025-03-04 21:36:19  data_ems_change_report.pcsOverVolRideThroughStart2 287.5
#    2025-03-04 21:36:21  data_ems_change_report.pcsOverVolTime1 100
#    2025-03-04 21:36:21  data_ems_change_report.pcsOverVolTime2 100
#    2025-03-04 21:36:19  data_ems_change_report.pcsOverVolTime3 0
#    2025-03-04 21:36:19  data_ems_change_report.pcsOvpProtectCnt 0
#    2025-03-04 21:36:19  data_ems_change_report.pcsOvpProtectValue 0.0
#    2025-03-04 21:36:19  data_ems_change_report.pcsPfValue 1.0
#    2025-03-04 21:36:21  data_ems_change_report.pcsPowerDeratingFlag 5
#    2025-03-04 21:36:21  data_ems_change_report.pcsPowerDeratingSet 200
#    2025-03-04 21:36:22  data_ems_change_report.pcsQuLockinPower 0.0
#    2025-03-04 21:36:19  data_ems_change_report.pcsQuLockoutPower 0.0
#    2025-03-04 21:36:22  data_ems_change_report.pcsQuMinimumCosphi 0.4
#    2025-03-04 21:36:20  data_ems_change_report.pcsQuQ1 0.6
#    2025-03-04 21:36:20  data_ems_change_report.pcsQuQ2 0.0
#    2025-03-04 21:36:20  data_ems_change_report.pcsQuQ3 0.0
#    2025-03-04 21:36:20  data_ems_change_report.pcsQuQ4 -0.6
#    2025-03-04 21:36:21  data_ems_change_report.pcsQuTimeConst 10.0
#    2025-03-04 21:36:22  data_ems_change_report.pcsQuV1 213.90001
#    2025-03-04 21:36:21  data_ems_change_report.pcsQuV2 223.1
#    2025-03-04 21:36:20  data_ems_change_report.pcsQuV3 236.9
#    2025-03-04 21:36:20  data_ems_change_report.pcsQuV4 246.1
#    2025-03-04 21:36:19  data_ems_change_report.pcsReactPwrCompensation 0.0062
#    2025-03-04 21:36:21  data_ems_change_report.pcsReactPwrModeSelect 0
#    2025-03-04 21:36:22  data_ems_change_report.pcsReactPwrPercent 0.0
#    2025-03-04 21:36:20  data_ems_change_report.pcsReconnectGridDetectSwitch 1
#    2025-03-04 21:36:19  data_ems_change_report.pcsRelaySelfCheckSta 0
#    2025-03-04 21:36:19  data_ems_change_report.pcsRelayStateShow 13732943
#    2025-03-04 21:36:20  data_ems_change_report.pcsRunFsmState 2542168178
#    2025-03-04 21:36:21  data_ems_change_report.pcsRunSta RUNSTA_RUN
#    2025-03-04 21:36:20  data_ems_change_report.pcsSafetyCountryCodeSelection 4
#    2025-03-04 21:36:22  data_ems_change_report.pcsSendEnd 0
#    2025-03-04 21:36:21  data_ems_change_report.pcsUfpProtectCnt 0
#    2025-03-04 21:36:19  data_ems_change_report.pcsUfpProtectValue 0.0
#    2025-03-04 21:36:22  data_ems_change_report.pcsUnderFreqIncrementEnd 49.8
#    2025-03-04 21:36:20  data_ems_change_report.pcsUnderFreqIncrementEndDelay 0.0
#    2025-03-04 21:36:20  data_ems_change_report.pcsUnderFreqIncrementFrozeSwitch 0
#    2025-03-04 21:36:22  data_ems_change_report.pcsUnderFreqIncrementRecoverSlope 0.09
#    2025-03-04 21:36:22  data_ems_change_report.pcsUnderFreqIncrementRecoverSlopeSwitch 1
#    2025-03-04 21:36:19  data_ems_change_report.pcsUnderFreqIncrementSlope 0.4
#    2025-03-04 21:36:20  data_ems_change_report.pcsUnderFreqIncrementStart 49.8
#    2025-03-04 21:36:19  data_ems_change_report.pcsUnderFreqIncrementStartDelay 0.0
#    2025-03-04 21:36:22  data_ems_change_report.pcsUnderFreqIncrementSwitch 0
#    2025-03-04 21:36:19  data_ems_change_report.pcsUvp1ProtectCnt 0
#    2025-03-04 21:36:19  data_ems_change_report.pcsUvp1ProtectValue 0.0
#    2025-03-04 21:36:22  data_ems_change_report.pcsUvp2ProtectCnt 0
#    2025-03-04 21:36:20  data_ems_change_report.pcsUvp2ProtectValue 0.0
#    2025-03-04 21:36:20  data_ems_change_report.pcsVolRecoverTime 1000
#    2025-03-04 21:36:22  data_ems_change_report.rateCtrlSwtich false
#    2025-03-04 21:36:19  data_ems_change_report.relay14a 0
#    2025-03-04 21:36:21  data_ems_change_report.sys14aEnable false
#    2025-03-04 21:36:22  data_ems_change_report.sys14aType 1
#    2025-03-04 21:36:20  data_ems_change_report.sysBatDsgDownLimit 0
#    2025-03-04 21:36:22  data_ems_change_report.sysCalStat 0
#    2025-03-04 21:36:22  data_ems_change_report.sysGridSta 0
#    2025-03-04 21:36:22  data_ems_change_report.sysHeatStat 0
#    2025-03-04 21:36:20  data_ems_change_report.sysMeterCfg 0
#    2025-03-04 21:36:21  data_ems_change_report.sysMulPeakSwitch false
#    2025-03-04 21:36:21  data_ems_change_report.sysMulPeakTime 1200
#    2025-03-04 21:36:22  data_ems_change_report.sysOnOffMachineStat 0
#    2025-03-04 21:36:19  data_ems_change_report.sysRateCtrlTime 60
#    2025-03-04 21:36:20  data_ems_change_report.sysStateBit 0
#    2025-03-04 21:36:21  data_ems_change_report.sysTypeCfg 0
#    2025-03-07 11:51:35  data_ems_change_report.updateTime 2025-03-07 18:51:23
#    2025-03-04 21:36:20  data_ems_change_report.userRole 0
#    2025-03-04 21:36:19  data_ems_change_report.virtualHardEdition 1
#    2025-03-04 21:36:19  data_ems_change_report.wifiStaStat 10
#    2025-03-04 21:36:20  data_ems_eco_logy_dev.HPReport.online 0
#    2025-03-07 11:51:35  data_ems_eco_logy_dev.updateTime 2025-03-07 18:51:21
#    2025-03-04 21:36:21  data_ems_edev_sys.devFirstInfo 31
#    2025-03-04 21:36:20  data_ems_edev_sys.devLastInfo 31
#    2025-03-04 21:36:20  data_ems_edev_sys.devLastMinInfo 31
#    2025-03-07 11:20:02  data_ems_edev_sys.dispatchType 2
#    2025-03-04 21:36:21  data_ems_edev_sys.feedPwrCap 10000.0
#    2025-03-04 21:36:20  data_ems_edev_sys.freeNum 36
#    2025-03-07 11:53:29  data_ems_edev_sys.pclPwrBase 5257.5
#    2025-03-07 11:39:39  data_ems_edev_sys.socCur 100.0
#    2025-03-04 21:36:21  data_ems_edev_sys.socDev 90
#    2025-03-07 11:33:51  data_ems_edev_sys.solarFlag 9183
#    2025-03-04 21:36:22  data_ems_edev_sys.startState 0
#    2025-03-04 21:36:22  data_ems_edev_sys.stratType 0
#    2025-03-07 11:22:21  data_ems_edev_sys.sysFlag 71
#    2025-03-07 11:53:29  data_ems_edev_sys.updateTime 2025-03-07 18:53:27
#    2025-03-04 21:36:21  data_ems_edev_sys.usedNum 0
#    2025-03-07 02:54:42  data_ems_logy_dev.updateTime 2025-03-07 09:54:41
#    2025-03-04 21:36:20  data_ems_param_change_report.bpBurst false
#    2025-03-04 21:36:19  data_ems_param_change_report.breakerCapacityMax 32
#    2025-03-04 21:36:21  data_ems_param_change_report.breakerEnableState true
#    2025-03-04 21:36:20  data_ems_param_change_report.devSoc 90
#    2025-03-04 21:36:19  data_ems_param_change_report.energyEfficientEnable true
#    2025-03-04 21:36:20  data_ems_param_change_report.lowerPowerStat false
#    2025-03-04 21:36:21  data_ems_param_change_report.smartCtrl false
#    2025-03-04 21:36:21  data_ems_param_change_report.sysTimeTab 19662120
#    2025-03-04 21:36:22  data_ems_param_change_report.sysZone 4
#    2025-03-07 11:51:34  data_ems_param_change_report.updateTime 2025-03-07 18:51:21
#    2025-03-07 02:54:42  data_ems_priority.updateTime 2025-03-07 09:54:41
#    2025-03-07 02:54:43  data_ems_task.updateTime 2025-03-07 09:54:40
#    2025-03-04 21:36:20  data_error_code.bpErrCode_1_moduleSn SExxxxxxxxxxxxxx==
#    2025-03-04 21:36:21  data_error_code.bpErrCode_2_moduleSn Sxxxxxxxxxxxxxxxxxxxx=
#    2025-03-04 21:36:20  data_error_code.emsErrCode.moduleSn Sxxxxxxxxxxxxxxxxxxx
#    2025-03-04 21:36:19  data_error_code.pcsErrCode.moduleSn Sxxxxxxxxxxxxxxxxxxx==
#    2025-03-07 11:51:35  data_error_code.updateTime 2025-03-07 18:51:25
#    2025-03-04 21:36:20  data_error_code_mark_report.errorCode_1 0
#    2025-03-04 21:36:22  data_error_code_mark_report.errorCode_10 0
#    2025-03-04 21:36:22  data_error_code_mark_report.errorCode_11 0
#    2025-03-04 21:36:21  data_error_code_mark_report.errorCode_12 0
#    2025-03-04 21:36:22  data_error_code_mark_report.errorCode_13 0
#    2025-03-04 21:36:20  data_error_code_mark_report.errorCode_14 0
#    2025-03-04 21:36:20  data_error_code_mark_report.errorCode_15 0
#    2025-03-04 21:36:21  data_error_code_mark_report.errorCode_16 0
#    2025-03-04 21:36:22  data_error_code_mark_report.errorCode_17 0
#    2025-03-04 21:36:22  data_error_code_mark_report.errorCode_18 0
#    2025-03-04 21:36:20  data_error_code_mark_report.errorCode_19 0
#    2025-03-04 21:36:21  data_error_code_mark_report.errorCode_2 0
#    2025-03-04 21:36:19  data_error_code_mark_report.errorCode_20 0
#    2025-03-04 21:36:20  data_error_code_mark_report.errorCode_21 0
#    2025-03-04 21:36:20  data_error_code_mark_report.errorCode_22 0
#    2025-03-04 21:36:21  data_error_code_mark_report.errorCode_23 0
#    2025-03-04 21:36:22  data_error_code_mark_report.errorCode_24 0
#    2025-03-04 21:36:21  data_error_code_mark_report.errorCode_25 0
#    2025-03-04 21:36:20  data_error_code_mark_report.errorCode_26 0
#    2025-03-04 21:36:21  data_error_code_mark_report.errorCode_27 0
#    2025-03-04 21:36:19  data_error_code_mark_report.errorCode_28 0
#    2025-03-04 21:36:19  data_error_code_mark_report.errorCode_29 0
#    2025-03-04 21:36:19  data_error_code_mark_report.errorCode_3 0
#    2025-03-04 21:36:20  data_error_code_mark_report.errorCode_30 0
#    2025-03-04 21:36:19  data_error_code_mark_report.errorCode_31 0
#    2025-03-04 21:36:20  data_error_code_mark_report.errorCode_32 0
#    2025-03-04 21:36:20  data_error_code_mark_report.errorCode_4 0
#    2025-03-04 21:36:19  data_error_code_mark_report.errorCode_5 0
#    2025-03-04 21:36:21  data_error_code_mark_report.errorCode_6 0
#    2025-03-04 21:36:22  data_error_code_mark_report.errorCode_7 0
#    2025-03-04 21:36:21  data_error_code_mark_report.errorCode_8 0
#    2025-03-04 21:36:21  data_error_code_mark_report.errorCode_9 0
#    2025-03-07 02:54:42  data_error_code_mark_report.updateTime 2025-03-07 09:54:41
#    2025-03-07 11:53:30  data_mpptHeartBeat_1_mpptPv_1_amp 8.640048
#    2025-03-07 11:53:29  data_mpptHeartBeat_1_mpptPv_1_pwr 3046.899
#    2025-03-07 11:53:30  data_mpptHeartBeat_1_mpptPv_1_vol 352.64838
#    2025-03-07 11:53:29  data_mpptHeartBeat_1_mpptPv_2_amp 8.50316
#    2025-03-07 11:53:29  data_mpptHeartBeat_1_mpptPv_2_pwr 3267.882
#    2025-03-07 11:53:30  data_mpptHeartBeat_1_mpptPv_2_vol 384.3138
#    2025-03-07 11:53:42  data_mpptPwr    6350.0
#    2025-03-07 11:53:30  data_pcsAPhase.actPwr -1991.044
#    2025-03-07 11:53:29  data_pcsAPhase.amp 8.407616
#    2025-03-07 11:53:29  data_pcsAPhase.apparentPwr 1999.9281
#    2025-03-07 11:53:29  data_pcsAPhase.reactPwr 188.29897
#    2025-03-07 11:53:30  data_pcsAPhase.vol 237.87102
#    2025-03-07 11:53:29  data_pcsBPhase.actPwr -1964.698
#    2025-03-07 11:53:30  data_pcsBPhase.amp 8.298588
#    2025-03-07 11:53:29  data_pcsBPhase.apparentPwr 1973.1041
#    2025-03-07 11:53:30  data_pcsBPhase.reactPwr 181.93886
#    2025-03-07 11:53:29  data_pcsBPhase.vol 237.76384
#    2025-03-07 11:53:29  data_pcsCPhase.actPwr -1949.5348
#    2025-03-07 11:53:29  data_pcsCPhase.amp 8.258227
#    2025-03-07 11:53:30  data_pcsCPhase.apparentPwr 1961.4961
#    2025-03-07 11:53:30  data_pcsCPhase.reactPwr 216.28915
#    2025-03-07 11:53:29  data_pcsCPhase.vol 237.52023
#    2025-03-07 11:53:42  data_sysGridPwr -5280.0
#    2025-03-07 11:53:42  data_sysLoadPwr 1070.0
#    2025-03-07 11:53:42  eagleEyeTraceId ea1a2a5c32174134482xxxxxxxxxxxxxxx
#    2025-03-06 18:24:25  message        Success
#
setstate PO2 Solarertrag: 6350.0 W <br>Hausnetz: 1070.0 W <br> Batterie: 0.0 W <br>Ladestatus: 100 % <br>Netzeinspeisung: -5280.0 W <br>Letzte Meldung: 2025-03-07 11:53:42
setstate PO2 2025-03-06 18:24:25 code 0
setstate PO2 2025-03-07 11:39:52 data_bpPwr 0.0
setstate PO2 2025-03-07 11:39:51 data_bpSoc 100
setstate PO2 2025-03-07 11:52:38 data_bp_addr.HJ3xxxxxxxxxxxxxxxx {\
  "bpPwr": -0.64905936,\
  "bpSoc": 100,\
  "bpSoh": 100,\
  "bpTemp": [29.0, 31.0, 29.0, 30.0, 31.0, 28.0, 29.0, 29.0, 30.0],\
  "bpCellMaxVol": 3405.0,\
  "bpCellMinVol": 3355.0,\
  "bpRunSta": "RUNSTA_RUN",\
  "bpVol": 54.326,\
  "bpAmp": -0.01194749,\
  "bpBusVol": 832.07184,\
  "bpErrCode": 2,\
  "bpCellVol": [3395.0, 3399.0, 3398.0, 3395.0, 3399.0, 3404.0, 3401.0, 3404.0, 3355.0, 3402.0, 3405.0, 3402.0, 3401.0, 3401.0, 3397.0, 3403.0],\
  "bpDsrc": 1,\
  "bpSn": "SExxxxxxxxxxxxxxxxxxxxx=",\
  "bpCycles": 28,\
  "bpBalanceState": 21589,\
  "bpHvMosTemp": 40.0,\
  "bpLvMosTemp": 38.0,\
  "bpPtcTemp": 31.0,\
  "bpHtsTemp": 38.0,\
  "bpBusNegTemp": 36.0,\
  "bpBusPosTemp": 39.0,\
  "bpEnvTemp": 37.0,\
  "bpAccuChgCap": 2637324,\
  "bpAccuDsgCap": 2571636,\
  "bpDesignCap": 100000,\
  "bpFullCap": 100000,\
  "bpMaxCellTemp": 31.0,\
  "bpMinCellTemp": 28.0,\
  "bpMaxMosTemp": 40.0,\
  "bpMinMosTemp": 38.0,\
  "bpBmsFault": 0,\
  "bpEcloundSoc": 65535,\
  "bpHeartbeatVer": 33,\
  "bpTimestamp": 1741344751,\
  "bpRealSoc": 99.0,\
  "bpRealSoh": 104.86778,\
  "bpGlobalProtect": 32,\
  "bpDownLimitSoc": 5,\
  "bpUpLimitSoc": 100,\
  "bpActiveCalReqStat": 0,\
  "bpActiveCalRunStat": 0,\
  "moduleProductInfo": 21251,\
  "moduleProgramSta": 1,\
  "moduleAplSwVer": 67176967,\
  "moduleLoaderSwVer": 67174401,\
  "bmsRunSta": "PB_BMS_STATE_DISCHARGEABLE",\
  "bmsChgDsgSta": "PB_STANDBY_STATE",\
  "dabModSta": "PB_MOD_STA_WARNNING",\
  "bpChgSop": 0,\
  "bpDsgSop": 80,\
  "bpRemainWatth": 5120.0,\
  "bpTargetSoc": 99.9,\
  "bpDiffSoc": 2.734375,\
  "bpMaxSoc": 100.0,\
  "bpMinSoc": 97.26585,\
  "bpLimitSoc": 0.5,\
  "bpCalendarSoh": 99.84766,\
  "bpCycleSoh": 99.84766,\
  "bpAcRechargeFlag": false,\
  "bpPtcHeatFlag": false,\
  "bpPtcExitEvent": "PB_PTC_OT_STATE",\
  "bpAccuChgEnergy": 142158,\
  "bpAccuDsgEnergy": 133496,\
  "bpPtcTemp2": 30.0,\
  "bpSysState": "NORMAL_STATE",\
  "bpAuxCellVol01": 3394.0\
}
setstate PO2 2025-03-07 11:52:39 data_bp_addr.HJ3xxxxxxxxxxxxxx {\
  "bpPwr": -0.3821171,\
  "bpSoc": 100,\
  "bpSoh": 100,\
  "bpTemp": [28.0, 31.0, 29.0, 30.0, 30.0, 27.0, 28.0, 28.0, 29.0],\
  "bpCellMaxVol": 3386.0,\
  "bpCellMinVol": 3370.0,\
  "bpRunSta": "RUNSTA_RUN",\
  "bpVol": 54.006,\
  "bpAmp": -0.007075456,\
  "bpBusVol": 831.59674,\
  "bpErrCode": 2,\
  "bpCellVol": [3370.0, 3373.0, 3372.0, 3380.0, 3379.0, 3378.0, 3382.0, 3377.0, 3382.0, 3382.0, 3382.0, 3382.0, 3386.0, 3381.0, 3385.0, 3380.0],\
  "bpDsrc": 2,\
  "bpSn": "Sxxxxxxxxxxxxxxxxxxxxxx",\
  "bpCycles": 28,\
  "bpBalanceState": 0,\
  "bpHvMosTemp": 37.0,\
  "bpLvMosTemp": 35.0,\
  "bpPtcTemp": 29.0,\
  "bpHtsTemp": 35.0,\
  "bpBusNegTemp": 35.0,\
  "bpBusPosTemp": 36.0,\
  "bpEnvTemp": 34.0,\
  "bpAccuChgCap": 2663070,\
  "bpAccuDsgCap": 2595472,\
  "bpDesignCap": 100000,\
  "bpFullCap": 100000,\
  "bpMaxCellTemp": 31.0,\
  "bpMinCellTemp": 27.0,\
  "bpMaxMosTemp": 37.0,\
  "bpMinMosTemp": 35.0,\
  "bpBmsFault": 0,\
  "bpEcloundSoc": 65535,\
  "bpHeartbeatVer": 33,\
  "bpTimestamp": 1741344746,\
  "bpRealSoc": 100.0,\
  "bpRealSoh": 102.700005,\
  "bpGlobalProtect": 0,\
  "bpDownLimitSoc": 5,\
  "bpUpLimitSoc": 100,\
  "bpActiveCalReqStat": 0,\
  "bpActiveCalRunStat": 0,\
  "moduleProductInfo": 21251,\
  "moduleProgramSta": 1,\
  "moduleAplSwVer": 67176967,\
  "moduleLoaderSwVer": 67174401,\
  "bmsRunSta": "PB_BMS_STATE_DISCHARGEABLE",\
  "bmsChgDsgSta": "PB_STANDBY_STATE",\
  "dabModSta": "PB_MOD_STA_WARNNING",\
  "bpChgSop": 49,\
  "bpDsgSop": 80,\
  "bpRemainWatth": 5120.0,\
  "bpTargetSoc": 99.9,\
  "bpDiffSoc": 0.15625,\
  "bpMaxSoc": 100.0,\
  "bpMinSoc": 99.84404,\
  "bpLimitSoc": 0.5,\
  "bpCalendarSoh": 99.84766,\
  "bpCycleSoh": 99.84766,\
  "bpAcRechargeFlag": false,\
  "bpPtcHeatFlag": false,\
  "bpPtcExitEvent": "PB_PTC_OT_STATE",\
  "bpAccuChgEnergy": 143528,\
  "bpAccuDsgEnergy": 134706,\
  "bpPtcTemp2": 29.0,\
  "bpSysState": "NORMAL_STATE",\
  "bpAuxCellVol01": 3370.0\
}
setstate PO2 2025-03-07 11:52:39 data_bp_addr.updateTime 2025-03-07 18:52:35
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.afciEn 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.afciEnSet 0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.afciEnableCmdState 0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.afciFaultClearState 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.afciFaultCntCh1 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.afciFaultCntCh2 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.afciFaultFlagCh1 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.afciFaultFlagCh2 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.afciFaultMaxValueCh1 0.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.afciFaultMaxValueCh2 0.0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.afciFaultValueCh1 0.0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.afciFaultValueCh2 0.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.afciIsExist 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.afciProtectValueCh1 0.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.afciProtectValueCh2 0.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.afciSelfTestCmdState 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.afciSellfTestResult 0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.afciSwitchFreqCh1 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.afciSwitchFreqCh2 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.batRealyStatus 2
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.batRelayCloseFailFlag 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.batSoftRelayStatus 0
setstate PO2 2025-03-07 11:39:52 data_ems_change_report.bpChgDsgSta 2
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.bpLineOffFlag 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.bpOnlineSum 2
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.bpRestartFlag 1
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.bpReverseFlag 0
setstate PO2 2025-03-07 11:39:39 data_ems_change_report.bpSoc 100
setstate PO2 2025-03-07 11:51:34 data_ems_change_report.bpTotalChgEnergy 274940
setstate PO2 2025-03-07 09:51:32 data_ems_change_report.bpTotalDsgEnergy 258836
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.chgDsgMode 0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.chgDsgPwr 700.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.devMaxPower 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.duration 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.emsBackupEvent 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.emsCtrlLedBright 10
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.emsCtrlLedType 1
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.emsFeedMode 1
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.emsFeedPwr 10000
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.emsFeedRatio 100
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.emsSgReadyEn false
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.emsSgRunStat 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.emsStopAll 0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.emsWordMode WORKMODE_SELFUSE
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.emsWorkState 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.endTimestamp 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.ethWanStat 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.iot4gErr 7
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.iot4gOn 1
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.iot4gPdp -1
setstate PO2 2025-03-06 21:51:48 data_ems_change_report.iot4gSta 2
setstate PO2 2025-03-07 06:30:20 data_ems_change_report.mppt1FaultCode 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.mppt1WarningCode 0
setstate PO2 2025-03-07 06:29:55 data_ems_change_report.mppt2FaultCode 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.mppt2WarningCode 0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.parallelAllowState false
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.parallelType 0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.parallelTypeCur 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.parallelTypeSet 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcs10minOverVol 253.0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcs10minOverVolSwitch 1
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcs10minOverVolTime 100
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsAcErrCode 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsAcWarningCode 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsActivePowerDeratingPercent 1.0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsActivePowerDeratingSwitch 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsActivePowerGradient 0.0033
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsActivePowerNormalRampUpRate 60.0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsActivePowerSoftStartRate 0.1
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsActivePowerSoftstartSwitch 1
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsActivePowerSoftstartTime 666
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsAntiBackFlowSwitch 1
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsAutoTestFlag 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsAutoTestPercent 0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsAutoTestState 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsAvgOvpProtectCnt 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsAvgOvpProtectValue 0.0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsCospP1 0.1
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsCospP2 0.5
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsCospP3 1.0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsCospP4 0.0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsCospPf1 -1.0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsCospPf2 -1.0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsCospPf3 -0.9
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsCospPf4 0.0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsDcErrCode 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsFastCheck 0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsFaultRecoverHighFreqOnGrid 50.1
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsFaultRecoverHighVolOnGrid 253.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsFaultRecoverLowFreqOnGrid 47.53
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsFaultRecoverLowVolOnGrid 195.5
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsFaultRecoverOnGridWaitTime 60000
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsFreqExternalSignal 0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsFreqLocalCommand 1
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsFreqRecoverTime 1000
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsFunctionEnable 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsHighFreqOnGrid 50.1
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsHighVolOnGrid 253.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsHighVolRideThroughRecover 253.0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsHvrtLvrtSwitch 1
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsIslandDetectSwitch 1
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsLowFreq1 47.5
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsLowFreq2 47.5
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsLowFreqOnGrid 47.53
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsLowFreqRecover 47.53
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsLowFreqTime1 100
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsLowFreqTime2 100
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsLowVol1 184.0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsLowVol2 103.5
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsLowVol3 57.5
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsLowVolOnGrid 195.5
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsLowVolRecover 195.5
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsLowVolRideThroughProtectTime1 5200
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsLowVolRideThroughProtectTime2 3000
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsLowVolRideThroughProtectTime3 1000
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsLowVolRideThroughRecover 195.5
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsLowVolRideThroughStart1 184.0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsLowVolRideThroughStart2 103.5
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsLowVolRideThroughStart3 34.5
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsLowVolTime1 3000
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsLowVolTime2 300
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsLowVolTime3 240
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsOfpProtectCnt 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsOfpProtectValue 0.0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsOnGridWaitTime 60000
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsOngridReconnectFlag 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsOverFreq1 51.5
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsOverFreq2 51.5
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsOverFreqDeratingCutoffPower 0.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsOverFreqDeratingEnd 50.2
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsOverFreqDeratingEndDelay 0.0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsOverFreqDeratingFrozeSwitch 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsOverFreqDeratingPowerBased 2.0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsOverFreqDeratingRecoverSlope 0.09
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsOverFreqDeratingRecoverSlopeSwitch 1
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsOverFreqDeratingSlope 0.4
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsOverFreqDeratingStart 50.2
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsOverFreqDeratingStartDelay 0.0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsOverFreqDeratingSwitch 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsOverFreqRecover 50.1
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsOverFreqTime1 100
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsOverFreqTime2 100
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsOverVol1 287.5
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsOverVol2 287.5
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsOverVol3 0.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsOverVolDeratingDaleyTime 0.0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsOverVolDeratingEnd 257.6
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsOverVolDeratingEndPower 0.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsOverVolDeratingStart 253.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsOverVolDeratingStartingPower 1.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsOverVolDeratingSwitch 0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsOverVolDeratingTimeConst 10.0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsOverVolRecover 253.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsOverVolRideThroughProtectTime1 5500
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsOverVolRideThroughProtectTime2 1000
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsOverVolRideThroughStart1 265.65
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsOverVolRideThroughStart2 287.5
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsOverVolTime1 100
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsOverVolTime2 100
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsOverVolTime3 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsOvpProtectCnt 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsOvpProtectValue 0.0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsPfValue 1.0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsPowerDeratingFlag 5
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsPowerDeratingSet 200
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsQuLockinPower 0.0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsQuLockoutPower 0.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsQuMinimumCosphi 0.4
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsQuQ1 0.6
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsQuQ2 0.0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsQuQ3 0.0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsQuQ4 -0.6
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsQuTimeConst 10.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsQuV1 213.90001
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsQuV2 223.1
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsQuV3 236.9
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsQuV4 246.1
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsReactPwrCompensation 0.0062
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsReactPwrModeSelect 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsReactPwrPercent 0.0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsReconnectGridDetectSwitch 1
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsRelaySelfCheckSta 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsRelayStateShow 13732943
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsRunFsmState 2542168178
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsRunSta RUNSTA_RUN
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsSafetyCountryCodeSelection 4
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsSendEnd 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.pcsUfpProtectCnt 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsUfpProtectValue 0.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsUnderFreqIncrementEnd 49.8
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsUnderFreqIncrementEndDelay 0.0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsUnderFreqIncrementFrozeSwitch 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsUnderFreqIncrementRecoverSlope 0.09
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsUnderFreqIncrementRecoverSlopeSwitch 1
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsUnderFreqIncrementSlope 0.4
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsUnderFreqIncrementStart 49.8
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsUnderFreqIncrementStartDelay 0.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsUnderFreqIncrementSwitch 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsUvp1ProtectCnt 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.pcsUvp1ProtectValue 0.0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.pcsUvp2ProtectCnt 0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsUvp2ProtectValue 0.0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.pcsVolRecoverTime 1000
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.rateCtrlSwtich false
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.relay14a 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.sys14aEnable false
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.sys14aType 1
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.sysBatDsgDownLimit 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.sysCalStat 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.sysGridSta 0
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.sysHeatStat 0
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.sysMeterCfg 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.sysMulPeakSwitch false
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.sysMulPeakTime 1200
setstate PO2 2025-03-04 21:36:22 data_ems_change_report.sysOnOffMachineStat 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.sysRateCtrlTime 60
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.sysStateBit 0
setstate PO2 2025-03-04 21:36:21 data_ems_change_report.sysTypeCfg 0
setstate PO2 2025-03-07 11:51:35 data_ems_change_report.updateTime 2025-03-07 18:51:23
setstate PO2 2025-03-04 21:36:20 data_ems_change_report.userRole 0
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.virtualHardEdition 1
setstate PO2 2025-03-04 21:36:19 data_ems_change_report.wifiStaStat 10
setstate PO2 2025-03-04 21:36:20 data_ems_eco_logy_dev.HPReport.online 0
setstate PO2 2025-03-07 11:51:35 data_ems_eco_logy_dev.updateTime 2025-03-07 18:51:21
setstate PO2 2025-03-04 21:36:21 data_ems_edev_sys.devFirstInfo 31
setstate PO2 2025-03-04 21:36:20 data_ems_edev_sys.devLastInfo 31
setstate PO2 2025-03-04 21:36:20 data_ems_edev_sys.devL
# ... truncated to 50k, original length 56564

Grüße
Mathias
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: tschimi am 09 März 2025, 16:09:08
So, das wirft die Maschine aus:

2025.03.09 16:04:16 1: $url = /iot-open/sign/device/quota/all?sn=xxxx $query_str = accessKey=xxxx&nonce=457331×tamp=1741532656528
2025.03.09 16:04:16 1: $response = {"code":"8512","message":"no permission to do it","eagleEyeTraceId":"ea1a2xxxx","tid":""}

Und dann immer "No permission to do that". Kann es sein, das ich aus irgendeinem Grund das Password nicht setzen?? Zudem komisch, meine Fhemeinträge haben keine Kommandozeile für Set xxxx connect oder set xxx password. Ist das richtig so?? Vielleicht ist ja dass das Problem??
Lg, tschimi

P.S.: hab mal mit deinen Gets rumgespielt. Also alle Werte, die ich vom Device hole (password, access_key und serial_no) sind richtig definiert. Das "no permission to do it" kommt also irgendwo anders her... Muss ich an den Ecoflow Geräte noch irgendwas anpassen?
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 10 März 2025, 09:58:52
Zitat von: Fakenius am 08 März 2025, 16:39:33Eine Frage: ist es Absicht, dass in FhemWeb die Set- und Get-Befehle im DeviceOverview nicht sichtbar sind (also zum Anklicken und Auswählen)?
Nein, da hatte ich noch nicht ganz begriffen, wie das geht, hab ich jetzt eingebaut.
Zitat von: tschimi am 09 März 2025, 16:09:08So, das wirft die Maschine aus:

2025.03.09 16:04:16 1: $url = /iot-open/sign/device/quota/all?sn=xxxx $query_str = accessKey=xxxx&nonce=457331×tamp=1741532656528
2025.03.09 16:04:16 1: $response = {"code":"8512","message":"no permission to do it","eagleEyeTraceId":"ea1a2xxxx","tid":""}
P.S.: hab mal mit deinen Gets rumgespielt. Also alle Werte, die ich vom Device hole (password, access_key und serial_no) sind richtig definiert. Das "no permission to do it" kommt also irgendwo anders her... Muss ich an den Ecoflow Geräte noch irgendwas anpassen?
Hm, also den AccessKey und den SecretKey hast Du hier beantragt? https://developer-eu.ecoflow.com (https://developer-eu.ecoflow.com)
Ja, stimmt, hast Du oben geschrieben.

Was ist denn das für ein Ecoflow-Gerät? Und die Firmware des Geräts ist aktuell?
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 10 März 2025, 10:39:41
Neue Version:

kleines Update:
-Get- und Set-Listen jetzt auch in der UI.
-Ohne Password/SecretKey werden keine API-Calls mehr ausgeführt
-Hinweise, dass erst ein Password/SecretKey gesetzt werden soll
-Parameter "secret_key" eingeführt
-Parameter "password" wird in den nächsten Versionen verschwinden.

(Aktuellste Version immer im 1. Post dieses Threads!)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 10 März 2025, 16:11:31
Zitat von: matsches am 07 März 2025, 12:06:30Ich hoffe ich habe alles sicherheitsrelevante ausgeixxt und die Vorgehensweise "Copy for forum.fhem.de" ist so korrekt.
Leider aktualisieren sich die Daten nur, wenn ich parallel die App oder das Webportal aufrufe. Ich meine das war bei der ersten Version deines Moduls nicht so.
attr PO2 ecInterval 10

Das sollte nicht so sein. ecInterval 10 ist auch recht kurz, damit fragst Du alle 10 Sekunden ab. Lade Dir mal die letzte Version (voriger Post) und mit "set <DeviceName> deleteReadings" lösch mal alle Readings. Die Werte sollten auch kommen, ohne daß die App läuft.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: tschimi am 10 März 2025, 16:15:27
Ok, hab gerade deine neue Version gezogen. Ich mußte noch URL::Encode installieren ;-)

Ich hab 2 Ecoflow PowerStream(s) mit der neusten Firmware. Leider ist aber der Fehler "no permission to do it" immer noch da :-(

Lg, tschimi

P.S.: Kann es sein das dein Modul für die PowerStream(s) nicht geht??
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 10 März 2025, 16:21:29
Hab jetzt noch mal mit neuem Ubuntu 24.04 und nur dem fhem-6.3.pkg getestet:
Derzeit ist "apt install libwww-curl-perl libdatetime-hires-perl libdigest-sha-perl liburl-encode-perl" erforderlich, damit das Modul läuft.

Zitat von: tschimi am 10 März 2025, 16:15:27Ich hab 2 Ecoflow PowerStream(s) mit der neusten Firmware. Leider ist aber der Fehler "no permission to do it" immer noch da :-(
Komisch, ich hab zwar nur eine PowerStream, aber bei mir läuft das. Ich bau da mal eben was ein... Moment...
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 10 März 2025, 16:33:18
Update mal auf diese Version und dann führe mal "get <device> devices" aus. Da müssten dann all Deine registrierten Geräte mit Seriennummern gelistet werden.

Bei mir kommt das hier:
code=0
data_1_online=1
data_1_productName=PowerStream
data_1_sn=HW5XXXXXXXX
data_2_online=1
data_2_productName=DELTA 2 Max
data_2_sn=R3XXXXXXXXXX
eagleEyeTraceId=ea1XXXXXXXXXXXXXXXXXXXXX
message=Success
tid=

(Aktuellste Version immer im 1. Post dieses Threads!)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 10 März 2025, 22:02:31
Hi.

Habe nun deine aktuelle Version nach ein paar Hürden zum Laufen bekommen mit der PowerOcean.
(Problem waren die notwendigen libwww-curl-perl libdatetime-hires-perl libdigest-sha-perl liburl-encode-perl... und die Installation auf dem Raspi2 mit Rasberian Buster)
libdatetime-hires-perl konnte ich nicht installieren. Läuft aber anscheinend auch ohne.

Auf den ersten Blick läuft alles mit ecInterval 120

Grüße
Mathias




Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Stromzähler am 11 März 2025, 10:10:59
Hallo,

ich habe (privat!) die Version "0.0.1.0 - 21.02.2025" um eine "Sendefunktion" erweitert. Mit meinem PowerStream klappt das einwandfrei. Wenn der Autor Interesse hat, schicke ich im das per PM.

Mit meiner neuen Delta 3 klappt das offensichtlich nicht mehr. Da wird die Payload wohl über "Google Protocol Buffers" geschickt bzw. "gepackt"  :o

Ich arbeite dran ;D

Gruß
Joachim
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 11 März 2025, 10:21:25
Zitat von: Fakenius am 11 März 2025, 10:10:59ich habe (privat!) die Version "0.0.1.0 - 21.02.2025" um eine "Sendefunktion" erweitert. Mit meinem PowerStream klappt das einwandfrei. Wenn der Autor Interesse hat, schicke ich im das per PM.
na, immer her damit, interessiert mich natürlich! :)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: tschimi am 11 März 2025, 13:20:45
Zitat von: Neolux am 10 März 2025, 16:33:18Update mal auf diese Version und dann führe mal "get <device> devices" aus. Da müssten dann all Deine registrierten Geräte mit Seriennummern gelistet werden.
Bin zu blöde. Hatte 2 verschiedene Emails für die APP und als Developer... Und siehe da, alles funktioniert ;-)

Dankeschön nochmal für deine Geduld....

Lg, tschimi
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 11 März 2025, 14:43:46
Zitat von: tschimi am 11 März 2025, 13:20:45ABER, du schreibst "registrierte Geräte". Wo hast du deine den registriert??? Vielleicht ist dass das Problem?!

Hi.
Versuche es mal bei https://www.ecoflow.com/de/login

Für den PowerOcean gibt es dann das Webportal https://portal.ecoflow.com/user/eu/de/login
Für den Powerstream bin ich mir nicht sicher.

Grüße
Mathias
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 11 März 2025, 15:04:46
Zitat von: tschimi am 11 März 2025, 13:20:45Bin zu blöde. Hatte 2 verschiedene Emails für die APP und als Developer... Und siehe da, alles funktioniert ;-)

Dankeschön nochmal für deine Geduld....

Lg, tschimi


Den Verdacht hatte ich, daß Du für der Developer-Portal eine andere Mail-Adresse genommen hattest.  :)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 12 März 2025, 17:04:24
So, es hat sich einiges getan.
Dank Joachim/Fakenius hab ich es nun auch hinbekommen, SET-Befehle per HTTP-REST erfolgreich abzusetzen. ich war da einem Fehler in der CURL-Doku aufgesessen, aber das nur am Rande.
Ich hab einiges überarbeitet.
"GET <device> password" und "GET <device> secret_key" habe ich entfernt, die werden nun nicht mehr unterstützt, da meine Programmierung für die Signierung des HTTP-Requests nun stimmt, und es besser ist, wenn man nicht einfach so den Secret Key auslesen kann.

GET- und SET-Befehle gehen nun komplett über die GUI (Mit Dropdowns).
Der PowerStream-Inverter wird nun vollständig unterstützt, es sollte erkannt werden, daß ein Powerstream-Device angesprochen wird und entsprechend die GET- und SET-Befehle um die Powerstream-Ansteuerung erweitert werden.

Entsprechend der ecoflow-API hab ich die Befehle angepasst, es heißt nun:
GET|SET <device> AccessKey <AccessKey>
SET <device> SecretKey <SecretKey>
GET|SET <device> SerialNo <SerialNo>

"get <device> devices" gibt eine Liste aus mit allen Devices, die ihr mit dem AccessKey auslesen und ansteuern könnt.
"set <device> connect" erzwingt einen direkten HTTP-API-REQUEST über das Gerät
"set <device> deleteReadings" löscht einmal alle Readings des Geräts, sinnvoll, wenn man noch eine uralte Version im Einsatz hat, und da noch alte Readings rumlungern.

Zum Powerstream:
"get <device> data_20_1.invBrightness" liest den Wert der LED-Helligkeit des Inverters aus. Wenn man's braucht. Wert liegt zwischen 0..1023
"set <device> data_20_1.invBrightness" set entsprechnend den Wert neu, ich hab's als slider implementiert.

"get <device> data_20_1.lowerLimit" liest das untere Limit aus, ab dem die Batterie nicht mehr entladen werden soll (0..30)%
"set <device> data_20_1.lowerLimit" setzt entsprechend das Limit

analog dazu:
"get <device> data_20_1.upperLimit" liest das ober Limit aus, ab dem die Batterie nicht mehr geladen werden soll (70..100)%
"set <device> data_20_1.upperLimit" setzt entsprechend das Limit

"data_20_1.permanentWatts" liest/setzt die Leistung in Watt, die an die Stromversorgung des Haushalts abgegeben werden soll. (0..600)W
"data_20_1.supplyPriority" liest/setzt die Priorität des Inverters: Stromversorgung oder Batterie laden.

"get <device> data_20_134.task(1..11)" liest die einzelnen Tasks des Inverters aus.

aber ACHTUNG!
"set <device> data_20_134.task (1..11)" LÖSCHT den jeweiligen Task des Inverters. Ob man Tasks auch über HTTP-REST programmieren kann, darüber schweigt sich die Doku aus.


(Aktuellste Version immer im 1. Post dieses Threads!)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 19 März 2025, 14:20:55
UPDATE: Die "Delta 2 Max" ist nun auch mit Get/Set unterstützt.

Ich arbeite nun die Module Zug um Zug aus der Ecoflow API Dokumentation (https://developer-eu.ecoflow.com/us/document/) ab.

BTW: wie mache ich es hier denn so, daß der 1. Post des Threads immer die aktuellste Version enthält? Muss ich den einfach nur bearbeiten?


(Aktuellste Version immer im 1. Post dieses Threads!)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Wolle02 am 19 März 2025, 16:58:42
Das ist ja mega, dass du hier ein Modul erstellst. Ich hab hier grade ein Angebot für eine Power Ocean Anlage liegen, das mir auch sehr gut gefällt. Nur das Problem mit der Anbindung an Fhem war für mich bislang der Wermutstropfen, der mich hat überlegen lassen, ob das wirklich das richtige System ist. Aber da dein Modul wohl auch die Power Ocean unterstützt, ist das richtig klasse. Vielen Dank schonmal.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: tschimi am 19 März 2025, 19:08:22
Hi,
könntest du bitte mal schauen, ob Verbose richtig implementiert ist? Trotz Verbose=0 ist mein log voll...
Dankeschön, tschimi


P.S.: Das hier landet jetzt alle paar sec. im Log...
03-20 01:38:12","20_1.mqttErr":17,"20_1.supplyPriority":0,"20_1.wifiErr":6,"20_1.ratedPower":8000,"20_1.batInputCur":0,"20_1.pv1OpVolt":2919,"20_1.rstPanic":0,"20_1.wifiRssi":-75,"20_1.pvPowerLimitAcPower":6023,"20_1.installTown":0,"20_1.wifiFirmwareVersion":11505},"eagleEyeTraceId":"...","tid":""}
2025.03.19 19:05:08 1: $http_method = GET
2025.03.19 19:05:08 1: $host = https://api-e.ecoflow.com
2025.03.19 19:05:08 1: $url = /iot-open/sign/device/list
2025.03.19 19:05:08 1: $url = /iot-open/sign/device/list $query_str = accessKey=...&nonce=...×tamp=...
2025.03.19 19:05:08 1: $sign = ...
2025.03.19 19:05:08 1: $response = {"code":"0","message":"Success","data":[{"sn":"HW....","deviceName":"Terrasse","online":0,"productName":"PowerStream"},{"sn":"HW...","deviceName":"Balkon","online":0,"productName":"PowerStream"}],"eagleEyeTraceId":"ea...","tid":""}
2025.03.19 19:05:08 1: $http_method = GET
2025.03.19 19:05:08 1: $host = https://api-e.ecoflow.com
2025.03.19 19:05:08 1: $url = /iot-open/sign/device/quota/all?sn=HW51ZEH4SF6F1064
2025.03.19 19:05:08 1: $url = /iot-open/sign/device/quota/all?sn=HW51ZEH4SF6F1064 $query_str = accessKey=...&nonce=...×tamp=...
2025.03.19 19:05:08 1: $sign =...
2025.03.19 19:05:08 1: $response = {"code":"0","message":"Success","data":{"20_1.pv2Temp":210,"20_1.invOutputWatts":0,"20_1.pv2RelayStatus":0,"20_1.mqttTlsLastErr":32769,"20_1.batInputVolt":4,"20_1.invDemandWatts":8000,"20_1.wifiEncryptMode":3,"20_1.pv2OpVolt":0,"20_1.consNum":0,"20_1.invOnOff":1,"20_1.invOpVolt":2388,"20_1.installCountry":17477,"20_1.batErrorInvLoadLimit":8000,"20_1.acSetWatts":8000,"20_1.feedProtect":1,"20_1.rstSdio":0,"20_1.espTempsensor":27,"20_1.mqttSockErrno":2,"20_1.historyInvOutputWatts":0,"20_1.pvToInvWatts":0,"20_1.pv1ErrCode":256,"20_1.invLoadLimitFlag":8,"20_1.batLoadLimitFlag":0,"20_1.geneNum":2,"20_1.invToPlugWatts":0,"20_134.task10":{"taskIndex":9,"type":0,"timeRange":{"isConfig":false,"timeData":0,"timeMode":0,"startTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"stopTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"isEnable":false}},"20_1.eventInfo.cpu":160,"20_134.task11":{"taskIndex":10,"type":0,"timeRange":{"isConfig":false,"timeData":0,"timeMode":0,"startTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"stopTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"isEnable":false}},"20_1.meshId":42072836,"20_1.eventInfo.wifiSuccessCount":2747,"20_1.batOpVolt":279,"20_1.utcTime":1742404848,"20_1.permanentWatts":8000,"20_1.bpType":0,"20_1.llcWarningCode":0,"20_1.invOutputCur":27,"20_1.lowerLimit":0,"20_1.mqttTlsStackErr":0,"20_1.llcStatue":1,"20_1.pv1WarnCode":0,"20_1.batOutputLoadLimit":6000,"20_1.rstWdt":0,"20_1.batWarningCode":0,"20_1.acOffFlag":0,"20_1.mqttErrTime":1742399295,"20_1.eventInfo.communicationChannel":0,"20_1.batInputWatts":0,"20_1.eventInfo.bssidCount":0,"20_1.pv2Statue":1,"20_1.staIpAddr":1286777024,"20_1.uwlowLightFlag":0,"20_1.consWatt":0,"20_1.fisoRxyz":6046225.5,"20_1.eventInfo.bandwith":2,"20_1.batErrCode":64,"20_1.meshLayel":1,"20_1.dsgRemainTime":5999,"20_1.batSoc":0,"20_1.historyBatInputWatts":0,"20_1.invBrightness":203,"20_134.task7":{"taskIndex":6,"type":0,"timeRange":{"isConfig":false,"timeData":0,"timeMode":0,"startTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"stopTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"isEnable":false}},"20_1.pv2ErrCode":128,"20_1.invWarnCode":0,"20_134.task6":{"taskIndex":5,"type":0,"timeRange":{"isConfig":false,"timeData":0,"timeMode":0,"startTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"stopTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"isEnable":false}},"20_1.parentMac":3367824925,"20_134.task9":{"taskIndex":8,"type":0,"timeRange":{"isConfig":false,"timeData":0,"timeMode":0,"startTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"stopTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"isEnable":false}},"20_134.task8":{"taskIndex":7,"type":0,"timeRange":{"isConfig":false,"timeData":0,"timeMode":0,"startTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"stopTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"isEnable":false}},"20_1.eventInfo.mqttErrorCount":18589,"20_1.rstExt":0,"20_134.task3":{"taskIndex":2,"type":0,"timeRange":{"isConfig":false,"timeData":0,"timeMode":0,"startTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"stopTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"isEnable":false}},"20_134.task2":{"taskIndex":1,"type":0,"timeRange":{"isConfig":false,"timeData":0,"timeMode":0,"startTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"stopTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"isEnable":false}},"20_134.task5":{"taskIndex":4,"type":0,"timeRange":{"isConfig":false,"timeData":0,"timeMode":0,"startTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"stopTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"isEnable":false}},"20_134.task4":{"taskIndex":3,"type":0,"timeRange":{"isConfig":false,"timeData":0,"timeMode":0,"startTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"stopTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"isEnable":false}},"20_134.task1":{"taskIndex":0,"type":0,"timeRange":{"isConfig":false,"timeData":0,"timeMode":0,"startTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"stopTime":{"sec":0,"week":0,"min":0,"hour":0,"month":0,"year":0,"day":0},"isEnable":false}},"20_1.pv2CtrlMpptOffFlag":0,"20_1.uwloadLimitFlag":4,"20_1.floadLimitOut":500,"20_1.pv1Statue":7,"20_134.updateTime":"2025-03-19 23:48:45","20_1.pv1InputCur":0,"20_1.eventInfo.connectTime":3610,"20_1.rssiThreshold":-58,"20_1.wifiErrTime":1742399298,"20_1.pv2InputWatts":0,"20_1.historyInvToPlugWatts":0,"20_1.eventInfo.btState":0,"20_1.pv2WarningCode":0,"20_1.pv2InputVolt":0,"20_1.wifiConnectChannel":6,"20_1.rstDeepsleep":0,"20_1.batSystem":1,"20_1.wirelessWarnCode":0,"20_1.invErrCode":0,"20_1.dynamicWatts":0,"20_1.batStatue":1,"20_1.eventInfo.mqttSuccessCount":1054,"20_1.eventInfo.type":6,"20_1.heartbeatType2Frequency":10,"20_1.stackMinFree":38,"20_1.resetCount":4020,"20_1.mqttLastDisReason":0,"20_1.uwsocFlag":0,"20_1.llcOpVolt":7,"20_1.timeZone":3600,"20_1.batTemp":0,"20_1.upperLimit":100,"20_1.rstIntWdt":0,"20_1.rssiVariance":0,"20_1.gridOvpCnt":0,"20_1.historyGridConsWatts":0,"20_1.eventInfo.isHidden":1,"20_1.plugTotalWatts":0,"20_1.resetReason":1,"20_1.llcOffFlag":0,"20_1.invInputVolt":0,"20_1.stackFree":74,"20_1.pv1InputVolt":275,"20_1.eventInfo.wifiErrorCount":0,"20_1.invFreq":499,"20_1.invToOtherWatts":0,"20_1.heartbeatFrequency":2,"20_1.dstTime":0,"20_1.selfMac":871673204,"20_1.chgRemainTime":5999,"20_1.eventInfo.adjacentChannelCount":0,"20_1.llcTemp":220,"20_1.rstPoweron":3758,"20_1.pv1Temp":220,"20_1.pv2InputCur":0,"20_1.pv1InputWatts":0,"20_1.noiseFloor":0,"20_1.eventInfo.wifiStandard":7,"20_1.gridConsWatts":8000,"20_1.historyPlugTotalWatts":0,"20_1.geneWatt":8,"20_1.rstBrownout":0,"20_1.invTemp":0,"20_1.rstSw":2,"20_1.wirelessErrCode":0,"20_1.eventInfo.channelCount":0,"20_1.rstTaskWdt":0,"20_1.pv1RelayStatus":0,"20_1.bmsReqChgVol":0,"20_1.invOutputLoadLimit":5984,"20_1.interfaceConnFlag":1,"20_1.llcErrCode":0,"20_1.invStatue":2,"20_1.spaceDemandWatts":8000,"20_1.rstUnknow":0,"20_1.pv1CtrlMpptOffFlag":0,"20_1.historyPvToInvWatts":0,"20_1.bmsReqChgAmp":0,"20_1.invRelayStatus":16,"20_1.historyPermanentWatts":0,"20_1.antiBackFlowFlag":8000,"20_1.batOffFlag":0,"20_1.llcInputVolt":0,"20_1.updateTime":"2025-03-20 01:20:49","20_1.mqttErr":1,"20_1.supplyPriority":0,"20_1.wifiErr":8,"20_1.ratedPower":8000,"20_1.batInputCur":0,"20_1.pv1OpVolt":1436,"20_1.rstPanic":2,"20_1.wifiRssi":-58,"20_1.pvPowerLimitAcPower":5982,"20_1.installTown":0,"20_1.wifiFirmwareVersion":11505},"eagleEyeTraceId":"...","tid":""}
 
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 19 März 2025, 19:31:14
Zitat von: Wolle02 am 19 März 2025, 16:58:42Das ist ja mega, dass du hier ein Modul erstellst. Ich hab hier grade ein Angebot für eine Power Ocean Anlage liegen, das mir auch sehr gut gefällt. Nur das Problem mit der Anbindung an Fhem war für mich bislang der Wermutstropfen, der mich hat überlegen lassen, ob das wirklich das richtige System ist. Aber da dein Modul wohl auch die Power Ocean unterstützt, ist das richtig klasse. Vielen Dank schonmal.

Ich kann es nicht komplett versprechen, ich hab keine Power Ocean, aber ich werde es versuchen...  :)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 19 März 2025, 19:38:59
Zitat von: tschimi am 19 März 2025, 19:08:22Hi,
könntest du bitte mal schauen, ob Verbose richtig implementiert ist? Trotz Verbose=0 ist mein log voll...
Dankeschön, tschimi
Ist das die neueste Version?
In den ersten Versionen war ich ein wenig nachlässig mit den LogLeveln, da hab ich mit "verbose 1" alles rausgehauen, weil ich sehen musste, was da eigentlich so alles in meiner Entwicklungsumgebung passiert. Im Moment sollte das Modul eigentlich nur noch was bei "verbose 5" ausgeben.


Ich hatte allerdings bis zu Version vom 12.3.25 das Logging nicht richtig verstanden, da fiel der Verbose-Level auf den eingestellten Verbose-Level bei "global" zurück.
Das habe ich eigentlich in den letzten Tagen extensiv getestet, daß das Logging jetzt so läuft, wie es soll.
In meinem "produktiven" FHEM hab ich meine Ecoflow-Komponenten auf "verbose 0" und global auf "verbose 1".
Da loggt bei mir nur, was soll.

Zitat2025.03.19 19:05:08 1: $response = {...
Hmm, ja, sieht mir nach einer alten Version aus, die noch nach der verbose-Einstellung durch global loggt. ;-) " 1:" ist Verbose-Level 1 durch global.
Nimm mal die neueste...
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: tschimi am 19 März 2025, 19:57:51
Hi, habs nochmal überprüft. Hatte wohl doch noch ne ältere Version am Start - jetzt läufts :-)

DANKE!!!!
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Wolle02 am 19 März 2025, 20:46:50
Zitat von: Neolux am 19 März 2025, 19:31:14Ich kann es nicht komplett versprechen, ich hab keine Power Ocean, aber ich werde es versuchen...  :)

Hallo Neolux, das ist ja klar, dass du das nicht versprechen kannst. Das erwartet ja auch keiner  :D  Ich find es aber schon toll, dass du dich der Sache annimmst und dass es auch noch zeitlich mit meiner geplanten Anschaffung zusammen passt.  ;D
Natürlich dauert es noch etwas bis die Anlage bei mir steht, aber sobald sie in Betrieb ist unterstütze ich dich sehr gerne mit Daten die hilfreich sein könnten.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 19 März 2025, 21:38:01
Hi.
Ich habe die PowerOcean und es läuft auch soweit ganz gut. Allerdings werden die Daten nur aktualisiert, wenn die App oder das Webportal parallel aktualisiert wird.
Das ist allerdings kein Problem des Moduls oder Fhem, sondern ein Problem der Ecoflow-Api.
Die Kollegen mit Homeassistant haben das gleiche Problem!
Ecoflow hat noch ein paar Dinge nachzuliefern die sie angekündigt haben. Es fehlen z.B. noch Funktionen für die Automatisierung etc. in der Ecoflow-App.
Die API-Dokumentation wird leider nicht gepflegt. Für die PowerOcean stimmen die Beispiele m.E nicht.

Grüße
Mathias





Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Wolle02 am 20 März 2025, 07:26:40
Oha, danke für die Info. Da muss ich doch nochmal überlegen ob Ecoflow die richtige Anlage ist. Der Solateur meinte ja, dass es möglich sein müsste die RS485 Schnittstelle am Wechselrichter zu verwenden. Laut Ecoflow-technik ist das aber wohl nicht möglich. Schade dass sich Ecoflow hier so kapselt.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 20 März 2025, 09:50:02
Zitat von: Wolle02 am 20 März 2025, 07:26:40Oha, danke für die Info. Da muss ich doch nochmal überlegen ob Ecoflow die richtige Anlage ist.

Nicht falsch verstehen. Die Anlage und das Konzept ist super und wird auch stetig verbessert. Updates kommen regelmäßig mit neuen Funktionen.
SG-Ready-Schnittstellen hat sie auch, aber da kann man nichts auslesen. Leider gibt es (noch) keine lokale Api.
Ich vermute mal, dass sie bei der Cloud auch irgendwie den Datenverkehr beschränken müssen. Bei Daikin ist das ähnlich. (Limitierte Abfragen und neu Authorisieren alle paar Wochen)
Das ist eben einer der Nachteile an diesen Cloudlösungen.
Die Qualität und das Konzept der PowerOcean überzeugen mich trotzdem.
Ich kann dir die Facebook-Gruppe "EcoFlow PowerOcean und DC Fit - offizieller Club (https://www.facebook.com/groups/1023505065537508) empfehlen.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 20 März 2025, 11:32:10
Zitat von: Wolle02 am 20 März 2025, 07:26:40Oha, danke für die Info. Da muss ich doch nochmal überlegen ob Ecoflow die richtige Anlage ist. Der Solateur meinte ja, dass es möglich sein müsste die RS485 Schnittstelle am Wechselrichter zu verwenden. Laut Ecoflow-technik ist das aber wohl nicht möglich. Schade dass sich Ecoflow hier so kapselt.
Ich hab zwar "nur" ein Balkonkraftwerk mit Powerstream und Delta 2 Max, das war damals das einzig preislich sinnvolle mit einer brauchbaren Ausstattung. Damals.
Ich fand zwar die Power Ocean interessant, aber mittlerweile gibt es IMHO genügend andere Anbieter mit besseren Systemen, ich finde das Zendure Hyper 2000 (https://www.zendure.de/products/hyper-2000) sehr interessant, und kostet nur einen Bruchteil.

Was meiner Meinung nach gegen Ecoflow spricht (und das sind meine Erfahrungen mit meiner Anlage!):


Was ich gut finde:


Alles im Allen kommt Ecoflow als "Hochglanz-Produkt", ähnlich wie Apple daher, die Geräte sehen auch schick aus, aber unter der Haube klemmt es ziemlich, ich würde die heutzutage nicht nochmal kaufen.

Gruß
Knut
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Wolle02 am 20 März 2025, 12:07:47
Danke für Eure Zusammenfassungen. Unterm Strich schau ich mir doch nochmal mein Alternativangebot an; auch wenn es leider etwas teurer ist.  :-\
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 25 März 2025, 17:40:08
Zitat von: Fakenius am 22 März 2025, 16:45:36hat schon jemand Erfahrungen mit den Antwortzeiten dieses Moduls? Es wird ja m.W. ein Blocking-Request mit WWW::Curl::Easy gemacht.
Ja, WWW::Curl::Easy hab ich für den Anfang genommen, weil es mir erstmal um "GET","POST" und "PUT" ging und um einfach zu sehen, was ich zurückerhalte.

Lustigerweise hab ich mich am Wochenende hingesetzt, und auf HttpUtils umgestellt. Das Modul läuft jetzt non-blocking.

Hab einige interne Anpassungen vorgenommen, weiter am Logging verbessert.

Einige Werte beim Powerstream wurden noch falsch gesetzt, das hab ich korrigiert, bei meiner Delta 2 Max werden noch einige Werte falsch gesetzt, da muss ich mich noch weiter drum kümmern.

Anbei V 0.3.5.1, von heute. :)

(Aktuellste Version immer im 1. Post dieses Threads!)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 26 März 2025, 17:33:25
Zitat von: Wolle02 am 19 März 2025, 20:46:50Hallo Neolux, das ist ja klar, dass du das nicht versprechen kannst. Das erwartet ja auch keiner  :D  Ich find es aber schon toll, dass du dich der Sache annimmst und dass es auch noch zeitlich mit meiner geplanten Anschaffung zusammen passt.  ;D
Natürlich dauert es noch etwas bis die Anlage bei mir steht, aber sobald sie in Betrieb ist unterstütze ich dich sehr gerne mit Daten die hilfreich sein könnten.

Also die Get-CMDs hab ich jetzt für die PowerOcean gemäß der Doku eingebaut. Müsstet ihr mal testen.

Es gibt ein Set-CMD, "JT303_Dashboard_Overview_Summary_Week", das die Statistik der letzten Woche ausgeben soll.

Testen könnt ihr es mit "set <DeviceName> JT303_Dashboard_Overview_Summary_Week YYYY-MM-DD hh:mm:ss YY-MM-DD hh:mm:ss"
Wenn das funktioniert, dann kann ich das so umbauen, daß immer die Statistik der letzten 7 Tage geholt wird, mehr geht sowieso nicht, laut Doku.

Ich hab hier gerade auch aufgeräumt, die aktuellste Version des Moduls ist nun immer im 1. Post des Threads (https://forum.fhem.de/index.php?msg=1334171).
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 26 März 2025, 21:40:21
Hi Neolux,

die aktuelle Version wirft mir beim Reload des Moduls einen Error aus:
syntax error at ./FHEM/98_Ecoflow.pm line 611, near "else"
Missing right curly or square bracket at ./FHEM/98_Ecoflow.pm line 1014, at end of line

Grüße
Mathias

Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 26 März 2025, 21:55:13
Huch... hatte ich doch vorher getestet?!

Naja, ich hab's korrigiert.  :'(
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 26 März 2025, 22:19:57
Hi. Danke für das schnelle korrigieren! Super.

Zitat von: Neolux am 26 März 2025, 17:33:25Testen könnt ihr es mit "set <DeviceName> JT303_Dashboard_Overview_Summary_Week YYYY-MM-DD hh:mm:ss YY-MM-DD hh:mm:ss"

Leider funktioniert das bei mir nicht.
Ecoflow: Set with unknown argument JT303_Dashboard_Overview_Summary_Week, choose one of deleteReadings SecretKey AccessKey SerialNo connect
EDIT: Gibt es eine neue oder andere Dokumentation?
Woher hast du das mit JT303_Dashboard....?
Ich kenne nur diese hier: https://developer-eu.ecoflow.com/us/document/powerocean
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 02 April 2025, 17:00:17
Seltsam, das hab ich aus der API unter "Historical Data".
ZitatHistorical data

Obtaining historical data (timespan not exceeding a week): POST: /iot-open/sign/device/quota/data
{
    "sn": "HJ31ZDH2ZF690025",
    "params": {
        "code": "JT303_Dashboard_Overview_Summary_Week",
        "beginTime": "2024-06-17 00:00:00",
        "endTime": "2024-06-23 23:59:59"
    }
}

Muss ich mir noch mal genauer ansehen. Die letze Woche hab ich nicht viel programmiert, da war ich auf dem Dach und hab Solar-Paneele dazugeschraubt, einen Zusatzakku zugesteckt und endlich den Shelly Pro 3 EM eingebaut. ;)

Jetzt geht's weiter, habe angefangen, die "Delta Pro"-Unterstützung einzubauen, die Delta 2 Max kann mit den Delta Pro-Befehlen bedient werden. Witzig.

Das mit der Statistik habe ich mir noch mal angesehen, im Prinzip sollte das funktionieren.
Wird das Device denn als "POWER OCEAN" erkannt?
Was steht bei "Internals" bei "Model"? "UNKOWN" oder "POWER OCEAN"? Oder was anderes?

Wenn ich meine Delta 2 Max als Power Ocean ausgebe, erhalten ich keine Fehlermeldung vom Server, aber auch keine Antwort (Mit verbose 5):
2025.04.02 14:51:38 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Set(): Delta2Max: $model = POWER OCEAN
2025.04.02 14:51:38 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Set(): $ef_arg = 1
2025.04.02 14:51:38 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Set(): $key = params.beginTime
2025.04.02 14:51:38 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Set(): $str_value = a[2] a[3]
2025.04.02 14:51:38 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Set(): $key = params.code
2025.04.02 14:51:38 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Set(): $str_value = JT303_Dashboard_Overview_Summary_Week
2025.04.02 14:51:38 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Set(): $key = params.endTime
2025.04.02 14:51:38 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Set(): $str_value = a[4] a[5]
2025.04.02 14:51:38 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Request(): Method = POST
2025.04.02 14:51:38 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Request(): $nonce=827171 $timestamp=1743605498981
2025.04.02 14:51:38 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Request(): $url = /iot-open/sign/device/quota/data $query_str = params.beginTime=2025-04-01+00%3A00%3A00&params.code=JT303_Dashboard_Overview_Summary_Week&params.endTime=2025-04-02+16%3A00%3A00&sn=R3XXXXXXXXXXXXXX&accessKey=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456&nonce=827171&timestamp=1743605498981
2025.04.02 14:51:38 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Request(): $sign = 76de068f5799a79f388d222ca93da14fcb18403023096182dbcf1a26ba7b02f9
2025.04.02 14:51:38 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Request(): $json = {"sn": "R3XXXXXXXXXXXXXX", "params": {"beginTime": "2025-04-01 00:00:00","code": "JT303_Dashboard_Overview_Summary_Week","endTime": "2025-04-02 16:00:00"}}
2025.04.02 14:51:39 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Set(): Delta2Max: $model = POWER OCEAN
2025.04.02 14:51:39 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Set(): $ef_arg =
2025.04.02 14:51:39 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Set(): Delta2Max: $model = POWER OCEAN
2025.04.02 14:51:39 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Set(): $ef_arg =
2025.04.02 14:51:39 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Get(): Delta2Max: $model = POWER OCEAN
2025.04.02 14:51:39 5: Delta2Max(Ecoflow 0.3.7.9): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota/data

Die akuellste Version gibt es immer hier (https://forum.fhem.de/index.php?msg=1334171)!
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 02 April 2025, 20:42:27
Hi.

ZitatWird das Device denn als "POWER OCEAN" erkannt?
Was steht bei "Internals" bei "Model"? "UNKOWN" oder "POWER OCEAN"? Oder was anderes?

Ich denke daran liegt es. Ohne Leerzeichen!
Internals -> Model: POWEROCEAN

Edit: Mit der Version vom 02.04. kommt nun: "Ecoflow: Get with unknown argument JT303_Dashboard_Overview_Summary_Week, choose one of SerialNo devices AccessKey"
Also die "mögliche" Auswahl an Befehlen hat sich veringert.
Oder mache ich einen Fehler? Mein Aufruf lautet: "get PowerOcean JT303_Dashboard_Overview_Summary_Week 2025-03-19 00:00:00 2025-03-25 23:59:59"

Nochmal edit:
Sorry, habe get und Set verwechselt. Mit SET weiterhin: "Ecoflow: Set with unknown argument JT303_Dashboard_Overview_Summary_Week, choose one of SecretKey detectModel connect AccessKey SerialNo deleteReadings"

LG
Mathias
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 02 April 2025, 20:50:10
Okay, das ist ja ein Ding.  ;D

Dann nimm doch mal das neue Modul 0.3.8.0  8)

Dein Aufruf ist richtig, das Modul erkannte das Gerät nicht richtig und bot daher die Befehlssätze nicht an.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 02 April 2025, 23:06:48
Hi.

mit dem neuen Modul 0.3.8.0 bekomme ich keinerlei Rückmeldung! Immerhin keine Fehlermeldung! :)
Ich glaube PowerOcean und Ecoflow-Api ist irgendwie generell richtig zickig!
Werte aktualisieren sich weiterhin nur, wenn parallel das Webportal oder die App aktiv im Vordergrund laufen.
Diese verdammten Cloud-Apis....

Grüße
Mathias 
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: jop am 03 April 2025, 08:57:57
Hallo Knut,
vielen Dank für das Modul! Super, dass ich endlich meinen Powerstream und Delta Max einbinden kann!
Im Moment kämpfe ich noch damit, dass ich alle 5 Minuten einen Eintrag im FileLog haben möchte (unabhängig, ob sich der Wert ändert oder nicht). Ich habe schon Kombinationen aus event-on-update-reading, event-on-change-reading, event-min-interval probiert (entsprechend fhem Wiki) und event-min-interval gleich oder höher als das ecInterval gesetzt, aber ich erreiche nur, dass die Readings bei Änderung bzw. auch eher sporadisch geloggt werden. Hast Du eine Idee?
Danke schon Mal!
Grüße
Jörg
 
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 03 April 2025, 09:44:20
Moin Mathias,

Zitat von: matsches am 02 April 2025, 23:06:48mit dem neuen Modul 0.3.8.0 bekomme ich keinerlei Rückmeldung! Immerhin keine Fehlermeldung! :)
Ich glaube PowerOcean und Ecoflow-Api ist irgendwie generell richtig zickig!
Werte aktualisieren sich weiterhin nur, wenn parallel das Webportal oder die App aktiv im Vordergrund laufen.
Diese verdammten Cloud-Apis....

Ja, ich hab auch versucht, über meine Credentials und Seriennummern irgendwas von der PowerOcean-API zurückzubekommen, das scheint nichts zurückzukommen. Allerdings kommen Fehlermeldungen zurück, wenn ich diese provoziere. Das liegt wohl dann tatsächlich an Ecoflow, bzw der Cloud.

Ich sehe gerade, die API-Doku wurde aktualisiert, man soll nun nicht mehr "GET" sondern grundsätzlich "POST" verwenden. Ob das was ändert? Ich schau mal...
ZitatHTTP communication mode
Get Quota
Obtaining real-time data: POST: /iot-open/sign/device/quota
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 03 April 2025, 09:53:10
Moin Jörg,

Zitat von: jop am 03 April 2025, 08:57:57Hallo Knut,
vielen Dank für das Modul! Super, dass ich endlich meinen Powerstream und Delta Max einbinden kann!
Im Moment kämpfe ich noch damit, dass ich alle 5 Minuten einen Eintrag im FileLog haben möchte (unabhängig, ob sich der Wert ändert oder nicht). Ich habe schon Kombinationen aus event-on-update-reading, event-on-change-reading, event-min-interval probiert (entsprechend fhem Wiki) und event-min-interval gleich oder höher als das ecInterval gesetzt, aber ich erreiche nur, dass die Readings bei Änderung bzw. auch eher sporadisch geloggt werden. Hast Du eine Idee?

Ja, da habe ich eine Idee: Das hab ich noch nicht umgesetzt. :)
Im Moment werden nur die Readings aktualisiert, die sich geändert haben. Ich schau mir das mal an.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 03 April 2025, 18:00:18
So, V 0.3.8.4 hab ich mal veröffentlicht.

Die "Delta Pro"-Unterstützung ist nun vollständig.
PowerOcean: Gemäß der aktualisierten Doku bei Ecoflow habe ich alle Gets von HTTP-GET auf HTTP-POST umgestellt. Wenn ich eine PowerOcean abfrage, erhalte ich zumindest einen leeren JSON "data":{} zurück. Vielleicht kommen bei einer echten PowerOcean nun Daten ohne daß die App läuft?!

Zu event-on-update-reading und event-on-change-reading: Eigentlich funktioniert das "von Haus aus". Ich hab mir jetzt Werte in eine Datei loggen lassen, die sich nie ändern. Das klappt insofern, daß immer nur der erste in der Liste angegebene Wert geloggt wird. die anderen nicht, auch wenn ich im Modul die im Attribut gelisteten Werte erzwinge. Verstehe ich nicht, muss ich noch tiefer einsteigen.

Ich habe meine Powerstream mit

attr Powerstream ecInterval 60
attr Powerstream event-min-interval data_20_1.batWarningCode:30, data_20_1.batErrorInvLoadLimit:30
attr Powerstream event-on-change-reading data_20_1.batErrorInvLoadLimit, data_20_1.batWarningCode
attr Powerstream event-on-change-reading data_20_1.batErrorInvLoadLimit, data_20_1.batWarningCode

laufen lassen und der data_20_1.batErrorInvLoadLimit wird schön jede Minute gelogged:

2025-04-03_15:32:46 Powerstream data_20_1.batErrorInvLoadLimit: 800
2025-04-03_15:33:46 Powerstream data_20_1.batErrorInvLoadLimit: 800
2025-04-03_15:34:46 Powerstream data_20_1.batErrorInvLoadLimit: 800
2025-04-03_15:35:43 Powerstream data_20_1.batErrorInvLoadLimit: 800
2025-04-03_15:36:43 Powerstream data_20_1.batErrorInvLoadLimit: 800
2025-04-03_15:37:43 Powerstream data_20_1.batErrorInvLoadLimit: 800
2025-04-03_15:38:43 Powerstream data_20_1.batErrorInvLoadLimit: 800
2025-04-03_15:39:43 Powerstream data_20_1.batErrorInvLoadLimit: 800
2025-04-03_15:40:43 Powerstream data_20_1.batErrorInvLoadLimit: 800
2025-04-03_15:41:43 Powerstream data_20_1.batErrorInvLoadLimit: 800
2025-04-03_15:42:43 Powerstream data_20_1.batErrorInvLoadLimit: 800
2025-04-03_15:43:43 Powerstream data_20_1.batErrorInvLoadLimit: 800

Wenn ich "data_20_1.batWarningCode" an 1. Stelle setze:

attr Powerstream event-on-change-reading data_20_1.batWarningCode, data_20_1.batErrorInvLoadLimit
attr Powerstream event-on-change-reading data_20_1.batWarningCode, data_20_1.batErrorInvLoadLimit

dann wird der Wert gelogged:
2025-04-03_14:45:06 Powerstream data_20_1.batWarningCode: 0
2025-04-03_14:46:06 Powerstream data_20_1.batWarningCode: 0
2025-04-03_14:47:06 Powerstream data_20_1.batWarningCode: 0
2025-04-03_14:48:06 Powerstream data_20_1.batWarningCode: 0
2025-04-03_14:49:06 Powerstream data_20_1.batWarningCode: 0

Warum nicht beide gelogged werden, weiß ich nicht.

Wenn Du alle 5 Minuten einen Wert haben willst, dann solltest Du

ecInterval 300
event-min-interval <reading>:150

setzen. So als Faustregel, den min-interval auf die Hälft von ecInterval, dann sollte zuverlässig mitgelogged werden.

Das hat damit zu tun, daß das Modul alle <ecInterval> Sekunden bei der ecoflow-Cloud per HTTP pollt. "Früher" per MQTT war das natürlich schöner, aber die Schnittstelle wurde anscheinend eingestellt, zumindest sendet die nichts mehr (bei mir).

Und Readings zwischendurch können sich somit nur durch einen SET-Befehl ändern, oder durch Eigenprogrammierung, z.B. eine Leistungsanpassung durch FHEM wo noch mal mit einen GET-Befehl Readings gezielt aktualisiert werden.

Dazu noch einen Hinweis: Bei den Tests während ich programmiere kam es auch häufig zu Fehlermeldungen aus der Cloud, die ich mir nicht erklären konnte. Mal lief die Anbindung fehlerfrei, dann wurden API-Requests mit "Parameter missing" und anderen Meldungen abgelehnt, dann ging es wieder, ohne daß ich was geändert hatte.

Ich kam dann drauf, daß bei zu vielen Abfragen pro Minute(!) die API einfach diese Fehler wirft. Ich hatte da mit meinem Shelly rumprobiert, und alle paar Sekunden die Leistungsabgabe des Powerstreams entsprechend des Pro3EM angepasst, das hat die API ziemlich schnell geblockt.

Ich empfehle da Pi mal Auge höchstens alle 10 Sekunden eine Abfrage zu machen, bei 5 Sekunden wird's schon kritisch.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: jop am 04 April 2025, 13:57:42
Zitat von: Neolux am 03 April 2025, 18:00:18Wenn ich "data_20_1.batWarningCode" an 1. Stelle setze:

attr Powerstream event-on-change-reading data_20_1.batWarningCode, data_20_1.batErrorInvLoadLimit
attr Powerstream event-on-change-reading data_20_1.batWarningCode, data_20_1.batErrorInvLoadLimit

dann wird der Wert gelogged:
2025-04-03_14:45:06 Powerstream data_20_1.batWarningCode: 0
2025-04-03_14:46:06 Powerstream data_20_1.batWarningCode: 0
2025-04-03_14:47:06 Powerstream data_20_1.batWarningCode: 0
2025-04-03_14:48:06 Powerstream data_20_1.batWarningCode: 0
2025-04-03_14:49:06 Powerstream data_20_1.batWarningCode: 0

Warum nicht beide gelogged werden, weiß ich nicht.


Hallo Knut!
Danke für die schnelle Antwort und die neue Version!
Ich hatte auch schon beobachtet, dass immer nur das erste Reading geloggt wird und ohne Erfolg mit den Schreibweisen für die Readings gespielt (mit und ohne Leer mit | usw.). Ich habe das dann durch Verwendung von .* "gelöst".
Leider hat auch das Setzen von event-min-interval auf die Hälfte des ecIntervals und die Verwendung von event-on-change-reading bzw. event-on-update-reading nichts gebracht - z.B. data_20_1.batTemp wird nur geloggt, wenn sich die Temperatur ändert.
Grüße

Jörg
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 04 April 2025, 16:16:08
Zitat von: jop am 04 April 2025, 13:57:42Leider hat auch das Setzen von event-min-interval auf die Hälfte des ecIntervals und die Verwendung von event-on-change-reading bzw. event-on-update-reading nichts gebracht - z.B. data_20_1.batTemp wird nur geloggt, wenn sich die Temperatur ändert.
Hallo Jörg,

hm, das kann ich leider nicht bestätigen:
2025-04-04_13:56:19 Powerstream data_20_1.batTemp: 16
2025-04-04_13:57:19 Powerstream data_20_1.batTemp: 16
2025-04-04_13:58:19 Powerstream data_20_1.batTemp: 16
2025-04-04_13:59:19 Powerstream data_20_1.batTemp: 16
2025-04-04_14:00:20 Powerstream data_20_1.batTemp: 16
2025-04-04_14:01:20 Powerstream data_20_1.batTemp: 16

Und mit ".*" erhalte ich minütlich alle Readings im Log bei meinen Tests.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 05 April 2025, 13:05:18
Hi  Knut!

Zitat von: Neolux am 03 April 2025, 18:00:18So, V 0.3.8.4 hab ich mal veröffentlicht.

... PowerOcean: Gemäß der aktualisierten Doku bei Ecoflow habe ich alle Gets von HTTP-GET auf HTTP-POST umgestellt. Wenn ich eine PowerOcean abfrage, erhalte ich zumindest einen leeren JSON "data":{} zurück. Vielleicht kommen bei einer echten PowerOcean nun Daten ohne daß die App läuft?!

PowerOcean funktioniert nun ohne parallel laufendes Webportal oder App mit ecInterval 60.
Super!
Die Abfrage mit "get PowerOcean JT303_Dashboard_Overview_Summary_Week 2025-03-31 00:00:00 2025-04-04 23:59:59" liefert allerdings weiterhin weder Daten noch Fehler.

So habe ich die PO definiert. Vielleicht kann es jemand brauchen:
define PowerOcean Ecoflow xxxxxxxxxxxxxxxxxxxxxx HJ3xxxxxxxxxxxxx
attr PowerOcean ecInterval 60
attr PowerOcean event-on-change-reading data_sysLoadPwr,data_sysGridPwr,data_bpPwr,data_bpSoc,data_mpptPwr
attr PowerOcean group Energie
attr PowerOcean icon measure_photovoltaic_inst
attr PowerOcean room Energie
attr PowerOcean stateFormat Solarertrag: [$name:data_mpptPwr] W <br>Hausnetz: [$name:data_sysLoadPwr] W <br>Stromnetz: [$name:data_sysGridPwr] W <br> Batterie: [$name:data_bpPwr] W <br>Ladestatus: [$name:data_bpSoc] % <br>Letzte Meldung: [$name:data_sysLoadPwr:t]
attr PowerOcean verbose 0

Viele Grüße
Mathias

Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 08 April 2025, 13:45:43
Zitat von: matsches am 05 April 2025, 13:05:18Hi  Knut!

PowerOcean funktioniert nun ohne parallel laufendes Webportal oder App mit ecInterval 60.
Super!
Die Abfrage mit "get PowerOcean JT303_Dashboard_Overview_Summary_Week 2025-03-31 00:00:00 2025-04-04 23:59:59" liefert allerdings weiterhin weder Daten noch Fehler.

Das ist schon mal gut, daß die Daten jetzt so kommen. Tja, das mit der Wochenübersicht ist ärgerlich, dann nehm ich das raus. Wer braucht das schon, wenn er FHEM nutzt?  ;)

Da meine Anlage auch nur die aktuellen Daten liefern kann, hab ich mir ein kleines Hilfsmodul geschrieben, einen virtuellen Stromzähler.

define <NAME> VirtStromzaehler

definiert das Device

mit "set watch <devicename> <reading>" pollt das Modul regelmässig das Reading bei einem anderen Device, und summiert die Daten auf in:
Gesamterzeugung: "device_reading_total"
Stündlich: "device_reading_hourly"
Täglich: "device_reading_daily"
Monatlich: "device_reading_monthly"
Jährlich: "device_reading_yearly"

Hourly fliegt sehr wahrscheinlich wieder raus, das hab ich nur für Kontrollzwecke. ;)

mit "attr <devicename> Interval 5..600" wird das Poll-Intervall gesetzt. Macht in Verbindung mit Ecoflow-Devices natürlich keinen Sinn, öfter zu pollen als das eigentliche Device gepollt wird.

Für meinen Powerstream zähle ich den Strom, der ins Hausnetz gespeist wird:

define Stromzaehler VirtStromzaehler
attr Stromzaehler Interval 60
set Stromzaehler watch Powerstream data_20_1.permanentWatts

Wichtig: Die überwachten Readingswerte müssen Watt ausgeben, wenn die Kilowatt liefern, werden die in Megawatt umgerechnet (durch 1000 geteilt). :)
Es lassen sich beliebig viele Devices / Readings zählen.

Vielleicht nützt es jemanden.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: macfly am 10 Juni 2025, 15:37:29
hi  Neolux,

Danke, dass du dich da ran traust!

Ich habe das Modul mal mit meiner Ecoflow Delta Pro getestet, PV-Module (1600W) hängen direkt am xt60i Anschluss.

erster Eindruck: sofort kommen Messwerte, well done!

zweiter Eindruck: ein bisschen fischig sind einige Daten, hier mal meine Vermutungen:

data_mppt.inAmp ist 325, müsste 3,25 sein
data_mppt.inVol ist 875, müsste 87,5 sein
data_mppt.inWatts ist 3050, müsste 305,0 sein  (ist gerade wolkig)
data_mppt.outAmp ist 585, müsste 5,85 ein
data_mppt.outVol ist 508, müsste 50,8 sein
data_mppt.outWatts ist 2978, müsste 297,8 sein

data_pd.wattsInSum ist korrekt
data_pd.wattsOutSum ist korrekt
data_ems.f32LcdShowSoc ist korrekt.


ich werde noch weiter rumspielen und weiter feedback geben.

Nochmal, *vielen Dank*, dass du das Modul gebaut hast.



Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 10 Juni 2025, 16:12:05
Zitat von: macfly am 10 Juni 2025, 15:37:29zweiter Eindruck: ein bisschen fischig sind einige Daten, hier mal meine Vermutungen:
data_mppt.inAmp ist 325, müsste 3,25 sein
data_mppt.inVol ist 875, müsste 87,5 sein
data_mppt.inWatts ist 3050, müsste 305,0 sein  (ist gerade wolkig)
data_mppt.outAmp ist 585, müsste 5,85 ein
data_mppt.outVol ist 508, müsste 50,8 sein
data_mppt.outWatts ist 2978, müsste 297,8 sein

Dann hab ich das mal angepasst.  ;D

Ich verstehe es aber nicht ganz...

Aus der Doku:
Zitatdata_mppt.inVol long "PV input voltage (mV)"
data_mppt.inAmp long "PV input current (mA)"
data_mppt.inWatts int "PV input power (W)"
data_mppt.outVol long "PV output voltage (mV)"
data_mppt.outAmp long "PV output current (mA)"
data_mppt.outWatts int "PV output power (W)"

data_mppt.inAmp sind demnach 325 mA, also 0,325 A?!
und
data_mppt.inVol sind demnach 875 mV, also 0,875 V?!

Naja, nehme ich dann mal so hin, hab ich ja mit dem PowerStream nicht anders erlebt. :)


Spannend wären dann noch mal folgende Werte:
data_mppt.dcdc12vVol
data_mppt.dcdc12vAmp
data_mppt.dcdc12vWatts
data_mppt.carOutVol
data_mppt.carOutAmp
data_mppt.carOutWatts



Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 10 Juni 2025, 21:26:49
ZitatWarum nicht beide gelogged werden, weiß ich nicht.
wenn das stimmt
Zitatattr Powerstream event-on-change-reading data_20_1.batErrorInvLoadLimit, data_20_1.batWarningCode
ist es klar. Ist nicht
Zitatevent-on-change-reading
The attribute takes a comma-separated list of readings.
;)
Grüße Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: macfly am 12 Juni 2025, 10:47:17
Zitat von: Neolux am 10 Juni 2025, 16:12:05
Zitat von: macfly am 10 Juni 2025, 15:37:29zweiter Eindruck: ein bisschen fischig sind einige Daten, hier mal meine Vermutungen:
data_mppt.inAmp ist 325, müsste 3,25 sein
data_mppt.inVol ist 875, müsste 87,5 sein
data_mppt.inWatts ist 3050, müsste 305,0 sein  (ist gerade wolkig)
data_mppt.outAmp ist 585, müsste 5,85 ein
data_mppt.outVol ist 508, müsste 50,8 sein
data_mppt.outWatts ist 2978, müsste 297,8 sein

Dann hab ich das mal angepasst.  ;D

Ich verstehe es aber nicht ganz...

Aus der Doku:
Zitatdata_mppt.inVol long "PV input voltage (mV)"
data_mppt.inAmp long "PV input current (mA)"
data_mppt.inWatts int "PV input power (W)"
data_mppt.outVol long "PV output voltage (mV)"
data_mppt.outAmp long "PV output current (mA)"
data_mppt.outWatts int "PV output power (W)"

data_mppt.inAmp sind demnach 325 mA, also 0,325 A?!
und
data_mppt.inVol sind demnach 875 mV, also 0,875 V?!

Naja, nehme ich dann mal so hin, hab ich ja mit dem PowerStream nicht anders erlebt. :)


Spannend wären dann noch mal folgende Werte:
data_mppt.dcdc12vVol
data_mppt.dcdc12vAmp
data_mppt.dcdc12vWatts
data_mppt.carOutVol
data_mppt.carOutAmp
data_mppt.carOutWatts

Diese Werte habe ich nicht, aber folgende:

data_ems.paraVolMax 50118 50.118   
data_ems.paraVolMin 49528 49.528
data_ems.chgVol 52225 52.225
data_bmsMaster.amp 13301 13.301
data_bmsMaster.maxCellVol 3345 33.45
data_bmsMaster.minCellVol 3339 33.39
data_bmsMaster.vol 50251 50.251
data_ems.chgVol 52257 52.257
data_inv.cfgAcOutVoltage 230000 230.000

und für den Powerstream Wechselrichter:

data_20_1.bmsReqChgVol 541830 54.1830
data_20_1.bmsReqChgAmp 650000 6.50000
data_20_1.llcOpVolt 4106 41.06

(erste Zahl: Anzeige, zweite Zahl: meine Erwartung.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: tschimi am 19 Juni 2025, 10:13:56
Hi,
ich bekomme seit heute immer "502 bad gateway" angezeigt. Außerdem zeigt die APP auf dem Handy öfter, das sie angeblich kein Internet hat, obwohl im Router die Powerstreams verbunden sind. Dann gibts noch die Meldung    /503 SERVICE_UNAVAILABLE "Unable to find instance for iot-open"/. Ich hab mal versucht, mich im Developerportal anzumelden aber auch das geht irgendwie heute nicht :-(

Habt ihr das bei euch auch? Hat schon jemand einen Workaround gefunden??
Lg, tschimi
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 19 Juni 2025, 10:19:48
Das liegt wohl an Ecoflow.

Ich bekomme "Server is too busy", wenn ich mich auf dem Ecoflow-Portal einloggen will...

Ab und zu kommt mal was:
data_pd.wattsInSum 322 2025-06-19 07:24:53
data_pd.wattsOutSum 146 2025-06-19 07:24:53
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: xelawe am 19 Juni 2025, 10:48:49
Zitat von: tschimi am 19 Juni 2025, 10:13:56Hi,
ich bekomme seit heute immer "502 bad gateway" angezeigt. Außerdem zeigt die APP auf dem Handy öfter, das sie angeblich kein Internet hat, obwohl im Router die Powerstreams verbunden sind. Dann gibts noch die Meldung    /503 SERVICE_UNAVAILABLE "Unable to find instance for iot-open"/. Ich hab mal versucht, mich im Developerportal anzumelden aber auch das geht irgendwie heute nicht :-(

Habt ihr das bei euch auch? Hat schon jemand einen Workaround gefunden??
Lg, tschimi
Selbiges Problem habe ich auch. Ich vermute mal, dass der Ecoflow Server down ist
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: macfly am 19 Juni 2025, 11:02:25
ja, bei mir auch.

evtl. ist dies hier (https://github.com/rabits/ha-ef-ble/tree/main) eine Lösung?
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 19 Juni 2025, 11:06:52
Ecoflow hat gerade ziemliche Probleme. Angeblich werden die Server upgegraded...
Also einfach mal abwarten, es liegt nicht an Eurer Konfiguration.

Zitat"Update: Bezüglich der nicht funktionierenden Bluetooth-Verbindung: Das Problem wurde bereits weitergeleitet. Bitte habt noch etwas Geduld – sobald es ein Update gibt, melde ich mich umgehend.
-------------------------------------------------

Morgen zusammen,
Wir möchten euch kurz informieren: Aktuell führen wir ein Server-Upgrade durch, um unsere Cloud-Plattform zu verbessern und euch künftig ein noch stabileres Nutzungserlebnis zu bieten.

📶 Während dieser Umstellung kann voraussichtlich für ca. 3 Stunden zu vorübergehenden WLAN-Verbindungsabbrüchen und Netzwerkstörungen kommen.. Das tut uns wirklich leid!

👉 Unser Tipp:
Wechselt in der Zwischenzeit bitte auf die Bluetooth-Verbindung, damit ihr eure Geräte weiterhin wie gewohnt verwenden könnt.

Nochmals Entschuldigung für die Unannehmlichkeiten – vielen Dank für euer Verständnis und eure Geduld.

Euer EcoFlow Team"
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 19 Juni 2025, 11:13:15
Peinlich, die können einen mit Werbung zuballern per Mail und in der App, aber solche Infos verbreiten sie mal lieber nicht. Echt zum k....


Zitat von: macfly am 19 Juni 2025, 11:02:25ja, bei mir auch.

evtl. ist dies hier (https://github.com/rabits/ha-ef-ble/tree/main) eine Lösung?
Das wär ganz gut, auch um aus dem Cloud-Zwang rauszukommen.
Wenn man da nen ESP32 hätte, der mit Bluetooth mit den EF-Komponenten "redet" und mit FHEM über WIFi...
da bin ich aber raus. Das ist zeitlich alleine nicht zu stemmen.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 19 Juni 2025, 15:27:38
Zitat von: matsches am 19 Juni 2025, 11:06:52Ecoflow hat gerade ziemliche Probleme. Angeblich werden die Server upgegraded...
Also einfach mal abwarten, es liegt nicht an Eurer Konfiguration.

Zitat📶 Während dieser Umstellung kann voraussichtlich für ca. 3 Stunden zu vorübergehenden WLAN-Verbindungsabbrüchen und Netzwerkstörungen kommen.. Das tut uns wirklich leid!

Nun ja, auch nach 3x3 Stunden geht es nicht.  ;D
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 20 Juni 2025, 08:59:21
Ich nutze ja die quasi cloudfreie Anbindung über MQTT(senden der Delta2 im Router gesperrt-->keine Livedaten;Empfang aus dem Internet zugelassen-->Befehle an die Delta2 aus FHEM heraus möglich.
Genutzt werden dieser Server u. Port
mqtt-e.ecoflow.com:8883
im log habe ich dann diesen Status seit gestern Nacht2025.06.19 04:16:25 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 04:16:25 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflowMI)
2025.06.19 04:17:41 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflowMI)
2025.06.19 04:17:53 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 04:19:11 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflowMI)
2025.06.19 04:19:26 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflowMI)
2025.06.19 04:21:00 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 04:21:00 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflowMI)
2025.06.19 04:26:30 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflowMI)
2025.06.19 04:26:48 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 04:27:18 2: ecoflow: No CONNACK, disconnecting
2025.06.19 04:27:18 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 04:27:18 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 04:27:48 2: ecoflow: No CONNACK, disconnecting
2025.06.19 04:27:48 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 04:28:02 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 04:28:32 2: ecoflow: No CONNACK, disconnecting
2025.06.19 04:28:32 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 04:28:32 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 04:29:02 2: ecoflow: No CONNACK, disconnecting
2025.06.19 04:29:02 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 04:29:02 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 04:29:32 2: ecoflow: No CONNACK, disconnecting
2025.06.19 04:29:32 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 04:29:32 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 04:29:58 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflowMI)
2025.06.19 04:29:58 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflowMI)
2025.06.19 04:30:02 2: ecoflow: No CONNACK, disconnecting
2025.06.19 04:30:02 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 04:30:02 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 04:30:28 2: ecoflowMI: No CONNACK, disconnecting
2025.06.19 04:30:28 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflowMI)
2025.06.19 04:30:28 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflowMI)
2025.06.19 04:30:32 2: ecoflow: No CONNACK, disconnecting
2025.06.19 04:30:32 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 04:30:32 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 04:30:58 2: ecoflowMI: No CONNACK, disconnecting
2025.06.19 04:30:58 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflowMI)
2025.06.19 04:31:00 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflowMI)
2025.06.19 04:31:02 2: ecoflow: No CONNACK, disconnecting
2025.06.19 04:31:02 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 04:31:04 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 04:31:30 2: ecoflowMI: No CONNACK, disconnecting
2025.06.19 04:31:30 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflowMI)
2025.06.19 04:31:32 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflowMI)
2025.06.19 04:31:34 2: ecoflow: No CONNACK, disconnecting
2025.06.19 04:31:34 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 04:32:02 2: ecoflowMI: No CONNACK, disconnecting
2025.06.19 04:32:02 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflowMI)
2025.06.19 05:14:52 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 05:15:00 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflowMI)
2025.06.19 05:15:22 2: ecoflow: No CONNACK, disconnecting
2025.06.19 05:15:22 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 05:15:30 2: ecoflowMI: No CONNACK, disconnecting
2025.06.19 05:15:30 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflowMI)
2025.06.19 05:15:56 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflowMI)
2025.06.19 05:16:02 1: ecoflowMI: Connection refused, not authorized
2025.06.19 05:16:02 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflowMI)
2025.06.19 06:02:04 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 06:02:34 2: ecoflow: No CONNACK, disconnecting
2025.06.19 06:02:34 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 06:55:29 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 06:55:59 2: ecoflow: No CONNACK, disconnecting
2025.06.19 06:55:59 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 07:29:11 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 07:39:44 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 08:30:52 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 08:36:55 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 09:01:00 3: MQTT2_DEVICE set Delta2 Soc_backup 100
2025.06.19 09:20:44 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 09:23:58 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 09:26:13 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 10:21:31 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 10:21:31 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 10:40:47 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 10:41:26 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 10:43:44 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
2025.06.19 11:44:52 1: mqtt-e.ecoflow.com:8883 reappeared (ecoflow)
2025.06.19 11:44:57 1: ecoflow: Connection refused, not authorized
2025.06.19 11:44:57 1: mqtt-e.ecoflow.com:8883 disconnected, waiting to reappear (ecoflow)
Jetzt weiß ich, warum meine Delta2 gestern nicht aufgeladen wurde.  :'(
Der MQTT-Server von ecoflow hatte also von 4:19 an Probleme, lief immer mal wieder, bis er schließlich bis jetzt seit 11:44 gar nicht mehr läuft.  :'(
Läuft Eure HTTP-Rest-Methode wieder ?

Vorerst muss ich lokal über Bluetooth steuern.  :-X

Grüße Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 20 Juni 2025, 09:14:28
Zitat von: KölnSolar am 20 Juni 2025, 08:59:21Jetzt weiß ich, warum meine Delta2 gestern nicht aufgeladen wurde.  :'(
Der MQTT-Server von ecoflow hatte also von 4:19 an Probleme, lief immer mal wieder, bis er schließlich bis jetzt seit 11:44 gar nicht mehr läuft.  :'(
Läuft Eure HTTP-Rest-Methode wieder ?

Vorerst muss ich lokal über Bluetooth steuern.  :-X

Grüße Markus

MQTT lief bei mir seit Januar generell nicht mehr. Deswegen hab ich mich ja mit dem HTTP-REST-API beschäftigt.
Und die läuft bei mir seit gestern 17 Uhr wieder. Aufgeladen wurden meine Batterien trotzdem, lediglich die 0-Einspeisung hat etwas gelitten, da die Abgabe des Powerstreams nicht nachgeregelt werden konnte.

So ein Steuerungsmodul über Bluetooth, das Daten lesen und schreiben kann, wär natürlich echt knorke... Hmmm...
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 20 Juni 2025, 10:51:26
Danke für die Rückmeldung.
MQTT lief bei mir seit Januar generell nicht mehr. Deshalb vermeide ich updates der firmware bei Geräten, wenn ich sie einmal vernünftig in FHEM integriert habe.
Ich harre mal der weiteren Entwicklung.
ZitatSo ein Steuerungsmodul über Bluetooth, das Daten lesen und schreiben kann, wär natürlich echt knorke... Hmmm...
Man findet was auf github(oder gitlab oder ?), aber nicht so einfach/schön umzusetzen wie MQTT.
Meine manuelle Steuerung ist halt temporär über bluetooth und ecoflow-App(ich hasse Apps).
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 21 Juni 2025, 14:09:26
Die Geduld war am Ende und ich habe nach Lösung des MQTT-Problems gesucht(hatte es ja fälschlicherweise in Verbindung mit der Serverumstellung gebracht).
Im passenderen Thread habe ich dann meine Lösung gepostet
ZitatAuch bei mir hat sich die App-Id geändert, weshalb das device nicht mehr connected war, obwohl sich der ecoflow-Server anpingen ließ.

Start des Skripts mit neuen App-Id's als Ergebnis, attr ecoflow ClientID Eine_Neue_AppId--> FHEM neu starten --> funktioniert

Ungefähr ein Jahr nach Kauf, was mich zu der Spekulation veranlasst, dass der MQTT-Account nur 1 Jahr Gültigkeit hat.

Grüße Markus
Have fun
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: mrabdip am 09 Juli 2025, 13:35:23
Hallo zusammen,

ich habe eine STREAM Ultra, diese wird vom Modul (noch) nicht unterstützt, oder? Den API Connect bekomme ich noch hin, aber nach "Reading Vars" kommt nichts zurück.

Grüße
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: xelawe am 10 August 2025, 10:48:29
Hallo,

ich bekomme seit Anfang August von meine rRiver 2 Max keine Daten mehr und folgende Meldungen im Log:

2025.08.10 10:25:47 0: Ecoflow_River_2_Max(Ecoflow 0.3.8.8): Ecoflow_Response(): ERROR! {"code":"1006","message":"current device is not allowed to get device info","eagleEyeTraceId":"ea1a2a350917548143476492498d0007","tid":""}
2025.08.10 10:35:47 0: Ecoflow_River_2_Max(Ecoflow 0.3.8.8): Ecoflow_Response(): ERROR! {"code":"1006","message":"current device is not allowed to get device info","eagleEyeTraceId":"ea1a2a585717548149476782094d0007","tid":""}

mit detectModel erhalte ich folgendes im Log:
2025.08.10 10:45:53 3: Ecoflow_River_2_Max(Ecoflow 0.3.8.8): Ecoflow_DetectModel(): Trying to detect model.
2025.08.10 10:45:53 2: Ecoflow_River_2_Max(Ecoflow 0.3.8.8): Ecoflow_DetectModel(): Model "RIVER 2 MAX" detected.
2025.08.10 10:45:53 0: Ecoflow_River_2_Max(Ecoflow 0.3.8.8): Ecoflow_DetectModel(): Modul initialised.
2025.08.10 10:45:53 0: Ecoflow_River_2_Max(Ecoflow 0.3.8.8): Ecoflow_Response(): ERROR! {"code":"1006","message":"current device is not allowed to get device info","eagleEyeTraceId":"ea1a2a585717548155539621011d0007","tid":""}

Meine Modul-Version: V 0.3.8.8

Hat sonst noch wer das Probelem bzw. gibt es dafür eine Lösung?

Beste Grüße,
Alex
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 09 September 2025, 21:57:30
Hi Knut,
ich habe nun das Modul für meine powerstream u. delta2 im Einsatz. Funktioniert grundsätzlich. Danke.

Leider musste ich regelmäßige minimale freezes feststellen, was mir mit meinem freezemon das Log zuballert.
Bei der Suche bin ich im Code auf my @ev_on_change_reading=Ecoflow_CleanArray(split(",",AttrVal($name,"event-on-change-reading","")));
my @ev_on_update_reading=Ecoflow_CleanArray(split(",",AttrVal($name,"event-on-update-reading","")));
.
.
.
if((Ecoflow_StrInArr($vname,@ev_on_update_reading)) || (Ecoflow_StrInArr(".*",@ev_on_update_reading)) || (Ecoflow_StrInArr($vname,@ev_on_change_reading)) || (Ecoflow_StrInArr(".*",@ev_on_change_reading))){
Ecoflow_Log($param->{hash}, 5, "Ecoflow_Response(): Forced Update $vname");
readingsBulkUpdate($param->{hash},$vname,$v{$rname});
}
else
{
readingsBulkUpdateIfChanged($param->{hash},$vname,$v{$rname});
}
gestoßen. Eine etwas eigentümliche Implementierung der event-on-Attribute. Warum ?

Außerdem scheint die Schleife foreach my $key(sort keys %{$Ecoflow_Vars{$model}->{Adjustments}}){
Ecoflow_Log($param->{hash},6,"Ecoflow_Response(): \$key = $key | \$rname = $rname");
if($key eq $rname){
$v{$rname}=$v{$rname}/$Ecoflow_Vars{$model}->{Adjustments}->{$rname};
}
}
die freezes zu verursachen, da sie für jedes Feld aufgerufen wird. Warum nicht durch
$v{$rname}=$v{$rname}/$Ecoflow_Vars{$model}->{Adjustments}->{$rname} if($Ecoflow_Vars{$model}->{Adjustments}->{$rname});ersetzen ?

Für die Delta2 gibt es ja noch keine Adjustments. Welche Einheiten sollen denn ausgegeben werden ? V,A,W,Wh,h ? Dann kann ich mich an die Definition machen.

Grüße
Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 09 September 2025, 22:31:39
...und wie wäre es mit einem Attribut no_data_20_134 ?

Die time-schedules braucht doch eigentlich niemand in FHEM. Frisst unnötig Leistung und macht ne Masse nichtssagender readings.
...
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 10 September 2025, 12:28:00
Moin zusammen,

sorry war den Sommer über mit anderen Sachen beschäftigt.

Also, zunächst mal:
[quote [quote
Zitat von: MasterRay am 27 August 2025, 11:09:35
Zitat von: xelawe am 10 August 2025, 10:48:29Hallo,

ich bekomme seit Anfang August von meine rRiver 2 Max keine Daten mehr ...

Habe ich bei meiner Delta 3 auch. Wie ich gelesen habe, ist das die EF-Antwort auf eine (noch) unveröffentliche API.

Alternativ ggf. MQTT verwenden.
Delta 3- und River-Geräte: Hierzu wurde seitens Ecoflow keine API veröffentlicht. Wie auch bei anderen neueren geräten von Ecoflow werden hier wohl "Google Protocol Buffers" benutzt, dazu wurde keine Schnittstelle bekanntgegeben, und aufgrund der Verschlüsselung kommt man da auch nicht so hemdsärmelig weiter.

Zitat von: KölnSolar am 09 September 2025, 21:57:30 foreach my $key(sort keys %{$Ecoflow_Vars{$model}->{Adjustments}}){
Ecoflow_Log($param->{hash},6,"Ecoflow_Response(): \$key = $key | \$rname = $rname");
if($key eq $rname){
$v{$rname}=$v{$rname}/$Ecoflow_Vars{$model}->{Adjustments}->{$rname};
}
}
Ja, ändere ich, kein Thema. Ich bin kein Perl-Profi, von daher bin ich mit diesem Modul von 0 auf 100 gegangen. Von daher bin ich für jede Optimierung dankbar.

Zitat von: KölnSolar am 09 September 2025, 22:31:39...und wie wäre es mit einem Attribut no_data_20_134 ?

Die time-schedules braucht doch eigentlich niemand in FHEM. Frisst unnötig Leistung und macht ne Masse nichtssagender readings.

Naja, die werden einfach über den HTTP-Request mit zurückgegeben. Ich bin mir nicht sicher, ob das die Leistung des Moduls verbessert, wenn ich die rausfiltere.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 10 September 2025, 14:11:55
Hi Knut,
ZitatIch bin kein Perl-Profi, von daher bin ich mit diesem Modul von 0 auf 100 gegangen.
Frag mich, ich stehe mit Perl auch eher auf Kriegsfuß. Und manche Perl-Dinge in Deinem Modul verstehe ich mangels Wissen nicht.
ZitatIch bin mir nicht sicher, ob das die Leistung des Moduls verbessert, wenn ich die rausfiltere.
Die Schleife wird 70% performanter.  ;) Mir geht's es aber mehr um die Übersicht bei den readings. 125 sind schon unübersichtlich genug, aber 350.... :( 
Bei
Zitatevent-on-Attribute.
kann ich ja vielleicht weiterhelfen... :)
Grüße Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 10 September 2025, 14:22:20
Zitat von: KölnSolar am 09 September 2025, 21:57:30Für die Delta2 gibt es ja noch keine Adjustments. Welche Einheiten sollen denn ausgegeben werden ? V,A,W,Wh,h ? Dann kann ich mich an die Definition machen.
Richtig, ich hab die alle normiert auf V,A,W... etc.
Ecoflow hat da so lustige Ausgaben wie milliVolt, deziWatt, etc. Das will doch keiner Wissen. ;)

Nachtrag: Ich hab angefangen, die Schleifen zu optimieren. brauch aber wohl noch ein paar Tage bis zum Release.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 10 September 2025, 17:14:45
Schon einmal das, was ich im Augenblick liefern kann "DELTA 2" => {
"Adjustments" => {
"data_inv.acInAmp" => 1000,
"data_inv.acInVol" => 1000,
"data_inv.cfgAcOutVol" => 1000,
"data_mppt.outVol" => 1000,
"data_inv.invOutVol" => 1000,
"data_inv.invOutAmp" => 1000,
},
"Gets" => {},
"Sets" => {},
"SetCmdCodes" => {},
},
da meine delta2 im Augenblick zur Reparatur ist.
Es gibt noch 19 readings zu Zellspannungen(3-3,3V,differenz 0,001V). Aber da machen dann glaube ich die mV Sinn, oder ?
"data_bms_bmsStatus.cellVol_1 => 1000,
"data_bms_bmsStatus.cellVol_2 => 1000,
"data_bms_bmsStatus.cellVol_3 => 1000,
"data_bms_bmsStatus.cellVol_4 => 1000,
"data_bms_bmsStatus.cellVol_5 => 1000,
"data_bms_bmsStatus.cellVol_6 => 1000,
"data_bms_bmsStatus.cellVol_7 => 1000,
"data_bms_bmsStatus.cellVol_8 => 1000,
"data_bms_bmsStatus.cellVol_9 => 1000,
"data_bms_bmsStatus.cellVol_10 => 1000,
"data_bms_bmsStatus.cellVol_11 => 1000,
"data_bms_bmsStatus.cellVol_12 => 1000,
"data_bms_bmsStatus.cellVol_13 => 1000,
"data_bms_bmsStatus.cellVol_14 => 1000,
"data_bms_bmsStatus.cellVol_15 => 1000,
"data_bms_bmsStatus.cellVol_16 => 1000,
"data_bms_bmsStatus.maxCellVol => 1000,
"data_bms_bmsStatus.minCellVol => 1000,
"data_bms_bmsStatus.maxVolDiff => 1000,

Habe ich Deine gets richtig verstanden, dass Du nur das Reading ausliest und anzeigst ?
Das würde keinen Sinn machen. Ein get bezieht sich auf das physische Device(in dem Fall die Cloud), also z.B. get update/request, um sofort Daten vom device zu holen, weil man nicht auf den Ablauf des Intervalls warten möchte. Oder um Daten zu ermitteln, die nicht mit dem Standardzyklus übertragen werden.

Grüße Markus

edit:
Zitatbrauch aber wohl noch ein paar Tage bis zum Release
Nur kein Stress. Ist nur ein Hobby.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: MasterRay am 11 September 2025, 18:19:14
Zitat von: Neolux am 10 September 2025, 12:28:00Delta 3- und River-Geräte: Hierzu wurde seitens Ecoflow keine API veröffentlicht. Wie auch bei anderen neueren geräten von Ecoflow werden hier wohl "Google Protocol Buffers" benutzt, dazu wurde keine Schnittstelle bekanntgegeben, und aufgrund der Verschlüsselung kommt man da auch nicht so hemdsärmelig weiter.

Hallo,

bei "Google Protocol Buffers" handelt es sich nicht um eine Verschlüsselung, sondern um eine Umkodierung in (bzw. aus) ein kompaktes, binäres Format (siehe Google). Programmtechnisch ist das nicht schwierig. Man benötigt allerdings die .proto-Files dazu und die rückt EF nicht raus. Habe angefragt. Sei "internal".

Allerdings haben die "Kollegen" anderer Systeme sich schon damit erfolgreich beschäftigt und man kann deren Dateien aus diversen Foren (googeln!) beziehen -und/oder- selbst reengineeren.

Schönen Abend und Grüße
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 12 September 2025, 11:18:42
So, ich habe Performance-Optimierungen vorgenommen und einige foreach-Schleifen beseitigt.
Auch das Attribut "no_data_20_134" ist drin, die Tasks der Powerstream werden nicht mehr ausgelesen, wenn  "no_data_20_134" = 1 ist.
Um die Readings loszuwerden, einmal ein "set <devicename> DeleteReadings
Zitat von: KölnSolar am 10 September 2025, 17:14:45Schon einmal das, was ich im Augenblick liefern kann "DELTA 2" => {
"Adjustments" => {
Danke für die Mühe, die baue ich dann als nächstes ein, zusammen mit eventuellen Get- und Set-Cmds für die Delta 2.

Zitat von: KölnSolar am 10 September 2025, 17:14:45Habe ich Deine gets richtig verstanden, dass Du nur das Reading ausliest und anzeigst ?
Das würde keinen Sinn machen. Ein get bezieht sich auf das physische Device(in dem Fall die Cloud), also z.B. get update/request, um sofort Daten vom device zu holen, weil man nicht auf den Ablauf des Intervalls warten möchte. Oder um Daten zu ermitteln, die nicht mit dem Standardzyklus übertragen werden.
Jein. Da die Requests an die Cloud asynchron laufen, liefern die Gets zwar das letzte Readings zurück, lösen aber auch einen Request an die Cloud aus, das Reading wird nach Rückmeldung des Requests aktualisiert.
Die Requests an die Cloud laufen über HttpUtils_Nonblocking, damit FHEM nicht stehenbleibt, wenn keine Antwort kommt und der HTTP-Request erst auf einen Timeout warten muss.
Ich könnte für die Gets eine Routine mit HttpUtils schreiben, die blockierend auslöst, aber dann steht im Fall der Fälle FHEM erstmal still. Da hatte ich mich erstmal dagegen entschieden.

Zitat von: MasterRay am 11 September 2025, 18:19:14Allerdings haben die "Kollegen" anderer Systeme sich schon damit erfolgreich beschäftigt und man kann deren Dateien aus diversen Foren (googeln!) beziehen -und/oder- selbst reengineeren. Ich habe für meine Delta3 eine Mischung aus beidem gemacht und das läuft seit März hervorragend. Schließlich wird dieses Format von der EF-Äpp verwendet, was eine gewisse Stabilität und Unabhängigkeit bedeutet.

Ich hatte vor einiger Zeit nur einen Blogpost über die Protocolbuffers gelesen, und da war von Verschlüsselung die Rede, hab mich da nicht weiter mit befasst. Das wäre insofern interessant, wenn man damit alle Geräte ansteuern kann, und nicht nur die neuen.

Wenn es nur die neueren Modelle unterstützen, dann ist da wohl ein weiteres Modul fällig...
 
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 12 September 2025, 12:22:58
Danke, geladen u. getestet.
Ich bekomme massenhaft
ZitatUse of uninitialized value $value in string eq at fhem.pl line 5026.
im Log.
Kannst Du das bestätigen ?

ZitatJein. Da die Requests an die Cloud asynchron laufen, liefern die Gets zwar das letzte Readings zurück, lösen aber auch einen Request an die Cloud aus, das Reading wird nach Rückmeldung des Requests aktualisiert.
Die Requests an die Cloud laufen über HttpUtils_Nonblocking, damit FHEM nicht stehenbleibt, wenn keine Antwort kommt und der HTTP-Request erst auf einen Timeout warten muss.
Ich könnte für die Gets eine Routine mit HttpUtils schreiben, die blockierend auslöst, aber dann steht im Fall der Fälle FHEM erstmal still. Da hatte ich mich erstmal dagegen entschieden.
Bloß nicht Blocking !  ;)
Deshalb meinte ich auch, nur ein z.B. get device update, dann sieht man ja im entsprechenden reading den aktuellen Wert.
Grüße Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 12 September 2025, 14:24:43
Zitat von: KölnSolar am 12 September 2025, 12:22:58Danke, geladen u. getestet.
Ich bekomme massenhaft
ZitatUse of uninitialized value $value in string eq at fhem.pl line 5026.
im Log.
Kannst Du das bestätigen ?
Check ich mal.
Hm, nein, ich hab das nicht. Weder bei meiner Delta2Max, noch bei meinem Powerstream.

Zitat von: KölnSolar am 12 September 2025, 12:22:58Bloß nicht Blocking !  ;)
Deshalb meinte ich auch, nur ein z.B. get device update, dann sieht man ja im entsprechenden reading den aktuellen Wert.
Ja, könnte ich auch machen. Ich dachte nur, aus Datensparsamkeit ist es geschickter, gezielt einen Wert abzufragen, statt immer den ganzen Rotz von der Cloud zurückgemeldet zu bekommen, wie z.B. unnötige data_20_134, die dann überlesen werden. ;)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 12 September 2025, 16:37:48
Zitatnein, ich hab das nicht.
Dann aktiviere ich es beizeiten wieder und mache einen Restart.
ZitatJa, könnte ich auch machen. Ich dachte nur, aus Datensparsamkeit ist es geschickter, gezielt einen Wert abzufragen, statt immer den ganzen Rotz von der Cloud zurückgemeldet zu bekommen, wie z.B. unnötige data_20_134, die dann überlesen werden.
Performant ist es ja jetzt.  ;D
Sicherlich Geschmacksache. Ich hab lieber wenige übersichtliche set/get, wenn ich sie dann mal brauche.

Vielleicht äußern andere sich mal zu ihrem Geschmack.

Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 13 September 2025, 13:39:54
Zitat von: MasterRay am 11 September 2025, 18:19:14Hallo,
Allerdings haben die "Kollegen" anderer Systeme sich schon damit erfolgreich beschäftigt und man kann deren Dateien aus diversen Foren (googeln!) beziehen -und/oder- selbst reengineeren. Ich habe für meine Delta3 eine Mischung aus beidem gemacht und das läuft seit März hervorragend. Schließlich wird dieses Format von der EF-Äpp verwendet, was eine gewisse Stabilität und Unabhängigkeit bedeutet.

Da ist wohl eine Home-Assistant-API in Arbeit: https://www.youtube.com/watch?v=__v_FcX8Fns (https://www.youtube.com/watch?v=__v_FcX8Fns)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 15 September 2025, 08:06:02
Morjen,

ZitatDanke, geladen u. getestet.
Ich bekomme massenhaft
ZitatUse of uninitialized value $value in string eq at fhem.pl line 5026.
im Log.
Kannst Du das bestätigen ?

hat seinen Ursprung bei AttrVal($name,$Ecoflow_AttrNo_Data_20_134,0) eq "1"))beim Ausschluss der Verarbeitung "data_20_134.*" hier:
delete $v{$rname};
mit Ersatz durchnext;ist der Fehler behoben.

Grüße Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 24 September 2025, 11:04:02
Guten Morgen,
ich habe nun ein Austauschgerät Delta2 erhalten.

Wer etwas mehr zum Defekt wissen möchte kann hier (https://forum.fhem.de/index.php?msg=1348425) nachlesen.

Weiß hier jemand, ob Firmwareversion 1.0.2.85 noch MQTT(Klartext, kein protobuf !) und die API(also das 98_Ecoflow) unterstützt ?

Grüße Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 16 Oktober 2025, 13:36:33
So, die aktuellste Firmware für die Delta2 unterstützt immer noch MQTT u. die API in Klartext(vs. protobuf).

Nun versuche ich mich an set-Befehlen. Im Bsp. die Ladeleistung von 400W auf 350W. Ergebnis mit verbose=5
2025.10.16 12:34:24 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Get(): Delta2_AC: $model = DELTA 2
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = version
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = moduleType
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = id
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = operateType
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = params.chgPauseFlag
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Set(): $str_value = data_mppt.chgPauseFlag
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = params.chgWatts
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Set(): $str_value = a[2]
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = PUT
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=469829 $timestamp=1760610879078
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"id": "123","moduleType": "5","operateType": "acChgCfg","sn": "R331FEMeine","version": "1.0", "params": {"chgPauseFlag": "0","chgWatts": "350"}}
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota $query_str = id=123&moduleType=5&operateType=acChgCfg&params.chgPauseFlag=0&params.chgWatts=350&sn=R331FEMeine&version=1.0&accessKey=Meiner&nonce=469829&timestamp=1760610879078
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = Meins
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"id": "123","moduleType": "5","operateType": "acChgCfg","sn": "R331FEMeine","version": "1.0", "params": {"chgPauseFlag": "0","chgWatts": "350"}}
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota
2025.10.16 12:34:39 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"0","message":"Success","eagleEyeTraceId":"ea1a2a350917606118792117423d0007","tid":""}

gemäß
Zitatsettings(chgPauseFlag: 0: AC charging in normal operation, 1: AC charging paused (not saved, restored by plugging))

           
{
    "id": 123456789,
    "version": "1.0",
    "sn": "R331ZEB4ZEAL0528",
    "moduleType": 5,
    "operateType": "acChgCfg",
    "params": {
        "chgWatts": 100,
        "chgPauseFlag": 0
    }
}

Obwohl ja mit "success" geantwortet, stelle ich fest, dass data_mppt.cfgChgWatts sich nicht verändert hat. Sieht jemand einen Fehler ?

Grüße
Markus

Edit: Versuche für gets scheitern mit 405=Method not allowed. dasselbe bekomme ich bei gets mit meinem Powerstream. Evtl. Probleme durch restriktiven Internetzugang konnte ich auch ausschließen. Die MQTT-Variante funktioniert problemlos.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 15 Dezember 2025, 19:47:37
Hi Knut,
so gar nicht mehr aktiv ?
ZitatVersuche für gets scheitern mit 405=Method not allowed. dasselbe bekomme ich bei gets mit meinem Powerstream. Evtl. Probleme durch restriktiven Internetzugang konnte ich auch ausschließen. Die MQTT-Variante funktioniert problemlos.
Konnte ich nun lösen. gets bentötigen bei MEINEM powerstream u. Delta2 die Methode "POST". Dass bei "anderen" powerstreams "GET" funktioniert, liegt vielleicht am firmware-Stand ? ::)

Daran
ZitatHabe ich Deine gets richtig verstanden, dass Du nur das Reading ausliest und anzeigst ?
Das würde keinen Sinn machen. Ein get bezieht sich auf das physische Device(in dem Fall die Cloud), also z.B. get update/request, um sofort Daten vom device zu holen, weil man nicht auf den Ablauf des Intervalls warten möchte. Oder um Daten zu ermitteln, die nicht mit dem Standardzyklus übertragen werden.
und dem Thema Events bzw. event-on.... sollten wir uns widmen. Fällt mir immer wieder beim set auf die Füße, weil mir das Modul sagt, es hätte was gemacht und dann stelle ich später fest, dass in der Cloud u. dem Device doch nur der alte Wert steht.  :'( z.B. wenn die WLAN-Verbindung zum Device instabil ist.

Solltest Du so gar keine Zeit haben, würde ich einen fork machen.

Grüße Markus



Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 16 Dezember 2025, 14:56:02
PUT beim set, oder ? Der Standard im Modul beim get ist GET und nur beim POWEROCEAN ist es POST.
Um so mehr war ich verwundert, dass mein POWERSTREAM auch nur mit POST funktioniert.

Mein Firmwarestand ist 1.1.4.61 und es wird mir die Aktuellste mit 1.1.4.140 angeboten.
Siehst Du die WifiVersion irgendwo in der Äpp oder auch nur in den readings ? Dort ist es bei mir ebenfalls 1.1.4.61  :-\

Grüße
Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 16 Dezember 2025, 17:02:30
Et is wie et is.  8) Schon alleine wieder, dass in Deiner Äpp 2 Firmwareversionen angezeigt werden. Bei mir nur eine unter Einstellungen/Firmware. Und jetzt kann ich nicht noch einmal gucken, weil das Ding keinen Saft mehr hat. :'(

Für die Ungläubigen habe ich es mal mit der Delta2(die hat ja 24/7 ne Verbindung  :-X ) gelogged mit Methode GET:
2025.12.16 16:51:35 3: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): redirects: 0, protocol: https, path: /iot-open/sign/device/quota, host: api-e.ecoflow.com, httpheader: HTTP/1.1 405 Method Not Allowed
Date: Tue, 16 Dec 2025 15:51:35 GMT
Content-Type: application/json;charset=UTF-8
Content-Length: 75
Connection: close
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Allow: POST,PUT
x-timestamp: 1765900295683, addr: https://api-e.ecoflow.com:443, host: api-e.ecoflow.com

Wenn die Methode also noch nicht einmal modellabhängig ist, wird man wohl oder übel zur Verallgemeinerung ein Internal beschreiben müssen, in welchem man die Methode hinterlegt, wenn der jeweils 1. Aufruf mit einem Standard(GET) in einem Fehler 405 endet.

Grüße Markus


Edit: Hab dann auch noch einmal schnell ein set mit der Modifizierung des standardmäßigen PUT durch ein GET bei der Delta2 probiert:
405 und Allow: POST,PUT Also mal auf POST geändert, http fehlerfrei, aber leider
2025.12.16 17:49:15 0: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): ERROR! {"code":"8524","message":"invalid parameter","eagleEyeTraceId":"","tid":""}
Und wie ich oben bereits schrieb: mit PUT geht das set durch(SUCCESS). Nur leider kommt es in der Delta2 nie an.  :'(
Bisher hatte ich ja immer mein nicht ganz so einfaches Netzwerk im Verdacht, aber beim Powerstream kommt der Befehl bei identischen Netzwerkbedingungen an, bei der Delta2 nicht.  :o

Edit2: Wo es nun wieder hell ist, habe ich wegen der firmware vom powerstream in die Äpp geguckt: Ich finde unter "Mikro-Wechselrichtersystem"/Einstellungen/Firmware die Seriennr. des powerstream. Unter "AndereGeräte/Powerstream"/Einstellungen/Firmware "WLAN". Meintest Du das ? Bei mir sind die Versionen allerdings identisch.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Stefan6183 am 30 Dezember 2025, 18:16:54
Hallo zusammen,

ich habe jetzt seit einigen Wochen einen EcoFlow PowerOcean Plus 20kW Wechselrichter mit einer EcoFlow PowerOcean 5kWh Batterie in Betrieb und würde gerne eine einfache Ansteuerung über FHEM realisieren.
Die aktuelle 98_Ecoflow.pm und die abhängigen Module habe ich auf meinem Raspi installiert mit:
sudo apt-get update
sudo apt-get install liburl-encode-perl
sudo apt-get install libwww-curl-perl
sudo apt-get install libtime-hires-perl
sudo apt-get install libdigest-sha-perl

In FHEM habe ich folgendes gemacht:
define PowerOcean Ecoflow <meinAccessKey> <meineSerialNr>
set PowerOcean SecretKey <meinSecretKey>
attr PowerOcean ecInterval 120

Leider erhalte ich als Readings nur:
code: 1006
message: current device is not allowed to get device info

Das set PowerOcean detectModel schreibt ins Log:
2025.12.30 18:13:25 3: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_DetectModel(): Trying to detect model.
2025.12.30 18:13:25 2: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_DetectModel(): Model "" detected.
2025.12.30 18:13:25 0: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_DetectModel(): Modul initialised.
2025.12.30 18:13:26 0: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Response(): ERROR! {"code":"1006","message":"current device is not allowed to get device info","eagleEyeTraceId":"","tid":""}

Habt ihr einen Tipp, was ich noch versuchen könnte?

Grüße und einen guten Rutsch ins Neue Jahr!
Stefan
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 30 Dezember 2025, 19:06:32
Die Meldung kommt ja vom ecoflow-Server.

Ich könnte mir vorstellen, dass das Gerät bei ecoflow nicht Deinem Developer-Account zugeordnet ist, mit dem Du Dir access- und secret-key besorgt hast.

Ansonsten mal ein Log mit verbose 5 hier einstellen, wenn Du "get devices" ausführst.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Stefan6183 am 30 Dezember 2025, 19:43:05
Wie kann ich denn bei EcoFlow das Gerät meinem Developer-Account zuordnen?
Ich verwende bei meinem Developer Account die selbe Emailadresse und den selben Login wie in der EcoFlow App, wo die Seriennummern von Wechselrichter und Batterie korrekt erfasst sind.

Hier ein Log mit verbose 5 vom "get devices" (ein paar sensible Daten habe ich verändert):
2025.12.30 19:33:13 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Get(): PowerOcean: $model =
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Get(): PowerOcean: $model =
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Get(): cmd = devices
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = GET
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=742945 $timestamp=1767119604670
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/list $query_str = accessKey=hierStehtMeinAccessKey&nonce=742945&timestamp=1767119604670
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = 7dfd2d1acd25b160333cverändert7d19c432ac2d71768veränderte67edc383
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/list
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"0","message":"Success","data":[{"sn":"hierStehtMeineSeriennummer","online":1}],"eagleEyeTraceId":"","tid":""}
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Response(): code = 0
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_online = 1
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn = hierStehtMeineSeriennummer
2025.12.30 19:33:24 4: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn : Comparing SerialNo hierStehtMeineSeriennummer
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Response(): $base = data_1
2025.12.30 19:33:24 4: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Response():
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Response(): eagleEyeTraceId =
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Response(): message = Success
2025.12.30 19:33:24 5: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Response(): tid =
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 30 Dezember 2025, 20:20:07
ZitatIch verwende bei meinem Developer Account die selbe Emailadresse und den selben Login wie in der EcoFlow App, wo die Seriennummern von Wechselrichter und Batterie korrekt erfasst sind.
...ist genau richtig und wichtig.
Zitat{"code":"0","message":"Success","data":[{"sn":"hierStehtMeineSeriennummer","online":1}],"eagleEyeTraceId":"","tid":""}
Also funktioniert es ja !
Und jetzt habe ich erst richtig hingeguckt:
Das set PowerOcean detectModel schreibt ins Log:
2025.12.30 18:13:25 3: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_DetectModel(): Trying to detect model.
2025.12.30 18:13:25 2: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_DetectModel(): Model "" detected.
2025.12.30 18:13:25 0: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_DetectModel(): Modul initialised.
2025.12.30 18:13:26 0: PowerOcean(Ecoflow 0.3.9.0): Ecoflow_Response(): ERROR! {"code":"1006","message":"current device is not allowed to get device info","eagleEyeTraceId":"","tid":""}
ist leider eine irreführende "normale" Meldung beim Start des Moduls. Danach funktionieren alle Zugriffe.

Bitte demnächst Log-Auszüge in Code-Tags posten.  ;)

Grüße Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Stefan6183 am 30 Dezember 2025, 21:20:26
Ok, also verstehe ich das richtig, dass ich die Meldung "current device is not allowed to get device info" ignorieren kann?

Aber sollte bei Ecoflow_DetectModel(): Model "" detected nicht Model "POWEROCEAN" stehen?
Das Ecoflow Device bietet mir nämlich keine gerätespezifischen get und set Kommandos an.
Bei get z.B. nur get AccessKey, get SerialNo und get devices.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 30 Dezember 2025, 22:12:27
Wahrscheinlich schon. Probier es mal, indem Du das attr model setzt.

Bei powerstream u. Delta2 sieht das Ergebnis eines get devices(ohne attr model) so aus25.12.13 09:58:11 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"0","message":"Success","data":[{"sn":"xy","deviceName":"PowerStream-8875","online":1,"productName":"PowerStream"},{"sn":"yz","deviceName":"DELTA 2-0024","online":1,"productName":"DELTA 2"}],"eagleEyeTraceId":"","tid":""}
2025.12.13 09:58:11 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): code = 0
2025.12.13 09:58:11 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_deviceName = PowerStream-8875
2025.12.13 09:58:11 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_online = 1
2025.12.13 09:58:11 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_productName = PowerStream
2025.12.13 09:58:11 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn = xy
2025.12.13 09:58:11 4: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn : Comparing SerialNo xy
2025.12.13 09:58:11 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): data_2_deviceName = DELTA 2-0024
2025.12.13 09:58:11 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): data_2_online = 1
2025.12.13 09:58:11 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): data_2_productName = DELTA 2
2025.12.13 09:58:11 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): data_2_sn = yz
2025.12.13 09:58:11 4: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): data_2_sn : Comparing SerialNo yz
2025.12.13 09:58:11 5: Delta2_AC(Ecoflow 0.3.9.0): Ecoflow_Response(): $base = data_2

Die Zeilen ..._productName ..._deviceName vermisse ich in Deinem Log.

Hast Du das Internal "Model" ?
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: matsches am 30 Dezember 2025, 22:30:32
Hi

Der PowerOcen-Plus wird m.E. generell (noch) nicht unterstützt.

Zitat und Quelle: "Ich hab grad 'ne Antwort von Ecoflow bekommen. PowerOcean Plus Geräte werden in ihrer API nicht unterstützt, und es ist unklar, ob und wann das der Fall sein wird. :(" (https://www.reddit.com/r/Ecoflow_community/comments/1nryzaa/ecoflow_powerocean_plus_developer_api_code_1006/?tl=de)

Mein PO ohne "Plus" wird zwar unterstützt und hat auch mal mit fhem funktioniert, aber ich bin letztendlich dann zu Homeassistant gewechselt.
Dort funktioniert es etwas reibungsloser mit der PO-Integration.

Grüße
Mathias

Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Stefan6183 am 31 Dezember 2025, 15:08:49
Hallo zusammen,

danke für eure Hinweise.

Ein temporäres Setzen des Internals Model auf POWEROCEAN über
{$defs{"PowerOcean"}{Model} = "POWEROCEAN" }
erzeugte mir dann zwar die gerätespezifischen Gets, deren Ausführung liefert aber immer nur den Fehler "Ecoflow: Get with unknown argument data_bpSoc, choose one of AccessKey SerialNo devices"


Die EF API Doku hatte ich gelesen, mir war aber nicht klar, dass EcoFlow zwischen PowerOcean und PowerOcean-Plus unterscheidet.

Vielleicht versuche ich mal, über die API ein paar Raw Daten abzugreifen und ins Log zu schreiben.
Da ich aber dieselbe Fehlermeldung {"code":"1006","message":"current device is not allowed to get device info","eagleEyeTraceId":"","tid":""} im Log sehe, wie in der Quelle von Mathias, habe ich keine große Hoffnung, dass die API aktuell für PowerOcean-Plus Geräte funktioniert.

Da werde ich im neuen Jahr wohl mal den EcoFlow Support anschreiben müssen. Immerhin war die Steuerbarkeit der Anlage über die API für mich ein Kaufargument.

Euch allen einen Guten Rutsch!
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 03 Januar 2026, 20:54:51
Hallo,
ich habe eine Stream Max ich sehe aber keine SET Befehle. Wird die schon unterstützt?

Gruß Denis
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 03 Januar 2026, 22:29:52
No, völlig andere Systematik bei Stream xyz.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 04 Januar 2026, 10:03:02
Hi, OK dachte nur weil das lesen ja funktioniert. Kann man die Set Befehle selber zusammen bauen und an die Stream schicken. Entweder über sowas wie senRawJson oder das Mann über Attribute eigene Befehle definieren kann?

Gruß Denis
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 04 Januar 2026, 14:17:42
lt. Doku beginnt es schon damit, dass im Gegensatz zu allen anderen Devices ein get erfolgen muss, um die "master-seriennr" zu ermitteln(Frage mich wieso überhaupt erwartet wird, dass mehrere Geräte im "Verbund" installiert sein sollen) Mit dieser Seriennr erfolgen dann die "gewohnten" sets/gets. Allerdings auch hier sehr unterschiedlich für die verschiedenen Stream-Typen.
Grüße Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 04 Januar 2026, 16:41:49
Hi, werde mich dann mit der Doku Auseinandersetzen müssen.
Es werden bei den Stream Geräten tatsächlich bis zu 6 Stück im Verbund betrieben um in gewissen Grenzen die 800W Beschränkungen bei Balkonkraftwerken aufzuweichen.
Gruß Denis
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 07 Januar 2026, 13:26:53
Hallo,

so ich habe mal angefangen:
"STREAM MAX" => {
        "Adjustments" => {},
        "Gets" => {
            "relay2Onoff" => "",
            "backupReverseSoc" => "",
            "energyStrategyOperateMode.operateSelfPoweredOpen" => "",
            "energyStrategyOperateMode.operateIntelligentScheduleModeOpen" => "",
            "feedGridMode" => "",
        },
        "Sets" => {
            "cfgRelay2Onoff" => ":true,false",
            "cfgBackupReverseSoc"=> ":slider,3,1,95",
            "cfgEnergyStrategyOperateMode.operateSelfPoweredOpen" => ":true",
            "cfgEnergyStrategyOperateMode.operateIntelligentScheduleModeOpen" => ":true",
            "cfgFeedGridMode" => ":1,2",
        },
        "SetCmdCodes" => {
            "cfgRelay2Onoff" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgRelay2Onoff" => "a[2]"},
            "cfgBackupReverseSoc" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgBackupReverseSoc" => "a[2]" },
            "cfgEnergyStrategyOperateMode.operateSelfPoweredOpen" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgEnergyStrategyOperateMode.operateSelfPoweredOpen" => "a[2]"},
            "cfgEnergyStrategyOperateMode.operateIntelligentScheduleModeOpen" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgEnergyStrategyOperateMode.operateIntelligentScheduleModeOpen" => "a[2]"},
            "cfgFeedGridMode" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgFeedGridMode" => "a[2]"},
        },
    },

leider bekomme ich keinen _ProduktName in der Antwort dehalb habe ich mir mit mit dem _deviceName der in der Response ausgeholfen.
my $product = $v{$base . "_productName"} || '';
if(length($product)) {
$param->{hash}->{Model} = uc($product);
}
else {
my $dev = $v{$base . "_deviceName"} || '';
Ecoflow_Log($param->{hash}, 4, "Ecoflow_Response(): " . $dev);
if ($dev =~ /STREAM Max/i) {
$param->{hash}->{Model} = "STREAM MAX";
}
elsif ($dev =~ /STREAM Ultra/i) {
$param->{hash}->{Model} = "STREAM ULTRA";
}
elsif ($dev =~ /STREAM Pro/i) {
$param->{hash}->{Model} = "STREAM PRO";
}
elsif ($dev =~ /STREAM AC/i) {
$param->{hash}->{Model} = "STREAM AC";
}
}
Da der Name in der App geändert werden kann, muss mann dann darauf achten, das der Name "STREAM xyz" enthält.
Das Setzten des Ausgangs funktioniert leider nicht Fehler "Validation failed, Please check your param: cfgRelay2Onoff". Kann es sein das true und false nicht in Anführungsstrichen stehen dürten?

Gruß Denis
 
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 07 Januar 2026, 17:47:05
Eigentlich nicht.

andere set/get funktionieren ?

mal mit verbose=5 set ausführen u. Log posten.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 08 Januar 2026, 06:34:55
Hallo,

hier mal ein Log:
2026.01.08 06:30:17 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax: $model = STREAM MAX
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = params.cfgRelay2Onoff
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $str_value = a[2]
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dest
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdFunc
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = needAck
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirSrc
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirDest
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdId
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = PUT
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=440880 $timestamp=1767850231752
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": "true","sn": "BKxxxxxxxxxxx55", "params": {"cfgRelay2Onoff": "false"}}
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota $query_str = cmdFunc=254&cmdId=17&dest=2&dirDest=1&dirSrc=1&needAck=true¶ms.cfgRelay2Onoff=false&sn=BKxxxxxxx7155&accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nonce=440880×tamp=1767850231752
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": "true","sn": "BKxxxxxxxxx5", "params": {"cfgRelay2Onoff": "false"}}
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota
2026.01.08 06:30:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"8524","message":"Validation failed, Please check your param: cfgRelay2Onoff","eagleEyeTraceId":"","tid":""}
2026.01.08 06:30:31 0: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): ERROR! {"code":"8524","message":"Validation failed, Please check your param: cfgRelay2Onoff","eagleEyeTraceId":"","tid":""}
2026.01.08 06:30:31 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars

Gruß Denis
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 08 Januar 2026, 07:43:03
Hast nicht alle Sn unkenntlich gemacht.

Die hast Du Dir über GET: /iot-open/sign/device/system/main/sn?sn=DeineSngeholt ?

Edit: wat is dat denn ?
Zitattrue¶ms.cfgRelay2Onoff
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 08 Januar 2026, 13:31:09
Hi,
die Seriennummer hab ich aus der App.

true¶ms.cfgRelay2Onoff
woher das kommt weis ich nicht, alles was ich geändert hab ist in dem Post oben.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 08 Januar 2026, 13:53:42
Zitatandere set/get funktionieren ?
Hast Du ignoriert.
Ggfs. mal mit "get devices" und "get relay2Onoff" probieren und wenn es nicht klappt, noch einmal mit verbose=5 und Ergebnisse hier einstellen.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 08 Januar 2026, 14:25:46
Hi,
nein andere Set/get fuktionieren auch nicht.
2026.01.08 14:15:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = GET
2026.01.08 14:15:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=16536 $timestamp=1767878129927
2026.01.08 14:15:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"sn": "BKxxxxxxxxxxxxx", "params": {"quotas":["relay2Onoff"]}}
2026.01.08 14:15:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota $query_str = params.quotas[0]=relay2Onoff&sn=BKxxxxxxxxxxxxx&accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nonce=16536×tamp=1767878129927
2026.01.08 14:15:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2026.01.08 14:15:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = GET
2026.01.08 14:15:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=913650 $timestamp=1767878129959
2026.01.08 14:15:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/list $query_str = accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nonce=913650×tamp=1767878129959
2026.01.08 14:15:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2026.01.08 14:15:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = GET
2026.01.08 14:15:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=212146 $timestamp=1767878129962
2026.01.08 14:15:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota/all?sn=BKxxxxxxxxxxxxxx $query_str = accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nonce=212146×tamp=1767878129962
2026.01.08 14:15:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2026.01.08 14:15:30 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota
2026.01.08 14:15:30 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"405","message":"Method Not Allowed","eagleEyeTraceId":"","tid":""}
2026.01.08 14:15:30 0: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): ERROR! {"code":"405","message":"Method Not Allowed","eagleEyeTraceId":"","tid":""}
2026.01.08 14:15:30 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars
2026.01.08 14:15:30 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/list
2026.01.08 14:15:30 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"0","message":"Success","data":[{"sn":"BKxxxxxxxxxxx","deviceName":"STREAM Max-7155gol","online":1}],"eagleEyeTraceId":"","tid":""}
2026.01.08 14:15:30 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): code = 0
2026.01.08 14:15:30 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_deviceName = STREAM Max-7155gol
2026.01.08 14:15:30 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_online = 1
2026.01.08 14:15:30 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn = BKxxxxxxxxxxxxx
2026.01.08 14:15:30 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn : Comparing SerialNo BKxxxxxxxxxxxxxxxxx
2026.01.08 14:15:30 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $base = data_1
2026.01.08 14:15:30 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): STREAM Max-7155gol
2026.01.08 14:15:30 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): eagleEyeTraceId =
2026.01.08 14:15:30 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): message = Success
2026.01.08 14:15:30 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): tid =
2026.01.08 14:15:30 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota/all?sn=BKxxxxxxxxxxxxxx
2026.01.08 14:15:30 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars
Gruß Denis
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 08 Januar 2026, 17:57:22
OK.

get device.....funktioniert.


der$url = /iot-open/sign/device/quota/allging in die Hose.
ERROR! {"code":"405","message":"Method Not Allowed"
Den kenne ich schon.  :)

Such mal if(uc($model) eq "POWEROCEAN"){in der sub Ecoflow_Get.

Diese und die übernächste Zeile(ist nur die abschließende Klammer des if) kommentieren und noch einmal versuchen.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 09 Januar 2026, 06:26:48
Hi,

funktioniert nicht, Antwort sieht so aus.

2026.01.09 06:11:18 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax: $model = STREAM MAX
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirDest
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdId
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = needAck
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirSrc
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdFunc
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = params.cfgBackupReverseSoc
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $str_value = a[2]
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dest
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = PUT
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=578149 $timestamp=1767935484329
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": "true","sn": "BKxxxxxxxxxxxxxx", "params": {"cfgBackupReverseSoc": "29"}}
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota $query_str = cmdFunc=254&cmdId=17&dest=2&dirDest=1&dirSrc=1&needAck=true¶ms.cfgBackupReverseSoc=29&sn=BKxxxxxxxxxxx&accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nonce=578149×tamp=1767935484329
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": "true","sn": "BKxxxxxxxxxxxxxxx", "params": {"cfgBackupReverseSoc": "29"}}
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota
2026.01.09 06:11:24 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"8524","message":"cfgBackupReverseSoc validator error","eagleEyeTraceId":"","tid":""}
2026.01.09 06:11:24 0: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): ERROR! {"code":"8524","message":"cfgBackupReverseSoc validator error","eagleEyeTraceId":"","tid":""}
2026.01.09 06:11:24 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars

das mit dem "&needAck=true¶ms.cfgBackupReverseSoc" ist immer noch da...
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 09 Januar 2026, 09:22:23
aber besser. POST genau wie bei mir für die gets.

url muss so aussehen
url = /iot-open/sign/device/quota $query_str = cmdFunc=254&cmdId=17&dest=2&dirDest=1&dirSrc=1&needAck=true&params.cfgBackupReverseSoc=29&sn=BKxxxxxxxxxxx&accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nonce=578149×tamp=1767935484329das xtamp ist auch immer xtamp anstatt &timestamp ?

Poste nochmal Deine gesamte %Ecoflow_Vars

Edit: das Für die Anbindung benötigt ihr noch folgende Perl-Module:
Time::HiRes,Digest::SHA,URL::Encode
hast Du installiert ?

Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 09 Januar 2026, 10:47:29
hier estmal die Variablen:
"STREAM MAX" => {
"Adjustments" => {},
"Gets" => {
"relay2Onoff" => "",
"backupReverseSoc" => "",
"energyStrategyOperateMode.operateSelfPoweredOpen" => "",
"energyStrategyOperateMode.operateIntelligentScheduleModeOpen" => "",
"feedGridMode" => "",
},
"Sets" => {
"cfgRelay2Onoff" => ":true,false",
"cfgBackupReverseSoc"=> ":slider,3,1,95",
"cfgEnergyStrategyOperateMode.operateSelfPoweredOpen" => ":true",
"cfgEnergyStrategyOperateMode.operateIntelligentScheduleModeOpen" => ":true",
"cfgFeedGridMode" => ":1,2",
},
"SetCmdCodes" => {
    "cfgRelay2Onoff" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "needAck" => "true", "dest" => 2, "params.cfgRelay2Onoff" => "a[2]"},
"cfgBackupReverseSoc" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgBackupReverseSoc" => "a[2]" },
"cfgEnergyStrategyOperateMode.operateSelfPoweredOpen" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgEnergyStrategyOperateMode.operateSelfPoweredOpen" => "a[2]"},
"cfgEnergyStrategyOperateMode.operateIntelligentScheduleModeOpen" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgEnergyStrategyOperateMode.operateIntelligentScheduleModeOpen" => "a[2]"},
"cfgFeedGridMode" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgFeedGridMode" => "a[2]"},
},

klar, die Perl-Module sind installiert.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 09 Januar 2026, 10:55:17
und hier nochmal ein Längerern Auszug aus der Logdatei:
2026.01.09 10:47:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax: $model = STREAM MAX
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirDest
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdId
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = needAck
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirSrc
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdFunc
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = params.cfgBackupReverseSoc
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $str_value = a[2]
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dest
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = PUT
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=713898 $timestamp=1767952080224
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": "true","sn": "BKXXXXXXXXXXXXX", "params": {"cfgBackupReverseSoc": "34"}}
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota $query_str = cmdFunc=254&cmdId=17&dest=2&dirDest=1&dirSrc=1&needAck=true¶ms.cfgBackupReverseSoc=34&sn=BKXXXXXXXXXXXXX&accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxD&nonce=713898×tamp=1767952080224
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": "true","sn": "BKXXXXXXXXXXXXX", "params": {"cfgBackupReverseSoc": "34"}}
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota
2026.01.09 10:48:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"8524","message":"cfgBackupReverseSoc validator error","eagleEyeTraceId":"","tid":""}
2026.01.09 10:48:00 0: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): ERROR! {"code":"8524","message":"cfgBackupReverseSoc validator error","eagleEyeTraceId":"","tid":""}
2026.01.09 10:48:00 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = GET
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=84976 $timestamp=1767952085420
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/list $query_str = accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxD&nonce=84976×tamp=1767952085420
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = GET
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=88113 $timestamp=1767952085422
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota/all?sn=BKXXXXXXXXXXXXX $query_str = accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxD&nonce=88113×tamp=1767952085422
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota/all?sn=BKXXXXXXXXXXXXX
2026.01.09 10:48:05 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/list
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"0","message":"Success","data":[{"sn":"BKXXXXXXXXXXXXX","deviceName":"STREAM Max-7155gol","online":1}],"eagleEyeTraceId":"","tid":""}
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): code = 0
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_deviceName = STREAM Max-7155gol
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_online = 1
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn = BKXXXXXXXXXXXXX
2026.01.09 10:48:05 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn : Comparing SerialNo BKXXXXXXXXXXXXX
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $base = data_1
2026.01.09 10:48:05 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): STREAM Max-7155gol
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): eagleEyeTraceId =
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): message = Success
2026.01.09 10:48:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): tid =
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dest
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = params.cfgRelay2Onoff
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $str_value = a[2]
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdFunc
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = needAck
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirSrc
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdId
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirDest
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = PUT
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=564982 $timestamp=1767952090441
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": "true","sn": "BKXXXXXXXXXXXXX", "params": {"cfgRelay2Onoff": "false"}}
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota $query_str = cmdFunc=254&cmdId=17&dest=2&dirDest=1&dirSrc=1&needAck=true¶ms.cfgRelay2Onoff=false&sn=BKXXXXXXXXXXXXX&accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxD&nonce=564982×tamp=1767952090441
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": "true","sn": "BKXXXXXXXXXXXXX", "params": {"cfgRelay2Onoff": "false"}}
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota
2026.01.09 10:48:10 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"8524","message":"Validation failed, Please check your param: cfgRelay2Onoff","eagleEyeTraceId":"","tid":""}
2026.01.09 10:48:10 0: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): ERROR! {"code":"8524","message":"Validation failed, Please check your param: cfgRelay2Onoff","eagleEyeTraceId":"","tid":""}
2026.01.09 10:48:10 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = params.cfgFeedGridMode
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $str_value = a[2]
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirDest
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdFunc
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdId
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = needAck
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dest
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirSrc
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = PUT
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=985369 $timestamp=1767952103448
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": "true","sn": "BKXXXXXXXXXXXXX", "params": {"cfgFeedGridMode": "2"}}
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota $query_str = cmdFunc=254&cmdId=17&dest=2&dirDest=1&dirSrc=1&needAck=true¶ms.cfgFeedGridMode=2&sn=BKXXXXXXXXXXXXX&accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxD&nonce=985369×tamp=1767952103448
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": "true","sn": "BKXXXXXXXXXXXXX", "params": {"cfgFeedGridMode": "2"}}
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax: $model = STREAM MAX
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota
2026.01.09 10:48:23 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"8524","message":"Validation failed, Please check your param: cfgFeedGridMode","eagleEyeTraceId":"","tid":""}
2026.01.09 10:48:23 0: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): ERROR! {"code":"8524","message":"Validation failed, Please check your param: cfgFeedGridMode","eagleEyeTraceId":"","tid":""}
2026.01.09 10:48:23 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = GET
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=816752 $timestamp=1767952145429
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/list $query_str = accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxD&nonce=816752×tamp=1767952145429
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = GET
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=143763 $timestamp=1767952145431
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota/all?sn=BKXXXXXXXXXXXXX $query_str = accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxD&nonce=143763×tamp=1767952145431
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/list
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"0","message":"Success","data":[{"sn":"BKXXXXXXXXXXXXX","deviceName":"STREAM Max-7155gol","online":1}],"eagleEyeTraceId":"","tid":""}
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): code = 0
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_deviceName = STREAM Max-7155gol
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_online = 1
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn = BKXXXXXXXXXXXXX
2026.01.09 10:49:05 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn : Comparing SerialNo BKXXXXXXXXXXXXX
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $base = data_1
2026.01.09 10:49:05 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): STREAM Max-7155gol
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): eagleEyeTraceId =
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): message = Success
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): tid =
2026.01.09 10:49:05 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota/all?sn=BKXXXXXXXXXXXXX
2026.01.09 10:49:05 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 09 Januar 2026, 12:07:46
Erste Auffälligkeit: wo sind Deine GetCmdCodes ?

Du testet immer mit sets. Das ist komplizierter.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 11 Januar 2026, 10:24:34
Hi,
sorry am WE ist immer schlecht mit antworten.
Die Get hab ich noch nicht gemacht, ich dachte erstmal die SetCmd zum laufen bringen und dann weitermachen. Ich werde die Montag fertig machen.

Gruß Denis
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 12 Januar 2026, 07:18:37
So die Get sind drinn:
hier der Code für Stream MAX
"STREAM MAX" => {
"Adjustments" => {},
"Gets" => {
"relay2Onoff" => "",
"backupReverseSoc" => "",
"energyStrategyOperateMode.operateSelfPoweredOpen" => "",
"energyStrategyOperateMode.operateIntelligentScheduleModeOpen" => "",
"feedGridMode" => "",
},
"Sets" => {
"cfgRelay2Onoff" => ":true,false",
"cfgBackupReverseSoc"=> ":slider,3,1,95",
"cfgEnergyStrategyOperateMode.operateSelfPoweredOpen" => ":true",
"cfgEnergyStrategyOperateMode.operateIntelligentScheduleModeOpen" => ":true",
"cfgFeedGridMode" => ":1,2",
},
"GetCmdCodes" => {
"relay2Onoff" =>                                           { "params.quotas" => {"relay2Onoff" => "",} },
"backupReverseSoc" =>                                       { "params.quotas" => {"backupReverseSoc" => ""},  },
"energyStrategyOperateMode.operateSelfPoweredOpen" =>       { "params.quotas" => {"energyStrategyOperateMode.operateSelfPoweredOpen" => ""} },
"energyStrategyOperateMode.operateIntelligentScheduleModeOpen" => { "params.quotas" => {"energyStrategyOperateMode.operateIntelligentScheduleModeOpen" => ""} },
"feedGridMode" =>                                       { "params.quotas" => {"feedGridMode" => ""} },
},
"SetCmdCodes" => {
    "cfgRelay2Onoff" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "needAck" => "true", "dest" => 2, "params.cfgRelay2Onoff" => "a[2]"},
"cfgBackupReverseSoc" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgBackupReverseSoc" => "a[2]" },
"cfgEnergyStrategyOperateMode.operateSelfPoweredOpen" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgEnergyStrategyOperateMode.operateSelfPoweredOpen" => "a[2]"},
"cfgEnergyStrategyOperateMode.operateIntelligentScheduleModeOpen" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgEnergyStrategyOperateMode.operateIntelligentScheduleModeOpen" => "a[2]"},
"cfgFeedGridMode" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgFeedGridMode" => "a[2]"},
},

Gurß Denis


hier der Auszug aus dem Log:
2026.01.12 07:07:31 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax: $model = STREAM MAX
2026.01.12 07:07:44 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax: $model = STREAM MAX
2026.01.12 07:07:44 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): cmd = relay2Onoff
2026.01.12 07:07:44 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax has GetCmdCodes
2026.01.12 07:07:44 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): $key = params.quotas
2026.01.12 07:07:44 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): $str_value =
2026.01.12 07:07:44 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = POST
2026.01.12 07:07:44 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=553634 $timestamp=1768198064501
2026.01.12 07:07:44 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"sn": "BKXXXXXXXXXXXXX", "params": {"quotas":["relay2Onoff"]}}
2026.01.12 07:07:44 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota $query_str = params.quotas[0]=relay2Onoff&sn=BKXXXXXXXXXXXXX&accessKey=XXXXXXXXXXXXXXXXXXXXXXXXXX&nonce=553634×tamp=1768198064501
2026.01.12 07:07:44 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2026.01.12 07:07:44 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"sn": "BKXXXXXXXXXXXXX", "params": {"quotas":["relay2Onoff"]}}
2026.01.12 07:07:44 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota
2026.01.12 07:07:44 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"0","message":"Success","data":{"relay2Onoff":true},"eagleEyeTraceId":"","tid":""}
2026.01.12 07:07:44 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = GET
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=376545 $timestamp=1768198072616
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/list $query_str = accessKey=XXXXXXXXXXXXXXXXXXXXXXXXXX&nonce=376545×tamp=1768198072616
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = GET
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=754027 $timestamp=1768198072619
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota/all?sn=BKXXXXXXXXXXXXX $query_str = accessKey=XXXXXXXXXXXXXXXXXXXXXXXXXX&nonce=754027×tamp=1768198072619
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/list
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"0","message":"Success","data":[{"sn":"BKXXXXXXXXXXXXX","deviceName":"STREAM Max-7155gol","online":1}],"eagleEyeTraceId":"","tid":""}
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): code = 0
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_deviceName = STREAM Max-7155gol
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_online = 1
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn = BKXXXXXXXXXXXXX
2026.01.12 07:07:52 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn : Comparing SerialNo BKXXXXXXXXXXXXX
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $base = data_1
2026.01.12 07:07:52 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): STREAM Max-7155gol
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): eagleEyeTraceId =
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): message = Success
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): tid =
2026.01.12 07:07:52 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota/all?sn=BKXXXXXXXXXXXXX
2026.01.12 07:07:52 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars
2026.01.12 07:08:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax: $model = STREAM MAX
2026.01.12 07:08:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): cmd = feedGridMode
2026.01.12 07:08:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax has GetCmdCodes
2026.01.12 07:08:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): $key = params.quotas
2026.01.12 07:08:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): $str_value =
2026.01.12 07:08:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = POST
2026.01.12 07:08:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=981418 $timestamp=1768198080985
2026.01.12 07:08:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"sn": "BKXXXXXXXXXXXXX", "params": {"quotas":["feedGridMode"]}}
2026.01.12 07:08:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota $query_str = params.quotas[0]=feedGridMode&sn=BKXXXXXXXXXXXXX&accessKey=XXXXXXXXXXXXXXXXXXXXXXXXXX&nonce=981418×tamp=1768198080985
2026.01.12 07:08:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2026.01.12 07:08:00 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"sn": "BKXXXXXXXXXXXXX", "params": {"quotas":["feedGridMode"]}}
2026.01.12 07:08:01 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota
2026.01.12 07:08:01 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"0","message":"Success","data":{"feedGridMode":2},"eagleEyeTraceId":"","tid":""}
2026.01.12 07:08:01 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars
2026.01.12 07:08:07 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax: $model = STREAM MAX
2026.01.12 07:08:07 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): cmd = energyStrategyOperateMode.operateSelfPoweredOpen
2026.01.12 07:08:07 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax has GetCmdCodes
2026.01.12 07:08:07 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): $key = params.quotas
2026.01.12 07:08:07 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): $str_value =
2026.01.12 07:08:07 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = POST
2026.01.12 07:08:07 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=763286 $timestamp=1768198087133
2026.01.12 07:08:07 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"sn": "BKXXXXXXXXXXXXX", "params": {"quotas":["energyStrategyOperateMode.operateSelfPoweredOpen"]}}
2026.01.12 07:08:07 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota $query_str = params.quotas[0]=energyStrategyOperateMode.operateSelfPoweredOpen&sn=BKXXXXXXXXXXXXX&accessKey=XXXXXXXXXXXXXXXXXXXXXXXXXX&nonce=763286×tamp=1768198087133
2026.01.12 07:08:07 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2026.01.12 07:08:07 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"sn": "BKXXXXXXXXXXXXX", "params": {"quotas":["energyStrategyOperateMode.operateSelfPoweredOpen"]}}
2026.01.12 07:08:07 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota
2026.01.12 07:08:07 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"0","message":"Success","data":{"energyStrategyOperateMode.operateSelfPoweredOpen":true},"eagleEyeTraceId":"","tid":""}
2026.01.12 07:08:07 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 12 Januar 2026, 08:24:58
Na wer sagt es denn: Success  8)

Also klappt der generelle Zugriff.

Bleiben die sets. Guck als 1. mal nach dem xtamp. Evtl. versehentlich timestamp im Code überschrieben ?
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 12 Januar 2026, 09:26:00
Hi,

Nein das wort xtamp ist nicht im Code vorhanden. Da wo timestamp stehen soll ist es auch immer vorhanden.
Ich habe die Datei mal im jetzigen Zustand amgehängt.

Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 12 Januar 2026, 18:12:30
Deine Version liefert bei mir kein xstamp. :o

Shutdown Restart gemacht ? wie hast Du URL::Encode installiert ? Bei welcher Hardware/OS Konstellation ?

Edit: nimm bitte mal meine Version, denn Deine verursachte bei mir andere Probleme.
Ich habe Deine Daten für Stream max übernommen. Nicht aber die "model detection". Knut hat das Attribut testmodel eingebaut. Wenn Du das mit STREAM MAX anlegst, sollte es auch funktionieren.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 13 Januar 2026, 06:40:10
Hallo,

die Hardware wird jetzt nicht mehr erkannt. Da er immernoch das Problem mit dem Xtamp hat werde ich die Perl Module alle noch mal mit einem Update versehen. Wenn ich noch die nötige Zeit habe werde ich das gesammte system updaten.
Ich habe einen Odroid HC2 mit DietPi v9.xy Shutdown Restart habe ich schon mehrfach gemacht.

2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax: $model =
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): cmd = devices
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = GET
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=124528 $timestamp=1768282049382
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/list $query_str = accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nonce=124528×tamp=1768282049382
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/list
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"0","message":"Success","data":[{"sn":"BKxxxxxxxxxxxxxx","deviceName":"STREAM Max-7155gol","online":1}],"eagleEyeTraceId":"","tid":""}
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): code = 0
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_deviceName = STREAM Max-7155gol
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_online = 1
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn = BKxxxxxxxxxxxxxx
2026.01.13 06:27:29 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): data_1_sn : Comparing SerialNo BKxxxxxxxxxxxxxx
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $base = data_1
2026.01.13 06:27:29 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response():
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): eagleEyeTraceId =
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): message = Success
2026.01.13 06:27:29 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): tid =
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 13 Januar 2026, 19:55:07
ZitatOdroid HC2 mit DietPi v9.xy
Da bin ich raus.
Attribut hattest Du gesetzt ? Was steht im Internal Model ?
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 14 Januar 2026, 06:58:12
Hi,
ich habe das mit dem attr testModel versucht, das Funktioniert. Ich habe aber noch keine Lösung für:

"&needAck=true¶ms.cfgRelay2Onoff=false"

und "xtamp" gefunden. Ein Update des Moduls URL::Encode habe ich gemacht. Das hat nicht geholfen.

Gruß Denis 
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: phantom am 17 Februar 2026, 10:37:18
HI,
gibt es schon einen Fortschritt für Ecoflow STREAM Module? Insbesondere wie aktiviert man die Set-Funktionen?
Die GET Funktionen zum Auslesen klappt auch mit den Ecoflow STREAM Ultra
aber bei den SET Funktionen (z.B. zum Schalten der Ausgänge) mittels PUT oder POST calls komme ich nicht weiter
PS: ich bin mit der Modulversion von KölnSolar aus #127 am weitesten gekommen
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 19 Februar 2026, 10:21:02
Nice, gefällt mir. Sollten wir den SourceCode nach Github transferieren?

Sorry, über dne Winter war ich ziemlich untätig, weil meine Solaranlage da auch nicht so viel zu tun hatte. :)
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 19 Februar 2026, 16:41:40
Hallo phantom,
ja get funktioniert, kannst du mal versuchen einen Set mit verbose 5 zu machen und dann den Auszug aus dem Log hier Posten? Unkenntlich machen der Seriennummer und API Keys nicht vergessen. Mich würde interessieren ob da die Probleme wie bei mir auftreten. ich habes es schon soweit probiert, das ich das URL encode schon von Hand als Funktion eingebaut habe, was auch keine änderung brachte, bei mir fehl nur noch als Versuch ein komplettes System Update aus. Das hat aber erstmal keine Prio, da für mein Balkonkraftwerk ein neues Smart Meter her müsste von Janitza umg103 auf Shelly pro 3em( was für ein Abstieg)).

Gruß Denis
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: phantom am 21 Februar 2026, 15:32:24
die Set Funktion für die Ausgänge, etc.  wird bei mir erst gar nicht im Frontend angezeigt  :o

ich vermute, weil auch die "detect model" Set-Funktion des Ecoflow Model nicht erkennt (dessen Name ist bei mir als "Ultra-1083" über die App eingetragen)
ist das Erkennen des Modells ggf. eine Voraussetzung für alles Weitere?
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 21 Februar 2026, 18:17:56
ZitatSollten wir den SourceCode nach Github transferieren?

Sorry, über dne Winter war ich ziemlich untätig,
Und weil Du Dich lange nicht gemeldet hattest, habe ich zwischenzeitlich eine stark veränderte Version entwickelt.
Da sollten wir dann
1. schauen, ob meine Version nicht sinnvoller ist und
2. Warum github ? wenn doch ins FHEM-SVN als offizielles Modul.

ZitatErkennen des Modells ggf. eine Voraussetzung für alles Weitere?
Das lässt sich im Augenblick über das attr testmodel lösen. Set müsstest Du mit der zitierten Version dann bekommen(wird aber vermutlich wie bei Denis ohne Erfolg sein)

Ich werde vermutlich in 1-2 Wochen so weit sein, dass ich hier eine erste Version veröffentlichen kann und dann auch detailliert erläutern, was und warum ich "Funktionalitäten" verändert habe.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: phantom am 22 Februar 2026, 12:55:45
Hi zusammen, 
es stimmt  :P  testModel bringt nicht wirklich weiter; es bleibt bei den GET's
die SET's über PUT bzw. POST bekomme ich auch mittels curl nicht hin, obwohl curl-GET problemlos klappt
--> ich werde hier auf eine verbesserte Version von KölnSolar warten (nur kein Stress, es scheint ja ohnehin nicht so viel Sonne ...)

Bis dahin habe ich mal die Ecoflow STREAM's mittels MQTT2_CLIENT in FHEM eingebunden und darüber konnte man auch SET's per MQTT-Publish absetzen. Das Ganze via MQTT ist etwas "unplanbar", da nicht zu erkennen ist wann Ecoflow welche der vielen subscribe-Werte aktualisiert.

bis dahin  Gruß phantom
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 22 Februar 2026, 16:56:41
ZitatBis dahin habe ich mal die Ecoflow STREAM's mittels MQTT2_CLIENT in FHEM eingebunden und darüber konnte man auch SET's per MQTT-Publish absetzen.
Genau.
Zitat--> ich werde hier auf eine verbesserte Version von KölnSolar warten (nur kein Stress, es scheint ja ohnehin nicht so viel Sonne ...)
Da muss ich Dich leider enttäuschen. Ich habe ja dasselbe und ungelöste Problem mit meinem powerstream, der bei anderen problemlos funktioniert. :'(
Mit meiner Version wird lediglich das debugging transparenter, da nicht z.B. durch das set ein reading ein update erfährt, sondern nur, wenn wirklich Daten von der API kommen. Überraschend wieviele readings es gibt, aber nur wenige tatsächlich "genutzt" werden.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: phantom am 22 Februar 2026, 17:48:12
ich habe die HTTP API nochmal "von Hand" mit curl gemäß der Ecoflow Dokumentation durchprobiert
GET: /iot-open/sign/device/system/main/sn?sn=BKXXXXXXXXXX  klappt problemlos
aber
PUT: /iot-open/sign/device/quota: SetCmdRequest
POST: /iot-open/sign/device/quota: GetCmdRequest, GetCmdResponse

klappt mit den identischen Zugangsdaten nicht, es bringt stets "signature ist wrong"

hat das evtl. schon jemand erfolgreich beim Ecoflow STREAM geschafft?
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 26 Februar 2026, 11:35:36
Zitat von: KölnSolar am 21 Februar 2026, 18:17:56
ZitatSollten wir den SourceCode nach Github transferieren?

Sorry, über dne Winter war ich ziemlich untätig,
Und weil Du Dich lange nicht gemeldet hattest, habe ich zwischenzeitlich eine stark veränderte Version entwickelt.
Da habe ich keine Schmerzen mit, ich hatte neulich erst festgestellt, daß alle Notifications vom Forum im Spam gelandet waren, und der wird leider auch recht schnell geleert.
Mich freut, daß Leben in die Sache kommt, und daß ich Verantwortung abgeben kann, ich war dann auch beruflich stark eingespannt und hatte kaum Zeit, mich um das Modul weiter zu kümmern, von daher ist es besser, wenn es auch mehreren Schultern liegt.
Zumal meine Perl-Kenntnisse für den Hausgebrauch reichen, tief in Perl einsteigen wollte ich eigentlich nie.  ;)
Zitat von: KölnSolar am 21 Februar 2026, 18:17:56Da sollten wir dann
1. schauen, ob meine Version nicht sinnvoller ist und
Da muss man nicht schauen, alles andere wäre ein Rückschritt.

Zitat von: KölnSolar am 21 Februar 2026, 18:17:562. Warum github ? wenn doch ins FHEM-SVN als offizielles Modul.
Ja, das meinte ich eigentlich.  :-[

Nein, stellt das ins FHEM-SVN und macht weiter, ich hab im Moment beruflich soviel vorm Bauch, dass ich da sowieso nicht weiterkomme.
Im Gegenteil, das soll ja weitergehen, und dazu ist OpenSource doch da.

Wie schon mal gesagt (glaube ich), ich wollte schon immer mal ein kleines FHEM-Modul schreiben, dieses wurde aus der Not geboren. Und da sich der Solarmarkt so explosiv entwickelt und die Hersteller ihr Angebot so schnell und groß verbreitern... da komm ich wohl nicht hinterher. :)

Also, haut rein, Jungs!
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Neolux am 26 Februar 2026, 11:40:03
Zitat von: phantom am 22 Februar 2026, 17:48:12PUT: /iot-open/sign/device/quota: SetCmdRequest
POST: /iot-open/sign/device/quota: GetCmdRequest, GetCmdResponse
klappt mit den identischen Zugangsdaten nicht, es bringt stets "signature ist wrong"
hat das evtl. schon jemand erfolgreich beim Ecoflow STREAM geschafft?
Da kann ich aus Erfahrung nur den Tipp geben: Meist muss die Reihenfolge der Parameter beachtet werden, sonst ist die Prüfsumme ("Signature") angeblich falsch, obwohl der Wert der Signature sich eigentlich nicht ändert. Nicht ärgern, nur wundern.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 03 März 2026, 11:00:40
Hallo zusammen,

kleine Status Update meinerseits:
 $ContentType=$ContentType.";UTF-8"; Geändert in :
 $ContentType=$ContentType.";charset=UTF-8";

¶ms. ×tamp sind natürlich nur Anzeigefehler im Browser &para ist eine HTML-Entität die eine Absatzzeichen erzeugt und &times erzeugt ein x (Multiplikationszeichen) in der Anzeige des Browsers. Wenn man in den Seitenquelltext der Browsers guckt erkennt das schnell...

Get funktioniert:
2026.03.03 10:44:19 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax: $model = STREAM MAX
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax: $model = STREAM MAX
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): cmd = relay2Onoff
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): EcoFlowMax has GetCmdCodes
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): $key = params.quotas
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Get(): $str_value =
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = POST
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=958137 $timestamp=1772531088118
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"sn": "BK41Zxxxxxxxxxxx", "params": {"quotas":["relay2Onoff"]}}
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $request_str = params.quotas[0]=relay2Onoff&sn=BK41Zxxxxxxxxxxx
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $query_str = params.quotas[0]=relay2Onoff&sn=BK41Zxxxxxxxxxxx&accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nonce=958137×tamp=1772531088118
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota $query_str = params.quotas[0]=relay2Onoff&sn=BK41Zxxxxxxxxxxx&accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nonce=958137×tamp=1772531088118
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = c10141ab3d40c8900a8963b548616c0afd58d82d97a86b04e3ac832e34f6b3d7
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"sn": "BK41Zxxxxxxxxxx", "params": {"quotas":["relay2Onoff"]}}
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota
2026.03.03 10:44:48 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"0","message":"Success","data":{"relay2Onoff":false},"eagleEyeTraceId":"","tid":""}
2026.03.03 10:44:48 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars

Nur das die Readings nach dem lesen nicht sofort aktualisiert werden.

Set funktioniert noch nicht :
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = needAck
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdFunc
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirSrc
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdId
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = params.cfgRelay2Onoff
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $str_value = a[2]
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirDest
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dest
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = PUT
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=416540 $timestamp=1772531500698
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": "true","sn": "BK41Zxxxxxxxxxx", "params": {"cfgRelay2Onoff": "true"}}
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $request_str = cmdFunc=254&cmdId=17&dest=2&dirDest=1&dirSrc=1&needAck=true&params.cfgRelay2Onoff=true&sn=BK41Zxxxxxxxxx
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $query_str = cmdFunc=254&cmdId=17&dest=2&dirDest=1&dirSrc=1&needAck=true&params.cfgRelay2Onoff=true&sn=BK41Zxxxxxxxxx&accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nonce=416540&timestamp=1772531500698
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota $query_str = cmdFunc=254&cmdId=17&dest=2&dirDest=1&dirSrc=1&needAck=true&params.cfgRelay2Onoff=true&sn=BK41Zxxxxxxxxxxxxxx&accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nonce=416540&timestamp=1772531500698
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = 19a3010cff2ed1b4c3eddea2a790f88a9b2a29b4a1564a59a652cd62875f8d96
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": "true","sn": "BK41Zxxxxxxxxxxxx", "params": {"cfgRelay2Onoff": "true"}}
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota
2026.03.03 10:51:40 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"8524","message":"Validation failed, Please check your param: cfgRelay2Onoff","eagleEyeTraceId":"","tid":""}
2026.03.03 10:51:40 0: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): ERROR! {"code":"8524","message":"Validation failed, Please check your param: cfgRelay2Onoff","eagleEyeTraceId":"","tid":""}
2026.03.03 10:51:40 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars
(Params und Timestamp hier verbessert da es sonnst die irrefürende Anzeige aus dem Browser gäbe)


gruß Denis 
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 03 März 2026, 13:47:36
ZitatNur das die Readings nach dem lesen nicht sofort aktualisiert werden
langsame Hardware ? könnte am BlockingCall liegen. Ist dann aber richtig so.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 06 März 2026, 09:35:59
Hallo zusammen,

so erster erfolg beim SET:
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dest
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirDest
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = params.cfgRelay2Onoff
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $str_value = a[2]
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdId
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = cmdFunc
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = needAck
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Set(): $key = dirSrc
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): Method = PUT
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $nonce=804404 $timestamp=1772785645107
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": true,"sn": "BKxxxxxxxxxxxxxxxx", "params": {"cfgRelay2Onoff": true}}
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $request_str = cmdFunc=254&cmdId=17&dest=2&dirDest=1&dirSrc=1&needAck=true&params.cfgRelay2Onoff=true&sn=BKxxxxxxxxxxxxxx
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $url = /iot-open/sign/device/quota $query_str = cmdFunc=254&cmdId=17&dest=2&dirDest=1&dirSrc=1&needAck=true&params.cfgRelay2Onoff=true&sn=BKxxxxxxxxxxxxxx&accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nonce=804404&timestamp=1772785645107
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $sign = 74bf2913aa5958555d24417d3acdf34b6f513c4f9e4e549efc8fe55bc52f2aa7
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Request(): $json = {"cmdFunc": "254","cmdId": "17","dest": "2","dirDest": "1","dirSrc": "1","needAck": true,"sn": "BKxxxxxxxxxxxxxx", "params": {"cfgRelay2Onoff": true}}
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota
2026.03.06 09:27:25 5: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): $data = {"code":"0","message":"Success","eagleEyeTraceId":"","tid":""}
2026.03.06 09:27:25 4: EcoFlowMax(Ecoflow 0.3.9.0): Ecoflow_Response(): Setting Reading Vars

habe in Ecoflow_Request()
die folgende Zeilen eingefügt, damit der Json Stirng auch richtig ist. Ich glaube das mach ich noch für die zahlen, damit alles richtig ist... 
$json=~ s/"true"/true/g;
$json=~ s/"false"/false/g;

gruß Denis

edit: für die zahlen noch
$json=~ s/"(\d+)"/$1/g;einfügen, dann geht auch das!
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 06 März 2026, 13:28:11
So im Anhang mal meine aktuelle Version.
Folgene Geräte sollten jetzt zusätzlich noch unterstützt werden:
Name für testModel  Unterstütes Gerät
STREAM AC           STRAEM AC
STREAM MAX          STREAM MAX
STREAM UP           STREAM Ultra, STREAM Pro, STREAM AC Pro, STREAM Ultra X, STREAM Ultra (US)
Da ich nur die MAX habe kann ich die anderen Modelle leider nicht testen.

Schönes Sonniges Wochenende
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 12 März 2026, 10:28:40
Hallo zusammen,

hier meine Aktuelle Version, ich habe jetzt auch die "Historischen" Daten für die STREAM Serie mit eingebaut, getestet nur für die MAX.
Damit können jetzt die Werte für beliebige Zeiträume gelesen werden. Wird unter
SolarGeneratedPower, EnergyIndependence, EnvironmentalImpact, TotalSolarEnergySavings, ElectricityConsumption, Grid und BatteryChargingDischargingPower ein Zeitraum im Form von
 2026-03-09 00:00:00 2026-03-10 23:59:59 angegeben so werden die Werte für den 09. und 10.03.26 gelesen und im Reading mit den entsprechenden Namen abgelegt. Wird kein Datum angebeben, so werden die Werte des aktuellen Tages gelesen. 

Gruß Denis

PS: Bitte mal testen ob Irgendwelche Fehler auftreten
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: rubberduck67 am 12 März 2026, 13:27:23
Moin zusammen!

Danke für die Arbeit.
Bei mir klappt der Acesskey nicht. Wenn ich das vorrige Modul einstelle, geht alles wieder.
Gruß
Sven
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 12 März 2026, 18:59:43
Zitathier meine Aktuelle Version, ich habe jetzt auch die "Historischen" Daten für die STREAM Serie mit eingebaut, getestet nur für die MAX.
Damit können jetzt die Werte für beliebige Zeiträume gelesen werden. Wird unter
SolarGeneratedPower, EnergyIndependence, EnvironmentalImpact, TotalSolarEnergySavings, ElectricityConsumption, Grid und BatteryChargingDischargingPower ein Zeitraum im Form von
Dann muss ich wohl doch wieder das "Single read" einbauen. Bei powerstream und Delta machte das entweder keinen Sinn(es gibt keine historischen Daten) oder es wurde übersehen.

Ich guck es mir mal an....

Grüße
Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: rubberduck67 am 12 März 2026, 19:37:40
Zitat von: KölnSolar am 12 März 2026, 18:59:43
Zitathier meine Aktuelle Version, ich habe jetzt auch die "Historischen" Daten für die STREAM Serie mit eingebaut, getestet nur für die MAX.
Damit können jetzt die Werte für beliebige Zeiträume gelesen werden. Wird unter
SolarGeneratedPower, EnergyIndependence, EnvironmentalImpact, TotalSolarEnergySavings, ElectricityConsumption, Grid und BatteryChargingDischargingPower ein Zeitraum im Form von
Dann muss ich wohl doch wieder das "Single read" einbauen. Bei powerstream und Delta machte das entweder keinen Sinn(es gibt keine historischen Daten) oder es wurde übersehen.

Ich guck es mir mal an....

Grüße
Markus
Danke!
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 12 März 2026, 20:17:51
wie vermutet handelt es sich um eine "zusätzliche" URL "POST: /iot-open/sign/device/quota/data", die es für die Delta's, powerstream... nicht gibt.

Da werde ich den Code von Denis anschauen und übernehmen...

Edit: verstanden. Du hast Dich an 'JT303_Dashboard_Overview_Summary_Week' angelehnt, was ich mangels Nachvollziehbarkeit eliminiert hatte. Nochmal recherchiert mit Ergebnis, dass das historische Daten zur PowerOcean sind.
Da hatte ich die devicespezifischen gets schon eliminiert, da sie nicht darüber hinausgehen was ein "all data" auch überträgt und somit wenig Sinn machten(zumindest bei Delta, powerstream). Für die historischen Daten ist es aber etwas anderes. Die sind zusätzlich.
@Denis: Ist es bei den Stream Devices auch so, dass, abgesehen von den historischen Daten, sämtliche Daten der "Single gets" auch bei "all data" übertragen werden ? Ich würde dann nämlich die "getcmds" auf POST und einzig die historischen Daten umbauen
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 13 März 2026, 07:07:38
Ja, es ist so, dass sämtliche Daten der "Single gets" auch bei "all data" Übertragen werden.

Gruß Denis
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Cineman am 15 März 2026, 10:52:29
Hallo! Ich bin neu in diesem Forum und hoffe auf Eure Hilfe, obwohl ich kein FHEM-Nutzer bin (aktuell versuche ich meine Einbindung über n8n und in mein laufendes Openhab-System).
Ich besitze eine Stream Ultra und Stream AC Pro. Bisher ist mir mit den Jinweisen in diesem Forum gelungen die GET-Befehle umzusetzen. Ein herzlichen Dank für diese Infos! Jedoch schaffe ich es keine PUT oder POST Befehle zu senden. Ist das schon jemandem gelungen? Und wenn ja, wie????
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 15 März 2026, 13:43:24
https://forum.fhem.de/index.php?topic=140806.msg1358983#msg1358983
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 15 März 2026, 19:21:16
Hallo Denis,

anbei meine 1. Version, die bitte nur Du zum Test, insbesondere der historischen Daten, einsetzt.

Es gibt nur noch modellspezifische gets für die historischen Daten. Aktuelle "Allgemeine" Daten außerhalb der zyklischen Abfrage erhält man durch ein get update.

Updates/Timestamps von readings sind deutlich verändert. Dazu schreibe ich ausführlich etwas, wenn der Test erfolgreich war.

Wichtige Änderungen bei den Attributen:
- ecInterval geändert zu interval
- Testmodel geändert in Model

Eine englische commandref gibt es auch. Natürlich nur sichtbar mit dem nächsten FHEM-Update.

Ich hoffe es klappt. Ich kann es ja nicht testen.

Grüße Markus

Edit: neuere Version s.u.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 15 März 2026, 21:15:28
Hallo Markus,

so habe mich gerade mal hingesetzt und getestet. Hat alles funktioniert.

Gruß Denis
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 16 März 2026, 13:50:03
Prima, danke. Dann kann es jetzt jeder einsetzen.

Und nun noch die versprochene Dokumentation meiner Änderungen.

Erst einmal vielen Dank für das sicherlich seeeeeehr aufwändige Entwickeln des Moduls für die Ecoflow-Produkte auf Basis der von Ecoflow bereitgestellten API an Neolux.

Nun kurz zu meinen Beweggründen das Modul anzupassen:
Meine Delta2 weist/wies einen Defekt auf. Um diesen nachzuweisen ist das Verständnis und dann die Aufzeichnung der Notwendigen aus der der schier unendlichen Zahl der Readings nötig.
In der ursprünglichen Fassung war dies nicht möglich, weil:
- beim Abruf von Daten der timestamp für JEDES Datum, welches in der Cloud vorliegt, verändert wurde. Tatsächlich aber nur wenige Daten verändert werden
- Selbst ausgesetzter tatsächlicher Betrieb des physischen devices oder Störungen der Übertragung an die Ecoflow-Cloud konnten nicht erkannt werden, weil das Modul immer die in der Cloud vorhandenen Daten nach FHEM übertrug
- ein set änderte das betroffene Reading, obwohl das set vielleicht gar nicht erfolgreich war(kann u.U. vorkommen, wenn z.B. das device gar nicht mit der Cloud verbunden ist)

Das Modul nutzt nun
- konsequent update-if-changed, so dass nur veränderte readings ein event auslösen.
- das von mir selbst geforderte Attribut  "no_data_20_134", was ebenfalls zu mehr Übersichtlichkeit führen sollte, habe ich entfernt, da nun mit dem Standard-Attribut suppressreadings der vergleichbare Effekt erreicht wird
- eine für mich nicht nachvollziehbare Anpassung zu den Standard-Attributen "event-on-change" habe ich entfernt.
  Die Standard event-on-.... Attribute liefern nun wieder zu erwartende Ergebnisse
 
Die Umsetzung jedes einzelnen MÖGLICHEN device-spezifischen Datums durch get, führte zu einer sehr unübersichtlichen Anzahl von gets, obwohl diese Daten auch mit einem get "all" geliefert werden.
Folglich macht deren Berücksichtigung wenig Sinn. Ich habe diese vollständig entfernt und durch einen einzelnen Abruf "get update" ersetzt, sofern jemand Bedarf an der Aktualisierung der Daten außerhalb des zyklischen automatischen Abrufs haben sollte.
device spezifische gets sind somit nur noch für Daten realisiert, die nicht mit get update abrufbar sind. Nach aktuellen Erkenntnissen betrifft dies nur historische Daten bei PowerOcean und Stream xyz Modellen.

Im Ergebnis ist nun viel leichter ersichtlich, welche Daten sich tatsächlich im Betrieb verändern, Loggingdaten sind deutlich reduziert.

Ebenfalls für Intransparenz sorgte die Darstellung von Bildschirmausgaben nach set/get.
Tatsächlich ist es so, dass das Modul richtigerweise Non-Blocking-Get einsetzt.
Das bedeutet im wesentlichen, dass das Modul nicht blockiert, nur weil Antwortzeiten deren Server unbefriedigend sind.
Es bedeutet nun einmal aber auch, dass eine erfolgreiche Verarbeitung der set/get Befehle nicht im Augenblick des Senden ersichtlich ist, sondern erst sobald auch tatsächlich eine Antwort aus der Cloud erfolgt ist.
In der vorherigen Fassung des Moduls wurden also lediglich "alte" Informationen angezeigt. Die "Wahrheit" war erst nach einem Empfang von Daten in den readings ersichtlich, die sich u.U. flip-/flop-mäßig änderten.
Ich habe daher entweder auf Anzeigen verzichtet oder weise in den Bildschirmmeldungen zumindest darauf hin, dass "veraltete" Daten angezeigt werden.

Die device- u. readingspezifischen "adjustments", halte ich für eine sehr sinnvolle Idee von Neolux. Ich habe dazu kleinere Anpassungen vorgenommen:
- device-spezifische Anpassung der einzelnen readings-Werte, sofern modulintern zum device konfiguriert(war bereits so implementiert)
- Zeitangaben sind scheinbar immer in Sekunden. Enthält der reading-Name das Literal "time" wird automatisch in hh:mm umgerechnet
- Internal HardwareVersion entfernt; nun lesbar über die 6 hwVersion_x readings

Weitere Kleingkeiten, die ich geändert habe:
 - kein set für AccessKey, da fehleranfällig; bei Änderung des AccessKey besser defmod ausführen
 - set "SerialNo", "deleteReadings" entfernt
 - einiges im Code zur Verbesserung der Lesbarkeit geändert, reduziert

Hier noch meine Beispiele für den sinnvollen Einsatz der Standard-Attribute.

Für eine Delta2:
attr Delta2_AC event-on-change-reading .*
attr Delta2_AC event-min-interval data_pd.inputW.*:160,data_pd.out.*W.*:160,data_pd.usb.W.*:160,data_pd.watts.*:160
attr Delta2_AC timestamp-on-change-reading .*
bewirkt, dass nur für Daten, die wirklich aktualisiert wurden ein event erzeugt wird. Der readings-timestamp ändert sich auch nur bei Änderung. Nach einiger Laufzeit erkennt man die wenigen wirklich genutzten readings.
Ich habe sogar manuell die timestamps der readings OHNE update in meinem FHEM so angepasst, dass ich leicht an den timestamps erkennen kann, ob und wann sich deren Wert tatsächlich geändert hat.(2025-12-31 23:59:59)
Für durchgängige Plots die Ausnahme mit event-min-interval, dass auch ohne Änderung ein update erfolgt

Für einen Powerstream:
attr Powerstream_AC event-on-change-reading .*
attr Powerstream_AC suppressReading data_20_134.*
attr Powerstream_AC timestamp-on-change-reading .*
Vergleichbar den Attributen zur Delta2. Zusätzlich die Unterdrückung der unsäglichen time-schedule-Readings.

Sicherlich habe ich noch etwas vergessen, aber so ist das leider bei umfangreichen Änderungen.

Bedenkt, dass Ihr nach Einspielen in Euer FHEM ein "reload 98_Ecoflow" machen müsst und mindestens das Attribut ecInterval löschen und ggfs. das Attribut interval anlegen müsst.
Wenn das nicht klappt, müsst Ihr das device neu anlegen. Vorsicht: Holt Euch vorher den SecretKey, da dieser beim Löschen des devices auch aus der Datei gelöscht und wieder neu eingegeben werden muss.

Und nun bin ich auf Euer Feedback gespannt.

Sicherlich werden noch die ein oder andere Anpassung am Modul notwendig, aber in absehbarer Zeit würde ich es dann offiziell mit automatischer Verteilung machen.

Have fun
Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 17 März 2026, 19:30:07
Ich habe einen API-Zugang zum Ecoflow (Stream ac pro) beantragt. Dazu habe ich eine Frage zum aktuellen Modul. Erfolgt die Kommunikation über das Modul mit dem Ecoflow über das lokal Netz oder geht die Kommunikation über's Internet wie bei der App?
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 18 März 2026, 03:19:49
Hallo,

die Kommunikation erfolgt über das Internet wie Bei der App. Eine locale Verbindung ist leider noch nicht möglich.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 18 März 2026, 09:37:50
Das Modul baut auf der API von Ecoflow mit Zugriff auf deren Cloud auf.

Der MQTT-Zugriff funktioniert(bin mir gerade nicht zu 100% sicher) ohne Cloud. Allerdings stellt das device das Senden "irgendwann"(muss noch detaillierter analysiert werden) wieder ein und ein Anstoß über die Äpp ist notwendig.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 18 März 2026, 12:32:30
Zitat von: KölnSolar am 18 März 2026, 09:37:50Das Modul baut auf der API von Ecoflow mit Zugriff auf deren Cloud auf.

Der MQTT-Zugriff funktioniert(bin mir gerade nicht zu 100% sicher) ohne Cloud. Allerdings stellt das device das Senden "irgendwann"(muss noch detaillierter analysiert werden) wieder ein und ein Anstoß über die Äpp ist notwendig.

Ok. Also ganz cloudfrei geht es wohl erst mal nicht. Die Nulleinspeisung von ecoflow funktioniert eigentlich recht gut. Allerdings frage ich mich, wer die Regelung überhaupt übernimmt, ich hoffe nicht komplett die Cloud. Alleine die Tatsache, dass der Zähler bei mir über den Tibber-Puls mit einem Tibber-Account bei ecoflow zum Regeln benutzt wird, macht mir Bauchschmerzen.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 18 März 2026, 12:48:15
Kannst es ja mal mit MQTT probieren https://forum.fhem.de/index.php?topic=133322.msg1343585#msg1343585
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: MasterRay am 18 März 2026, 14:17:29
Zitat von: KölnSolar am 18 März 2026, 09:37:50Das Modul baut auf der API von Ecoflow mit Zugriff auf deren Cloud auf.

Der MQTT-Zugriff funktioniert(bin mir gerade nicht zu 100% sicher) ohne Cloud. Allerdings stellt das device das Senden "irgendwann"(muss noch detaillierter analysiert werden) wieder ein und ein Anstoß über die Äpp ist notwendig.

... nun, die URL, mit der man am MQTT-Server abonniert lautet ja 'mqtt.ecoflow.com'. Das sieht mir nicht "lokal" aus. Zudem müssten die Geräte, wenn es ohne Cloud gehen sollte, über MQTT-Server verfügen. Sie haben aber nach meiner Erfahrung MQTT-Clients.

Grüße aus dem (gerade) sonnigen SüdWesten
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 18 März 2026, 17:42:40
Vermutlich werde ich, sobald der API-key kommt, nur die aktuelle Kapazität und die aktuelle Einspeisung/Bezug auslesen, um es in FHEM anzuzeigen. Ein Shelly 3EM, den man statt eines Tibber-Puls angeben kann, würde vermutlich im Gegensatz zum Tibber-Puls lokal ausgelesen werden, aber den müsste ich erstmal anschaffen.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 18 März 2026, 18:31:37
Zitatnun, die URL, mit der man am MQTT-Server abonniert lautet ja 'mqtt.ecoflow.com'. Das sieht mir nicht "lokal" aus.
Du hast ja sows von recht.  :-[
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: phantom am 19 März 2026, 12:29:32
für Anwender von STREAM ULTRA & STREAM ACPRO habe ich 2 kleine Korrekturen zur Ansteuerung der Relais der Ausgänge:

- beim STREAM UP muss die Zeile für das 2. Relais so lauten:
    "cfgRelay3Onoff" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "needAck" => "true", "dest" => 2, "params.cfgRelay3Onoff" => "a[2]"},

- beim STREAM AC gibts auch 2 Relais, daher sollte die gleichen Sets und SetCmdCodes drin sein:
        "STREAM AC" => {
                "Adjustments" => {},
                "Gets" => {
                        "SolarGeneratedPower" => "",
                        "EnergyIndependence" => "",
                        "EnvironmentalImpact" => "",
                        "TotalSolarEnergySavings" => "",
                        "ElectricityConsumption" => "",
                        "Grid" => "",
                        "BatteryChargingDischargingPower" => ""
                },
                "Sets" => {
                        "cfgRelay2Onoff" => ":true,false",
                        "cfgRelay3Onoff" => ":true,false",
                        "cfgBackupReverseSoc"=> ":slider,3,1,95",
                        "cfgEnergyStrategyOperateMode.operateSelfPoweredOpen" => ":true",
                        "cfgEnergyStrategyOperateMode.operateIntelligentScheduleModeOpen" => ":true",
                        "cfgFeedGridMode" => ":1,2"
                },
                "GetCmdCodes" => {
                        "SolarGeneratedPower" =>                { "params.beginTime" => "a[1] a[2]" , "params.endTime" => "a[3] a[4]", "params.code" => "BK621-App-HOME-SOLAR-ENERGY-FLOW-solor-line-NOTDISTINGUISH-MASTER_DATA" },
                        "EnergyIndependence"  =>                { "params.beginTime" => "a[1] a[2]" , "params.endTime" => "a[3] a[4]", "params.code" => "BK621-App-HOME-INDEPENDENCE-PERCENT-FLOW-indep-progress_bar-NOTDISTINGUISH-MASTER_DATA" },
                        "EnvironmentalImpact" =>                { "params.beginTime" => "a[1] a[2]" , "params.endTime" => "a[3] a[4]", "params.code" => "BK621-App-HOME-CO2-WEIGHT-FLOW-impact-progress_arc-NOTDISTINGUISH-MASTER_DATA" },
                        "TotalSolarEnergySavings" =>            { "params.beginTime" => "a[1] a[2]" , "params.endTime" => "a[3] a[4]", "params.code" => "BK621-App-HOME-SAVING-CURRENCY-FLOW-earnings-progress_arc-NOTDISTINGUISH-MASTER_DATA" },
                        "ElectricityConsumption" =>             { "params.beginTime" => "a[1] a[2]" , "params.endTime" => "a[3] a[4]", "params.code" => "BK621-App-HOME-LOAD-ENERGY-FLOW-consumption-prop_arc-NOTDISTINGUISH-MASTER_DATA" },
                        "Grid" =>                               { "params.beginTime" => "a[1] a[2]" , "params.endTime" => "a[3] a[4]", "params.code" => "BK621-App-HOME-GRID-ENERGY-FLOW-grid_prop_bar-NOTDISTINGUISH-MASTER_DATA"},
                        "BatteryChargingDischargingPower" =>    { "params.beginTime" => "a[1] a[2]" , "params.endTime" => "a[3] a[4]", "params.code" => "BK621-App-HOME-SOC-ENERGY-FLOW-battery-prop_bar-NOTDISTINGUISH-MASTER_DATA"},
                },
                "SetCmdCodes" => {
                        "cfgRelay2Onoff" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "needAck" => "true", "dest" => 2, "params.cfgRelay2Onoff" => "a[2]"},
                        "cfgRelay3Onoff" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "needAck" => "true", "dest" => 2, "params.cfgRelay3Onoff" => "a[2]"},
                        "cfgBackupReverseSoc" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgBackupReverseSoc" => "a[2]" },
                        "cfgEnergyStrategyOperateMode.operateSelfPoweredOpen" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgEnergyStrategyOperateMode.operateSelfPoweredOpen" => "a[2]"},
                        "cfgEnergyStrategyOperateMode.operateIntelligentScheduleModeOpen" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgEnergyStrategyOperateMode.operateIntelligentScheduleModeOpen" => "a[2]"},
                        "cfgFeedGridMode" => { "cmdId" => 17, "cmdFunc" => 254, "dirDest" => 1, "dirSrc" => 1, "dest" => 2, "needAck" => "true", "params.cfgFeedGridMode" => "a[2]"}
                }
 
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 19 März 2026, 14:41:37
da fehlte noch die abschließende Geschweifte.  ;)

Ich habe es eingebaut. Bitte testen.

Edit: Old version removed
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 20 März 2026, 08:54:09
Guten Morgen,
scheinbar gibt es seit kurz nach 6:00 Probleme bei ecoflow. Die domain ist per ping erreichbar, es werden aber keine Daten übertragen.

Die mqtt-domain mqtt-e.ecoflow.com lässt sich nicht anpingen und die Äpp liefert jüngere und "live"-Daten.

Nur bei mir so oder allgemeines ecoflow-Problem ?

Grüße Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 20 März 2026, 09:31:49
Zitat von: KölnSolar am 20 März 2026, 08:54:09Guten Morgen,
scheinbar gibt es seit kurz nach 6:00 Probleme bei ecoflow. Die domain ist per ping erreichbar, es werden aber keine Daten übertragen.

Die mqtt-domain mqtt-e.ecoflow.com lässt sich nicht anpingen und die Äpp liefert jüngere und "live"-Daten.

Nur bei mir so oder allgemeines ecoflow-Problem ?

Grüße Markus

Ich habe keine Probleme mit der Kommunikation über die App.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: rubberduck67 am 20 März 2026, 10:17:33
Seit 7:20Uhr kommen Daten aus der API , aber ich überwache das nicht. In der App auch früher

Gruß Sven
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 21 März 2026, 16:08:46
Danke Euch. Ecoflow war schuldlos. Es lag an meiner zähen Migration zu Pi5 mit Trixie und machte allgemeinere DNS-Probleme.
Hat ja alles auch immer sein Gutes: da muss ich noch im Modul aktiv werden, falls die Server tatsächlich mal offline sind.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: phantom am 22 März 2026, 08:10:56
@KölnSolar #168  Danke, das klappt soweit

Die Ecoflow ACpro liefern per HTTP als laufende Daten nur "gridConnectionPower": 93.54 und den Status der beiden Schuko Steckdosen, wenn sie im System mit einem Ultra laufen.
Ich nutze das Modul im Wesetlichen nur zum Schalten der Steckdosen, da dies zuverlässiger klappt als per MQTT.

Mir ist noch aufgefallen, daß die Ecoflow Cloud keine laufenden Daten mehr liefert, wenn ich über 3-4 Tage lang die Ecoflow-App nicht genutzt habe. Es geht erst weiter, wenn ich mal kurz die App anwerfe; dann kommen wieder alle Daten von allen Geräten. Ich habe noch nicht herausbekommen, wie man die per FHEM "triggern" könnte ???

Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 22 März 2026, 09:51:33
ZitatMir ist noch aufgefallen, daß die Ecoflow Cloud keine laufenden Daten mehr liefert, wenn ich über 3-4 Tage lang die Ecoflow-App nicht genutzt habe. Es geht erst weiter, wenn ich mal kurz die App anwerfe; dann kommen wieder alle Daten von allen Geräten.
Sicher ? Ein solches Verhalten kenne ich nur von der MQTT-Variante. Über das Modul(API) bekomme ich immer Daten für eine Delta2 u. einen Powerstream. Die Delta2 spreche ich bis dato 2mal am Tag über MQTT-set an. Ob das einen Unterschied macht ?
Zukünftig soll das bei mir über das Modul laufen. Da teste ich aber noch, da es hier nicht "regelmäßig" funktioniert. Suche noch nach Ursachen.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: phantom am 22 März 2026, 10:42:06
ja korrekt, das "triggern" per App gilt nur für MQTT. 
per HTTP-Modul klappt das Polling bei mir alle 180 sec. problemlos

noch nicht probiert habe ich ein disconnect/connect des MQTT-Client, wenn es mal wieder hakt
wenn das klappen sollten, macht evtl. ein Timer dafür Sinn

ich warte mal ab, wann MQTT wieder aussetzt ...
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: MasterRay am 22 März 2026, 18:53:41
Die App löst (bei mir: Delta3 und PowerStream) beim Start unter MQTT-Topic /app/[userid]/[serno1]/thing/property/get einen Request aus, der die Übermittlung aller Daten anfordert. Wenn man den zyklisch schickt, dann kommen dauerhaft Daten.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 22 März 2026, 23:26:28
Ich habe nun den API-Key erstellt.

Beim Laden des Ecoflow-Moduls bekomme ich die Meldung:

Can't locate URL/Encode.pm in @INC (you may need to install the URL::Encode module) ...
Was muss ich da noch installieren?

git clone http://github.com/chansen/p5-url-encode

reicht offenbar nicht aus.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 23 März 2026, 14:59:24
Ich weiß es nicht mehr. Auf die Schnelle gegoogelt ist es für Debian wohl das package liburl-encode-perl.

Edit: Danke Masterray. Hat mit einer Delta2 funktioniert.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 23 März 2026, 18:22:55
Zitat von: KölnSolar am 23 März 2026, 14:59:24Ich weiß es nicht mehr. Auf die Schnelle gegoogelt ist es für Debian wohl das package liburl-encode-perl.

Ich habe nun alles mögliche nachinstalliert, geht immer noch nicht. Es handelt sich um debian 12 unter proxmox.

Könnt ihr mir sagen, in welchem Verzeichnis sich bei euch Encode.pm im System befindet?

So sieht die Fehlermeldung komplett aus:

Can't locate URL/Encode.pm in @INC (you may need to install the URL::Encode module) (@INC contains: ./FHEM/lib ./lib . ./FHEM /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.36.0 /usr/local/share/perl/5.36.0 /usr/lib/x86_64-linux-gnu/perl5/5.36 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl-base /usr/lib/x86_64-linux-gnu/perl/5.36 /usr/share/perl/5.36 /usr/local/lib/site_perl) at ./FHEM/98_Ecoflow.pm line 16.
BEGIN failed--compilation aborted at ./FHEM/98_Ecoflow.pm line 16.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 23 März 2026, 19:40:13
/usr/lib/aarch64-linux-gnu/perl5/5.40/URL/Encode/XS.pm
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 23 März 2026, 20:06:33
OK, ich habe jetzt ein URL-Verzeichnis mit Encode.pm angelegt. Jetzt lässt sich ein Device definieren.

Was muss ich bei Model für den STREAM AC Pro angeben?
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 23 März 2026, 22:35:51
Hi,
für die STREAM AC Pro solltest du STREAM UP als Model angeben.
attr [name] userattr Model
attr [name] Model STREAM UP

Gruß Denis
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 24 März 2026, 22:03:05
Ich habe es erst mal über MQTT ans Laufen bekommen. Das Ausbleiben der Daten habe ich auch schon beobachtet, ggf. hilft ein Reconnect der Verbindung. Das muss ich aber erst mal beobachten. Eine kleine Visualisierung habe ich auf die Schnelle auch schon zusammengezimmert. 
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 25 März 2026, 07:32:58
attr [name] userattr Model
attr [name] Model STREAM UP
das userattr dürfte es eigentlich nicht brauchen.

Zitatggf. hilft ein Reconnect der Verbindung
Nein, sondern
ZitatDie App löst (bei mir: Delta3 und PowerStream) beim Start unter MQTT-Topic
CodeAuswählen
/app/[userid]/[serno1]/thing/property/get
einen Request aus, der die Übermittlung aller Daten anfordert. Wenn man den zyklisch schickt, dann kommen dauerhaft Daten.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 25 März 2026, 07:39:31
Ich habe hiernach https://www.juergenstechnikwelt.de/photovoltaik/offizielle-ecoflow-api-mittels-fhem-und-mqtt-nutzen das Mqtt eingerichtet.

Die Topics sehen ganz anders aus:

attr myMQTTClient subscriptions /open/open-e05CERTIFICATEACCOUNT/SERIENNUMMER/status /open/open-e05XXXXX/SERIENNUMMER/quota /open/open-e05CERTIFICATEACCOUNT/SERIENNUMMER/set
attr myMQTTClient username open-e05CERTIFICATEACCOUNT

Ein get hat bei mir keine Auswirkungen gehabt.

Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: MasterRay am 25 März 2026, 09:06:45
Zitat von: Damian am 25 März 2026, 07:39:31Die Topics sehen ganz anders aus:

Hallo,
die mit 'open' beginnenden Topics sind die der offiziellen Schnittstelle, die es ja nur für wenige Produkte gibt. Die mit 'app' beginnenden die, mit denen die App kommuniziert. Die App fragt beim Öffnen mit einem /app/[userid]/[serno1]/thing/property/get (zzgl. eines Payloads) die Auslieferung aller Daten an. Ich hatte mal angenommen, dass damit auch die offizielle Schnittstelle "in Schwung" kommt.

Ich werde das für den PowerStream mal versuchen nachzustellen.

Grüße und schönen (= ertragreichen) Tag
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 25 März 2026, 10:10:46
Ich glaube das Problem mit dem Ausbleiben des Traffics bei mir gefunden zu haben.

Wenn ich die App starte, läuft der Traffic erst mal weiter, nach dem Beenden der App (habe sie auch aus dem Hauptspeicher entfernt) kommen wenige Sekunden danach keine Nachrichten in FHEM mehr an.

Ein Disconnect beim MQTT-Client und ein erneutes Connect behebt das Problem. Das konnte ich wiederholt reproduzieren.

Dh. solange ich die App nicht starte, funktioniert bei mir alles wie es soll. Als Folge werde ich die App nicht nutzen. Per MQTT erhalte ich ohnehin viel mehr Informationen als per App (siehe unten, sensible Daten wurden geändert).


   READINGS:
     2026-03-23 23:23:16   IODev           ecoflow
     2026-03-25 10:05:45   quota_acTotalActivePower -1051
     2026-03-25 09:36:40   quota_acTotalInvDeratePower 1236
     2026-03-25 10:06:28   quota_accuChgCap 1154698
     2026-03-25 10:06:28   quota_accuChgEnergy 23368
     2026-03-25 10:06:28   quota_accuDsgCap 1071785
     2026-03-25 10:06:28   quota_accuDsgEnergy 21270
     2026-03-25 09:36:40   quota_actPwrByFreqDroop 792
     2026-03-25 09:36:40   quota_actPwrByOfdp 791
     2026-03-25 09:36:40   quota_actPwrByOvdp 792
     2026-03-25 09:36:40   quota_actPwrByPerc 792
     2026-03-25 09:36:40   quota_actPwrByRampUp 792
     2026-03-25 09:36:40   quota_actPwrByUfip 791
     2026-03-25 09:36:40   quota_actPwrRated 800
     2026-03-25 10:06:28   quota_actSoc    92.0
     2026-03-25 09:36:40   quota_activePowerNeed 0
     2026-03-25 09:36:40   quota_addPwrActLimit 792
     2026-03-25 10:06:28   quota_afeSysStatus 0
     2026-03-25 09:36:40   quota_aiTouTargetSoc 0
     2026-03-25 09:36:40   quota_aiTouValid false
     2026-03-25 10:06:28   quota_allBmsFault 0
     2026-03-25 10:06:28   quota_allErrCode 0
     2026-03-25 10:06:28   quota_amp       47457
     2026-03-25 10:05:15   quota_backupReverseSoc 10
     2026-03-25 10:06:28   quota_balanceCmd 0
     2026-03-25 10:06:28   quota_balanceState 0
     2026-03-25 10:06:28   quota_bmsAlarmState1 0
     2026-03-25 10:06:28   quota_bmsAlarmState2 0
     2026-03-25 10:05:15   quota_bmsBattHeating false
     2026-03-25 10:06:33   quota_bmsBattSoc 94.0
     2026-03-25 10:05:15   quota_bmsBattSoh 100.0
     2026-03-25 10:05:15   quota_bmsChgDsgState 2
     2026-03-25 10:06:33   quota_bmsChgRemTime 8
     2026-03-25 09:36:40   quota_bmsChgReqCurr 32767
     2026-03-25 09:36:40   quota_bmsChgReqVolt 21900
     2026-03-25 10:05:15   quota_bmsDesignCap 1920
     2026-03-25 10:05:15   quota_bmsDsgRemTime 5939
     2026-03-25 10:06:28   quota_bmsFault  0
     2026-03-25 10:06:28   quota_bmsFaultState 0
     2026-03-25 10:06:28   quota_bmsHeartbeatVer 260
     2026-03-25 10:05:15   quota_bmsMaxCellTemp 38
     2026-03-25 10:06:35   quota_bmsMaxMosTemp 49
     2026-03-25 10:05:15   quota_bmsMinCellTemp 36
     2026-03-25 10:06:35   quota_bmsMinMosTemp 49
     2026-03-25 10:06:28   quota_bmsProtectState1 0
     2026-03-25 10:06:28   quota_bmsProtectState2 0
     2026-03-25 10:06:28   quota_bmsSn     BK33500ADH4B5424
     2026-03-25 10:06:28   quota_bqSysStatReg 0
     2026-03-25 10:05:15   quota_brightness 10
     2026-03-25 10:06:28   quota_bsmSysEvent 5
     2026-03-25 10:05:15   quota_busbarPowLimit 2231
     2026-03-25 09:36:40   quota_bypassOutPowerAbilityMax 0
     2026-03-25 10:06:28   quota_calendarSoh 88.0
     2026-03-25 09:36:40   quota_cascadeSysCanId 1
     2026-03-25 09:36:40   quota_cascadeSysDeviceCnt 1
     2026-03-25 10:05:16   quota_cascadeSysDistributedPwrSum -1050
     2026-03-25 09:36:40   quota_cascadeSysOutputPwrDiff 0
     2026-03-25 10:06:45   quota_cascadeSysSoc 94
     2026-03-25 10:05:16   quota_cascadeSysTargetPwr 1050
     2026-03-25 09:36:40   quota_cascadeSysWorkMode 2
     2026-03-25 10:06:28   quota_cellId    2
     2026-03-25 10:06:28   quota_cellNtcNum 2
     2026-03-25 10:06:28   quota_cellSeriesNum 6
     2026-03-25 10:06:28   quota_cellTemp_1 38
     2026-03-25 10:06:28   quota_cellTemp_2 36
     2026-03-25 10:06:28   quota_cellVol_1 3422
     2026-03-25 10:06:28   quota_cellVol_2 3419
     2026-03-25 10:06:28   quota_cellVol_3 3419
     2026-03-25 10:06:28   quota_cellVol_4 3416
     2026-03-25 10:06:28   quota_cellVol_5 3416
     2026-03-25 10:06:28   quota_cellVol_6 3412
     2026-03-25 10:06:28   quota_chgDsgState 2
     2026-03-25 09:36:40   quota_chgOverCurOffCnt 0
     2026-03-25 10:05:16   quota_chgPowerLoopRef 1049
     2026-03-25 10:07:04   quota_cloudMetter_hasMeter true
     2026-03-25 10:07:04   quota_cloudMetter_model IR_TIBBER_PULSE
     2026-03-25 10:07:04   quota_cloudMetter_phaseAPower 9
     2026-03-25 10:07:04   quota_cloudMetter_phaseBPower 0
     2026-03-25 10:07:04   quota_cloudMetter_phaseCPower 0
     2026-03-25 10:07:04   quota_cloudMetter_sn f3bc4d01-04f8-766c-a4eb-75ba27da6040
     2026-03-25 10:05:15   quota_cmsBattFullEnergy 1920
     2026-03-25 10:05:15   quota_cmsBattPowInMax 1050
     2026-03-25 10:05:15   quota_cmsBattPowOutMax 1200
     2026-03-25 10:06:33   quota_cmsBattSoc 94.0
     2026-03-25 10:05:15   quota_cmsBattSoh 100.0
     2026-03-25 10:05:15   quota_cmsBmsRunState 1
     2026-03-25 10:05:15   quota_cmsChgDsgState 2
     2026-03-25 10:06:33   quota_cmsChgRemTime 8
     2026-03-25 10:05:15   quota_cmsDsgRemTime 5939
     2026-03-25 10:05:15   quota_cmsMaxChgSoc 95
     2026-03-25 10:05:15   quota_cmsMinDsgSoc 6
     2026-03-25 10:06:45   quota_curAvaiToBmsPower 1167
     2026-03-25 10:06:28   quota_curSensorNtcNum 0
     2026-03-25 10:06:28   quota_cycleSoh  99.997
     2026-03-25 10:06:28   quota_cycles    11
     2026-03-25 09:36:40   quota_dabFault  0
     2026-03-25 09:36:40   quota_dabFaultLock 0
     2026-03-25 10:05:16   quota_dabHighTempNtc 46
     2026-03-25 10:06:15   quota_dabLvTempNtc 60
     2026-03-25 09:36:40   quota_dabStateMonitor1 1595753042
     2026-03-25 09:36:40   quota_dabStateMonitor2 25232168
     2026-03-25 09:36:40   quota_dabStateMonitor3 0
     2026-03-25 09:36:40   quota_dcTemp1Ntc 46
     2026-03-25 09:36:40   quota_dcTemp2Ntc 50
     2026-03-25 09:49:17   quota_dcTemp3Ntc 53
     2026-03-25 09:36:40   quota_dcToInvData 1359909
     2026-03-25 10:06:45   quota_dciFilt   -57
     2026-03-25 09:51:18   quota_dcvFilt   82
     2026-03-25 10:06:28   quota_designCap 100000
     2026-03-25 10:05:16   quota_dev1DistributeTarget -1050
     2026-03-25 09:36:40   quota_dev1PowerAbility 1200
     2026-03-25 09:36:40   quota_dev1PowerInAbility 1050
     2026-03-25 09:36:40   quota_dev1PvRemain 0
     2026-03-25 10:05:16   quota_dev1ToPcsPwr -1049
     2026-03-25 09:36:40   quota_dev2DistributeTarget 0
     2026-03-25 09:36:40   quota_dev2PowerAbility 0
     2026-03-25 09:36:40   quota_dev2PowerInAbility 0
     2026-03-25 09:36:40   quota_dev2PvRemain 0
     2026-03-25 09:36:40   quota_dev2ToPcsPwr 0
     2026-03-25 09:36:40   quota_dev3DistributeTarget 0
     2026-03-25 09:36:40   quota_dev3PowerAbility 0
     2026-03-25 09:36:40   quota_dev3PowerInAbility 0
     2026-03-25 09:36:40   quota_dev3PvRemain 0
     2026-03-25 09:36:40   quota_dev3ToPcsPwr 0
     2026-03-25 09:36:40   quota_dev4DistributeTarget 0
     2026-03-25 09:36:40   quota_dev4PowerAbility 0
     2026-03-25 09:36:40   quota_dev4PowerInAbility 0
     2026-03-25 09:36:40   quota_dev4PvRemain 0
     2026-03-25 09:36:40   quota_dev4ToPcsPwr 0
     2026-03-25 09:36:40   quota_dev5DistributeTarget 0
     2026-03-25 09:36:40   quota_dev5PowerAbility 0
     2026-03-25 09:36:40   quota_dev5PowerInAbility 0
     2026-03-25 09:36:40   quota_dev5PvRemain 0
     2026-03-25 09:36:40   quota_dev5ToPcsPwr 0
     2026-03-25 09:36:40   quota_dev6DistributeTarget 0
     2026-03-25 09:36:40   quota_dev6PowerAbility 0
     2026-03-25 09:36:40   quota_dev6PowerInAbility 0
     2026-03-25 09:36:40   quota_dev6PvRemain 0
     2026-03-25 09:36:40   quota_dev6ToPcsPwr 0
     2026-03-25 10:05:15   quota_devCtrlStatus 1
     2026-03-24 15:52:39   quota_devErrcodeList_devErrcode_1 348
     2026-03-25 10:06:28   quota_diffSoc   0.19232178
     2026-03-25 09:36:40   quota_displayPropertyFullUploadPeriod 120000
     2026-03-25 09:36:40   quota_displayPropertyIncrementalUploadPeriod 2000
     2026-03-25 10:05:15   quota_distributedDeviceStatus MASTER
     2026-03-25 10:06:28   quota_ecloudOcv 65535
     2026-03-25 10:05:16   quota_emsPfcChgPwrTag 1049
     2026-03-25 09:36:40   quota_emsSetRatedPower 800
     2026-03-25 10:05:15   quota_energyStrategyOperateMode_operateIntelligentScheduleModeOpen false
     2026-03-25 10:05:15   quota_energyStrategyOperateMode_operateScheduledOpen false
     2026-03-25 10:05:15   quota_energyStrategyOperateMode_operateSelfPoweredOpen true
     2026-03-25 10:05:15   quota_energyStrategyOperateMode_operateTouModeOpen false
     2026-03-25 10:06:28   quota_envNtcNum 0
     2026-03-25 10:06:28   quota_errCode   0
     2026-03-25 10:05:45   quota_exPsD1    93
     2026-03-25 10:06:28   quota_f32ShowSoc 93.43765
     2026-03-25 10:05:15   quota_feedGridMode 2
     2026-03-25 10:05:15   quota_feedGridModePowLimit 800
     2026-03-25 10:05:15   quota_feedGridModePowMax 800
     2026-03-25 10:05:15   quota_feedGridSafetyPowMax 0
     2026-03-25 10:06:28   quota_fullCap   100000
     2026-03-25 10:05:15   quota_gridCodeSelection GRID_STD_CODE_VDE_4105
     2026-03-25 10:05:15   quota_gridCodeVersion 10001
     2026-03-25 10:05:15   quota_gridConnectionFreq 50.0134
     2026-03-25 10:05:15   quota_gridConnectionPortBind_err 0
     2026-03-25 10:05:15   quota_gridConnectionPortBind_portNum 0
     2026-03-25 10:05:15   quota_gridConnectionPortBind_sn
     2026-03-25 10:07:11   quota_gridConnectionPower -989.2969
     2026-03-25 10:05:15   quota_gridConnectionSta PANEL_GRID_IN
     2026-03-25 10:06:18   quota_gridConnectionVol 233.7819
     2026-03-25 09:36:40   quota_gridFault 0
     2026-03-25 10:05:15   quota_gridSysDeviceCnt 1
     2026-03-25 10:06:28   quota_heatfilmNtcNum 1
     2026-03-25 10:06:28   quota_heatfilmTemp_1 39
     2026-03-25 10:06:28   quota_hwVer     V0.0.0
     2026-03-25 10:06:45   quota_iDabLv    4705
     2026-03-25 09:36:40   quota_iinPv1    0
     2026-03-25 09:36:40   quota_iinPv2    0
     2026-03-25 09:36:40   quota_iinPv3    0
     2026-03-25 09:36:40   quota_iinPv4    0
     2026-03-25 10:06:28   quota_inputWatts 973
     2026-03-25 09:36:40   quota_invCommFault 0
     2026-03-25 09:36:40   quota_invFault  0
     2026-03-25 09:36:40   quota_invFaultLock 0
     2026-03-25 10:05:16   quota_invIl1Rms 446
     2026-03-25 09:36:40   quota_invInPowerAbilityMax 1200
     2026-03-25 09:36:40   quota_invOutPowerAbilityMax 1200
     2026-03-25 09:36:40   quota_invStateMonitor1 419759392
     2026-03-25 09:36:40   quota_invStateMonitor2 410204217
     2026-03-25 09:36:40   quota_invStateMonitor3 0
     2026-03-25 09:48:47   quota_invTempNtc 54
     2026-03-25 09:36:40   quota_invTodcData 1051896
     2026-03-25 10:05:16   quota_invVcapRms 2338
     2026-03-25 09:36:40   quota_iotBleAuthState 1
     2026-03-25 09:36:40   quota_iotBleState 0
     2026-03-25 09:36:40   quota_iotGatewayAddress 18263521
     2026-03-25 09:36:40   quota_iotIpAddress 1885431303
     2026-03-25 10:06:45   quota_iotLan1FsmState 2
     2026-03-25 09:36:40   quota_iotLan1LastRecvDataTime 0
     2026-03-25 09:36:40   quota_iotLan1MeshIdSummary 0
     2026-03-25 09:36:40   quota_iotLan1PlugConsPwr 0
     2026-03-25 09:36:40   quota_iotLan1PlugCounts 0
     2026-03-25 09:36:40   quota_iotLan2DevOnlineCounts 0
     2026-03-25 09:36:40   quota_iotLan2EncKeySummary 402232618
     2026-03-25 09:36:40   quota_iotLan2FsmState 3
     2026-03-25 09:36:40   quota_iotLan2IdSummary 120035675
     2026-03-25 09:36:40   quota_iotLan2LastRecvDataTime 0
     2026-03-25 09:36:40   quota_iotMemHeapSize 63500
     2026-03-25 09:36:40   quota_iotMemInternalFreeSize 48900
     2026-03-25 09:36:40   quota_iotMemLargestFreeSize 25088
     2026-03-25 09:36:40   quota_iotMqttErrReason 0
     2026-03-25 09:36:40   quota_iotMqttErrType 1
     2026-03-25 09:36:40   quota_iotMqttState 1
     2026-03-25 09:36:40   quota_iotShellyCfgDevCounts 0
     2026-03-25 09:36:40   quota_iotShellyLastRecvDataTime 0
     2026-03-25 09:36:40   quota_iotShellyOnlineCounts 0
     2026-03-25 09:36:40   quota_iotVersion 16777580
     2026-03-25 09:36:40   quota_iotWifiBssid dc:23:c8:14:6e:40
     2026-03-25 09:36:40   quota_iotWifiState 1
     2026-03-25 10:06:45   quota_ioutBat   4679
     2026-03-25 09:36:40   quota_lanSysDeviceCnt 1
     2026-03-25 10:05:16   quota_lanSysHomeNeedPwr -1050
     2026-03-25 10:06:45   quota_lanSysMeterValue -33
     2026-03-25 10:05:16   quota_lanSysScheduleOutput_output_1_pwr 1050
     2026-03-25 10:05:16   quota_lanSysScheduleOutput_output_1_snSuffix 0296
     2026-03-25 10:05:16   quota_lanSysScheduleOutput_output_1_workmode 2
     2026-03-25 10:05:16   quota_lanSysTargetPwr -1050
     2026-03-25 10:05:15   quota_maxBpInput 1050
     2026-03-25 10:05:15   quota_maxBpOutput 1200
     2026-03-25 10:06:28   quota_maxCellTemp 38
     2026-03-25 10:06:28   quota_maxCellVol 3422
     2026-03-25 10:06:28   quota_maxCurSensorTemp 0
     2026-03-25 10:06:28   quota_maxEnvTemp 0
     2026-03-25 10:06:28   quota_maxHeatfilmTemp 39
     2026-03-25 10:05:15   quota_maxInvInput 1200
     2026-03-25 10:05:15   quota_maxInvOutput 1200
     2026-03-25 10:06:28   quota_maxMosTemp 49
     2026-03-25 10:06:28   quota_maxVolDiff 10
     2026-03-25 10:06:28   quota_mcuPinInStatus 0
     2026-03-25 10:06:28   quota_mcuPinOutStatus 0
     2026-03-25 10:06:28   quota_minCellTemp 36
     2026-03-25 10:06:28   quota_minCellVol 3412
     2026-03-25 10:06:28   quota_minCurSensorTemp 0
     2026-03-25 10:06:28   quota_minEnvTemp 0
     2026-03-25 10:06:28   quota_minHeatfilmTemp 39
     2026-03-25 10:06:28   quota_minMosTemp 49
     2026-03-25 10:05:15   quota_moduleWifiRssi -61.0
     2026-03-25 10:06:28   quota_mosNtcNum 1
     2026-03-25 10:06:28   quota_mosState  3
     2026-03-25 10:06:28   quota_mosTemp_1 49
     2026-03-25 09:36:40   quota_mosVolt   328
     2026-03-25 09:36:40   quota_mpptFaultComm 0
     2026-03-25 09:36:40   quota_mpptPv1Fault 0
     2026-03-25 09:36:40   quota_mpptPv2Fault 0
     2026-03-25 09:36:40   quota_mpptPv3Fault 0
     2026-03-25 09:36:40   quota_mpptPv4Fault 0
     2026-03-25 10:06:28   quota_num       0
     2026-03-25 09:36:40   quota_offgrid1ActivePower 0
     2026-03-25 09:36:40   quota_offgrid1ApperentPower 4
     2026-03-25 09:36:40   quota_offgrid2ActivePower -5
     2026-03-25 09:36:40   quota_offgrid2ApperentPower 3
     2026-03-25 09:36:40   quota_offgridInvDeratePower 1200
     2026-03-25 09:36:40   quota_offgridVout1Rms 486
     2026-03-25 09:39:47   quota_offgridVout2Rms 472
     2026-03-25 09:36:40   quota_ongridActivePowerRef -113
     2026-03-25 10:06:45   quota_ongridIinRms 449
     2026-03-25 10:05:16   quota_ongridInActivePower -1045
     2026-03-25 10:05:16   quota_ongridInReactivePower 83
     2026-03-25 09:36:40   quota_ongridInvDeratePower 792
     2026-03-25 09:36:40   quota_ongridOutPowerAbilityMax 791
     2026-03-25 10:05:45   quota_ongridVinRms 2338
     2026-03-25 10:05:45   quota_ongridVoutRms 2335
     2026-03-25 10:06:28   quota_openBmsFlag 1
     2026-03-25 10:06:28   quota_outputWatts 0
     2026-03-25 10:06:28   quota_packSn    BK11P3052H4K0644
     2026-03-25 09:36:40   quota_pfcFault  0
     2026-03-25 09:36:40   quota_pfcVbusTag 450
     2026-03-25 09:36:40   quota_pinPv1    0
     2026-03-25 09:36:40   quota_pinPv2    0
     2026-03-25 09:36:40   quota_pinPv3    0
     2026-03-25 09:36:40   quota_pinPv4    0
     2026-03-25 10:05:15   quota_plugInInfoPv2Amp 0.0
     2026-03-25 10:05:15   quota_plugInInfoPv2Flag false
     2026-03-25 10:05:15   quota_plugInInfoPv2Vol 0.0
     2026-03-25 10:05:15   quota_plugInInfoPv3Amp 0.0
     2026-03-25 10:05:15   quota_plugInInfoPv3Flag false
     2026-03-25 10:05:15   quota_plugInInfoPv3Vol 0.0
     2026-03-25 10:05:15   quota_plugInInfoPv4Amp 0.0
     2026-03-25 10:05:15   quota_plugInInfoPv4Flag false
     2026-03-25 10:05:15   quota_plugInInfoPv4Vol 0.0
     2026-03-25 10:05:15   quota_plugInInfoPvAmp 0.0
     2026-03-25 10:05:15   quota_plugInInfoPvFlag false
     2026-03-25 10:05:15   quota_plugInInfoPvVol 0.0
     2026-03-25 10:05:15   quota_powConsumptionMeasurement 2
     2026-03-25 10:07:12   quota_powGetBpCms 982.4571
     2026-03-25 10:05:15   quota_powGetPv  0.0
     2026-03-25 10:05:15   quota_powGetPv2 0.0
     2026-03-25 10:05:15   quota_powGetPv3 0.0
     2026-03-25 10:05:15   quota_powGetPv4 0.0
     2026-03-25 10:07:12   quota_powGetPvSum 982.4571
     2026-03-25 10:05:15   quota_powGetSchuko1 0.0
     2026-03-25 10:05:15   quota_powGetSchuko2 0.0
     2026-03-25 10:07:04   quota_powGetSysGrid 0.0
     2026-03-25 10:05:15   quota_powGetSysLoad 0.0
     2026-03-25 10:05:15   quota_powGetSysLoadFromBp 0.0
     2026-03-25 10:05:15   quota_powGetSysLoadFromGrid 0.0
     2026-03-25 10:05:15   quota_powGetSysLoadFromPv 0.0
     2026-03-25 10:05:15   quota_powSysAcInMax 2231
     2026-03-25 10:05:15   quota_powSysAcOutMax 800
     2026-03-25 10:06:28   quota_powerportNtcNum 8
     2026-03-25 10:06:28   quota_powerportTemp_1 40
     2026-03-25 10:06:28   quota_powerportTemp_2 46
     2026-03-25 10:06:28   quota_powerportTemp_3 49
     2026-03-25 10:06:28   quota_powerportTemp_4 49
     2026-03-25 10:06:28   quota_powerportTemp_5 46
     2026-03-25 10:06:28   quota_powerportTemp_6 46
     2026-03-25 10:06:28   quota_powerportTemp_7 46
     2026-03-25 10:06:28   quota_powerportTemp_8 46
     2026-03-25 10:06:28   quota_productDetail 5
     2026-03-25 10:06:28   quota_productType 58
     2026-03-25 09:36:40   quota_pv1GndInsRy 0
     2026-03-25 09:36:40   quota_pv1InsRx  0
     2026-03-25 09:36:40   quota_pv2GndInsRy 0
     2026-03-25 09:36:40   quota_pv2InsRx  0
     2026-03-25 09:36:40   quota_pv3GndInsRy 0
     2026-03-25 09:36:40   quota_pv3InsRx  0
     2026-03-25 09:36:40   quota_pv4GndInsRy 0
     2026-03-25 09:36:40   quota_pv4InsRx  0
     2026-03-25 09:36:40   quota_pvIoutFilt 0
     2026-03-25 09:36:40   quota_pvStateMonitor1 0
     2026-03-25 09:36:40   quota_pvStateMonitor2 17895424
     2026-03-25 10:06:28   quota_pwr12v    0
     2026-03-25 09:36:40   quota_reactPwrRefDelta 0
     2026-03-25 10:06:28   quota_realSoh   100.0
     2026-03-25 09:36:40   quota_ref1P65   1637
     2026-03-25 09:36:40   quota_ref2P5    0
     2026-03-25 10:05:15   quota_relay1Onoff true
     2026-03-25 10:05:15   quota_relay2Onoff false
     2026-03-25 10:05:15   quota_relay3Onoff false
     2026-03-25 10:05:15   quota_relay4Onoff true
     2026-03-25 10:06:28   quota_remainBalanceTime_1 0
     2026-03-25 10:06:28   quota_remainBalanceTime_2 0
     2026-03-25 10:06:28   quota_remainBalanceTime_3 0
     2026-03-25 10:06:28   quota_remainBalanceTime_4 0
     2026-03-25 10:06:28   quota_remainBalanceTime_5 0
     2026-03-25 10:06:28   quota_remainBalanceTime_6 0
     2026-03-25 10:06:28   quota_remainCap 93437
     2026-03-25 10:06:28   quota_remainTime 9
     2026-03-25 09:36:40   quota_runtimePropertyFullUploadPeriod 120000
     2026-03-25 09:36:40   quota_runtimePropertyIncrementalUploadPeriod 30000
     2026-03-25 10:05:15   quota_scoket1BindDeviceSn
     2026-03-25 10:05:15   quota_scoket2BindDeviceSn
     2026-03-25 10:05:15   quota_seriesConnectDeviceId 1
     2026-03-25 10:05:15   quota_seriesConnectDeviceStatus MASTER
     2026-03-25 10:05:16   quota_seriesPower -6
     2026-03-25 10:06:28   quota_soc       93
     2026-03-25 10:05:15   quota_socket1PwrInUnbind false
     2026-03-25 10:05:15   quota_socket2PwrInUnbind false
     2026-03-25 10:05:15   quota_socketMeasurePower 0.0
     2026-03-25 10:06:28   quota_soh       100
     2026-03-25 10:07:12   quota_sysGridConnectionPower -991.4571
     2026-03-25 10:05:15   quota_sysGridInPwrLimit 3600
     2026-03-25 10:06:28   quota_sysLoaderVer 4294967295
     2026-03-25 10:05:15   quota_sysOffgrid false
     2026-03-25 10:06:28   quota_sysPwrFlag 1
     2026-03-25 10:06:28   quota_sysState  3
     2026-03-25 10:06:28   quota_sysVer    33620044
     2026-03-25 10:05:15   quota_systemGroupId 2058670082
     2026-03-25 10:05:15   quota_systemMeshId 1
     2026-03-25 10:06:28   quota_tagChgAmp 50000
     2026-03-25 10:06:28   quota_targetSoc 93.43381
     2026-03-25 10:06:28   quota_temp      38
     2026-03-25 10:05:15   quota_timezoneChangeList_timeZoneChangeItem_1_utcTime 1774746000
     2026-03-25 10:05:15   quota_timezoneChangeList_timeZoneChangeItem_1_utcTimezone 200
     2026-03-25 10:05:15   quota_timezoneChangeList_timeZoneChangeItem_2_utcTime 1792890000
     2026-03-25 10:05:15   quota_timezoneChangeList_timeZoneChangeItem_2_utcTimezone 100
     2026-03-25 10:05:15   quota_townCode  0
     2026-03-25 10:06:28   quota_type      1
     2026-03-25 10:05:15   quota_updateBanFlag 0
     2026-03-25 10:05:15   quota_useLanMeter false
     2026-03-25 10:05:15   quota_utcSetMode true
     2026-03-25 10:05:15   quota_utcTimezone 100
     2026-03-25 10:05:15   quota_utcTimezoneId Europe/Berlin
     2026-03-25 10:06:27   quota_v1p0_bmsIsConnt_1 3
     2026-03-25 10:06:27   quota_v1p0_bmsIsConnt_2 0
     2026-03-25 10:06:27   quota_v1p0_bmsIsConnt_3 1
     2026-03-25 10:06:27   quota_v1p0_bmsModel 1
     2026-03-25 10:06:27   quota_v1p0_bmsWarningState 0
     2026-03-25 10:06:27   quota_v1p0_chgAmp 90000
     2026-03-25 10:06:27   quota_v1p0_chgCmd 1
     2026-03-25 10:06:27   quota_v1p0_chgRemainTime 9
     2026-03-25 10:06:27   quota_v1p0_chgState 2
     2026-03-25 10:06:27   quota_v1p0_chgVol 22503
     2026-03-25 10:06:27   quota_v1p0_dsgCmd 1
     2026-03-25 10:06:27   quota_v1p0_dsgRemainTime 5939
     2026-03-25 10:06:27   quota_v1p0_emsIsNormalFlag 1
     2026-03-25 10:06:27   quota_v1p0_f32LcdShowSoc 93.437
     2026-03-25 10:06:27   quota_v1p0_fanLevel 0
     2026-03-25 10:06:27   quota_v1p0_lcdShowSoc 93
     2026-03-25 10:06:27   quota_v1p0_maxAvailableNum 1
     2026-03-25 10:06:27   quota_v1p0_maxChargeSoc 95
     2026-03-25 10:06:27   quota_v1p0_maxCloseOilEbSoc 100
     2026-03-25 10:06:27   quota_v1p0_minDsgSoc 6
     2026-03-25 10:06:27   quota_v1p0_minOpenOilEbSoc 20
     2026-03-25 10:06:27   quota_v1p0_openBmsIdx 1
     2026-03-25 10:06:27   quota_v1p0_openUpsFlag 1
     2026-03-25 10:06:27   quota_v1p0_paraVolMax 0
     2026-03-25 10:06:27   quota_v1p0_paraVolMin 0
     2026-03-25 10:06:27   quota_v1p3_chgDisableCond 0
     2026-03-25 10:06:27   quota_v1p3_chgLinePlugInFlag 0
     2026-03-25 10:06:27   quota_v1p3_dsgDisableCond 0
     2026-03-25 10:06:27   quota_v1p3_emsHeartbeatVer 259
     2026-03-25 10:06:27   quota_v1p3_sysChgDsgState 2
     2026-03-25 10:06:45   quota_vBat      20383
     2026-03-25 10:06:45   quota_vBus      441
     2026-03-25 10:06:45   quota_vBusHv    451
     2026-03-25 09:36:49   quota_vBusPidRef 451
     2026-03-25 09:36:40   quota_vinPv1    0
     2026-03-25 09:36:40   quota_vinPv2    0
     2026-03-25 09:36:40   quota_vinPv3    0
     2026-03-25 09:36:40   quota_vinPv4    0
     2026-03-25 10:06:28   quota_vol       20504
     2026-03-25 10:05:45   quota_voltFreqfilter 5001
     2026-03-25 10:06:28   quota_waterInFlag 0
     2026-03-25 03:50:59   status_id       602641409
     2026-03-25 03:50:59   status_params_status 1
     2026-03-25 03:50:59   status_timestamp 1774407059389
     2026-03-25 03:50:59   status_version  1.0

Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: MasterRay am 25 März 2026, 11:04:31
Vielleicht kann man sich auch mit einer anderen Client-Id anmelden. In mosquitto_sub der Parameter -i. Ansonsten quittiert die App beim Schließen wohl auch den Client an der Konsole.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 25 März 2026, 11:20:13
Zitat von: MasterRay am 25 März 2026, 11:04:31Vielleicht kann man sich auch mit einer anderen Client-Id anmelden. In mosquitto_sub der Parameter -i. Ansonsten quittiert die App beim Schließen wohl auch den Client an der Konsole.

Ich nutze als Client MQTT2, dort wird mqtt-e.ecoflow.com:8883 und der erstellte Accesskey als user mit dem dazugehörigen Passwort angegeben. Die clientId habe ich mir ausgedacht und sie hat mit der clientId der App wohl nichts gemeinsam.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 25 März 2026, 13:59:35
Vermutlich ist dann die Client-Id schnurz ? Ich habe den access-key beim MQTT2_Client eingegeben und beim MQTT2_Device mit IODev MQTT2_Client sehe ich als CID den access-key aus der Definition.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 26 März 2026, 08:12:55
Die Datenübermittlung läuft ganz gut. Auch die Nulleinspeisung von Ecoflow ist ok. Der Akku wird mit Solarenergie morgens in 2 Std. geladen und hält den Bezug in den teuren Abendstunden (Tibber dynamisch) bis ca. 23:00 Uhr auf Null. Der Speicher könnte sich so in 3 Jahren amortisieren.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 26 März 2026, 19:18:05
Offenbar ist die ecoflow-Schnittstelle nicht dafür ausgelegt rund um die Uhr Daten zu senden. Irgendwann nach weniger als 24 Stunden werden keine Nachrichten mehr gesendet.

Ich habe jetzt alle 12 Stunden einen Reconnect bei mir eingebaut, mal schauen, ob es schon reicht. Ggf. baue ich einen Reconnect, der ausgeführt wird, wenn einige Sekunden lang keine Daten kommen. Aber vielleicht reicht es schon zwei mal am Tag die Leitung wiederzubeleben.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 26 März 2026, 22:01:40
Hallo zusammen,
wie viele Readings habt ihr per Mqtt? Bei mir haben sich 426 angesammelt nachdem das jetzt seit 18 Stunden ohne Unterbrechung gelaufen ist.

In das Modul könnten wir noch das Holen der Mqtt Zugansgdaten mit einbauen würde das zumindest vereinfachen.

gruß Denis
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 27 März 2026, 07:15:56
ZitatIn das Modul könnten wir noch das Holen der Mqtt Zugansgdaten mit einbauen würde das zumindest vereinfachen.
Bin ich bei Dir. Muss ich mir mal näher ansehen...
ZitatBei mir haben sich 426 angesammelt nachdem das jetzt seit 18 Stunden ohne Unterbrechung gelaufen ist.
Ja, fürchterlich.
das hatte ich bereits in ähnlicher Form gepostet. Wäre interessant wie bei der Stream die Quote der gar nicht genutzten Daten ist. Und die der wirklich Bedeutenden. 
ZitatFür eine Delta2:
attr Delta2_AC event-on-change-reading .*
attr Delta2_AC event-min-interval data_pd.inputW.*:160,data_pd.out.*W.*:160,data_pd.usb.W.*:160,data_pd.watts.*:160
attr Delta2_AC timestamp-on-change-reading .*
bewirkt, dass nur für Daten, die wirklich aktualisiert wurden ein event erzeugt wird. Der readings-timestamp ändert sich auch nur bei Änderung. Nach einiger Laufzeit erkennt man die wenigen wirklich genutzten readings.
Ich habe sogar manuell die timestamps der readings OHNE update in meinem FHEM so angepasst, dass ich leicht an den timestamps erkennen kann, ob und wann sich deren Wert tatsächlich geändert hat.(2025-12-31 23:59:59)
Für durchgängige Plots die Ausnahme mit event-min-interval, dass auch ohne Änderung ein update erfolgt

Möglicherweise macht es Sinn ein Attribut einzuführen, dass die readings filtert. Oder automatisch unsichtbar für den "gewöhnlichen" user, sichtbar, aber sortiert, bei attr global showInternalValues 1 Stelle mir das so vor: 1. lesen und update eines "InternalValues" .readingname mit fiktivem timestamp(z.B. 2001-01-01 00:00:001). Erst mit einem weiteren update anlegen des eigentlichen readings. Performance könnte dagegen sprechen.

Grüße Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 27 März 2026, 07:43:01
Ich habe kein Problem mit den vielen Readings - je mehr spezifische Infos, desto besser. Diese werden bei quote offenbar nur bei Änderung gesendet - es sind einige wenige, die sich ständig ändern. Zusätzlich habe ich natürlich event-on-change-reading .* gesetzt.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 28 März 2026, 12:39:32
Ich habs dann mal umgesetzt:
- es gibt ein get devicename MQTTSecrets
  es schreibt das Ergebnis im JSON-Format ins Log und in ein Internal .MQTTSecrets
  Nach einem Neustart ist das Internal wieder weg....
- Die Vielzahl der readings habe ich deutlich reduziert. Herrlich wie überichtlich das nun ist
  Bei einem 1. run werden nun die Daten in Internals geschrieben. sind also "dauerhaft" mit attr global showInternalValues 1 oder "on demand" durch ein list devicename sichtbar.
  Sobald sich bei einem zukünftigen run der Wert verändert, wird das Internal gelöscht und ein reading angelegt.
- Für existierende devices gibt es nun verschiedene Wege, um die neue Funktionalität zu nutzen:
  - unter Verzicht auf die alten timestamps einfach das device löschen und wieder neu anlegen;
    bei wenigen wichtigen readings diese vorher mit ihrem setstate aus der raw definition kopieren
  - wer sich an meine event-on-.... Vorgehensweise gehalten hat, wird bei allen readings, die keine Bedeutung(Veränderung)
    haben, einen gleichen timestamp haben. Anstatt das device neu anzulegen, genügt es diese readings zu löschen. Dazu
    könnt Ihr diesen Codeschnipsel auf Euren devicename und timestamp anpassen:
{ my $hash = $defs{"EuerDevicename"};;\
my @ReadingsList = $hash->{READINGS};;\
foreach my $ReadingsName (keys %{$ReadingsList[0]}) {\
readingsDelete($hash, $ReadingsName) if (ReadingsTimestamp($hash->{NAME}, $ReadingsName, "") eq "2001-01-01 00:00:01");;\
}}
 

Schönes Wochenende
Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Timmy.m am 28 März 2026, 20:51:47
Hallo zusammen,

ich bin nun auch stolzer Besitzer eines EcoFlow Stream Ultra X und bin begeistert von diesem Modul.
Ich habe gelesen, dass man mit diesem Modul auch die Steckdosen des Ultra X schalten kann, aber mir ist es bisher nicht gelungen.
Habe Ihr einen Tipp?

Grüße Tim
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 28 März 2026, 21:47:53
Hallo Tim,
schalte im Modul mal das Logging ein schick mal was beim Schalten passiert. Bitte im Log Auszug den Key und Seriennummern unkenntlich machen.

Gruß Denis
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 28 März 2026, 21:59:17
Hallo Tim,
diese Info von Denis hast Du berücksichtigt ?
ZitatName für Attribut Model  Unterstütztes Gerät
STREAM AC                      STREAM AC
STREAM MAX                   STREAM MAX
STREAM UP                      STREAM Ultra, STREAM Pro, STREAM AC Pro, STREAM Ultra X, STREAM Ultra (US)
Müsstest also
attr deindevicename Model STREAM UP anlegen.
Grüße Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Timmy.m am 29 März 2026, 14:20:33
Herzlichen Dank, wenn man es richtig macht, funktioniert es auch.
Mir gefällt das Modul richtig gut, tolle Arbeit und Danke für den Support.

Grüße Tim
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: Damian am 02 April 2026, 12:33:45
Kann mir jemand sagen, in welchem Reading die aktuelle geladene/entnommene Energie bei einem Ecoflow STREAM AC Pro abgelegt wird. Diese wird zumindest in der App dargestellt.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: phantom am 02 April 2026, 16:48:16
Wo findet man denn die historischen Daten, die man z.B. mit "BatteryChargingDischargingPower" abrufen kann ?
Ich sehe nur die Resultbox "historical data requested".
Ich habe einen STREAM ULTRA, der die normalen Daten per HTTP-REST ansonsten prima empfängt.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 02 April 2026, 17:42:21
sollten nach dem request dann in den readings stehen. Ggfs. bei einem 1. request in den internals.
Ich würde 3 readings erwarten: indexName, indexValue, unit. Bei manchen requests noch ein 'extra'

Poste gerne mal ein list des devices mit dem vorhergehenden request...
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: phantom am 02 April 2026, 18:27:59
es ist deine Modulversion aus Post #168
hier ein list des Ecoflow STREAM Ultra:
Internals:
   AccessKey  xxxxxxxx
   DEF        yyyyyyyy BKzzzzz
   FUUID      69bbd54e-f33f-d00b-a4c2-5722bab9a85c49d4
   Model      STREAM UP
   ModulVersion V 0.0.0.1
   NAME       Ecoflow_Ultra1
   NR         453
   STATE      PV: 24 GridCon: -229 SysGrid: 1382 SysLoad: 1369 BP: 36 SoC: 30 - - 2026-04-02 18:17:34
   SerialNo   BKzzzzz
   TYPE       Ecoflow
   eventCount 71
   READINGS:
     2026-04-02 15:55:12   code            0
     2026-04-02 18:17:34   data_backupReverseSoc 30
     2026-04-02 18:17:34   data_cmsBattSoc 30.0
     2026-04-02 18:17:34   data_cmsMaxChgSoc 95
     2026-04-02 18:17:34   data_cmsMinDsgSoc 20
     2026-04-02 18:17:34   data_energyStrategyOperateMode.operateIntelligentScheduleModeOpen false
     2026-04-02 18:17:34   data_energyStrategyOperateMode.operateSelfPoweredOpen true
     2026-04-02 18:17:34   data_feedGridMode 2
     2026-04-02 18:17:34   data_gridConnectionPower -229.46362
     2026-04-02 18:17:34   data_powGetBpCms 36.463623
     2026-04-02 18:17:34   data_powGetPvSum 24.0
     2026-04-02 18:17:34   data_powGetSysGrid 1382.0
     2026-04-02 18:17:34   data_powGetSysLoad 1369.5364
     2026-04-02 18:17:34   data_quota_cloud_ts 2026-04-03 00:15:12
     2026-04-02 18:17:34   data_relay2Onoff true
     2026-04-02 18:17:34   data_relay3Onoff true
     2026-04-02 15:55:12   eagleEyeTraceId
     2026-04-02 18:17:34   message         Success
     2026-04-02 15:55:12   tid             
Attributes:
   Model      STREAM UP
   interval   120
   room       PowerMeter
   stateFormat {sprintf("PV: %d GridCon: %d SysGrid: %d SysLoad: %d BP: %d SoC: %d - - %s", ReadingsVal($name,"data_powGetPvSum",0), ReadingsVal($name,"data_gridConnectionPower",0),ReadingsVal($name,"data_powGetSysGrid",0), ReadingsVal($name,"data_powGetSysLoad",0), ReadingsVal($name,"data_powGetBpCms",0),ReadingsVal($name,"data_cmsBattSoc",0),ReadingsTimestamp($name,"data_gridConnectionPower","???") )}
ein attr global showInternalValues 1 zeigt zusätzlich nur MQTT-secrets
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 02 April 2026, 18:49:33
mach noch die SerialNo unkenntlich !

Ist ja übersichtlich im Vergleich zu einer Delta....

Ich gleiche es mal mit der Developer-Doku ab und editiere dann diesen Beitrag

Edit:
regelmäßige Daten
2026-04-02 18:17:34   data_backupReverseSoc 30
     2026-04-02 18:17:34   data_cmsBattSoc 30.0
     2026-04-02 18:17:34   data_cmsMaxChgSoc 95
     2026-04-02 18:17:34   data_cmsMinDsgSoc 20
     2026-04-02 18:17:34   data_energyStrategyOperateMode.operateIntelligentScheduleModeOpen false
     2026-04-02 18:17:34   data_energyStrategyOperateMode.operateSelfPoweredOpen true
     2026-04-02 18:17:34   data_feedGridMode 2
     2026-04-02 18:17:34   data_gridConnectionPower -229.46362
     2026-04-02 18:17:34   data_powGetBpCms 36.463623
     2026-04-02 18:17:34   data_powGetPvSum 24.0
     2026-04-02 18:17:34   data_powGetSysGrid 1382.0
     2026-04-02 18:17:34   data_powGetSysLoad 1369.5364
     2026-04-02 18:17:34   data_quota_cloud_ts 2026-04-03 00:15:12
     2026-04-02 18:17:34   data_relay2Onoff true
     2026-04-02 18:17:34   data_relay3Onoff true
historische Daten
keine
Wie sah Dein get aus ? get Ecoflow_Ultra1 BatteryChargingDischargingPower ?????????
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: phantom am 02 April 2026, 19:18:45
nach dem get Ecoflow_Ultra1 BatteryChargingDischargingPower erscheint nur eine Anzeig-Box mit dem Inhalt historical data requested ; die kann man dann mit OK schließen

Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 02 April 2026, 21:53:17
schon klar, das kommt ja so vom Modul.
Denis hatte zwar geschrieben, dass ohne Angabe von timestamps der aktuelle Tag ausgelesen wird, aber vielleicht musst Du ja Zeiten mitgeben
ZitatbeginTime   dateTime   Query start time, formatted as 'yyyy-MM-dd HH:mm:ss', in UTC timezone. The effective range refers to the query latitude column.
endTime   dateTime   Query end time, formatted as 'yyyy-MM-dd HH:mm:ss', in UTC timezone. The effective range refers to the query latitude column.
z.B.
get Ecoflow_Ultra1 BatteryChargingDischargingPower 2026-04-02 07:00:00 2026-04-02 21:00:00 Sonst müssen wir auf Denis warten...

Edit: wenn ich Denis's code richtig interpretiert habe, wird ohne Angabe von timestamps der aktuelle Tag in den request generiert. Kannst ja auch mal ein get bei verbose=5 machen und das Log posten.
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 05 April 2026, 18:12:41
Frohe Ostern,

anbei eine neue Version:
- kleiner bug, der zu Plotfehlern führte, beseitigt
- Code vereinheitlicht und lesbarer gestaltet

Wegen Letzterem prüft bitte etwas intensiver, ob mir beim change vieler Zeilen nicht vielleicht ein Tipp-Fehlerchen unterlaufen ist. Insbesondere die Abfrage historischer Daten.

Grüße Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 20 April 2026, 09:01:27
Hallo Markus,

ich habe es jetzt endlich mal geschafft, die neue Version zu testen. Die "Historischen" Daten funktionieren nicht.
bei der Antwort steht nur:
2026.04.20 08:52:13 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota/data
in Zeile 846 und 847 muß noch || $param->{url} eq $HOST.$GET_QUOTA_URL."/data"
Gruß Denis[/code]
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: dergolem am 20 April 2026, 10:14:53
Hi,

so hab weiter getestet, in der Response ist jetzt der Fehler "signature is wrong":


2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Get(): cmd = Grid
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Get(): EcoFlowMax has GetCmdCodes
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Get(): $key = params.beginTime
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Get(): params $str_value = a[2] a[3]
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Get(): $key = params.endTime
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Get(): params $str_value = a[4] a[5]
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Get(): $key = params.code
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Get(): params $str_value = BK621-App-HOME-GRID-ENERGY-FLOW-grid_prop_bar-NOTDISTINGUISH-MASTER_DATA
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Gets(): setting URL to /iot-open/sign/device/quota/data
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_SingleRequest(): $json = {"sn": "BK41xxxxxxxxxxxxx", "params": {"beginTime": "2026-04-20 00:00:00","code": "BK621-App-HOME-GRID-ENERGY-FLOW-grid_prop_bar-NOTDISTINGUISH-MASTER_DATA","endTime": "2026-04-20 23:59:59"}}
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Request(): $json={"sn": "BK41xxxxxxxxxxxx", "params": {"beginTime": "2026-04-20 00:00:00","code": "BK621-App-HOME-GRID-ENERGY-FLOW-grid_prop_bar-NOTDISTINGUISH-MASTER_DATA","endTime": "2026-04-20 23:59:59"}} $query_str=params.beginTime=2026-04-20%2000%3A00%3A00¶ms.code=BK621-App-HOME-GRID-ENERGY-FLOW-grid_prop_bar-NOTDISTINGUISH-MASTER_DATA¶ms.endTime=2026-04-20%2023%3A59%3A59&sn=BK41ZE1B2H5B7155&
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Request(): $accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx $nonce=951547 $timestamp=1776672352854
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Request(): $url = /iot-open/sign/device/quota/data $query_str = params.beginTime=2026-04-20%2000%3A00%3A00¶ms.code=BK621-App-HOME-GRID-ENERGY-FLOW-grid_prop_bar-NOTDISTINGUISH-MASTER_DATA¶ms.endTime=2026-04-20%2023%3A59%3A59&sn=BK41xxxxxxxxxxx&accessKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&nonce=951547×tamp=1776672352854
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Request(): $sign = d908a0b3d51907fabb0373b50248d7853fc10e6cf4ebe69c6e1cb060a6a63800
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Request(): $json = {"sn": "BK41xxxxxxxxxxxx", "params": {"beginTime": "2026-04-20 00:00:00","code": "BK621-App-HOME-GRID-ENERGY-FLOW-grid_prop_bar-NOTDISTINGUISH-MASTER_DATA","endTime": "2026-04-20 23:59:59"}}
2026.04.20 10:05:52 5: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Response(): $url = https://api-e.ecoflow.com/iot-open/sign/device/quota/data
2026.04.20 10:05:52 0: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Response(): ERROR! {"code":"8521","message":"signature is wrong","eagleEyeTraceId":"","tid":""}
2026.04.20 10:05:52 4: EcoFlowMax(Ecoflow 0.0.0.2): Ecoflow_Response(): Update Readings
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 20 April 2026, 13:06:56
Hi Denis,
Danke Dir.

Ich habe auch noch einen Bug entdeckt, der aber nur bei den Deltas zum Tragen kommt. Ich gucke dann mal, ob ich Deine Korrekturvorschläge in meiner neusten Version so einfach umgesetzt bekomme.

@StreamUltra/Pro/Max-User: Die Dinger sind ja spottbillig. Könnte mal jemand ein list einstellen, dass man die möglichen readings sieht.
Und könnte vielleicht jemand beschreiben, ob Laden/Entladen bei der Ultra/Pro/Max(eben nicht AC) auch über den Netzanschluss steuerbar ist.
Was ich damit meine: Bei der Delta ist das möglich, wenn man an die Delta einen Powerstream anschließt. Man kann dann die Entladeleistung über den Powerstream steuern, braucht also keinen zusätzlichen Smartmeter, sondern steuert die Entladeleistung am Powerstream per FHEM, wenn dort bereits die Daten von einem anderen Smartmeter verfügbar sind.

Grüße Markus
Titel: Aw: Modul für Ecoflow-Komponenten (über HTTP-REST)
Beitrag von: KölnSolar am 20 April 2026, 15:07:43
Hi Denis,

historische Daten und Abfrage der URL ist jetzt klar für mich.

Das signature-Problem noch nicht. Ich habe gesehen, dass ich Deine damalige Änderung $ContentType=$ContentType.";charset=UTF-8";
nicht drin habe. Liegt es daran ? Wenn nicht, gehen denn andere sets/gets und nur bei den historischen Daten kommt "signature is wrong" ?

Grüße Markus