NEWS
Gibt es einen Adapter für ecoflow PowerOcean ?
-
Hallo,
bei meiner zukünftigen PV-Anlage habe ich mich komplett für ecoflow (WR + Speicher + Wallbox) entschieden.
Die Suche hier brachte mir auch Treffer zu ecoflow mit mqtt, jedoch waren das immer nur für die Balkonfkraftwerkslösungen und nicht für Hybrid-WR mit Speicher.
Deshalb frage ich, ob es da schon einen Adapter gibt, oder ob der obige auch dafür verwendet werden kann?
-
@allodo Hi, bekomme bald auch Ecoflow. Bist du mir der Anbindung weiter gekommen?
-
-
@dihi
Also @foxthefox hat einen Adapter "ecoflow-mqtt", wo man die PowerOcean einbinden kann.Ich habe für mich selbst, nach einiger Recherche, ein Script geschrieben, womit ich mir die Daten vom Server hole und in Datenpunkte schreibe. Das läuft relativ stabil. Das einzige Problem ist, das man ab und zu veraltete Werte erhält. Wenn man dann die Webseite oder die App von Ecoflow öffnet, sind sie wieder aktuell.
Ecoflow soll wohl derzeit an einer lokalen API arbeiten, so dass man die Werte direkt von der PO einlesen kann.
Bei Interesse kann ich das Script gerne hier anfügen. Weise aber darauf hin, das es keine Garantie gebe, dass es einwandfrei läuft
Für das Script werden nur die Zugangsdaten der App benötigt. Wobei ich, wenn ich mal wieder Zeit habe, die 2te Möglichkeit testen möchte, und zwar per offizieller API-Anbindung. Dafür braucht man aber einen Developer-Account von Ecoflow. Den man aber auch relativ leicht bekommt.
-
@allodo Das mit dem Script wäre super!
-
@dihi
Die Datenpunkte und die Pfade können natürlich je nach Gusto verändert werden.
Man kann sich einmal alles aus dem Response ausgeben lassen, um zu schauen, welche Datenpunkte man gerne hätte. Dafür einfach in Zeile 141 die "//" vor dem console.log entfernen . Nachdem man die Ausgabe analysiert hat, einfach wieder einfügen, da ansonsten immer alle Datenpunkte in der Ausgabe erscheinen.Da dies mein erstes Script ist, habt bitte Nachsicht. Für Verbesserung bin ich immer offen
Hier das Script:
// Variablendeklaration const fetch = require('node-fetch'); // Datenpunktpfad (Änderbar) // Info: So stehen die Daten nachher im iobroker const datenordner = '0_userdata.0.ecoflow.powerocean.'; //Userdaten: Mailadresse, Passwort und Seriennummer der PO const seriennummer = "HJxxxxxxxxxx"; const mailadresse = "mailadresse"; const passwort = "xxxxxxx"; // URL's (nicht ändern) const url_iot_app = "https://api.ecoflow.com/auth/login"; const url_user_fetch = `https://api-e.ecoflow.com/provider-service/user/device/detail?sn=${seriennummer}`; // Liste der gewünschten Datenpunkte var items = [ { "ecoflowname": "bpSoc", "name": "e_Ladezustand_Batterie", "unit":"%" }, { "ecoflowname": "todayElectricityGeneration", "name": "f_Tagesertrag", "unit":"kW" }, { "ecoflowname": "monthElectricityGeneration", "name": "j_Monatsertrag", "unit":"kW" }, { "ecoflowname": "yearElectricityGeneration", "name": "k_Jahresertrag", "unit":"kW" }, { "ecoflowname": "evPwr", "name": "i_Wallbox_Leistung", "unit":"W" }, { "ecoflowname": "mpptPwr", "name": "a_Solarertrag", "unit":"W" }, { "ecoflowname": "sysGridPwr", "name": "c_Netzeinspeisung", "unit":"W" }, { "ecoflowname": "sysLoadPwr", "name": "b_Hausnetz", "unit":"W" }, { "ecoflowname": "bpPwr", "name": "d_Batterieleistung", "unit":"W" }, { "ecoflowname": "mpptPv.0.pwr", "name": "g_PV1_Leistung", "unit":"W" }, { "ecoflowname": "mpptPv.1.pwr", "name": "h_PV2_Leistung", "unit":"W" } ] /******************************************************************************************************/ // Ablaufsteuerung authorize(); // Aufbau der Verbindung zu Ecoflow mit Authentifizierung schedule('*/2 * * * * *', async () => { // Alle 3 Sekunden werden die Daten geholt try { await fetch_data(); // Holen der Daten und Schreiben bzw. Erzeugung von Datenpunkten } catch (err) { console.error(err); } }); /******************************************************************************************************/ // Funktionen // Aufbau der Verbindung zu Ecoflow mit Authentifizierung async function authorize() { /** Function authorize */ let auth_ok = false; // default const headers = { "lang": "en_US", "content-type": "application/json" }; const data = { email: mailadresse, password: Buffer.from(passwort).toString('base64'), scene: "IOT_APP", userType: "ECOFLOW", }; try { const url = url_iot_app; //console.info(`Login to EcoFlow API ${url}`); const request = await fetch(url, { method: 'POST', headers: headers, body: JSON.stringify(data) }); const response = await get_json_response(request); this.token = response.data.token; this.user_id = response.data.user.userId; const user_name = response.data.user.name || "<no user name>"; auth_ok = true; //console.info(`Successfully logged in: ${user_name}`); } catch (error) { console.warn(`Unable to connect to ${url_iot_app}. Device might be offline.`); throw new Error(error); } return auth_ok; } // Aufbereitung des Reqquest zum JSON-Objekt async function get_json_response(request) { if (request.status !== 200) { throw new Error(`Got HTTP status code ${request.status}: ${await request.text()}`); } const response = await request.json(); const response_message = response.message; // Testausgabe aller Werte der PO-Geräte //console.log("DATA: " + response.data); if (response_message.toLowerCase() !== "success") { throw new Error(response_message); } return response; } // Holen der Daten vom Ecoflow-Server async function fetch_data() { /** Function fetch data from Url. */ const url = url_user_fetch; try { const headers = { "authorization": `Bearer ${this.token}` }; const request = await fetch(url, { headers: headers, timeout: 30000 }); const response = await get_json_response(request); setStatesFromJSON(JSON.stringify(response.data)); } catch (error) { console.error(error); } } // Verarbeitung der Daten und setzen bzw. erzeugen von Datenpunkten async function setStatesFromJSON(ecoflowResponse) { let data = ecoflowResponse; var obj2 = JSON.parse(data); insertElements(obj2) function insertElements(elems, parent="") { if(typeof(elems) === 'object') { for (const key in elems) { insertElements(elems[key], parent !== "" ? parent + '.' + key : key) } } else { insertelement(elems, parent) } } function insertelement(element, parent="") { //console.log('inserting: ' + id + parent + '=' + element) items.forEach(function(item) { if (parent.match(item.ecoflowname)) { if(!existsState(datenordner + "." + parent + "." + element)) { createState(datenordner + item.name , "", {name: parent, unit: item.unit}) setState(datenordner+ item.name, element, true); } else { setState(datenordner + item.name, element, true); } } }) } }
-
@allodo
Hallo, ich habe einen Adapter programmiert der die offizielle EcoFlow HTTP API benutzt: https://github.com/CatShape/ioBroker.ecoflow_catshape
Mein EcoFlow Adapter ist sehr schlank gehalten. Einfach in der Adapter-Config die Seriennummer vom Gerät und den API-Key eintragen und man sieht im Zustand "quota" sofort alle Daten wie sie von EcoFlow geliefert werden.Ich habe mich bewusst dafür entschieden, dass man die Zustände selber anlegen muss (am besten mittels JSON-Datei importieren). Dafür hat man volle Flexibilität:
- Man muss nur diejenigen Zustände anlegen, die man braucht; und man kann jederzeit weitere Zustände hinzufügen oder bestehende löschen.
- Man kann sie benennen und in Kanäle organisieren wie man will.
- Man kann auch den Typ der Zustände selber bestimmen.
Der Adapter funktioniert mit allen Geräte-Typen - auch zukünftigen - vorausgesetzt natürlich, der Geräte-Typ wird von der EcoFlow-API unterstützt. Aber wie oben gesagt - einfach mit der Seriennummer vom Gerät mal ausprobieren; und falls es unterstützt wird, sieht man das Gerät im Objektbaum und die gelieferten Daten im Zustand "quota".
Der Adapter kann mittels "installieren aus eigener URL --> Benutzerdefiniert" installiert werden.
URL: https://github.com/CatShape/ioBroker.ecoflow_catshape -
iobroker url https://github.com/CatShape/ioBroker.ecoflow_catshape --host iobroker --debug install CatShape/ioBroker.ecoflow_catshape#782590f8adbecfe1e158cffb9dcc3ce8a5d4aee2 NPM version: 9.6.7 Installing CatShape/ioBroker.ecoflow_catshape#782590f8adbecfe1e158cffb9dcc3ce8a5d4aee2... (System call) npm ERR! code EBADENGINE npm ERR! notsup Not compatible with your version of node/npm: iobroker.ecoflow_catshape@0.0.6 npm ERR! notsup Required: {"node":">= 20"}npm ERR! notsup Actual: {"npm":"9.6.7","node":"v18.17.1"} npm ERR! A complete log of this run can be found in: /home/iobroker/.npm/_logs/2024-12-03T14_57_21_436Z-debug-0.log npm ERR! code EBADENGINEnpm ERR! engine Unsupported enginenpm ERR! engine Not compatible with your version of node/npm: iobroker.ecoflow_catshape@0.0.6npm ERR! notsup Not compatible with your version of node/npm: iobroker.ecoflow_catshape@0.0.6npm ERR! notsup Required: {"node":">= 20"}npm ERR! notsup Actual: {"npm":"9.6.7","node":"v18.17.1"}npm ERR! A complete log of this run can be found in: /home/iobroker/.npm/_logs/2024-12-03T14_57_21_436Z-debug-0.log host.iobroker Cannot install CatShape/ioBroker.ecoflow_catshape#782590f8adbecfe1e158cffb9dcc3ce8a5d4aee2: 1 ERROR: Process exited with code 25
Bekomme immer diese Fehlermeldung beim installieren
-
@allodo Du brauchst node Version > 20
Steht auch so in der Fehlermeldung. -
@allodo Danke für den Hinweis. Diese Abhängigkeit hat mir der Adapter-Creator automatisch reingeschrieben. Sorry, ich hatte das bisher gar nicht gesehen. Mein Adapter sollte natürlich auch mit älteren Node Versionen laufen.
Ich habe das nun angepasst --> kannst das installieren nochmals versuchen, müsste jetzt funktionieren. -
@allodo sagte in Gibt es einen Adapter für ecoflow PowerOcean ?:
Bekomme immer diese Fehlermeldung beim installieren
Unabhängig von der Anpassung ist es so langsam an der Zeit die nodejs v18 hinter sich zu lassen.
20 ist schon geraume Zeit die vorgesehene Version und es gibt mittlerweile einige Adapter, die 20 als Mindestversion haben.
Also updaten... Geht mitiob nodejs-update
ja auch leicht von der Hand.
-
@thomas-braun
Ehrlich gesagt habe ich gar nicht auf die Node-js-Version geachtet, da iobroker einen ja immer informiert, wenn etwas aktualisiert werden sollte. Dachte das wäre bei node-js auch der Fall, scheint aber wohl nicht so zu sein -
Natürlich gibt es Hinweise.
1.)
npm ERR! notsup Not compatible with your version of node/npm: iobroker.ecoflow_catshape@0.0.6 npm ERR! notsup Required: {"node":">= 20"}npm ERR! notsup Actual: {"npm":"9.6.7","node":"v18.17.1"}
2.)
3.) In
iob diag
Nodejs-Installation: /usr/bin/nodejs v20.18.1 /usr/bin/node v20.18.1 /usr/bin/npm 10.8.2 /usr/bin/npx 10.8.2 /usr/bin/corepack 0.29.4 Recommended versions are nodejs 20.18.1 and npm 10.8.2 nodeJS installation is correct
4.) Im Forum wird es auch immer angekündigt:
https://forum.iobroker.net/topic/74831/wir-empfehlen-node-js-20-x