Node Red Schwellwertschalter

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:

  1. 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.

  2. 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.

  1. 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.