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

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

Vorheriges Thema - Nächstes Thema

phantom

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.

KölnSolar

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

phantom

#197
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

KölnSolar

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

phantom

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


KölnSolar

#200
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.
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

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

#202
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]

dergolem

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

KölnSolar

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

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

Hallo Markus,

ich havbe die alte Ecoflow_queryStr von mir wieder eingebaut, damit funktioniert es wieder.
sub Ecoflow_queryStr(%) {
    my (%req) = @_;
    my @pairs;
    my $qidx = 0;
    # ASCII-sortierte Keys
    for my $key (sort keys %req) {
        # Spezialfall: params.quotas -> Arrayform "params.quotas[0]=..."
        if (index($key, '.quotas') > 0) {
            my $p = index($key, '.quotas') + 7;  # Position hinter ".quotas"
            my $val = substr($key, $p + 1);     # das eigentliche Quota (z. B. relay2Onoff)
            push @pairs, substr($key, 0, $p) . "[$qidx]" . "=" . $val;
            $qidx++;
        } else {
            push @pairs, "$key=$req{$key}";
        }
    }
    return join('&', @pairs);  # KEINE HTML-Entities, KEIN URL-Encode im Sign-String
}

und
$ContentType=$ContentType.";charset=UTF-8";ist auch wieder drin.

Zu deiner Frage ob die Lade-/Entladeleistung über das netz Steuerbar ist: Nein leider nicht (oder ich habe noch nichts gefunden) Was sie wohl kann ist wenn ein (kompatiebles) SmartMeter vorhanden ist kann üner die Steckdosen am Gerät noch ein Wechselrichter (Z.B. von einer schon vorhandenen Anlage) angeschlossen werden und der Stom dann zum Laden oder einspeisen mitgenutzt werden.

Generell stellt sich bei mir die Frage, wie verhält sich das wenn ich meherre Geräte habe mit der neuen VDE-AR-N 4105. Ich kann ja bei der Anmeldung nur das Zertifikat eines Wechselrichters angeben. Was passiert bei z.B. zwei Stream Geräten die beide am Netz angeschlossen sind und beide einen 800VA Wechselrichter haben? 

gruß Denis 

KölnSolar

#207
Super, Danke Dir. Dann muss ich jetzt nicht mehr woanders suchen.

ZitatGenerell stellt sich bei mir die Frage, wie verhält sich das wenn ich meherre Geräte habe mit der neuen VDE-AR-N 4105. Ich kann ja bei der Anmeldung nur das Zertifikat eines Wechselrichters angeben. Was passiert bei z.B. zwei Stream Geräten die beide am Netz angeschlossen sind und beide einen 800VA Wechselrichter haben?

Meines Erachtens sind mehr als ein Gerät verboten EEG §8(eine Stream hat ja bereits 800VA):
Zitat5a) Ein Steckersolargerät oder mehrere Steckersolargeräte mit einer installierten Leistung von insgesamt bis zu 2 Kilowatt und einer Wechselrichterleistung von insgesamt bis zu 800 Voltampere, die hinter der Entnahmestelle eines Letztverbrauchers betrieben werden und der unentgeltlichen Abnahme zugeordnet werden, können unter Einhaltung der für die Ausführung eines Netzanschlusses maßgeblichen Regelungen angeschlossen werden. Registrierungspflichten nach der Marktstammdatenregisterverordnung bleiben unberührt; zusätzliche gegenüber dem Netzbetreiber abzugebende Meldungen von Anlagen nach Satz 1 können nicht verlangt werden.

ZitatWas sie wohl kann ist wenn ein (kompatiebles) SmartMeter vorhanden ist
Ich habe es so verstanden, dass dann über den AC-Anschluss eine Entladung erfolgt, sprich auf 0W geregelt wird. Und das "kompatible" Smartmeter müsste sich doch per MQTT simulieren lassen.  :-\
Grüße Markus

Edit: Es bräuchte dann jemanden, der ein kompatibles Smartmeter mit einer Stream installiert hat und uns seine Daten mitteilt.
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

OliverHH

Hallo Markus,

danke erst einmal für deinen Einsatz. Ich teste das Modul seit Mitte März um zu sehen ob es eine alternative zu meiner etwas unzuverlässigen MQTT-Steuerung meiner Delta 2 sein kann.

Zitat von: KölnSolar am 21 April 2026, 08:51:48Edit: Es bräuchte dann jemanden, der ein kompatibles Smartmeter mit einer Stream installiert hat und uns seine Daten mitteilt.

Ich habe gerade neu ein Stream AC PRO, länger im Einsatz eine Delta 2 sowie einen Shelly Pro 3EM. Ich bin zwar nicht so sehr erfahren in der tieferen Programmierung (mehr copy & paste und zurechtbiegen bis es passt), stelle mich aber gerne der Herausforderung. Wenn Du mir Hinweise gibst welche Daten du brauchst und wie ich die ggf. bekomme dann helfe ich gerne bei Weiterentwicklung und Testing dieses Moduls!

Viele Grüße
Oliver
HMLAN, Raspberry Pi 2 mit HM-MOD-UART, Charly CCU3 mit Raspberrymatic, Tradfri Gateway, Google Assistant, HomeConnect

OliverHH

Mein Erkenntisse und Motivation soweit:

Der Stream AC Pro ist z.Z. mit Shelly Pro 3EM gekoppelt, in der App richtet man das über die Verknüpfung des Shelly-Cloud-Kontos ein.

Da ich Verbraucher habe die nicht über den Shelly Pro 3EM laufen (Shelly ist im Sicherungskasten in der Wohnung, Mehrfamilienhaus, Kühltruhe am Nebenstrang in Keller) suche ich auch nach einer Möglichkeit die Stream AC PRO in der auf abweichende Lade-/Entladeleistung einzustellen. Die App ermöglicht nur entweder mehrere Mess-Zwischenstecker oder ein Smartmeter auszuwählen :/

Ich versuche es gerade mit uni-meter als virtuellen Shelly. habe das aber noch nicht zum laufen bekommen (Docker), da bin ich gerade dran. Ich befürchte aber das das nicht funktionieren wird, da die Kopplung so nur funktionieren wird, wenn ich den virtuellen Shelly in die Cloud bekomme, was vermutlich nicht funktioniert.

Sobald ich dazu Erkenntnisse habe teile ich die hier - wenn gewünscht.

Viele Grüße
Oliver
HMLAN, Raspberry Pi 2 mit HM-MOD-UART, Charly CCU3 mit Raspberrymatic, Tradfri Gateway, Google Assistant, HomeConnect