NEWS
Brauche Hilfe bei PV Laden Skript
-
@jb_sullivan sagte: Wo liegt mein Fehler?
Die Funktion Verbraucher_1_F muss innerhalb des Triggers zum Ende aufgerufen werden, nicht bei Skript-Start. Die Variablen onDelay und offDelay existieren nur einmal (in der Javascript-Ansicht prüfen)? Die Kombination "Wert >= 25" und "Wert < 99,2" passt nicht.
Die äußere falls-Klammer kann entfallen, denn der Datenpunkt-Wert ist in Wert enthallten.
-
@paul53 Hmm.... OK, ich habe es genauso zusammen gesetzt, wie in deinem Screenshot weiter oben. Ich dachte das wäre ein Lösungsansatz gewesen, der "nur" mit den Datenpunkten gefüllt werden müsste.
-
@jb_sullivan sagte: Lösungsansatz gewesen, der "nur" mit den Datenpunkten gefüllt werden müsste.
Mit den richtigen DP:
- Trigger: Einspeisung
- erstes falls: Umwälzpumpe läuft
- zweites falls: Wert Einspeisung (Trigger-DP)
- drittes falls: Wert Netzbezug
Einfach so übernehmen funktioniert nur manchmal.
-
Danke für deine Hinweise - nun schaltet die Steckdose schonmal und der Zustand wird auch in den Datenpunkt geschrieben. Jetzt muss ich mir Gedanken machen wie man das ganze Sinnvoll gegen alle Eventualitäten verriegeln kann. Der Speicher soll ja in erster Linie für die Überbrückung der Abend / Nachtstunden sein und Tagsüber nur Spitzenlasten puffern.
Diese Spitzenlasten könnten den Speicher aber auf einen SoC von z.B. 96% runter ziehen. Wenn man aber vorher wie blöd ins Netz eingespeist hat, schaltet der Wechselrichter nicht sofort wieder auf Speicherladung, sondern speist erstmal weiter ein. "Irgendwann" schaltet er dann wieder auf Speicher Ladung um. Die Logik dahinter habe ich noch nicht raus bekommen.
Auf jeden Fall muss man das Blockly so bauen, das es nicht zu einer permanenten AUS/EIN Schaltung des Verbrauchs kommt, weil ein paar Rahmenparameter für den Moment nicht stimmig sind.
Oh, Oh, ich sehe schon, das wird ein Akt werden
Vielleicht sollte ich doch auf evcc wecheln. Die haben jetzt auch eine FritzDECT Steckdose als virtuelle Wallbox mit eingebaut.
-
Darf ich dich nochmal belästigen? Du scheinst ein gutes Auge und natürlich auch das entsprechende Hintergrundwissen für Scripte allgemein zu haben. Bei mir ist das immer so mehr oder weniger try and error Könntest du nochmal einen Blick auf das "Konstrukt" werfen?
Hier das Blockly als js Ansicht.
Funktion soll wie folgt laufen:
3 unterschiedliche Verbraucher verfügen über unterschiedliche Leistungsangaben und werden entsprechend des zur Verfügung stehendem PV Überschuss an bzw. aus geschaltet. Das ganze soll aber nur dann passieren, wenn der Speicher seinen Füllgrad erreicht hat und nicht unter ein bestimmtes Nivau gefallen ist.
Dieses untere Speicher Nivau soll gleichzeitig als Wolkenpuffer fungieren.
Kann das so funktionieren. Aktuell regnet es hier und ich kann nicht so wirklich gut live testen.
var Speicher, Verbraucher_1, Verbraucher_2, Verbraucher_3, onDelay, onDelay, offDelay, offDelay; // Beschreibe diese Funktion … async function Verbraucher_1_F() { setState("javascript.0.PV_Eigenverbrauch.Verbraucher_1"/*PV_Eigenverbrauch.Verbraucher_1*/, ('e-Bike Ladestation ist ' + String(Verbraucher_1 == true ? 'AN' : 'AUS')), true); setState("sonoff.0.DEKO_3.POWER1"/*DEKO_3 POWER1*/, Verbraucher_1); } // Beschreibe diese Funktion … async function Verbraucher_2_F() { setState("javascript.0.PV_Eigenverbrauch.Verbraucher_1"/*PV_Eigenverbrauch.Verbraucher_1*/, ('Raumentfeuchter ist ' + String(Verbraucher_2 == true ? 'AN' : 'AUS')), true); setState("sonoff.0.DEKO_4.POWER1"/*DEKO_4 POWER1*/, Verbraucher_2); } // Beschreibe diese Funktion … async function Verbraucher_3_F() { setState("javascript.0.PV_Eigenverbrauch.Verbraucher_1"/*PV_Eigenverbrauch.Verbraucher_1*/, ('Freigabe Poolpumpe' + String(Verbraucher_3 == true ? 'EIN' : 'AUS')), true); setState("sonoff.0.DEKO_5.POWER1"/*DEKO_5 POWER1*/, Verbraucher_3); } // Beschreibe diese Funktion … async function PV_Ueberschuss() { setState("javascript.0.PV_Eigenverbrauch.PV_Ueberschuss_Freigabe "/*PV_Eigenverbrauch.PV_Ueberschuss_Freigabe */, ('PV Überschuss Freigabe ' + String(Speicher == true ? 'OK' : 'Gesperrt')), true); } Speicher = false; // Freigabe über Speicher SoC on({id: 'fronius.0.powerflow.inverter1.SOC', change: "any"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : "") >= 99.2) { (function () {if (offDelay) {clearTimeout(offDelay); offDelay = null;}})(); if (!onDelay) { onDelay = setTimeout(async function () { Verbraucher_1 = true; Speicher = true; }, 180000); } } if ((obj.state ? obj.state.val : "") <= 97) { (function () {if (onDelay) {clearTimeout(onDelay); onDelay = null;}})(); if (!offDelay) { offDelay = setTimeout(async function () { Speicher = false; Verbraucher_1 = false; }, 180000); } } await Verbraucher_1_F(); await PV_Ueberschuss(); }); Verbraucher_1 = false; Verbraucher_2 = false; Verbraucher_3 = false; Verbraucher_1 = 300; Verbraucher_2 = 200; Verbraucher_3 = 100; // Verbraucher priorisiert nach Netzeiinspeisung starten on({id: 'discovergy.0.60868258.Power_Delivery', change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("discovergy.0.60868258.Power_Delivery").val >= 0) { if (Verbraucher_1 == false && getState("discovergy.0.60868258.Power_Delivery").val > Verbraucher_1 && Speicher == true) { Verbraucher_1 = true; await Verbraucher_1_F(); } if (Verbraucher_1 == true && Verbraucher_2 == false && getState("discovergy.0.60868258.Power_Delivery").val > Verbraucher_1 + Verbraucher_2 && Speicher == true) { Verbraucher_2 = true; await Verbraucher_2_F(); } if (Verbraucher_1 == true && Verbraucher_3 == false && getState("discovergy.0.60868258.Power_Delivery").val > Verbraucher_1 + Verbraucher_2 + Verbraucher_3 && Speicher == true) { Verbraucher_3 = true; await Verbraucher_3_F(); } } }); // Verbraucher priorisiert nach Netzeinspeisung stoppen on({id: 'discovergy.0.60868258.Power_Consumption', change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("discovergy.0.60868258.Power_Consumption").val > 0) { if (Verbraucher_1 == true && getState("discovergy.0.60868258.Power_Consumption").val < Verbraucher_1) { Verbraucher_1 = false; await Verbraucher_1_F(); } else if (Verbraucher_1 == true && Verbraucher_2 == true && getState("discovergy.0.60868258.Power_Consumption").val < Verbraucher_1 + Verbraucher_2) { Verbraucher_2 = false; await Verbraucher_2_F(); } else if (Verbraucher_1 == true && Verbraucher_2 == true && Verbraucher_3 == true && getState("discovergy.0.60868258.Power_Consumption").val < Verbraucher_1 + Verbraucher_2 + Verbraucher_3) { Verbraucher_3 = false; await Verbraucher_3_F(); } } });
-
@jb_sullivan sagte: Kann das so funktionieren.
Als erstes fällt mir auf, dass onDelay und offDelay zweimal vorhanden sind (1. Zeile), was nicht funktioniert. Wähle bei "falls nicht onDelay"/"falls nicht offDelay" die jeweils andere Variable aus und überzeuge Dich in der Javascript-Ansicht davon, dass die Variablen nur noch einmal aufgeführt werden.
Den Rest habe ich mir noch nicht angesehen.
-
OK, da ich das ganze mit Timeout sowieso nie wirklich verstanden habe, habe ich das nun aus der Freigabe für den Speicher raus geworfen. Die beiden Werte <> sollten ja eigentlich bei der Trägheit des System ausreichend sein, damit es nicht prellt.
Hier nochmal die korrigierte Version
var Speicher, Verbraucher_1, Verbraucher_2, Verbraucher_3; // Beschreibe diese Funktion … async function Verbraucher_1_F() { setState("javascript.0.PV_Eigenverbrauch.Verbraucher_1"/*PV_Eigenverbrauch.Verbraucher_1*/, ('e-Bike Ladestation ist ' + String(Verbraucher_1 == true ? 'AN' : 'AUS')), true); setState("sonoff.0.DEKO_3.POWER1"/*DEKO_3 POWER1*/, Verbraucher_1); } // Beschreibe diese Funktion … async function Verbraucher_2_F() { setState("javascript.0.PV_Eigenverbrauch.Verbraucher_1"/*PV_Eigenverbrauch.Verbraucher_1*/, ('Raumentfeuchter ist ' + String(Verbraucher_2 == true ? 'AN' : 'AUS')), true); setState("sonoff.0.DEKO_4.POWER1"/*DEKO_4 POWER1*/, Verbraucher_2); } // Beschreibe diese Funktion … async function Verbraucher_3_F() { setState("javascript.0.PV_Eigenverbrauch.Verbraucher_1"/*PV_Eigenverbrauch.Verbraucher_1*/, ('Freigabe Poolpumpe' + String(Verbraucher_3 == true ? 'EIN' : 'AUS')), true); setState("sonoff.0.DEKO_5.POWER1"/*DEKO_5 POWER1*/, Verbraucher_3); } // Beschreibe diese Funktion … async function PV_Ueberschuss() { setState("javascript.0.PV_Eigenverbrauch.PV_Ueberschuss_Freigabe "/*PV_Eigenverbrauch.PV_Ueberschuss_Freigabe */, ('PV Überschuss Freigabe ' + String(Speicher == true ? 'OK' : 'Gesperrt')), true); } Speicher = false; // Freigabe über Speicher SoC on({id: 'fronius.0.powerflow.inverter1.SOC', change: "any"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : "") >= 99.2) { Speicher = true; } if ((obj.state ? obj.state.val : "") <= 97) { Speicher = false; } await PV_Ueberschuss(); }); Verbraucher_1 = false; Verbraucher_2 = false; Verbraucher_3 = false; Verbraucher_1 = 300; Verbraucher_2 = 200; Verbraucher_3 = 100; // Verbraucher priorisiert nach Netzeinspeisung starten on({id: 'discovergy.0.60868258.Power_Delivery', change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("discovergy.0.60868258.Power_Delivery").val >= 0) { if (Verbraucher_1 == false && getState("discovergy.0.60868258.Power_Delivery").val > Verbraucher_1 && Speicher == true) { Verbraucher_1 = true; await Verbraucher_1_F(); } if (Verbraucher_1 == true && Verbraucher_2 == false && getState("discovergy.0.60868258.Power_Delivery").val > Verbraucher_1 + Verbraucher_2 && Speicher == true) { Verbraucher_2 = true; await Verbraucher_2_F(); } if (Verbraucher_1 == true && Verbraucher_3 == false && getState("discovergy.0.60868258.Power_Delivery").val > Verbraucher_1 + Verbraucher_2 + Verbraucher_3 && Speicher == true) { Verbraucher_3 = true; await Verbraucher_3_F(); } } }); // Verbraucher priorisiert nach Netzeinspeisung stoppen on({id: 'discovergy.0.60868258.Power_Consumption', change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (getState("discovergy.0.60868258.Power_Consumption").val > 0) { if (Verbraucher_1 == true && getState("discovergy.0.60868258.Power_Consumption").val < Verbraucher_1) { Verbraucher_1 = false; await Verbraucher_1_F(); } else if (Verbraucher_1 == true && Verbraucher_2 == true && getState("discovergy.0.60868258.Power_Consumption").val < Verbraucher_1 + Verbraucher_2) { Verbraucher_2 = false; await Verbraucher_2_F(); } else if (Verbraucher_1 == true && Verbraucher_2 == true && Verbraucher_3 == true && getState("discovergy.0.60868258.Power_Consumption").val < Verbraucher_1 + Verbraucher_2 + Verbraucher_3) { Verbraucher_3 = false; await Verbraucher_3_F(); } } });
-
@jb_sullivan
Du verwendest die Variablen Verbraucher_1, Verbraucher_2, Verbraucher_3 mal als Boolean und mal als Zahl. Das kann nicht funktionieren.EDIT: Was für einen Wert enthält der Datenpunkt "Power_Delivery"?
-
@paul53 einen positiven Zahlenwert (Einspeisung) genau wie Power_Consumption (Netzbezug)
Das blöde ist, das der Wechselrichter immer versucht auf Einspeisung 0 zu regeln. Das ergiebt einen wilden Wechsel zwischen Bezug und Einspeisung, wenn nicht mit "tausenden" von Watt eingespeist wird. Das muss man irgendwie entprellen
-
sieht das jetzt besser aus mit den Variablen bzgl. Unterscheidung Zahl / Boolean?
-
@jb_sullivan sagte: sieht das jetzt besser aus mit den Variablen bzgl. Unterscheidung Zahl / Boolean?
Nicht wirklich. Vorschlag:
-
Sieht soweit ganz gut aus. Wann geschaltet wird, bestimmt im Moment im Grunde die Instanz von discovergy, da die Werte nur alle 180 Sekunden abgeholt werden.
D.h. wenn zu dem Zeitpunkt der Datenpunkt Aktualisierung der "falsche" Wert im DP drin steht, kommt es zu einer Verzögerung für die Zu- bzw. Abschaltung. Oder ist das über die Discovergy Adapter Einstellung vielleicht sogar besser um ein permanentes EIN/AUS schalten zu unterbinden?
-
@jb_sullivan
Beispiel Verbraucher schalten für verbraucher1: -
-
@jb_sullivan sagte: Das hatte ich ja schon so ähnlich
Du rufts die Funktion aber nur zum Einschalten auf. So wird der Verbraucher nie wieder ausgeschaltet.
@jb_sullivan sagte in Brauche Hilfe bei PV Laden Skript:
Was bdeutet "ungleich" eigentlich?
Wenn der Sollzustand (Variable) und der Istzustand (Datenpunkt-Wert) unterschiedlich sind.
-
@paul53 "Wert von objekt ID" wäre in deinem Beispiel was (Power_Delivery oder Leistung_1)?
-
@jb_sullivan sagte: "Wert von objekt ID" wäre in deinem Beispiel was?
DEKO_3_POWER1
-
Ähm - sicher? steuer wäre DEKO, aber Wert ist auch DEKO?
-
@jb_sullivan sagte: sicher? steuer wäre DEKO, aber Wert ist auch DEKO?
Ja. Es soll ja nur gefunkt werden, wenn der Aktor nicht den Sollzustand hat (Störpegelverringerung).
-
@paul53 Wir haben gerade einen coolen Sonnen/ Wolken Mix und ich habe den Aktualisierungsintervall vom Discovergy Adapter auf 30 Sekunden runter genommen und die Schaltschwellen entsprechend niedrig eingestellt.
Ist ein lustiges geklackere der Sonoff Steckdosen - also mit anderen Worten. Scheint prächtig zu funktionieren Viele Dank für deine Unterstützung !!!