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

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

Vorheriges Thema - Nächstes Thema

KölnSolar

No, völlig andere Systematik bei Stream xyz.
RPi3/2 buster/stretch-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)-zigbee2mqtt

dergolem

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

MasterRay

#107
Zitat von: dergolem am 04 Januar 2026, 10:03:02Kann man die Set Befehle selber zusammen bauen und an die Stream schicken?
Man könnte zunächst mal versuchen auf Basis der EF-Dokumentation (s.u.) die "Sets und Gets" (ab Zeile 132 im Modul) zu erweitern  ;)

(sieht mir auf den ersten Blick ähnlich aus, wie z.B. beim PowerStream)

KölnSolar

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
RPi3/2 buster/stretch-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)-zigbee2mqtt

dergolem

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

dergolem

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
 

KölnSolar

#111
Eigentlich nicht.

andere set/get funktionieren ?

mal mit verbose=5 set ausführen u. Log posten.
RPi3/2 buster/stretch-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)-zigbee2mqtt

dergolem

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

KölnSolar

#113
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
RPi3/2 buster/stretch-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)-zigbee2mqtt

dergolem

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.

KölnSolar

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.
RPi3/2 buster/stretch-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)-zigbee2mqtt

dergolem

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

KölnSolar

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.
RPi3/2 buster/stretch-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)-zigbee2mqtt