NEWS
ecoflow-connector-Script zur dynamischen Leistungsanpassung
-
@foxthefox leider ist die „Sprache“ der Deltas bisher von Modell zu Modell unterschiedlich. Ich musste das ja Senden mehrerer Parameter einbauen, weil es mit dem Einzelsenden bei manchen Funktionen nicht funktioniert hat.
Bei der Delta 2 Max könnte das vielleicht klappen ( hab ja keine und kann’s nicht selbst testen)Nehmt doch in der Writeables Definition mal die anderen Addparams raus, und guckt was passiert.
{ id: 0, name: 'chgPauseFlag', ValueName: 'chgPauseFlag', Typ: 'D2M', MT: 3, OT: 'acChgCfg'},
-
@foxthefox sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
nachdem ich einen String für die DeltaMax gefunden habe params: { id: 69, chgPause: 1 }
Hast Du das schon getestet? Das wäre super, wenn das auch bei der Delta Max funktionierte
-
@waly_de sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
@foxthefox leider ist die „Sprache“ der Deltas bisher von Modell zu Modell unterschiedlich. Ich musste das ja Senden mehrerer Parameter einbauen, weil es mit dem Einzelsenden bei manchen Funktionen nicht funktioniert hat.
Bei der Delta 2 Max könnte das vielleicht klappen ( hab ja keine und kann’s nicht selbst testen)Nehmt doch in der Writeables Definition mal die anderen Addparams raus, und guckt was passiert.
{ id: 0, name: 'chgPauseFlag', ValueName: 'chgPauseFlag', Typ: 'D2M', MT: 3, OT: 'acChgCfg'},
der obige ist für D2M, wäre mal zu probieren, ob es ohne die anderen Parameter geht.
also der String muß für DeltaMax (nicht die 2er) der zu senden ist muß so aussehen:
msg: { from: 'Android', operateType: 'TCP', id: '747329085', lang: 'en-us', params: { id: 69, chgPause: 1 }, version: '1.0' }
mit der DeltaMax geht das wunderbar, 0=keine Pause, 1=Pause
ich denke eher, daß es im script für DM so aussehen sollte (MT braucht es nicht)
{ id: 0, name: 'chgPauseFlag', ValueName: 'chgPause', Typ: 'DM', MT: 3, OT: 'TCP'},
Übrigens ist meine Adapterarbeit iobroker.ecoflow-mqtt quasi fertig. Werde ggf. heute noch einen neuen Thread dazu eröffnen.
-
@waly_de also gerade nochmal beobachtet die Delta 2 Max lädt nur soviel mit Leistung auf wie auch Power steht mit Offset 10Watt sobald ich auf 600 stelle geht alles rein in den Akku was geht
-
Wie schon mal angekündigt, ich habe den Ecoflow Geräten mal einen eigenen Adapter spendiert.
Dank der guten Arbeit von @Waly_de konnte ich mir an manchen Stellen Arbeit sparen.Der Adapter soll nicht das hier vorhanden script überflüssig machen, vielmehr scheint eine Entkopplung zwischen Gerätelogik und eigentliches Script sinnvoll. Benennung, Einheiten und Umrechnungen sind alle im Adapter enthalten, so daß man sich in den vielen Daten besser zurechtfindet.
Hier der Thread dazu:
https://forum.iobroker.net/topic/69819/neuer-adapter-ecoflow-mqttGruß
Klaus -
@karo2204 sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
Kann man jetzt in das zusätzliche Script einbauen, dass wenn der SOC von 100% erreicht ist, er wieder auf Strom-Prio umschaltet? Also entweder andere Levels oder SOC, was zuerst kommt?
OK.. Da ich auch Tibber bestellt habe und es vielleicht auch für andere Interessant ist, hab ich ein Modul-Script dafür erstellt. Das kann als eigenes, neues Script neben dem Hauptscript angelegt werden.
-
@waly_de Oh wow danke Dir.
Ich muss sagen seit ich Dein extra Script eingebaut habe, funktioniert es super, auch heute Nacht wieder.
-
@waly_de said in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
//************************************************************* // Tibber Modul //************************************************************* // Schaltet die Regelung der Powerstation ab, wenn der Strom billig ist // und einen beliebigen Schalter zum Aktivieren der AC-Ladung ein, bis die Batterie // den durch der "BatMax" festgelegten Ladestand in % erreicht hat // // Diese Parameter aus dem Hauptscript sind wichtig: // RegulationOffPower: -2 // Wird die Regulation per State abgestellt, wird die Einspeiseleistung des ersten Powerstreams auf diesen Wert gesetzt (-1 = keine Änderung, -2 = Batterie Priomodus) // RegulationState: "Regulate" // Erzeugt der State zum Ein und Aus-Schalten der Regulation. // // Das Script versucht selbst die ID's für den TibberStatus und den Batteriestand zu ermitteln. // Wenn das nicht klappt bitte einfach die richtigen ID's hinter "batSocID" und "tibberID" angeben. // //************************************************************* //************************************************************* // Konfiguration laden, wenn nicht im Originalscript eingefügt //************************************************************* var ConfigData = { statesPrefix: '0_userdata.0.ecoflow', RegulationState: "Regulate" } if (typeof ConfigData.email === 'undefined') { if (getState("0_userdata.0.ecoflow.Settings.ConfigData").val.email !== undefined) { ConfigData = getState("0_userdata.0.ecoflow.Settings.ConfigData").val; } } /*************************************** ********** YOUR DATA HERE ************ ****************************************/ var tibberConfig = { BatMax: 99, //Bei diesem Ladestand stoppt die AC-Ladung und das Script wird wieder eingeschaltet BatMin: 95, //Der Ladestand der Batterie muss kleiner sein als BatMin , damit der Akku per AC-Ladung geladen wird SwitchID: "sonoff.0.NOUS-DVES_F0A844.POWER", //ID des Schalters, der die AC-Ladung einschaltet. "true" und "false" werden gesetzt LevelToSwitch: [ //Hier die Werte definieren, bei denen die AC-Ladung eingeschaltet werden soll //"NORMAL", "CHEAP", //Einkommentieren falls gewüscht "VERY_CHEAP" ], } //***************************************/ // Nur angeben, wenn automatische Ermittlung fehlschlägt //***************************************/ let batSocID = getState(ConfigData.statesPrefix + ".Settings.Tibber.tibberBatSocID").val let tibberID = getState(ConfigData.statesPrefix + ".Settings.Tibber.tibberID").val //***************************************/ var idOK = false if (!batSocID || !tibberID) { log("Versuche die IDs für Tibber und Batterielevel zu finden") $("tibberlink.*.Homes.*.CurrentPrice.level").each(function (id, i) { tibberID = id createState(ConfigData.statesPrefix + ".Settings.Tibber.tibberID", tibberID, false) log("TibberID gefunden und gespeichert:" + id) }) $(ConfigData.statesPrefix + ".app_device_property_*.data.InverterHeartbeat.batSoc").each(function (id, i) { if (getState(id).val > 0) { batSocID = id createState(ConfigData.statesPrefix + ".Settings.Tibber.tibberBatSocID", batSocID, false) log("batSocID gefunden und gespeichert:" + id) } }) if (!batSocID || !tibberID) { log("Fehler bei der Ermittlung der IDs. Bitte händisch ins Script eintragen", 'error') } else { idOK = true } } else { idOK = true } if (idOK) { checkTibber() on({ id: tibberID, change: "ne" }, function (obj) { //log("Tibber Modul. tibberID Event:" + obj.state.val) checkTibber() }); on({ id: batSocID, change: "ne" }, function (obj) { //log("Tibber Modul. batSocID Event:" + obj.state.val + "%") checkTibber() }); } function checkTibber() { if (tibberID && batSocID) { const RegulateID = ConfigData.statesPrefix + "." + ConfigData.RegulationState let priceLevel = getState(tibberID).val; let batsoc = Number(getState(batSocID).val) let OldRegulate = toBoolean(getState(RegulateID).val) //log("Tibber Preislevel: " + priceLevel + " OldRegulate: " + OldRegulate + " batsoc: " + (batsoc)) if ((tibberConfig.LevelToSwitch.includes(priceLevel))) { if (OldRegulate) { if (batsoc <= tibberConfig.BatMin) { setState(RegulateID, false); // Regulierung aus setState(tibberConfig.SwitchID, true) //Schalter einschalten log("Script abgeschaltet AC-Ladung Ein, weil priceLevel:" + priceLevel + " batsoc:" + batsoc + "%") } } else { if (batsoc >= tibberConfig.BatMax) { setState(RegulateID, true); // Regulierung an setState(tibberConfig.SwitchID, false) //Schalter ausschalten log(" Batterie bei BatMax. Script eingeschaltet AC-Ladung Aus. priceLevel:" + priceLevel + " batsoc:" + batsoc + "%") } } } else { if (!OldRegulate) { setState(RegulateID, true); // Regulierung an setState(tibberConfig.SwitchID, false) //Schalter ausschalten log("Script eingeschaltet AC-Ladung Aus. priceLevel:" + priceLevel + " batsoc:" + batsoc + "%") } } } else { //log("checkTibber skip. batsocID und/oder tibberID fehlen.") } } //*************************************************************
Ich bekomme hier den Fehler angezeigt:
javascript.0 (52431) script.js.Ecoflow-Tibber: TypeError: Cannot read properties of null (reading 'email') 07:11:14.323 error javascript.0 (52431) at script.js.Ecoflow-Tibber:25:65 07:11:14.324 error javascript.0 (52431) at script.js.Ecoflow-Tibber:119:3
Was kann ich da machen?
-
-
@waly_de said in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
//************************************************************* // Tibber Modul //************************************************************* // Schaltet die Regelung der Powerstation ab, wenn der Strom billig ist // und einen beliebigen Schalter zum Aktivieren der AC-Ladung ein, bis die Batterie // den durch der "BatMax" festgelegten Ladestand in % erreicht hat // // Diese Parameter aus dem Hauptscript sind wichtig: // RegulationOffPower: -2 // Wird die Regulation per State abgestellt, wird die Einspeiseleistung des ersten Powerstreams auf diesen Wert gesetzt (-1 = keine Änderung, -2 = Batterie Priomodus) // RegulationState: "Regulate" // Erzeugt der State zum Ein und Aus-Schalten der Regulation. // // Das Script versucht selbst die ID's für den TibberStatus und den Batteriestand zu ermitteln. // Wenn das nicht klappt bitte einfach die richtigen ID's hinter "batSocID" und "tibberID" angeben. // //************************************************************* //************************************************************* // Konfiguration laden, wenn nicht im Originalscript eingefügt //************************************************************* var ConfigData = { statesPrefix: '0_userdata.0.ecoflow', RegulationState: "Regulate" } if (typeof ConfigData.email === 'undefined') { const tempConfigData = getState("0_userdata.0.ecoflow.Settings.ConfigData").val if (typeof tempConfigData === 'object' && tempConfigData !== null) { if (tempConfigData.email !== undefined) { ConfigData = tempConfigData; } } } /*************************************** ********** YOUR DATA HERE ************ ****************************************/ var tibberConfig = { BatMax: 99, //Bei diesem Ladestand stoppt die AC-Ladung und das Script wird wieder eingeschaltet BatMin: 95, //Der Ladestand der Batterie muss kleiner sein als BatMin , damit der Akku per AC-Ladung geladen wird SwitchID: "sonoff.0.NOUS-DVES_F0A844.POWER", //ID des Schalters, der die AC-Ladung einschaltet. "true" und "false" werden gesetzt LevelToSwitch: [ //Hier die Werte definieren, bei denen die AC-Ladung eingeschaltet werden soll //"NORMAL", "CHEAP", //Einkommentieren falls gewüscht "VERY_CHEAP" ], } //***************************************/ // Nur angeben, wenn automatische Ermittlung fehlschlägt //***************************************/ let batSocID = getState(ConfigData.statesPrefix + ".Settings.Tibber.tibberBatSocID").val let tibberID = getState(ConfigData.statesPrefix + ".Settings.Tibber.tibberID").val //***************************************/ var idOK = false if (!batSocID || !tibberID) { log("Versuche die IDs für Tibber und Batterielevel zu finden") $("tibberlink.*.Homes.*.CurrentPrice.level").each(function (id, i) { tibberID = id createState(ConfigData.statesPrefix + ".Settings.Tibber.tibberID", tibberID, false) log("TibberID gefunden und gespeichert:" + id) }) $(ConfigData.statesPrefix + ".app_device_property_*.data.InverterHeartbeat.batSoc").each(function (id, i) { if (getState(id).val > 0) { batSocID = id createState(ConfigData.statesPrefix + ".Settings.Tibber.tibberBatSocID", batSocID, false) log("batSocID gefunden und gespeichert:" + id) } }) if (!batSocID || !tibberID) { log("Fehler bei der Ermittlung der IDs. Bitte händisch ins Script eintragen", 'error') } else { idOK = true } } else { idOK = true } if (idOK) { checkTibber() on({ id: tibberID, change: "ne" }, function (obj) { //log("Tibber Modul. tibberID Event:" + obj.state.val) checkTibber() }); on({ id: batSocID, change: "ne" }, function (obj) { //log("Tibber Modul. batSocID Event:" + obj.state.val + "%") checkTibber() }); } function checkTibber() { if (tibberID && batSocID) { const RegulateID = ConfigData.statesPrefix + "." + ConfigData.RegulationState let priceLevel = getState(tibberID).val; let batsoc = Number(getState(batSocID).val) let OldRegulate = toBoolean(getState(RegulateID).val) //log("Tibber Preislevel: " + priceLevel + " OldRegulate: " + OldRegulate + " batsoc: " + (batsoc)) if ((tibberConfig.LevelToSwitch.includes(priceLevel))) { if (OldRegulate) { if (batsoc <= tibberConfig.BatMin) { setState(RegulateID, false); // Regulierung aus setState(tibberConfig.SwitchID, true) //Schalter einschalten log("Script abgeschaltet AC-Ladung Ein, weil priceLevel:" + priceLevel + " batsoc:" + batsoc + "%") } } else { if (batsoc >= tibberConfig.BatMax) { setState(RegulateID, true); // Regulierung an setState(tibberConfig.SwitchID, false) //Schalter ausschalten log(" Batterie bei BatMax. Script eingeschaltet AC-Ladung Aus. priceLevel:" + priceLevel + " batsoc:" + batsoc + "%") } } } else { if (!OldRegulate) { setState(RegulateID, true); // Regulierung an setState(tibberConfig.SwitchID, false) //Schalter ausschalten log("Script eingeschaltet AC-Ladung Aus. priceLevel:" + priceLevel + " batsoc:" + batsoc + "%") } } } else { //log("checkTibber skip. batsocID und/oder tibberID fehlen.") } } //*************************************************************
Schaut gut aus. Danke Dir. Hat nicht gemeckert.
-
Es ist schon seltsam. Die 1.1.6.1 funktioniert jeden Tag bis 1 Uhr wo ich die Batterie wieder auflade und nix einspeise, aber morgens um 7 wo wieder eingespeist werden sollte tut das script einfach nix mehr. Ein Neustart hilft nix, aber wenn ch das alte Script starte funktioniert’s und wenn ich dann zum 1.1.6.1 zurück gehe geht das auch wieder… Hab jetzt endlich gesehen was die mlog funktion tut und kann das vielleicht morgen anschauen… wobei ich keine Lust habe da wieder um 7 rumzudebuggen, vielleicht lass ich das alte Script laufen…
Aber um noch etwas sinnvolles beizutragen, da noch niemand davon geschrieben hat und Waly das Update ja vielleicht nicht bekommen hat, wer weiss. Es gibt die neue Funktion ‘Feed-in control’, die festlegt, ob bei vollem Akku die ganze Solarleistung eingespeist werden soll (control off) oder nur was eingestellt ist (control on):Feed-in control off:
- warn: javascript.0 (457337) script.js.Powerstream_v1_1_6_1: Nicht definierter cmd_func-Wert. [PowerStream] cmdId:143 cmdFunc:20 2023-11-04 11:48:31.052 - info: javascript.0 (457337) script.js.Powerstream_v1_1_6_1: hexString: 0a36102018352001280138034014488f01580170daaecbcf01800113880101ba0103696f73ca0110xx 2023-11-04 11:48:31.053 - info: javascript.0 (457337) script.js.Powerstream_v1_1_6_1: Nachricht: {"header":[{"src":32,"dest":53,"dSrc":1,"dDest":1,"checkType":3,"cmdFunc":20,"cmdId":143,"needAck":1,"seq":435345242,"version":19,"payloadVer":1,"from":"ios","deviceSn":"x"}]}
Feed in control ein:
2023-11-04 11:48:33.140 - warn: javascript.0 (457337) script.js.Powerstream_v1_1_6_1: Nicht definierter cmd_func-Wert. [PowerStream] cmdId:143 cmdFunc:20 2023-11-04 11:48:33.141 - info: javascript.0 (457337) script.js.Powerstream_v1_1_6_1: hexString: 0a3c0a020801102018352001280138034014488f015002580170afbfcbcf01800113880101ba0103696f73ca0110xx 2023-11-04 11:48:33.142 - info: javascript.0 (457337) script.js.Powerstream_v1_1_6_1: Nachricht: {"header":[{"pdata":"0801","src":32,"dest":53,"dSrc":1,"dDest":1,"checkType":3,"cmdFunc":20,"cmdId":143,"dataLen":2,"needAck":1,"seq":435347375,"version":19,"payloadVer":1,"from":"ios","deviceSn":"x"}]
-
@sirdir
Das scheint mit der neuen Version 1.0.3.45 gekommen zu sein.
Jetzt müsste man nur noch herausfinden wo dieser neue Wert im protobuf steckt
Sonst weiß man ja wieder mal nicht wie der derzeitige Zustand ist. -
@sirdir
kannst du den originalen hex string mal durch https://protobuf-decoder.netlify.app entschlüsseln.
Was kommt dort für die erste Stelle?
0801 ist ein komischer Wert -
@sirdir sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
Es ist schon seltsam. Die 1.1.6.1 funktioniert jeden Tag bis 1 Uhr wo ich die Batterie wieder auflade und nix einspeise, aber morgens um 7 wo wieder eingespeist werden sollte tut das script einfach nix mehr. Ein Neustart hilft nix, aber wenn ch das alte Script starte funktioniert’s und wenn ich dann zum 1.1.6.1 zurück gehe geht das auch wieder… Hab jetzt endlich gesehen was die mlog funktion tut und kann das vielleicht morgen anschauen… wobei ich keine Lust habe da wieder um 7 rumzudebuggen, vielleicht lass ich das alte Script laufen…
Das Problem hat bisher keiner reportet. Du sagst du lädst um 1. stellst du dann das script mit regulate state ab? Keine Meldungen im Log?
@sirdir sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
Aber um noch etwas sinnvolles beizutragen, da noch niemand davon geschrieben hat und Waly das Update ja vielleicht nicht bekommen hat, wer weiss. Es gibt die neue Funktion ‘Feed-in control’, die festlegt, ob bei vollem Akku die ganze Solarleistung eingespeist werden soll (control off) oder nur was eingestellt ist (control on):
Oh, cool. Nein, ich hab das Update nicht bekommen. 0801 als payload? Das ist wirklich schräg.... ich bau es mal in die Writeables...
-
@foxthefox sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
0801 ist ein komischer Wert
ach Quatsch... jetzt fällt es mir wieder ein. Der Payload ist ja auch protobuf codiert.... das ist ein HEXString und heisst einfach value:1
-
@waly_de sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
@foxthefox sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
0801 ist ein komischer Wert
ach Quatsch... jetzt fällt es mir wieder ein. Der Payload ist ja auch protobuf codiert.... das ist ein HEXString und heisst einfach value:1
ich bin beruhigt
-
@foxthefox Wenn du das im Heartbeat findest, sag bitte bescheid
-
@waly_de sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
@foxthefox Wenn du das im Heartbeat findest, sag bitte bescheid
das war einfach, ist auf Position 61 vom inverter_heartbeat
-
@foxthefox wie nennen wir es ?.... "FeedInControl" oder besser "feed_in_control" damit es zu den anderen passt ?
-
@waly_de sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
@foxthefox wie nennen wir es ?.... "FeedInControl" ?
Ich denke "feedPriority" trifft es ganz gut, ähnlich zu "supplyPriority"
0-prio auf alle Sonne in Leistung
1-prio auf festgelegte Leistung