NEWS
ecoflow-connector-Script zur dynamischen Leistungsanpassung
-
@pasch Ich denke du hast mitgelesen?
Bitte prĂŒfe noch mal ob Du den History-Adapter installiert hast und dieses auch lĂ€uft. -
Hallo,
ich habe mal eine VerstÀndnisfrage:
wozu benötige ich die Parameter:
lowBatLimitPozOn: 30,
lowBatLimitPozOff:40,
lowBatLimit: 150,Bei mir wird der Akku bis zum letzten % "leer" gezogen. Ich hÀtte erwartet, dass zumindest ab 30% "nur" noch auf 150W reduziert wird. Das klappt bei mir gar nicht.
Aber ich verstehe auch den Hintergrund nicht so ganz. Warum sollte ich "kurz vor Leer" die Ausgabeleistung "nur" auf 150W (oder einen beliebigen Wert) reduzieren. Entweder ich möchte die volle benötigte Leistung bis zur definierten Restladung haben oder nicht, aber was bringt eine reduzierte Abgabe?
Vielleicht verstehe ich das auch nicht richtig.Dann habe ich noch eine weitere Frage.
Der Ladestand der Batterie wird ja hier angezeigt:
0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_bmsStatus.f32ShowSoc
0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_bmsStatus.soc
0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_emsStatus.f32LcdShowSoc
0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_emsStatus.lcdShowSocAber um an die Werte heran zu kommen muss ich ja den D2M abfragen. Das wiederum erzeugt ja viel Datenstrom.
In den Einstellungen des PS in der APP wird ja auch der Batteriestand angezeigt.
Finde ich vielleicht den Wert irgendwo versteckt in den "userdaten" wieder ohne de D2M abzufragen?vielen Lieben Dank fĂŒr eure Hilfe.
Und vor allen fĂŒr das tolle Script.gruĂ Kai
-
Hallo,
ich habe mal eine VerstÀndnisfrage:
wozu benötige ich die Parameter:
lowBatLimitPozOn: 30,
lowBatLimitPozOff:40,
lowBatLimit: 150,Bei mir wird der Akku bis zum letzten % "leer" gezogen. Ich hÀtte erwartet, dass zumindest ab 30% "nur" noch auf 150W reduziert wird. Das klappt bei mir gar nicht.
Aber ich verstehe auch den Hintergrund nicht so ganz. Warum sollte ich "kurz vor Leer" die Ausgabeleistung "nur" auf 150W (oder einen beliebigen Wert) reduzieren. Entweder ich möchte die volle benötigte Leistung bis zur definierten Restladung haben oder nicht, aber was bringt eine reduzierte Abgabe?
Vielleicht verstehe ich das auch nicht richtig.Dann habe ich noch eine weitere Frage.
Der Ladestand der Batterie wird ja hier angezeigt:
0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_bmsStatus.f32ShowSoc
0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_bmsStatus.soc
0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_emsStatus.f32LcdShowSoc
0_userdata.0.ecoflow.app_device_property_R351xxxxD2Mxxx.data.params.bms_emsStatus.lcdShowSocAber um an die Werte heran zu kommen muss ich ja den D2M abfragen. Das wiederum erzeugt ja viel Datenstrom.
In den Einstellungen des PS in der APP wird ja auch der Batteriestand angezeigt.
Finde ich vielleicht den Wert irgendwo versteckt in den "userdaten" wieder ohne de D2M abzufragen?vielen Lieben Dank fĂŒr eure Hilfe.
Und vor allen fĂŒr das tolle Script.gruĂ Kai
@kaiausbrieselang ja das geht auch ĂŒber
*.data.InverterHeartbeat.batSoc -
LĂ€uft super bisher. :)
Mir ist aufgefallen, dass "Other Loads" bei mir oft um 1-3 Watt schwankt. Gibt es die Möglichkeit zu sagen, nur bei Ănderungen gröĂer X den neuen Wert setzten? In den Einstellungen habe ich nichts gefunden.
GrĂŒĂe
Patrick -
Gestern Abend ist mir was aufgefallen, das eventuell noch ein Bug sein könnte. Der erste PS mit Speicher war leer und der 2. hatte noch 60% aber das Script wollte/konnte
dem 2. PS die angeforderte Leistung nicht zuweisen er wollte immer den ersten bei dem die Batterie bereits leer war. Half nur das script zu stoppen und es manuell ĂŒber die app zu machen.
Aber ansonsten lÀuft die Regelung ziemlich gut auch bei Echtzeit-Regelung. -
@kaiausbrieselang ja das geht auch ĂŒber
*.data.InverterHeartbeat.batSoc@ponti92
wieder was gelernt :-)
Danke dir!! -
Hm, das neue Script funktioniert fĂŒr mich nicht. Es regelt ĂŒberhaupt nichts. Der Debug Modus gibt leider auch keine sinnvollen Meldungen mehr aus sondern im Prinzip nur MQTT geschnatter. Disregard, beim cut&paste ist bei der Smartmeter ID was schief gegangen.
-
Hallo zusammen,
Ich habe mal fĂŒr mich selber zusĂ€tzlich zum Script mit Blockly was entworfen, was mir erlaubt, den tĂ€glichen Strombezug vom Netz zu monitoren.

