Ich habe schon länger einige Ecoflow Geräte und mich hat es gestört, dass es nicht wirklich eine offene API von Ecoflow gegeben hat. Doch kürzlich ist dann doch etwas veröffentlich worden und wir können die Werte der Geräte aus der Ecoflow API abfragen.
Ihr müsst euch mit eurem bereits bestehenden Ecoflow Account den Ihr mit euren Geräten habt, bei der Ecoflow Developer API anmelden. Hier geht es zur Developer API (HIER). Die Freigabe der Anmeldung kann ein paar Tage dauern. Danach solltet Ihr aber einen Access Key und Security Key erstellen können und erste Daten abfragen.
Die API bietet zwei Optionen an. Einmal alles via HTTP/s oder über das MQTT Protokoll. Ich zeige euch nun den Weg über die HTTPS Schnittstelle und zwar mit einem PHP Skript. Mit dieser Abfrage zieht Ihr euch in ein PHP Array alle Abfragewerte, welche man über das Gerät erhält. Ihr könnt beliebige Geräte Abfragen, achtet aber dabei darauf das die Key Werte unterschiedlich sind.
Ecoflow API Script – Powerstream & Delta 2 Daten abfragen
<?php
$sn1 = 'Seriennummer eures Gerätes';
$accessKey = '1234567890987abcde';
$secretKey = '1234567890987abcde';
$timestamp = (string)intval(microtime(true) * 1000);
$nonce = substr(base64_encode(hash("sha256", $timestamp, True)), 0, -1);
$str = 'accessKey='.$accessKey.'&nonce='.$nonce.'&time stamp='.$timestamp;
$sign = hash_hmac('sha256', $str, $secretKey);
$url_eco = 'https://api-e.ecoflow.com/iot-open/sign/device/quota/all?sn='.$sn1;
$curl = curl_init($url_eco);
curl_setopt($curl, CURLOPT_URL, $url_eco);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
$headers = array(
'Content-Type: application/json',
'accessKey:'.$accessKey,
'nonce:'.$nonce,
'timestamp:'.$timestamp,
'sign:'.$sign,
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$resp = json_decode(curl_exec($curl));
curl_close($curl);
print_r($resp);
?>
root@api-calls:~# php test.php
stdClass Object
(
[code] => 0
[message] => Success
[data] => stdClass Object
(
[mppt.faultCode] => 0
[bms_emsStatus.maxChargeSoc] => 0
[bms_bmsInfo.bsmCycles] => 111
[bms_bmsStatus.designCap] => 20000
[pd.bpPowerSoc] => 30
[bms_bmsStatus.outputWatts] => 0
[...]
[...]
Wenn man nun die einzelnen Abfragewerte im PHP weiter verwenden möchte, dann kann man diese aus dem Object auslesen und dann in Variablen speichern. Ich z.B. schiebe dann die ausgelesenen Werte in eine InfluxDB2 rein.
# Delta 2 Werte - Beispiel
$soc = $resp->data->{'bms_bmsStatus.f32ShowSoc'}.PHP_EOL;
$temp = $resp->data->{'bms_bmsStatus.temp'}.PHP_EOL;
# Powerstream Werte - Beispiel
$ac_out = $resp2->data->{'20_1.invOutputWatts'}.PHP_EOL;
$ac_out = $ac_out / 10;
$pvinput = $resp2->data->{'20_1.pvToInvWatts'}.PHP_EOL;
$pvinput = $pvinput / 10;
24. Juli 2024 um 14:31 Uhr
Werden diese Werte auch ausgegeben unabhängig davon ob die App regelmäßig geöffnet wird? Ich hätte Mal ein anders Script gefunden, welches leider nach einiger Zeit die Daten nicht mehr aktualisierte bzw. aus gab. Erst wenn die App gestartet wurde und man sich die Werte der Delta anzeigen ließ wurden die Werte auch wieder über das Script, bzw mqtt wieder ausgegeben.
24. Juli 2024 um 14:59 Uhr
Jop! Das andere ware der Weg über die Android Logindaten.
Das hier benutzt zu 100% die offizielle Ecoflow API und ist daher immer online.
1. August 2024 um 11:06 Uhr
Hallo Dennis, bei mir funzt das nicht. Ich bekomme einen Fehler ausgegeben:
php index.php
PHP Fatal error: Uncaught Error: Call to undefined function curl_init() in /opt/lampp/htdocs/ecoflowapi/index.php:14
Stack trace:
#0 {main}
thrown in /opt/lampp/htdocs/ecoflowapi/index.php on line 14
Kannst du mir meinen Fehler erklären?
1. August 2024 um 11:37 Uhr
Es fehlte ein PHP Paket. Aber jetzt kommt diese Ausgabe:
$ php index.php
stdClass Object
(
[code] => 8521
[message] => signature is wrong
[eagleEyeTraceId] => ea1a2a67317335056542807973d3127
[tid] =>
)
1. August 2024 um 11:40 Uhr
Ich tippe auf Falsche Seriennummer oder deine Keys sind falsch
3. August 2024 um 20:37 Uhr
Hi,
ich bekomme den gleichen Fehler, hast Du schon eine Lösung dafür? Die Keys stimmen, die Seriennummer ebenfalls ¯\_(ツ)_/¯
Gruß
Marten
15. August 2024 um 14:38 Uhr
Ich habe den gleichen Fehler , gibts schon eine Lösung dafür?
LG
Clemens
15. August 2024 um 22:40 Uhr
apt install php8.2-curl ?
1. August 2024 um 11:38 Uhr
apt install php8.2-curl
Mit Google in 6 Sekunden gelöst.
21. August 2024 um 18:14 Uhr
Hi, ich bekomme warum auch immer auch den bereits genannten Fehler:
stdClass Object
(
[code] => 8521
[message] => signature is wrong
[eagleEyeTraceId] => ea1a2a582417242565849807905d0007
[tid] =>
)
sudo apt install php8.2-curl habe ich schon ausgeführt.
Bin ein bisschen am Ende mit meinem Latein.
Danke im Voraus!
21. August 2024 um 20:59 Uhr
Hat aus unerfindlichen Gründen aus dem nichts nun doch funktioniert. Danke für den Guide! 😉
LG Max
2. September 2024 um 19:28 Uhr
Ich habe den Fehler gefunden!
Im Script ist ein Leerschritt zuviel:
$str = ‚accessKey=‘.$accessKey.’&nonce=‘.$nonce.’&time stamp=‘.$timestamp;
An der Stelle „&time stamp“ muss das leerzeichen weg, dann gehts 😉
Ich habe eine Woche gesucht und eben erst gefunden 😀
18. September 2024 um 10:51 Uhr
Klasse Script. Vielen Dank für die Mühe.
Es bleibt für mich ein Problem: Auf einem Raspberry Pi läuft der Script einwandfrei. Da ich aber einen Windows Server in Betrieb habe, wollte ich den Script dort laufen lassen. Dort bekomme ich nur die Meldung „signature is wrong“
Bei identischem timestamp im Raspi und Windows werden die headers identisch erzeugt. Wo könnte noch ein Unterschied zwischen Linux (Raspi) und Windows liegen? Vielleicht hat jemand einen guten Tip.
Gruß Reinhard
18. September 2024 um 12:20 Uhr
Habe das Problem gelöst. In meiner Windows PHP Version (uralt 5.6) werden werden integers als int16 behandelt. Damit führt $timestamp = (string)intval(microtime(true) * 1000) zum integer Überlauf und zum falschen Ergebnis.
Lösung ist
$t = floatval(microtime(true)*1000);
$timestamp = sprintf(„%.0f“,$t);
Zusätzlich muss noch eingefügt werden
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
Dann läuft es.
Gruß Reinhard
8. Oktober 2024 um 09:41 Uhr
Mich würde einmal interessieren, mit welchen Zeitintervall die Werte in die InfluxDB geschrieben werden?
Viele Grüße,
Thomas