NEWS
Adapter für Ecoflow Einbindung
-
@mattenausohz ich habe diesen smartplug bei einem Ecoflow gewinnspiel gewonnen.
ich möchte mit dem etwas rumspielen, also für etwas anderes benutzen und ich habe ja noch kein powerstream.
Da hast du recht, smart plugs braucht man mit den scripten natürlich nicht mehr, wenn man die leistung am stromzähler abgreift.
Ich hätte mir sonst keinen gekauft.
Habe nämlich auch schon ein smartmeter -
@felixcrafter83 Siehe den Beitrag weiter oben.
Wenn man sich die Ecoflow APK (Android App) genauer ansieht wie die Codetechnisch funktioniert fällt zum einen Auf das ein import zu Googles Protobuf drinnen ist.
Ist aber sehr mühselig etwas herauszufinden. -
Ich hab dem Script mal einen eigenen Beitrag spendiert:
https://forum.iobroker.net/topic/66743/ecoflow-connector-script-zur-dynamischen-leistungsanpassung
@FelixCrafter83 Die meisten Deiner Daten kenn ich schon und sind im neuen Script verwendet. Was ich nicht kenne wird als State: X_Unknown_X angelegt. Funfact: ich hab auch einen Smartplug gewonnen ;-D hab ich aber noch nicht hier.
@mattenausohz Die Funktion wurde überarbeitet und sollte jetzt besser laufen.
-
Ich habe heute etwas rumgetüftelt und habe die Proto files in der App gefunden.
nur sind die komisch codiert, ich habe dann chatgpt zur hilfe genommen, das mir dann es in klartext ausgegeben hat.
Jetzt ist die Frage, ob jemand weiß, wie man von der einen darstellung auf die klartext dartstellung kommt:Hier mal das, was ich in der App gefunden habe:
\n\u0016wn511_socket_sys.proto\"\u00ca\u0001\n\brtc_data\u0012\u0011\n\u0004week\u0018\u0001 \u0001(\u0005H\u0000\u0088\u0001\u0001\u0012\u0010\n\u0003sec\u0018\u0002 \u0001(\u0005H\u0001\u0088\u0001\u0001\u0012\u0010\n\u0003min\u0018\u0003 \u0001(\u0005H\u0002\u0088\u0001\u0001\u0012\u0011\n\u0004hour\u0018\u0004 \u0001(\u0005H\u0003\u0088\u0001\u0001\u0012\u0010\n\u0003day\u0018\u0005 \u0001(\u0005H\u0004\u0088\u0001\u0001\u0012\u0012\n\u0005month\u0018\u0006 \u0001(\u0005H\u0005\u0088\u0001\u0001\u0012\u0011\n\u0004year\u0018\u0007 \u0001(\u0005H\u0006\u0088\u0001\u0001B\u0007\n\u0005_weekB\u0006\n\u0004_secB\u0006\n\u0004_minB\u0007\n\u0005_hourB\u0006\n\u0004_dayB\b\n\u0006_monthB\u0007\n\u0005_year\"\u009e\u0001\n\u0013time_range_strategy\u0012\u0011\n\tis_config\u0018\u0001 \u0001(\b\u0012\u0011\n\tis_enable\u0018\u0002 \u0001(\b\u0012\u0011\n\ttime_mode\u0018\u0003 \u0001(\u0005\u0012\u0011\n\ttime_data\u0018\u0004 \u0001(\u0005\u0012\u001d\n\nstart_time\u0018\u0005 \u0001(\u000b2\t.rtc_data\u0012\u001c\n\tstop_time\u0018\u0006 \u0001(\u000b2\t.rtc_data\"\u001f\n\u0010plug_ack_message\u0012\u000b\n\u0003ack\u0018\u0001 \u0001(\r\"\u00a5\u0004\n\u0013plug_heartbeat_pack\u0012\u0015\n\berr_code\u0018\u0001 \u0001(\rH\u0000\u0088\u0001\u0001\u0012\u0016\n\twarn_code\u0018\u0002 \u0001(\rH\u0001\u0088\u0001\u0001\u0012\u0014\n\u0007country\u0018\u0003 \u0001(\rH\u0002\u0088\u0001\u0001\u0012\u0011\n\u0004town\u0018\u0004 \u0001(\rH\u0003\u0088\u0001\u0001\u0012\u0014\n\u0007max_cur\u0018\u0005 \u0001(\u0005H\u0004\u0088\u0001\u0001\u0012\u0011\n\u0004temp\u0018\u0006 \u0001(\u0005H\u0005\u0088\u0001\u0001\u0012\u0011\n\u0004freq\u0018\u0007 \u0001(\u0005H\u0006\u0088\u0001\u0001\u0012\u0014\n\u0007current\u0018\b \u0001(\u0005H\u0007\u0088\u0001\u0001\u0012\u0011\n\u0004volt\u0018\t \u0001(\u0005H\b\u0088\u0001\u0001\u0012\u0012\n\u0005watts\u0018\n \u0001(\u0005H\t\u0088\u0001\u0001\u0012\u0013\n\u0006switch\u0018\u000b \u0001(\bH\n\u0088\u0001\u0001\u0012\u0017\n\nbrightness\u0018\f \u0001(\u0005H\u000b\u0088\u0001\u0001\u0012\u0016\n\tmax_watts\u0018\r \u0001(\u0005H\f\u0088\u0001\u0001\u0012 \n\u0013heartbeat_frequency\u0018\u000e \u0001(\u0005H\r\u0088\u0001\u0001\u0012\u0018\n\u000bmesh_enable\u0018\u000f \u0001(\u0005H\u000e\u0088\u0001\u0001B\u000b\n\t_err_codeB\f\n\n_warn_codeB\n\n\b_countryB\u0007\n\u0005_townB\n\n\b_max_curB\u0007\n\u0005_tempB\u0007\n\u0005_freqB\n\n\b_currentB\u0007\n\u0005_voltB\b\n\u0006_wattsB\t\n\u0007_switchB\r\n\u000b_brightnessB\f\n\n_max_wattsB\u0016\n\u0014_heartbeat_frequencyB\u000e\n\f_mesh_enable\"*\n\u0013plug_switch_message\u0012\u0013\n\u000bplug_switch\u0018\u0001 \u0001(\r\"%\n\u000fbrightness_pack\u0012\u0012\n\nbrightness\u0018\u0001 \u0001(\u0005\"\u001f\n\fmax_cur_pack\u0012\u000f\n\u0007max_cur\u0018\u0001 \u0001(\u0005\"]\n\u0010time_task_config\u0012\u0011\n\ttask_name\u0018\u0001 \u0001(\t\u0012(\n\ntime_range\u0018\u0002 \u0001(\u000b2\u0014.time_range_strategy\u0012\f\n\u0004type\u0018\u0003 \u0001(\u0005\"N\n\u0015time_task_config_post\u0012\r\n\u0005index\u0018\u0001 \u0001(\u0005\u0012&\n\u000btask_config\u0018\u0002 \u0001(\u000b2\u0011.time_task_config\"D\n\tPowerItem\u0012\u0011\n\ttimestamp\u0018\u0001 \u0001(\r\u0012\u0010\n\btimezone\u0018\u0002 \u0001(\u0011\u0012\u0012\n\nplug_power\u0018\u0003 \u0001(\r\"B\n\tPowerPack\u0012\u000f\n\u0007sys_seq\u0018\u0001 \u0001(\r\u0012$\n\u0010sys_power_stream\u0018\u0002 \u0003(\u000b2\n.PowerItem\"\u001f\n\fPowerAckPack\u0012\u000f\n\u0007sys_seq\u0018\u0001 \u0001(\r\"#\n\u000emax_watts_pack\u0012\u0011\n\tmax_watts\u0018\u0001 \u0001(\u0005\"%\n\u000emesh_ctrl_pack\u0012\u0013\n\u000bmesh_enable\u0018\u0001 \u0001(\r\"\u001b\n\bret_pack\u0012\u000f\n\u0007ret_sta\u0018\u0001 \u0001(\bb\u0006proto3
So sieht das dann in klartext aus:
wn511_socket_sys.protosyntax = "proto3"; message rtc_data { optional int32 week = 1 [default = 1]; optional int32 sec = 2 [default = 1]; optional int32 min = 3 [default = 1]; optional int32 hour = 4 [default = 1]; optional int32 day = 5 [default = 1]; optional int32 month = 6 [default = 1]; optional int32 year = 7 [default = 1]; } message time_range_strategy { optional bool is_config = 1; optional bool is_enable = 2; optional int32 time_mode = 3; optional int32 time_data = 4; optional rtc_data start_time = 5; optional rtc_data stop_time = 6; } message plug_ack_message { optional int32 ack = 1; } message plug_heartbeat_pack { optional int32 err_code = 1 [default = 1]; optional int32 warn_code = 2 [default = 1]; optional int32 country = 3 [default = 1]; optional int32 town = 4 [default = 1]; optional int32 max_cur = 5 [default = 1]; optional int32 temp = 6 [default = 1]; optional int32 freq = 7 [default = 1]; optional int32 current = 8 [default = 1]; optional int32 volt = 9 [default = 1]; optional int32 watts = 10 [default = 1]; optional bool switch = 11; optional int32 brightness = 12 [default = 1]; optional int32 max_watts = 13 [default = 1]; optional int32 heartbeat_frequency = 14 [default = 1]; optional bool mesh_enable = 15; } message plug_switch_message { optional int32 plug_switch = 1; } message brightness_pack { optional int32 brightness = 1; } message max_cur_pack { optional int32 max_cur = 1; } message time_task_config { optional string task_name = 1; optional time_range_strategy time_range = 2; optional int32 type = 3; } message time_task_config_post { optional int32 index = 1; optional time_task_config task_config = 2; } message PowerItem { optional int64 timestamp = 1; optional string timezone = 2; optional int32 plug_power = 3; } message PowerPack { optional int32 sys_seq = 1; repeated PowerItem sys_power_stream = 2; } message PowerAckPack { optional int32 sys_seq = 1; } message max_watts_pack { optional int32 max_watts = 1; } message mesh_ctrl_pack { optional int32 mesh_enable = 1; } message ret_pack { optional bool ret_sta = 1; }
-
Ich habe es geschafft alles in Klartext darzustellen hier eine txt Datei:ProtobufsDecoded.txt
Das müssten alle aus der App sein.
Mann muss sie sich nur etwas zusammenbasteln. -
Ich versuche diese Anleitung hier nachzustellen:
https://haus-automatisierung.com/hardware/2023/02/13/ecoflow-river-2-usv-batteriespeicher.htmWie kommt man denn an die UUID? Irgendwie stehe ich auf dem Schlauch.
-
@xfirf sagte in Adapter für Ecoflow Einbindung:
Wie kommt man denn an die UUID?
Du meinst für die Client-ID? Die kann man sich ausdenken soweit ich mich erinnere. Hauptsache deine userId am Ende stimmt.
-
@xfirf ich habe hier mal eine funktion für z.B Node-Red:
function uuidv4() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } msg.payload = uuidv4(); return msg;
-
Cool. Danke.
Kann ich mit dem Adapter auch einfach nur die Erträge aus dem Powerstream auslesen und im History-Adapter speichern? Ich will nichts steuern sondern nur die Erträge festhalten.
-
Hi @all,
lese hier fleißig mit und bin begeistert von der Arbeit von @Waly_de
Besitze selbst 2 Delta Pro und das SmartHomePanel, die beiden DP sind über HASS im ioBroker. eingebunden.
Nun die Frage die mich brennend interessiert, gibt es eine Möglichkeit mit dem Script von @Waly_de das "SmartHomePanel" auszulesen und im besten Fall auch zu steuern ? Hat das schon jemand geschafft?
Danke schon mal im Voraus für ne Antwort, und viele Grüße
MZ
-
@zariomahn ich würde einfach mal versuchen die Seriennummer im Script einzugeben. Wenn Du Glück hast bekommst du alle Daten. Die meisten Ecoflow Geräte (zumindest die Deltas) arbeiten ohne Protobuf und sind daher leicht auszulesen.
Steuern geht dann theoretisch auch. -
@waly_de
Hab ich versucht, bekomme aber lauter Fehlermeldungen... -
@zariomahn Dir fehlt das Modul
protobufjs
. Hast Du das als Erweiterung im JavaScript-Adapter eingetragen? -
habe protobufjs im Terminal mit npm install protobufjs installiert.
Muss noch etwas anderes gemacht werden ?Sorry, bin noch nicht lange mit ioBroker u.s.w. beschäftigt,
komme zwar aus der IT, habe aber immer einen großen Bogen um Programmierung, Skripten u.s.w. gemachtviele Grüße
Mz
-
@zariomahn sagte in Adapter für Ecoflow Einbindung:
habe protobufjs im Terminal mit npm install protobufjs installiert.
Warum das? Bitte in den Instanz-Einstellungen vom JavaScript-Adapter eintragen. Wenn Du manuell per
npm
etwas machst, dann machst Du IMMER etwas falsch -
Hallo,
Dacht ich muss, steht in der Beschreibung des Scripts...
OK, habs nun so gemacht, und bekomme keine Fehler mehr
Danke
viele Grüße
MZ
-
Hi,
ich habe ja nur mein SHP eingestellt mit der Seriennummer, da ich kein PowerStream habe um zu sehen was ich auslesen kann.
Bekomme aber beim starten des Skripts diese Fehlermeldung.
2023-08-08 10:10:13.659 error Script script.js.Tests.Skript_1 is calling setState more than 1000 times per minute! Stopping Script now! Please check your script! 2023-08-08 10:09:00.238 warn at processTimers (node:internal/timers:502:7) javascript.0 2023-08-08 10:09:00.238 warn at listOnTimeout (node:internal/timers:559:17) javascript.0 2023-08-08 10:09:00.238 warn at Timeout._onTimeout (/opt/iobroker/node_modules/iobroker.javascript/node_modules/node-schedule/lib/Invocation.js:228:7) javascript.0 2023-08-08 10:09:00.238 warn at /opt/iobroker/node_modules/iobroker.javascript/node_modules/node-schedule/lib/Invocation.js:268:28 javascript.0 2023-08-08 10:09:00.238 warn at Job.invoke (/opt/iobroker/node_modules/iobroker.javascript/node_modules/node-schedule/lib/Job.js:171:15) javascript.0 2023-08-08 10:09:00.238 warn at Job.job (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1606:34) javascript.0 2023-08-08 10:09:00.237 warn at Object.<anonymous> (script.js.Tests.Skript_1:218:9) javascript.0 2023-08-08 10:09:00.237 warn at CheckforReconnect (script.js.Tests.Skript_1:435:16) javascript.0 2023-08-08 10:09:00.234 warn getState "0_userdata.0.ecoflow.app_device_property_SP10ZEW5ZE7xxxx.RAW_HEX" not found (3)
Was bedeutet das, wo liegt der Fehler?
viele Grüße
MZ
-
@zariomahn Die Warnungen treten schon mal auf, wenn das script das erste mal gestartet wird und die States alle neu anlegen muss. Das sollte sich später legen.
Der Fehler weisst darauf hin, dass du einen oder mehrere Deltas angelegt hast. Vielleicht sendet aber auch Dein SHP Unmengen Daten. Daher setzte mal das Limit in den Einstellungen des Javascriptadapters hoch. 3000-4000 sollte reichen.
Später würde ich vielleicht die Deltas nicht subscriben, wenn Du die Daten nicht dringend brauchst.
Wenn dieser Fehler auftritt, musst du das Skript neu starten. -
@waly_de sagte in Adapter für Ecoflow Einbindung:
@zariomahn Die Warnungen treten schon mal auf, wenn das script das erste mal gestartet wird und die States alle neu anlegen muss. Das sollte sich später legen.
Der Fehler weisst darauf hin, dass du einen oder mehrere Deltas angelegt hast. Vielleicht sendet aber auch Dein SHP Unmengen Daten. Daher setzte mal das Limit in den Einstellungen des Javascriptadapters hoch. 3000-4000 sollte reichen.
Später würde ich vielleicht die Deltas nicht subscriben, wenn Du die Daten nicht dringend brauchst.
Wenn dieser Fehler auftritt, musst du das Skript neu starten.Hi, danke für die schnelle Antwort, ich habe eigentlich nur mein SHP eingetragen.
seriennummern: [ { seriennummer: "SP10ZEW5ZE7T0198", name: "SHP", isPowerStream: true, subscribe: true }, ],
das Skript stoppt immer nach ca. 2 min
viele Grüße
MZ
-
@zariomahn sagte in Adapter für Ecoflow Einbindung:
Hi, danke für die schnelle Antwort, ich habe eigentlich nur mein SHP eingetragen.
seriennummern: [ { seriennummer: "SP10ZEW5ZE7T0198", name: "SHP", isPowerStream: true, subscribe: true }, ],"isPowerStream: true" solltest du auf: "isPowerStream: false"
ändernSonst kann ich dazu nicht viel sagen, ohne selbst einen SHP zum testen zu haben.