Modul für Ecoflow-Komponenten (über HTTP-REST)

Begonnen von Neolux, 17 Februar 2025, 13:10:08

Vorheriges Thema - Nächstes Thema

Neolux

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!
Gruß
Knut

---
Modul 98_Ecoflow.pm für Ecoflow-Komponenten, die aktuellste Version gibt es immer hier

Neolux

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.
Gruß
Knut

---
Modul 98_Ecoflow.pm für Ecoflow-Komponenten, die aktuellste Version gibt es immer hier

dergolem

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 

KölnSolar

ZitatNur das die Readings nach dem lesen nicht sofort aktualisiert werden
langsame Hardware ? könnte am BlockingCall liegen. Ist dann aber richtig so.
RPi5/3/2 Trixie-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-ecovacs(mqtt2)-zigbee2mqtt

dergolem

#139
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!

dergolem

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

dergolem

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

rubberduck67

Moin zusammen!

Danke für die Arbeit.
Bei mir klappt der Acesskey nicht. Wenn ich das vorrige Modul einstelle, geht alles wieder.
Gruß
Sven

KölnSolar

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
RPi5/3/2 Trixie-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-ecovacs(mqtt2)-zigbee2mqtt

rubberduck67

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!

KölnSolar

#145
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
RPi5/3/2 Trixie-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-ecovacs(mqtt2)-zigbee2mqtt

dergolem

Ja, es ist so, dass sämtliche Daten der "Single gets" auch bei "all data" Übertragen werden.

Gruß Denis

Cineman

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????

KölnSolar

RPi5/3/2 Trixie-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-ecovacs(mqtt2)-zigbee2mqtt

KölnSolar

#149
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.
RPi5/3/2 Trixie-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-ecovacs(mqtt2)-zigbee2mqtt