Die dafĂŒr nötigen Objekte habe ich manuell erstellt:

Falls das interessant erscheint - vielleicht mag ja jemand das ins Script integrieren?
-
Hallo zusammen,
Das Script lĂ€uft bei mir inzwischen reibungslos - vielen Dank @Waly_de fĂŒr die super Arbeit!
Ich möchte "lowBatLimitPozOn" von der Wettervorhersage abhÀngig machen.
Wenn der kommende Tag sonnig wird, dann soll lowBatLimitPozOn = 10 sein, sonst lowBatLimitPozOn = 30 (möchte genĂŒgend Reserve fĂŒr StromausfĂ€lle behalten).
Die Wettervorhersage bekomme ich vom Adapter "DasWetter". Ăber die Objekte- daswetter.0.NextDays.Location_1.Day_1.Wetter_Symbol_id
und
- daswetter.0.NextDays.Location_1.Day_1.Wetter_Symbol_id2
kommt die Info, ob Vormittag, bzw. Nachmittag sonnig werden.
Darauf basierend habe ich ein Objekt ("AkkuReserve") erstellt, das den gewĂŒnschten Wert fĂŒr lowBatLimitPozOn enthĂ€lt.
"AkkuReserve" soll an lowBatLimitPozOn ĂŒbergeben werden.
Leider kann ich wirklich kein JavaScript...
Kann mir bitte jemand dabei helfen?

Vielen Dank!
-
Hallo zusammen,
Das Script lĂ€uft bei mir inzwischen reibungslos - vielen Dank @Waly_de fĂŒr die super Arbeit!
Ich möchte "lowBatLimitPozOn" von der Wettervorhersage abhÀngig machen.
Wenn der kommende Tag sonnig wird, dann soll lowBatLimitPozOn = 10 sein, sonst lowBatLimitPozOn = 30 (möchte genĂŒgend Reserve fĂŒr StromausfĂ€lle behalten).
Die Wettervorhersage bekomme ich vom Adapter "DasWetter". Ăber die Objekte- daswetter.0.NextDays.Location_1.Day_1.Wetter_Symbol_id
und
- daswetter.0.NextDays.Location_1.Day_1.Wetter_Symbol_id2
kommt die Info, ob Vormittag, bzw. Nachmittag sonnig werden.
Darauf basierend habe ich ein Objekt ("AkkuReserve") erstellt, das den gewĂŒnschten Wert fĂŒr lowBatLimitPozOn enthĂ€lt.
"AkkuReserve" soll an lowBatLimitPozOn ĂŒbergeben werden.
Leider kann ich wirklich kein JavaScript...
Kann mir bitte jemand dabei helfen?

Vielen Dank!
-
@umele hehe das ist eine tolle Idee đđ
Vorschlag: wenn du schon ein Objekt selbst anlegst, dann scheib doch da den gewĂŒnschten wert fĂŒr dein Limit rein, und wir ersetzen die entsprechende Variable im Script mit diesem ObjectâŠ
-
@waly_de - bist ein Schatz :-)
Ich habe es fĂŒr mich jetzt erst mal so probiert - hoffe, damit zerschiesse ich mir das Script nicht:

