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

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

Vorheriges Thema - Nächstes Thema

matsches

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

Neolux

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

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

matsches

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

Neolux

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

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

matsches

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 

jop

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
 

Neolux

#51
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
Gruß
Knut

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

Neolux

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

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

Neolux

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

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

jop

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

Neolux

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

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

matsches

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


Neolux

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

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