Programmierung node red - Kleinster Wert

Hallo,
ich versuche aus meinen Batterien den kleinsten SoC zu suchen. Es klappt aber nicht zuverlässig. Jede 2. Ausgabe passt. Die andere ist undefiniert.
Sicher kann wer den Fehler sofort erkennen.
Hier der Code in der Funnktion:

var Seplos = 0;
var Taico = 0;
var Soc_min = 0;
if (msg.topic === “Seplos SoC”)
{
Seplos = msg.payload;
Taico = context.get(“Taico”);
}
else if (msg.topic === “Taico SoC”)
{
Taico = msg.payload;
Seplos = context.get(“Seplos”)
}

if (Seplos > Taico) 
{
    msg.payload = Taico;
    msg.topic = "Taico";
}    
else 
{
    msg.payload = Seplos;
    msg.topic = "Lowest SoC";
}

context.set = “Seplos SoC”,Seplos;
context.set = “Taico SoC”,Taico;

return msg;

Es scheint, dass du Probleme mit der Variablenzuweisung und dem Zustand der Variablen hast. Ein häufiges Problem in Node-RED ist, dass die Variablen aus dem Kontext nicht richtig gespeichert oder abgerufen werden. Um sicherzustellen, dass dein Code immer den richtigen Wert verwendet, musst du darauf achten, dass du die Werte im Kontext speicherst, wenn du sie aktualisierst.

Hier ist ein überarbeiteter Codeausschnitt, der sicherstellt, dass du die Werte korrekt speicherst und abrufst:

var Seplos = context.get(“Seplos”) || 0; // Abrufen des gespeicherten Wertes oder 0 setzen
var Taico = context.get(“Taico”) || 0; // Abrufen des gespeicherten Wertes oder 0 setzen

if (msg.topic === “Seplos SoC”) {
Seplos = msg.payload; // Den neuen Wert setzen
context.set(“Seplos”, Seplos); // Den Wert im Kontext speichern
} else if (msg.topic === “Taico SoC”) {
Taico = msg.payload; // Den neuen Wert setzen
context.set(“Taico”, Taico); // Den Wert im Kontext speichern
}

if (Seplos > Taico) {
msg.payload = Taico;
msg.topic = “Taico”;
} else {
msg.payload = Seplos;
msg.topic = “Lowest SoC”;
}

// Rückgabe des modifizierten Nachrichtenobjekts
return msg;

Erläuterungen:

  1. Kontextabruf: Zu Beginn des Skripts ziehst du die Werte von Seplos und Taico aus dem Kontext (mit context.get()). Wenn sie noch nicht festgelegt sind (z. B. beim ersten Durchlauf), wird ihnen der Wert 0 zugewiesen.

  2. Wertzuweisung: Wenn das msg.topic mit “Seplos SoC” oder “Taico SoC” übereinstimmt, aktualisierst du den entsprechenden Wert und speicherst ihn im Kontext mit context.set().

  3. Bedienung: Danach vergleichst du die beiden Werte und erstellst die Ausgabe, die du zurückgeben möchtest.

  4. Rückgabe: Schließlich wird das msg-Objekt zurückgegeben, was wichtig ist für die weitere Verarbeitung in Node-RED.

Versuche, den aktualisierten Code zu verwenden und schaue, ob die Ausgabe jetzt zuverlässig ist.

Das wäre die Antwort einer KI. Für solche Zwecke ist KI unschlagbar. Wenn die Antwort nicht passt kannst du die Frage konkretisieren. Funktioniert wunderbar auch für funktionscode.

1 Like

Vielen Dank für die Verbesserung und die passenden Erklärungen.
Ich habe es mehrmals auf verschiedene Wege mit Gemini versucht aber die Resultate waren nicht verwertbar.
Es ist noch ein langer Weg bis meine Programmierung komplett steht, aber mache es lieber in kleinen Schritten wegen der Übersichtlichkeit und Fehlerquote.

Nochmals Danke

Ich nutze GPT und bin sehr zufrieden.

Passt denn die Antwort auf Anhieb?

Ich versuche es dann mal wieder mit GPT.
Ich musste nur die " anpassen. Der Rest war so ok. Feinschliff kommt erst wenn es läuft wie gedacht. Muss mir mal ein Flussdiagramm erstellen.