@umele das könnte gehen, allerdings greift das nur beim starten des Scripts und nicht wÀhrend der Laufzeit.
Ich hab mir dazu was flexibles ĂŒberlegt, das ich auch in die nĂ€chste Version fest einbaue.
Damit kann man das easy fĂŒr jeden Punkt der Config machen und es ist auch wĂ€hrend der Laufzeit alles Ă€nderbar:FĂŒge das hier unmittelbar nach der "ConfigData" definition ein:
// EXTERNE STATES zum Manipulieren von Configurationsvariablen var externConfig = [ //############# Diesen Abschnitt fĂŒr jeden einzelne Wert anlegen ################ { VarName: "seriennummern[0].lowBatLimitPozOn", //Variabelname aus "ConfigData" bei AufzĂ€hlungen [0...X] in der Reigenfolge der Angaben id: "0_userdata.0.ecoflow.ExStateTest" //Das Objekt (State) das den Wert fĂŒr diese variable enthalten soll }, //####################################################################### ]; //####################################################################### // Funktion zum Setzen einer verschachtelten Eigenschaft in einem Objekt function setNestedProperty(obj, path, value) { let keys = path.split('.'); let lastKey = keys.pop(); let tempObj = obj; keys.forEach(key => { if (key.match(/\[\d+\]/)) { let index = parseInt(key.match(/\[(\d+)\]/)[1]); key = key.split('[')[0]; tempObj = tempObj[key][index]; } else { tempObj = tempObj[key]; } }); tempObj[lastKey] = value; } function setConfigValueFromId(VarName, id) { if (isState2(id)) { let value = getState(id).val; // Wert von ioBroker abrufen setNestedProperty(ConfigData, VarName, value); // Wert in ConfigData setzen } } // Initialisierung bei Programmstart externConfig.forEach(config => { setConfigValueFromId(config.VarName, config.id); }); // Ănderungen wĂ€hrend der Laufzeit ĂŒberwachen externConfig.forEach(config => { if (isState2(config.id)) { on(config.id, function (obj) { setConfigValueFromId(config.VarName, obj.id); //log("ExternesEvent:" + obj.id + " : " + config.VarName + ":" + obj.state.val) }); } }); //#######################################################################solle sich selbst erklĂ€ren ;-)
-
@umele das könnte gehen, allerdings greift das nur beim starten des Scripts und nicht wÀhrend der Laufzeit.
Ich hab mir dazu was flexibles ĂŒberlegt, das ich auch in die nĂ€chste Version fest einbaue.
Damit kann man das easy fĂŒr jeden Punkt der Config machen und es ist auch wĂ€hrend der Laufzeit alles Ă€nderbar:FĂŒge das hier unmittelbar nach der "ConfigData" definition ein:
// EXTERNE STATES zum Manipulieren von Configurationsvariablen var externConfig = [ //############# Diesen Abschnitt fĂŒr jeden einzelne Wert anlegen ################ { VarName: "seriennummern[0].lowBatLimitPozOn", //Variabelname aus "ConfigData" bei AufzĂ€hlungen [0...X] in der Reigenfolge der Angaben id: "0_userdata.0.ecoflow.ExStateTest" //Das Objekt (State) das den Wert fĂŒr diese variable enthalten soll }, //####################################################################### ]; //####################################################################### // Funktion zum Setzen einer verschachtelten Eigenschaft in einem Objekt function setNestedProperty(obj, path, value) { let keys = path.split('.'); let lastKey = keys.pop(); let tempObj = obj; keys.forEach(key => { if (key.match(/\[\d+\]/)) { let index = parseInt(key.match(/\[(\d+)\]/)[1]); key = key.split('[')[0]; tempObj = tempObj[key][index]; } else { tempObj = tempObj[key]; } }); tempObj[lastKey] = value; } function setConfigValueFromId(VarName, id) { if (isState2(id)) { let value = getState(id).val; // Wert von ioBroker abrufen setNestedProperty(ConfigData, VarName, value); // Wert in ConfigData setzen } } // Initialisierung bei Programmstart externConfig.forEach(config => { setConfigValueFromId(config.VarName, config.id); }); // Ănderungen wĂ€hrend der Laufzeit ĂŒberwachen externConfig.forEach(config => { if (isState2(config.id)) { on(config.id, function (obj) { setConfigValueFromId(config.VarName, obj.id); //log("ExternesEvent:" + obj.id + " : " + config.VarName + ":" + obj.state.val) }); } }); //#######################################################################solle sich selbst erklĂ€ren ;-)
-
@umele das könnte gehen, allerdings greift das nur beim starten des Scripts und nicht wÀhrend der Laufzeit.
Ich hab mir dazu was flexibles ĂŒberlegt, das ich auch in die nĂ€chste Version fest einbaue.
Damit kann man das easy fĂŒr jeden Punkt der Config machen und es ist auch wĂ€hrend der Laufzeit alles Ă€nderbar:FĂŒge das hier unmittelbar nach der "ConfigData" definition ein:
// EXTERNE STATES zum Manipulieren von Configurationsvariablen var externConfig = [ //############# Diesen Abschnitt fĂŒr jeden einzelne Wert anlegen ################ { VarName: "seriennummern[0].lowBatLimitPozOn", //Variabelname aus "ConfigData" bei AufzĂ€hlungen [0...X] in der Reigenfolge der Angaben id: "0_userdata.0.ecoflow.ExStateTest" //Das Objekt (State) das den Wert fĂŒr diese variable enthalten soll }, //####################################################################### ]; //####################################################################### // Funktion zum Setzen einer verschachtelten Eigenschaft in einem Objekt function setNestedProperty(obj, path, value) { let keys = path.split('.'); let lastKey = keys.pop(); let tempObj = obj; keys.forEach(key => { if (key.match(/\[\d+\]/)) { let index = parseInt(key.match(/\[(\d+)\]/)[1]); key = key.split('[')[0]; tempObj = tempObj[key][index]; } else { tempObj = tempObj[key]; } }); tempObj[lastKey] = value; } function setConfigValueFromId(VarName, id) { if (isState2(id)) { let value = getState(id).val; // Wert von ioBroker abrufen setNestedProperty(ConfigData, VarName, value); // Wert in ConfigData setzen } } // Initialisierung bei Programmstart externConfig.forEach(config => { setConfigValueFromId(config.VarName, config.id); }); // Ănderungen wĂ€hrend der Laufzeit ĂŒberwachen externConfig.forEach(config => { if (isState2(config.id)) { on(config.id, function (obj) { setConfigValueFromId(config.VarName, obj.id); //log("ExternesEvent:" + obj.id + " : " + config.VarName + ":" + obj.state.val) }); } }); //#######################################################################solle sich selbst erklĂ€ren ;-)
-
@waly_de - gerade getestet. Bekomme diese Fehler:

