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

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

Vorheriges Thema - Nächstes Thema

Wolle02

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.

tschimi

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":""}
 

Neolux

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

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

Neolux

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

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

tschimi

Hi, habs nochmal überprüft. Hatte wohl doch noch ne ältere Version am Start - jetzt läufts :-)

DANKE!!!!

Wolle02

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.

matsches

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






Wolle02

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.

matsches

#38
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 empfehlen.

Neolux

#39
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 sehr interessant, und kostet nur einen Bruchteil.

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

  • API wurde erst später freigegeben, zu Anfang ging nur die App, bzw. MQTT-Anbindungen über ein Reverse Engineering des App-Traffics. Da hatte ich eine gewagte FHEM-Anbindung mit einem Zusammengeschusterten MQTT-Modul, das ein Android-Telefon simulierte
  • Keine Möglichkeit, die Anlage entfernt durchzustarten. Nach einem Firmware-Update stellte die Anlage meist die Stromproduktion ein. "Lösung" laut des Supports: Anlage abschalten und wieder einschalten. Anlage abschalten bedeutet aber: Alle Verbindungen physisch trennen, sonst geht nichts auszuschalten. Danach alles wieder anstecken und Anlage wieder einschalten. Und schon produziert sie wieder Strom.
  • Support ist nicht gut. Aus der Zentrale in China kommen nur unqualifizierte Antworten, wenn denn überhaupt Antworten kommen, der Support in der Tschechien ist mit den meisten Fragen, die über den Ottonormalverbraucher hinausgehen, komplett überfordert. Im Zweifel empfehlen die nur einen Anlagen-Neustart.
  • Nach Freigabe der API funktionierte die MQTT-Verbindung auf Anhieb, das fand ich ja gut, aber die Freude währte nur 1,3 Jahre. Seit Mitte Januar kommt bei mir kein MQTT mehr an (s.o.). Mal sehen, wie lange HTTP-Rest noch geht, oder ob ecoflow das wieder auf die App reduziert, die übrigens immer schlechter wird.
  • Taskplanung und Shelly-Anbindung in der App funktioniert nur mässig. Ich hatte Tasks und Regelungen mangels FHEM-Unterstützung erstellt, aber ob die Anlage die ausführt, hing eher von der Windrichtung ab. Oder von Lust & Laune. Das funktioniert jetzt über FHEM zuverlässig.

Was ich gut finde:

  • Hohe Belastbarkeit der Delta 2 Max, ich hab mein "Kraftwerk" in und auf meiner Garage(Werkstatt) und fürs Heimwerken nutze ich inzwischen ausschliesslich die Delta 2. Egal ob Rasenmäher, Tischkreissäge, Betonmischer oder Hilti, die steckt das weg.
  • Einspeisung richtet sich bach dem eingestellten Wert, bzw über eine Verbrauchsmessung über Shelly/Smart Plug, da ist ohne großen Aufwand eine Nulleinspeisung möglich
  • Die Möglichkeit, die Delta 2 Max über eigene Panels und Panels am Powerstream zu laden, bzw die Anlage zu betreiben.

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

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

Wolle02

Danke für Eure Zusammenfassungen. Unterm Strich schau ich mir doch nochmal mein Alternativangebot an; auch wenn es leider etwas teurer ist.  :-\

Neolux

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

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

Neolux

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

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

matsches

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


Neolux

Huch... hatte ich doch vorher getestet?!

Naja, ich hab's korrigiert.  :'(
Gruß
Knut

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