Hallo,
Ich möchte gern eine PV Überschusssteuerung erstellen.
Dazu möchte ich die Einspeisung aller 15min prüfen und bei vorhandener Kapazität Verbraucher zuschalten.
Grundsätzlich funktioniert der Schwellenschalter jedoch wird der Output 2 nicht aktiviert wenn die Schwelle überschritten ist und Output 1 und 2 auf true stehen.
ich sehe den fehler im code einfach nicht
var f_einspeisung = flow.get("f_einspeisung")||0;
var c_schwelle = context.get ("c_schwelle")||0;
c_schwelle = 500
context.set ('c_schwelle',c_schwelle);
var c_output_0 = context.get("c_output_0")||false;
var c_output_1 = context.get("c_output_1")||false;
var c_output_2 = context.get("c_output_2")||false;
var c_output_3 = context.get("c_output_3")||false;
let outputs = [null, null, null, null];
// output 0000
if (f_einspeisung <= c_schwelle )
{
c_output_0 = false
context.set ('c_output_0',c_output_0)
}
//output 1000
else if (f_einspeisung > c_schwelle && c_output_0 == false)
{
c_output_0 = true
context.set ('c_output_0',c_output_0)
}
// output 1100
else if (f_einspeisung > c_schwelle && c_output_0 == true)
{
c_output_1 = true
context.set ('c_output_1',c_output_1)
}
// output 1000
else if (f_einspeisung < c_schwelle && c_output_1 == true)
{
c_output_1 = false
context.set ('c_output_1',c_output_1)
}
//output 1110
else if (f_einspeisung > c_schwelle && c_output_1 == true)
{
c_output_2 = true
context.set ('c_output_2',c_output_2)
}
// output 1100
else if (f_einspeisung < c_schwelle && c_output_2 == true)
{
c_output_2 = false
context.set ('c_output_2',c_output_2)
}
// output 1111
else if (f_einspeisung > c_schwelle && c_output_2 == true)
{
c_output_3 = true
context.set('c_output_3', c_output_3)
}
else if (f_einspeisung < c_schwelle && c_output_2 == true)
{
c_output_3 = false
context.set('c_output_3', c_output_3)
}
outputs[0] = { payload: c_output_0};
outputs[1] = { payload: c_output_1};
outputs[2] = { payload: c_output_2};
outputs[3] = { payload: c_output_3};
return outputs;
was erwartest du?
Du belässt die c_schwelle immer auf 500
Sprich du fragst immer nur ab ob die Einspeisung > 500 ist.
Das kannst du machen wenn deine Schritte also die Outputs immer wenn wieder 500W Überschuss da sind einen weiteren Output zuschalten soll, oder falls nicht einen abschalten soll.
Du hast aber unterschiedliche Stufen, mal 500, mal 100 und mal 11W
Mein Tipp um es selbst rauszufinden was passiert.
Denn du müsstest ja die Context Variablen, die Flow Variablen und auch noch die Outputs checken, und auch warum etwas passiert also alle ELSE IF Verzweigungen.
Und die kannst du dir nicht alle zeitgleich in der rechten Leiste anschauen.
Also was tun:
-
Bei deinen Debug nodes hast du hoffentlich Node-Status angeklickt damit du nicht das Debuglog beobachten musst und den Bubbel rechts im node deaktiviert damit er dir nicht das DebugLog vollmüllt.
-
In den Funktion Node gehört zu allererst mal folgende Zeile
node.status({text:"c_schwelle: " + c_schwelle + "/ Einsp.: " + flow.get("f_einspeisung")});
Damit bekommt der einen Status und zeigt dir überhaupt mal was passiert sprich du musst nicht auf den Contextview umschalten um zu sehen was passiert.
- Und wenn du dann noch wissen willst welches “else if” ausgeführt wird (weil du ja meinst zu wissen welches ausgeführt werden müsste.
Dann fügst du innerhalb der { } in den einzelnen “else if” Blöcken halt noch ein
node.warn("bin bei output 0000");
und so weiter und bekommst dann nur diese Information im Debug Log.
Wobei es bei dir mehrmals “output1000” gibt, das solltest du ohnehin ändern, denn das ist sonst irreführend.
Hallo zusammen,
Ich habe das ganze gestern noch mal bei ChatGPT prüfen lassen.
dabei ist der Code rausgekommen inkl. noch einiger Anpassungen.
Funktioniert auch ganz gut, der Sandfilter läuft gerade immer nur bei Netzeinspeisung.
// Wert aus msg.payload holen und im Flow speichern
flow.set('f_einspeisung', msg.payload);
// Schwellenwerte festlegen
var c_schwelle_up = 500;
var c_schwelle_down = 100;
context.set("c_schwelle_up", c_schwelle_up);
context.set("c_schwelle_down", c_schwelle_down);
// Aktuellen Wert der Ausgänge holen
var c_output_0 = context.get("c_output_0") || false;
var c_output_1 = context.get("c_output_1") || false;
var c_output_2 = context.get("c_output_2") || false;
var c_output_3 = context.get("c_output_3") || false;
// Entscheidungslogik für die Aktivierung
if (msg.payload > c_schwelle_up) {
// Wenn f_einspeisung über der oberen Schwelle liegt, nacheinander aktivieren
if (!c_output_0) {
c_output_0 = true; // Aktiviert c_output_0
} else if (!c_output_1) {
c_output_1 = true; // Aktiviert c_output_1
} else if (!c_output_2) {
c_output_2 = true; // Aktiviert c_output_2
} else if (!c_output_3) {
c_output_3 = true; // Aktiviert c_output_3
}
} else if (msg.payload < c_schwelle_down) {
// Wenn f_einspeisung unter der unteren Schwelle liegt, nacheinander deaktivieren
if (c_output_3) {
c_output_3 = false; // Deaktiviert c_output_3
} else if (c_output_2) {
c_output_2 = false; // Deaktiviert c_output_2
} else if (c_output_1) {
c_output_1 = false; // Deaktiviert c_output_1
} else if (c_output_0) {
c_output_0 = false; // Deaktiviert c_output_0
}
}
// Kontexte aktualisieren
context.set("c_output_0", c_output_0);
context.set("c_output_1", c_output_1);
context.set("c_output_2", c_output_2);
context.set("c_output_3", c_output_3);
// Ausgabe vorbereiten
let outputs = [
{ payload: c_output_0 },
{ payload: c_output_1 },
{ payload: c_output_2 },
{ payload: c_output_3 }
];
return outputs;
Ach so ok, du wolltest gar nicht wissen warum das erste nicht lief und wie man es hätte herausfinden können an welcher Stelle das Problem lag, oder zumindest wie man sich behilft um das rauszufunden.