Weil mein Objekt eine andere ID hat, habe ich die fĂŒr den Test im Script angepasst:

In Zeile 282 und 283 steht das hier:

Zeile 2513 gibt es gar nicht:

-
@umele hmmm guck noch mal, ob du es an der richtigen Stelle eingefĂŒgt hast. Es muss hinter der. Letzten }; der ConfigData Definition eingesetzt werden
Hab ich - hier ist der Code bis zum Ende des neuen Codes von config-date bis zum Ende des neuen Codes:
var ConfigData = { email: "xxxxxx@gmail.com", // Die App-Zugangsdaten von ecoFlow passwort: "yyyyyyyyyy", SmartmeterID: "sonoff.0.Stromzaehler.SENSOR.E320.Power_in", // State, der den aktuellen Gesamtverbrauch in Watt anzeigt seriennummern: [ //############# Diesen Abschnitt fĂÂŒr jedes einzelne GerĂ€t anlegen ################ { seriennummer: "HWxxxxxxxxxx", // Die Seriennummer des GerĂ€tes name: "PowerStream", // beliebiger Namen MaxPower: 600, // Der höchstmögliche Wert in Watt fĂÂŒr die Einspeiseleistung subscribe: true, // "true": Alle Daten fĂÂŒr dieses GerĂ€t werden angefragt. "false": Es werden keine Statusdaten abgefragt typ: "PS", // Welches GerĂ€t ist es: Powerstrem:"PS"; DeltaMax:"DM"; Delta2: "D2" ; Delta2 Max: "D2M"; SmartPlug: "SM"; Andere: "NA" // Parameter an hier nur fĂÂŒr PowerStream. regulation: true, // "true": Dieser PowerStream soll vom Script reguliert werden RegulationOffPower: -1, // Wird die Regulation per State abgestellt, wird die Einspeiseleistung des ersten Powerstreams auf diesen Wert gesetzt (-1 = keine Ăânderung, -2 = Batterie Priomodus) hasBat: true, // "true": Eine Batterie ist angeschlossen. Nur fĂÂŒr PowerStream relevant. battPozOn: 99, battPozOff: 96, // Wenn die Batterie bei battPozOn ist, Einspeisung auf MaxPower. Bei BattPozOff Normalbetrieb battOnSwitchPrio: true, // "true": Bei battPozOn wird in den Batterie-PrioritĂ€tsmodus gewechselt prioOffOnDemand: 30, // Wattwert des Bedarfs, bei dem zurĂÂŒck in den Strom-Priomodus gechaltet wird. 0 fĂÂŒr kein RĂÂŒckschalten. lowBatLimitPozOn: 30, lowBatLimitPozOff: 35,// Bei Unterschreiten der Batterieladung von "lowBatLimitPozOn" % ist die maximale Einspeiseleistung auf lowBatLimit: 0, // "lowBatLimit" limitiert, bis der Ladezustand wieder bei "lowBatLimitPozOff" ist }, //####################################################################### { seriennummer: "DCExxxxx", name: "DELTA Pro", typ: "NA", subscribe: false, // "true": Alle Daten fĂÂŒr dieses GerĂ€t werden angefragt. "false": Es werden keine Statusdaten abgefragt }, //####################################################################### { seriennummer: "XXXXXXXXXXXXX", name: "SmartPlug 1", typ: "SM", subscribe: true, // "true": Alle Daten fĂÂŒr dieses GerĂ€t werden angefragt. "false": Es werden keine Statusdaten abgefragt }, //####################################################################### ], AdditionalPower: [ // Wenn es weitere Wechselrichter gibt, die in IOBroker erfasst werden, können diese hier Angelegt werden //############# Diesen Abschnitt fĂÂŒr jedes einzelne GerĂ€t anlegen ################ { name: "Hoymiles2000", // Beliebiger Name id: "mqtt.0.solar.1234567890.0.power" // Der Objektpfad zu dem Leistungswert in Watt (W) }, //####################################################################### ], //**************************************** // Erweiterte Einstellungen: //**************************************** SmartmeterTimeoutMin: 4, // Wenn der letzte Wert vom Smartmeter Ă€lter als "SmartmeterTimeoutMin" ist, wird das Script mit... SmartmeterFallbackPower: 150, // SmartmeterFallbackPower als aktuellem Realpowerwert weiter arbeiten, bis wieder aktuelle Daten geliefert werden. Regulation: true, // 'false' stellt das Setzen der Einspeiseleistung ab RegulationState: "Regulate", // Wenn angegeben, kann mit diesem State die Regulation ein- und ausgeschaltet werden (Wird automatisch unter 0_userdata.0.ecoflow angelegt) RegulationMultiPsMode: 0, // Wenn mehrere PS reguliert werden sollen. "balance" = 0 oder "serial" = 1 BasePowerOffset: 20, // Wird vom aktuellen Verbrauch abgezogen, um die Einspeiseleistung zu berechnen Zusatzpower_Offset: 10, // Zusatzpower startet ab einer Batterieladeleistung von MaxPower - Zusatzpower_Offset MinValueMin: 1, // Der Zeitraum in Minuten, aus dem der niedrigste Gesamtverbrauchswert geholt werden soll. 0 fĂÂŒr Echtzeitwert MinValueAg: 0, // Art der Ermittlung des kleinsten Wertes: 0 = Minimalwert, 1 = Durchschnittswert ReconnectMin: 30, // Zeit in Minuten, nach der die Anwendung neu gestartet wird, wenn keine neuen Daten eintreffen statesPrefix: "0_userdata.0.ecoflow", // Hier werden die ecoFlow States angelegt latitude: latitude, // Breitengrad des Standortes (wird automatisch eingesetzt) longitude: longitude, // LĂ€ngengrad des Standortes (wird automatisch eingesetzt) //**************************************** // ĂĆberschuss Ladung: //**************************************** ExcessCharge: false, // ExcessChargePowerID: "0_userdata.0.ecoflow.app_xxxxxxxxxxxxxxxxxxxx_DAxxxxxxxxxxxxxxxxxx_thing_property_set.writeables.slowChgPower", ExcessChargeSwitchID: "hm-rpc.3.xxxxxxxxxxxxxxxxxx.3.STATE", ExcessChargeSwitchOn: true, ExcessChargeSwitchOff: false, ExcessChargeSwitchMin: 10, ExcessChargeMaxPower: 1500, ExcessChargeStartPower: 50, ExcessChargeStartPowerDurationMin: 5, //**************************************** Debug: false, PlotCmdID: 99999, }; // EXTERNE STATES zum Manipulieren von Configurationsvariablen var externConfig = [ //############# Diesen Abschnitt fĂŒr jeden einzelne Wert anlegen ################ { VarName: "seriennummern[0].lowBatLimitPozOn", //Variabelname aus "ConfigData" bei AufzĂ€hlungen [0...X] in der Reigenfolge der Angaben id: "0_userdata.0.eigene_Berechnungen.AkkuReserve" //Das Objekt (State) das den Wert fĂŒr diese variable enthalten soll }, //####################################################################### ]; //####################################################################### // Funktion zum Setzen einer verschachtelten Eigenschaft in einem Objekt function setNestedProperty(obj, path, value) { let keys = path.split('.'); let lastKey = keys.pop(); let tempObj = obj; keys.forEach(key => { if (key.match(/[\d+]/)) { let index = parseInt(key.match(/[(\d+)]/)[1]); key = key.split('[')[0]; tempObj = tempObj[key][index]; } else { tempObj = tempObj[key]; } }); tempObj[lastKey] = value; } function setConfigValueFromId(VarName, id) { if (isState2(id)) { let value = getState(id).val; // Wert von ioBroker abrufen setNestedProperty(ConfigData, VarName, value); // Wert in ConfigData setzen } } // Initialisierung bei Programmstart externConfig.forEach(config => { setConfigValueFromId(config.VarName, config.id); }); // Ănderungen wĂ€hrend der Laufzeit ĂŒberwachen externConfig.forEach(config => { if (isState2(config.id)) { on(config.id, function (obj) { setConfigValueFromId(config.VarName, obj.id); //log("ExternesEvent:" + obj.id + " : " + config.VarName + ":" + obj.state.val) }); } }); //####################################################################### -
Hab ich - hier ist der Code bis zum Ende des neuen Codes von config-date bis zum Ende des neuen Codes:
var ConfigData = { email: "xxxxxx@gmail.com", // Die App-Zugangsdaten von ecoFlow passwort: "yyyyyyyyyy", SmartmeterID: "sonoff.0.Stromzaehler.SENSOR.E320.Power_in", // State, der den aktuellen Gesamtverbrauch in Watt anzeigt seriennummern: [ //############# Diesen Abschnitt fĂÂŒr jedes einzelne GerĂ€t anlegen ################ { seriennummer: "HWxxxxxxxxxx", // Die Seriennummer des GerĂ€tes name: "PowerStream", // beliebiger Namen MaxPower: 600, // Der höchstmögliche Wert in Watt fĂÂŒr die Einspeiseleistung subscribe: true, // "true": Alle Daten fĂÂŒr dieses GerĂ€t werden angefragt. "false": Es werden keine Statusdaten abgefragt typ: "PS", // Welches GerĂ€t ist es: Powerstrem:"PS"; DeltaMax:"DM"; Delta2: "D2" ; Delta2 Max: "D2M"; SmartPlug: "SM"; Andere: "NA" // Parameter an hier nur fĂÂŒr PowerStream. regulation: true, // "true": Dieser PowerStream soll vom Script reguliert werden RegulationOffPower: -1, // Wird die Regulation per State abgestellt, wird die Einspeiseleistung des ersten Powerstreams auf diesen Wert gesetzt (-1 = keine Ăânderung, -2 = Batterie Priomodus) hasBat: true, // "true": Eine Batterie ist angeschlossen. Nur fĂÂŒr PowerStream relevant. battPozOn: 99, battPozOff: 96, // Wenn die Batterie bei battPozOn ist, Einspeisung auf MaxPower. Bei BattPozOff Normalbetrieb battOnSwitchPrio: true, // "true": Bei battPozOn wird in den Batterie-PrioritĂ€tsmodus gewechselt prioOffOnDemand: 30, // Wattwert des Bedarfs, bei dem zurĂÂŒck in den Strom-Priomodus gechaltet wird. 0 fĂÂŒr kein RĂÂŒckschalten. lowBatLimitPozOn: 30, lowBatLimitPozOff: 35,// Bei Unterschreiten der Batterieladung von "lowBatLimitPozOn" % ist die maximale Einspeiseleistung auf lowBatLimit: 0, // "lowBatLimit" limitiert, bis der Ladezustand wieder bei "lowBatLimitPozOff" ist }, //####################################################################### { seriennummer: "DCExxxxx", name: "DELTA Pro", typ: "NA", subscribe: false, // "true": Alle Daten fĂÂŒr dieses GerĂ€t werden angefragt. "false": Es werden keine Statusdaten abgefragt }, //####################################################################### { seriennummer: "XXXXXXXXXXXXX", name: "SmartPlug 1", typ: "SM", subscribe: true, // "true": Alle Daten fĂÂŒr dieses GerĂ€t werden angefragt. "false": Es werden keine Statusdaten abgefragt }, //####################################################################### ], AdditionalPower: [ // Wenn es weitere Wechselrichter gibt, die in IOBroker erfasst werden, können diese hier Angelegt werden //############# Diesen Abschnitt fĂÂŒr jedes einzelne GerĂ€t anlegen ################ { name: "Hoymiles2000", // Beliebiger Name id: "mqtt.0.solar.1234567890.0.power" // Der Objektpfad zu dem Leistungswert in Watt (W) }, //####################################################################### ], //**************************************** // Erweiterte Einstellungen: //**************************************** SmartmeterTimeoutMin: 4, // Wenn der letzte Wert vom Smartmeter Ă€lter als "SmartmeterTimeoutMin" ist, wird das Script mit... SmartmeterFallbackPower: 150, // SmartmeterFallbackPower als aktuellem Realpowerwert weiter arbeiten, bis wieder aktuelle Daten geliefert werden. Regulation: true, // 'false' stellt das Setzen der Einspeiseleistung ab RegulationState: "Regulate", // Wenn angegeben, kann mit diesem State die Regulation ein- und ausgeschaltet werden (Wird automatisch unter 0_userdata.0.ecoflow angelegt) RegulationMultiPsMode: 0, // Wenn mehrere PS reguliert werden sollen. "balance" = 0 oder "serial" = 1 BasePowerOffset: 20, // Wird vom aktuellen Verbrauch abgezogen, um die Einspeiseleistung zu berechnen Zusatzpower_Offset: 10, // Zusatzpower startet ab einer Batterieladeleistung von MaxPower - Zusatzpower_Offset MinValueMin: 1, // Der Zeitraum in Minuten, aus dem der niedrigste Gesamtverbrauchswert geholt werden soll. 0 fĂÂŒr Echtzeitwert MinValueAg: 0, // Art der Ermittlung des kleinsten Wertes: 0 = Minimalwert, 1 = Durchschnittswert ReconnectMin: 30, // Zeit in Minuten, nach der die Anwendung neu gestartet wird, wenn keine neuen Daten eintreffen statesPrefix: "0_userdata.0.ecoflow", // Hier werden die ecoFlow States angelegt latitude: latitude, // Breitengrad des Standortes (wird automatisch eingesetzt) longitude: longitude, // LĂ€ngengrad des Standortes (wird automatisch eingesetzt) //**************************************** // ĂĆberschuss Ladung: //**************************************** ExcessCharge: false, // ExcessChargePowerID: "0_userdata.0.ecoflow.app_xxxxxxxxxxxxxxxxxxxx_DAxxxxxxxxxxxxxxxxxx_thing_property_set.writeables.slowChgPower", ExcessChargeSwitchID: "hm-rpc.3.xxxxxxxxxxxxxxxxxx.3.STATE", ExcessChargeSwitchOn: true, ExcessChargeSwitchOff: false, ExcessChargeSwitchMin: 10, ExcessChargeMaxPower: 1500, ExcessChargeStartPower: 50, ExcessChargeStartPowerDurationMin: 5, //**************************************** Debug: false, PlotCmdID: 99999, }; // EXTERNE STATES zum Manipulieren von Configurationsvariablen var externConfig = [ //############# Diesen Abschnitt fĂŒr jeden einzelne Wert anlegen ################ { VarName: "seriennummern[0].lowBatLimitPozOn", //Variabelname aus "ConfigData" bei AufzĂ€hlungen [0...X] in der Reigenfolge der Angaben id: "0_userdata.0.eigene_Berechnungen.AkkuReserve" //Das Objekt (State) das den Wert fĂŒr diese variable enthalten soll }, //####################################################################### ]; //####################################################################### // Funktion zum Setzen einer verschachtelten Eigenschaft in einem Objekt function setNestedProperty(obj, path, value) { let keys = path.split('.'); let lastKey = keys.pop(); let tempObj = obj; keys.forEach(key => { if (key.match(/[\d+]/)) { let index = parseInt(key.match(/[(\d+)]/)[1]); key = key.split('[')[0]; tempObj = tempObj[key][index]; } else { tempObj = tempObj[key]; } }); tempObj[lastKey] = value; } function setConfigValueFromId(VarName, id) { if (isState2(id)) { let value = getState(id).val; // Wert von ioBroker abrufen setNestedProperty(ConfigData, VarName, value); // Wert in ConfigData setzen } } // Initialisierung bei Programmstart externConfig.forEach(config => { setConfigValueFromId(config.VarName, config.id); }); // Ănderungen wĂ€hrend der Laufzeit ĂŒberwachen externConfig.forEach(config => { if (isState2(config.id)) { on(config.id, function (obj) { setConfigValueFromId(config.VarName, obj.id); //log("ExternesEvent:" + obj.id + " : " + config.VarName + ":" + obj.state.val) }); } }); //#######################################################################@umele sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
Hab ich - hier ist der Code bis zum Ende des neuen Codes von config-date bis zum Ende des neuen Codes:
da muss irgendwo anders im Script was kaputt sein.
Hier das komplette neue Script mit der eingebauten Ănderung. Versuch das bitte noch mal: -
@umele sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
Hab ich - hier ist der Code bis zum Ende des neuen Codes von config-date bis zum Ende des neuen Codes:
da muss irgendwo anders im Script was kaputt sein.
Hier das komplette neue Script mit der eingebauten Ănderung. Versuch das bitte noch mal:@waly_de - super - lĂ€uft

Vielen Dank!Hier ist noch mein mini blockly-Script fĂŒr die Ermittlung der Wettervorhersage fĂŒr das Setzen der Akkureserve:
<block xmlns="https://developers.google.com/blockly/xml" type="schedule" id="(GE`TYRwgdq64gu:ev3X" x="-1412.7252672983375" y="-312.29998779296875"> <field name="SCHEDULE">17 0 * * *</field> <statement name="STATEMENT"> <block type="controls_if" id="ZvDhkV_4w)f-:`W}*PD7"> <mutation else="1"></mutation> <value name="IF0"> <block type="logic_operation" id=")i8lCy/Y9qP.tfH3AbbA"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="XFoiqi)4IC{nioM%}N$V"> <field name="OP">LTE</field> <value name="A"> <block type="get_value" id="^cq7Kj`t!a5C-K@V5Cy5"> <field name="ATTR">val</field> <field name="OID">daswetter.0.NextDays.Location_1.Day_1.Wetter_Symbol_id</field> </block> </value> <value name="B"> <block type="math_number" id="[C5p_$e+hZj:45Jj`X8b"> <field name="NUM">2</field> </block> </value> </block> </value> <value name="B"> <block type="logic_compare" id="Y3Ss0!70G}oW:jZ;RE8N"> <field name="OP">LTE</field> <value name="A"> <block type="get_value" id="O?o^MK%1hqw`K8L?_6Ba"> <field name="ATTR">val</field> <field name="OID">daswetter.0.NextDays.Location_1.Day_1.Wetter_Symbol_id2</field> </block> </value> <value name="B"> <block type="math_number" id="2!2?c9]7:2RXsT7ARsin"> <field name="NUM">2</field> </block> </value> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="1:AV6/J(fY[Zz*1*X[6*"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.eigene_Berechnungen.AkkuReserve</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="Lj/0p64,RRVn/[21U`U("> <field name="NUM">10</field> </block> </value> <next> <block type="debug" id="^#I:RE;C?.+/QDp/q540"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="V0Et@Z_=RE]`1r`CjF``"> <field name="TEXT">Der Tag wird sonnig - Reserve runter auf 10.</field> </shadow> </value> </block> </next> </block> </statement> <statement name="ELSE"> <block type="control" id="XKy/aY~l#z4bg4uF*iJd"> <mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation> <field name="OID">0_userdata.0.eigene_Berechnungen.AkkuReserve</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="math_number" id="HVMt*OIb?!;7_QG9LQ#D"> <field name="NUM">30</field> </block> </value> <next> <block type="debug" id="!HTqeR|~wD?~*g(SzZ=."> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text" id="E-Eho[?yh+g;iD0_J:7x"> <field name="TEXT">Nicht genug Sonne - Reserve auf 30.</field> </shadow> </value> </block> </next> </block> </statement> </block> </statement> </block>
Die Instanz fĂŒr "Das Wetter" ist so konfiguriert, dass jede Nacht um 00:07 die Vorhersage aktualisiert wird.
Das blockly greift dann die Objekte ab, die anzeigen, ob es am kommenden Vormittag und Nachmittag sonnig genug wird.

-
Welche gröĂe sollte man eigentlich nehmen um zu tracken was wirklich eingespeist wurde (bei 2 PS)
jeweils die Werte addieren: ...data.InverterHeartbeat.invOutputWatts ?@resilient sagte in ecoflow-connector-Script zur dynamischen Leistungsanpassung:
jeweils die Werte addieren: ...data.InverterHeartbeat.invOutputWatts ?
Ja, das macht am meisten Sinn.
Es könnte auch sein, dass in den Daten unter:
0_userdata.0.ecoflow.app_device_property_HWXXXXXXXXXXX.data.PowerPack... irgendwie die Daten aus der App versteckt sind.. Ich hatte noch keine Geduld dass zu untersuchen. Auf den ersten Blick finde ich da aber keine Ăbereinstimmungen.
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen BeitrĂ€ge zu scrollen? Wenn du dich fĂŒr ein Konto anmeldest, kommst du immer genau dorthin zurĂŒck, wo du zuvor warst, und kannst dich ĂŒber neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und BeitrĂ€ge positiv bewerten, um anderen Community-Mitgliedern deine WertschĂ€tzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden đ
Registrieren Anmelden