NEWS
Steckdose bei PV Einspeisung mit Durchschnittswert > X
-
Hallo zusammen,
ich bin ein relativer Neuling in Sachen Javascript und auch Blockly. Einfache Problemstellungen bekomme ich hin aber nun bin ich an eine Stelle gestossen wo ich nicht weiß wie ich es beheben kann und für euch, denke ich, ist dies ein LeichtesProblemstellung: Ich möchte einen Shelly PlugS einschalten wenn ich Strom meiner PV Anlage ab einer gewissen Menge ins Netz einspeisen würde.
Ich möchte nicht dass der Schalter ständig ein- und ausschält sondern möchte etwas Spiel bei den Schaltvorgängen haben. Daher habe ich folgende Idee:Wenn sich der Wert des Datenpunktes Stromeinspeisung ändert, schreibe den Wert in ein Array, sind 4 Werte im Array, prüfe ob der Durchschnittswert >300 ist. Wenn ja schalte den Switch auf "true". Ist der Durchschnittswert <300 dann soll der Switch auf "false" gestellt werden. Danach soll wieder der nächste Wert im Array an Stelle 1 gesetzt werden und die Logik dementsprechend für die nächsten 4 Werte neu gestartet werden.
Könnt ihr mir hier bitte einen kurzen Hinweis geben, wie ich das Blockly mit Schleife, Array und Variablen erstellen kann? Am liebsten grafisch, damit ich das verstehe.
Datenpunkte und notwendige Objekte sind alle vorhanden und ich weiß auch wie ich den Switch ein und ausschalten kann.
Ich hoffe ich habe das verständlich erklärt.
Vielen Dank für eure Kompetente die Info und eure Hilfe im Voraus.
-
@chronos81 Warum so kompliziert ?
Wenn du immer 4 Werte im Array für den Durchschnitt haben willst, dann machst du wenn ein neuer wert an kommt:
Hast du mehr als 4 Werte im Array, letzten Wert wegwerfen (dieser Baustein, umstellen von 'nehme' (get) auf 'entferne' (remove)
Immer: setz den neuen Wert als ersten (dieser Baustein:)
Danach: kannst du per Schleife alle Werte Aufaddieren und durch die Anzahl der vorhandenen Werte teilen.Dann hast du immer den Durchschnitt der letzten 4 Werte - sprich eine Glättung deiner Messwerte.
Das ist insbesondere interessant wenn du feststellst das Dir 4 Werte nicht reichen - dann willst du mehr
A.
Nachtrag - du brauchst natürlich eine Variable, die du als 'leere Liste' initialisieren musst, sonst geht das nicht.
-
@asgothian Danke für deine schnelle Antwort und den Ansatz. Ich bin gerade dabei mir das Blockly in seiner Gesamtheit vorzustellen. Ist momentan nicht so einfach da ich wirklich noch nicht lange Blockly verwende. Kann es sein, dass da nach dem ersten Doppelpunkt ein Screenshot fehlt?
-
@chronos81 sagte: sind 4 Werte im Array, prüfe ob der Durchschnittswert >300 ist.
Wie oft wird der Wert aktualisiert? 4 Werte dürften etwas wenig sein, wenn kleine Wolken / Wolkenlücken überbrückt werden sollen.
@chronos81 sagte in Steckdose bei PV Einspeisung mit Durchschnittswert > X:
Ist der Durchschnittswert <300 dann soll der Switch auf "false" gestellt werden.
Es ist eine Hysterese erforderlich, die etwas größer ist als die Leistungsaufnahme des zu schaltenden Gerätes, denn die Leistungsaufnahme wirkt auf die Einspeisung zurück.
Prinzip: -
@paul53
Danke für deinen Hinweis. Meine Eingangswerte auf die ich mich beziehe, sind bereits geglättet und geben mir durch ein von ChatGPT erstelltes Javascript einen Wert zurück welcher bereits gemittelt ist. So ändern sich diese Werte circa alle 40 Sekunden.
Da ich aber nun gerne verstehen würde wie ich das in Blockly "selber" hinbekomme wollte ich mich hier mal der Sache annähern.
Der Eigenverbrauch des Verbrauchers beträgt um die 160W. Von daher habe ich hier schon etwas Spiel mit eingerechnet. Könnte aber, wenn ich es richtig bedenke, auch noch auf 500W Schwellenwert gehen. -
@chronos81 sagte: Der Eigenverbrauch des Verbrauchers beträgt um die 160W. Von daher habe ich hier schon etwas Spiel mit eingerechnet. Könnte aber, wenn ich es richtig bedenke, auch noch auf 500W Schwellenwert gehen.
Bei 160 W Leistungsaufnahme ist ein Einschaltgrenzwert von 300 W völlig in Ordnung. Wichtig ist die Hysterese (Einschalt-Ausschaltgrenzwert), die mind. 200 W betragen sollte.
Ich habe das Blockly oben auf 160 W angepasst.
-
@chronos81 sagte in Steckdose bei PV Einspeisung mit Durchschnittswert > X:
Kann es sein, dass da nach dem ersten Doppelpunkt ein Screenshot fehlt?
Och, da fehlen so einige Screenshots, wenn du damit alles nachbauen willst:
So wie du beschrieben hast
so wie ich beschrieben hab:
A.
Nachtrag: Das was @paul53 geschrieben hat gilt trotzdem - die Abarbeitung samt Hysterese sollte da passieren wo die gelben Blöcke sind.
-
@chronos81 sagte in Steckdose bei PV Einspeisung mit Durchschnittswert > X:
Danke für deinen Hinweis. Meine Eingangswerte auf die ich mich beziehe, sind bereits geglättet und geben mir durch ein von ChatGPT erstelltes Javascript einen Wert zurück welcher bereits gemittelt ist. So ändern sich diese Werte circa alle 40 Sekunden.
Aus Neugier - zeig mal das Skript von ChatGPT
A.
-
@asgothian Muss ich heute abend machen, habe gerade keinen Zugriff auf meinen IOBROKER. Daher kann ich auch eure Blockly's erst frühestens heute Abend wenn nicht die nächsten Tage machen.
@Asgothian @paul53 Eure Ansätze helfen mir schon mal sehr weiter und ich versuche mich damit ran zu tasten. Ich melde mich wieder im Thread, wenn ich herausgefunden habe wie ich alles nachbaue
und wenn ich entweder eine Lösung habe oder ein Problem. Kann aber noch bisschen dauern
-
@asgothian Hier wie gewünscht nachgereicht noch das ChatGPT generierte Skript. Im Unterschied zu deinem Blockly macht er die Berechnung des MIttelwertes nicht fließend sondern beginnt immer neu nach 4 Werten. Dies ist mir aber auch erst aufgefallen, als ich die beiden Werte verglichen habe
Somit ist für diesen Anwendungsfall die "HI" immer noch im Vorteil.
// Array für die Speicherung der letzten 4 Einspeisewerte let einspeisungValues = []; // Funktion zum Berechnen des Mittelwerts function calculateAverage(values) { const sum = values.reduce((acc, value) => acc + value, 0); return sum / values.length; } on({ id: 'solax.0.data.feedinpower', change: 'any' }, async (obj) => { let feedinPower = parseFloat(getState('solax.0.data.feedinpower').val); if (isNaN(feedinPower)) return; // Fehlervermeidung, falls Wert ungültig ist // Wert ins Array speichern (maximal 4 Werte) einspeisungValues.push(feedinPower); if (einspeisungValues.length > 4) { einspeisungValues.shift(); // Ältesten Wert entfernen } // Berechne den Mittelwert der letzten 4 Werte if (einspeisungValues.length === 4) { let averageEinspeisung = calculateAverage(einspeisungValues); averageEinspeisung = Math.floor(averageEinspeisung); // Auf ganze Zahl abrunden // Speichere den Mittelwert im benutzerdefinierten Zustand 'Einspeiseleistung' setState('0_userdata.0.Solar.Einspeiseleistung_MW', averageEinspeisung, true); // Leere das Array für die nächsten 4 Werte einspeisungValues = []; } });
-
@paul53 Danke für deine Hilfe es hat nun alles geklappt. Da die Ausgangswerte bei mir immer Positiv sind, habe ich die Negierung weggelassen. Es funktioniert prächtig und ich bin meinem Verständnis von Blockly näher gekommen. Vielen Dank für eure Hilfe.