@gooflo hab es selbst gefunden, man muss sie als AdditionalPower anlegen
NEWS
Best posts made by gooflo
-
RE: ecoflow-connector-Script zur dynamischen Leistungsanpassung
-
RE: ecoflow-connector-Script zur dynamischen Leistungsanpassung
@waly_de danke für das Video - wie das letzte sehr gelungen und gut verständlich. Habe (noch) keine Überschussladung, allerdings die Sache mit den zusätzlichen Modulen an der Delta 2 Max und das ist mit dem neuen Parameter (NoFeedIn) gut erklärt.
Temperaturparameter wird ab sofort nach influxdb geschrieben, mal sehen, was der so ausgibt.
-
RE: ecoflow-connector-Script zur dynamischen Leistungsanpassung
@waly_de danke für den Tip. Falls jemand auch diesen Anwendungsfall hat, hier meine aktuelle Lösung mit einem zweiten Skript, wobei ich im Originalskript in der Konfiguration das hier setze:
SmartmeterID: "0_userdata.0.ecoflow.TotalActivePowerPlusPlugs", // State, der den aktuellen Gesamtverbrauch in Watt anzeigt
und hier das neue Skript:
// globale Konfiguration var ConfigData = { statesPrefix: "0_userdata.0.ecoflow", // übernommen TotalActivePower : ".TotalActivePower", // Shelly total active power TotalActivePowerPlusPlugs : ".TotalActivePowerPlusPlugs", // Neuer State für Power mit Plugs in den Userdaten SmartmeterID: "shelly.0.shellypro3em#XXXXXXXXXXX.EM0.TotalActivePower", // übernommen State, der den aktuellen Gesamtverbrauch in Watt anzeigt } // state TotalActivePowerPlusPlugs anlegen if ( !existsState(ConfigData.statesPrefix + ConfigData.TotalActivePowerPlusPlugs)) { createState(ConfigData.statesPrefix + ConfigData.TotalActivePowerPlusPlugs,0,{name: "TotalActivePowerPlusPlugs", type: 'number', role: 'value'}, function () {}); } else { setState(ConfigData.statesPrefix + ConfigData.TotalActivePowerPlusPlugs,0); } // state TotalActivePower anlegen if ( !existsState(ConfigData.statesPrefix + ConfigData.TotalActivePower)) { createState(ConfigData.statesPrefix + ConfigData.TotalActivePower,0,{name: "TotalActivePower", type: 'number', role: 'value'}, function () {}); } else { setState(ConfigData.statesPrefix + ConfigData.TotalActivePower,0); } /** * @param {string} id */ function getPlugWatts(id) { let watts = 0 let age_min = (Date.now() - getState(id).ts) / (1000 * 60) let w = Number(getState(id).val)/10 // sanity check: nur wenn die Daten Daten jünger als 4 min sind oder nicht so hoch werden sie verwendet if (age_min < 4 || w < 50) { watts += w } // log(id + " " + watts + " W, age (min) = " + age_min) return watts } // wenn der Smartmeter gesetzt wird, die Plugs Watt ermitteln und die states setzen on({id: ConfigData.SmartmeterID}, function (obj) { let smartMeterTotal = Math.floor(Number(getState(ConfigData.SmartmeterID).val)) setState(ConfigData.statesPrefix + ConfigData.TotalActivePower, smartMeterTotal) // store initial TotalActivePower let plugsSum = 0 plugsSum += getPlugWatts("0_userdata.0.ecoflow.app_device_property_XXXXXXXXXXX_1.data.plug_heartbeat_pack.watts") plugsSum += getPlugWatts("0_userdata.0.ecoflow.app_device_property_XXXXXXXXXXX_2.data.plug_heartbeat_pack.watts") plugsSum += getPlugWatts("0_userdata.0.ecoflow.app_device_property_XXXXXXXXXXX_3data.plug_heartbeat_pack.watts") plugsSum += getPlugWatts("0_userdata.0.ecoflow.app_device_property_XXXXXXXXXXX_4.data.plug_heartbeat_pack.watts") // log("Plugs Watts = " + plugsSum) setState(ConfigData.statesPrefix + ConfigData.TotalActivePowerPlusPlugs, Math.floor(smartMeterTotal + plugsSum)) });
Natürlich müssen für Shelly und Plugs die entsprechenden IDs gesetzt werden.
-
RE: ecoflow-connector-Script zur dynamischen Leistungsanpassung
@ralf77 genau, es geht um die Entladung, da hast Du dann noch einen Fehler im Changelog gefunden @Waly_de . Bitte beobachte mal, wie gut das funktioniert. Soweit ich mich erinnere bin ich im Laufe der Zeit auf Fälle gestoßen, bei denen es nicht so gut funktioniert hat. Deswegen und weil ich auch das Laden (abhängig von PV (inklusive PV an der D2M) und Ladestand) regeln wollte, habe ich es nochmal weiterentwickelt.
Latest posts made by gooflo
-
RE: ecoflow-connector-Script zur dynamischen Leistungsanpassung
@djvanity ggf. gerne PN, ansonsten hier mal (ungetestet, weil ich bei mir noch weitere Änderungen drin hab) die Modifikation, ausgehend von Version 125:
ab Zeile 275
lowBatLimitPozOn: 5, lowBatLimitPozOff: 15, // Bei Unterschreiten der Batterieladung von "lowBatLimitPozOn" % ist die maximale Einspeiseleistung auf lowBatLimit: 150, // "lowBatLimit" limitiert, bis der Ladezustand wieder bei "lowBatLimitPozOff" ist lowBatLimitIsPVInput: true, // gooflo: falls unter lowBatLimit und >= 20W Input, auf Output = PV Input setzen
die letzte Zeile mit dem Parameter "LowBatLimitIsPVInput" einfügen. Und dann ab Zeile 2674 folgende Änderung:
if (Setpower > myMaxPower) { // Original Code: // cutoff = Math.floor((Setpower - myMaxPower)) // Setpower = myMaxPower // gooflo: falls unter lowBatLimit und >= 20W Input, auf Output = PV Input setzen let currentPVinput = GlobalObj[asn].sumPV if (GlobalObj[asn].batstate < ConfigData.seriennummern[i].lowBatLimitPozOn && currentPVinput >= 20 && ConfigData.seriennummern[i].lowBatLimitIsPVInput && Setpower > currentPVinput) { mlog("Limit output to PV Input = " + currentPVinput) cutoff = Math.floor((Setpower - currentPVinput )) Setpower = currentPVinput myMaxPower = Setpower } else { cutoff = Math.floor((Setpower - myMaxPower)) Setpower = myMaxPower } } else { Setpower = Setpower + cutoff cutoff = 0 ...
Hier ggf. noch die Schwelle von 20W anpassen (dafür habe ich keinen Parameter spendiert, wäre natürlich auch möglich.
Viel Spaß damit!
-
RE: ecoflow-connector-Script zur dynamischen Leistungsanpassung
Hallo zusammen,
ich hatte mal wieder eine Idee, weil im Winter ja kaum Sonne runterkommt, viele hängen ja sogar die Akkus ab (ich bisher nicht). Wenn es dann endlich mal etwas Sonne hat, dann nervt es, dass das immer unter lowBatLimit geht und dann wieder drüber. Da dachte ich mir: warum nicht eine Funktionalität implementieren, die ab einem Grenzwert (ich verwendet LowBatLimit) genau das einspeist, was von PV reinkommt, natürlich nur, wenn der Bedarf höher ist. Hab ich mal so implementiert und teste es. Vorteil, den ich mir verspreche: die Batterie bleibt (hoffentlich) an dem eingestellten Limit und man nutzt den PV Strom optimal, ohne Batterieverluste.
Was haltet ihr davon?
-
RE: ecoflow-connector-Script zur dynamischen Leistungsanpassung
@sirdir wenn Du die Überschussladung meinst dann ja, die nutze ich nicht (hab keinen Anwendungsfall dafür).
-
RE: ecoflow-connector-Script zur dynamischen Leistungsanpassung
@sirdir letztlich ist es so, dass die PSs weiterhin geregelt werden, d.h. der AC Ausgabewert wird in jedem Durchlauf neu gesetzt, wodurch dann eben nicht aller Überschuss eingespeist wird, sondern nur das was abzüglich dem realen Verbrauch noch übrig ist.
-
RE: ecoflow-connector-Script zur dynamischen Leistungsanpassung
@sirdir weiß nicht genau was Du meinst, das ist unabhängig von der Anzahl der vollen PSs (hab's allerdings nur mit 2 getestet bisher ;-)): man legt über die Variable halt fest, wie viel eingespeist werden kann. Sagen wir bei 3 PSs, jeder bekommt 700W PV, wären also max. 2.100W Einspeisung möglich. Wenn nun die Speicher aller 3 voll sind, dann kann man über die Variable festlegen, dass statt 2.100 eben nur 700 oder was man halt will ins Stromnetz gehen soll.
-
RE: ecoflow-connector-Script zur dynamischen Leistungsanpassung
@sirdir und ich habe es folgendermaßen gelöst:
- zwei globale Variablen bei den erweiterten Einstellungen definiert
intelligentBattPozOnMaxPower: true, // im Balance mode intelligent battPozOnMaxPower regeln ( (Target-Wert + Realpower)/Anzahl PSs) intelligentBattPozOnMaxPowerTarget: 700, // W für intelligente Regelung
- im Balance Mode zählt man dann erst mal, wie viel nicht regulierte PSs man hat, d.h. bei wie vielen die Batterie voll ist:
let nNichtReguliertePSs = 0 ... if (!GlobalObj[asn].regulieren) nNichtReguliertePSs++
- und baut dann noch folgenden else-if im Balance mode ein:
else if (ConfigData.seriennummern[i].typ == "PS" && ConfigData.seriennummern[i].seriennummer != "XXXXXXXXXXXXX") { if (ConfigData.intelligentBattPozOnMaxPower) { if (nNichtReguliertePSs > 0) { let v = (ConfigData.intelligentBattPozOnMaxPowerTarget + lowestValue)/nNichtReguliertePSs setAC(asn, Math.floor(v * 10)) mlog("unregulierter PS " + GlobalObj[asn].PsName + " (von insgesamt " + nNichtReguliertePSs + ")" + " set power = " + v.toFixed(0)) GlobalObj[asn].OldNewValue = v } } }
Der lowestValue Wert entspricht dem Bedarf, der dann auf die nicht regulierten PSs aufgeteilt wird, wobei man mit intelligentBattPozOnMaxPowerTarget einstellen kann, wie viel zusätzlich zum Bedarf eingespeist werden soll. Also wenn Bedarf 400 und ich habe zwei nicht mehr regulierte (= Batterie voll) PowerStreams und intelligentBattPozOnMaxPowerTarget = 600, dann wird je PowerStream 500W eingespeist. Ist nur einer von beiden nicht reguliert, dann versucht dieser die vollen 1000W einzuspeisen, was natürlich nicht klappt, den Rest übernimmt der andere über die normale Regelung.
-
RE: ecoflow-connector-Script zur dynamischen Leistungsanpassung
@sirdir habe zufälligerweise auch zwei PS und außerdem noch zwei Shelly Pro und muss mir, wenn alles nicht mehr funktioniert, auch was Eigenes basteln, außerdem fände ich ein funktionierendes Beispiel für Regelung mit der neuen API auch super interessant ... Du siehst, ich zumindest hätte Interesse daran, dass Du es teilst (gerne auch direkt per Chat, falls Dir das lieber wäre).
-
RE: ecoflow-connector-Script zur dynamischen Leistungsanpassung
@sirdir cool, dass Du es auf die offizielle API umgestellt hast. Teilst Du Deinen Code mit uns?
-
RE: ecoflow-connector-Script zur dynamischen Leistungsanpassung
@ralf77 hm, stimmt, das sieht seltsam aus. Wenn kein PV reinkommt sollte es eigentlich genau nach Kapazität aufgeteilt werden. Aus dem Logfile könnte man vermutlich die Ursache finden (mlog = true setzen).