Verständnisproblem Function Node bzw FlowData

Hallo zusammen

Ich habe Steckdosen (Tasmota) in Node Blue eingebunden.

Jetzt würde ich gerne eine davon nutzen um zu ermitteln ob die Waschmaschine fertig ist.

Ich habe die aktuelle Leistung aus dem JSON Objekt extrahiert und an einem function Node Ausgang verfügbar.

Den Leistungsverlauf der Waschmaschine habe ich mir mit Hilfe von Grafana angesehen.

Eigentlich muss ich nur ermitteln ob die Maschine unter 2 Watt Leistungsaufnahme hat und dann eine Telegram Message versenden.

Beim Einschalten der Maschine geht diese ja recht schnell in der Leistung nach oben, ergo habe ich versucht mit der Function Node einen “Trigger” zu setzen.

$actualPower = $message['payload'];

if ($actualPower > 10) {
    setFlowData('washingIsRunning', true);
} 

$msg = getFlowData('washingIsRunning');

return $msg;

Das return ist nur zur Kontrolle im Debugfenster.

Obwohl die Leistung > 10 ist, wird nichts als return zurück gegeben.

In einem weiteren Fenster wollte ich den Trigger dann benutzen um das Ende des Waschvorgangs zu ermitteln:

$actualPower = $message['payload'];

$stateRunning = getFlowData('washingIsRunning');

if ($stateRunning = true){
    if ($actualPower < 2) {
        $msg['payload'] = "Waschmaschine ist fertig";
        setFlowData('washingIsRunning', false);
    } 
}

return $msg;

Es wird jedoch immer der Text im Debug ausgegeben und dass obwohl scheinbar die Variable washingIsRunning NULL ist.

Kann mir jemand auf die Sprünge helfen wie ich das lösen kann ?

Ich bin mir auch nicht sicher ob ich die setFlowData und getFlowData richtig benutze

Danke im Voraus

$stateRunning = true setzt doch auch in PHP $stateRunning auf true.? Solle es nicht if $stateRunning == true heißen?

Das hier geht:

$count = getGlobalData("counter");
[deine Berechnung]
setGlobalData("counter", $count);

Die Variable counter muss natürlich auch vorher angelegt sein.

Du hast Recht, ich muss besser aufpassen :slight_smile:

Jetzt geht es, allerdings habe ich keine Anführungsstriche benutzt sondern Hochkommatas.

Angelegt wird die Variable ja mit setFlowData

Danke Dir

Ach eins habe ich noch vergessen zu fragen.

Kann ich in einer function Node auch einen Timer laufen lassen ?

Der Grund ist das ab und zu die Waschmaschine kurz unter den Schwellwert kommt, dann aber wieder ansteigt.
Ich bräuchte eine Möglichkeit zu schauen ob der Schwellwert meinetwegen 20 Sekunden unterschritten wurde.

oder soll ich das besser außerhalb der Function Node machen ?

Ich antworte mir mal selbst …

Ich habe das jetzt mal extern gemacht. Klappt auch ganz gut.
Ob das jetzt der Weisheit letzter Schluss ist sei dahin gestellt.

So sieht es jetzt bei mir aus:

Die beiden Function Nodes ohne Ausgang setzen abhängig von der Leistung je eine FlowData Variable.
Die Variablen werden dann in dem Function Node “Washing is finished” wieder auf false gesetzt.

Hi @Interceptor43,

solche Verzögerungen wie du die willst, sind mit externen Nodes (so wie du es jetzt gemacht hast) sinnvoller. Wenn es Situationen gibt wo du dir so nicht helfen kannst, verwende ich meistens einen Interval-Node und lasse mir z.B. einen Sekundentakt ausgeben den ich an einen Eingang vom Function Node verbinde und in der Function Node arbeite ich dann mit einem Counter in einer NodeData Variable. Das geht auch für sehr lange Perioden sehr gut, ohne dauerhaft einen Thread zu blockieren und man kann den aktuellen Stand noch schön ausgeben. Ich habe mir auch extra eine Funktion Node gebaut die aus 123 „2 Minuten und 3 Sekunden“ oder „2:03“ macht. Und aus 3672 „1 Stunde, 1 Minute und 12 Sekunden“ oder „1:01:12“. Das wiederum verwende ich in OpenHAB zur Darstellung.

Damit könntest du dein Problem auch lösen. Wenn Leistung unter 2W Counter-1, Wenn Leistung über 2W Counter auf 20 setzen. Wenn Counter 0 ist die WM fertig.

Gruß Andreas

2 Likes

Magst du den Knoten mit uns teilen? :slight_smile:

Ich räume den noch die Tage bisschen auf und Teile ihn dann.

2 Likes

So, wie versprochen, hier der besagte “Sekunden zu String”-Node:

[{"id":"1f80b30e.972aad","type":"function","namespace":"function","z":"cb80c51c.99d7b8","name":"","func":"// String Constants\n$strHour = \" Stunde\";\n$strHours = \" Stunden\";\n$strMinute = \" Minute\";\n$strMinutes = \" Minuten\";\n$strSecond = \" Sekunde\";\n$strSeconds = \" Sekunden\";\n$strElapsed = \"abgelaufen\";\n$strAnd = \", \";\n$strLastAnd = \" und \";\n$strSeperator = \":\";\n\n// Variables\n$outputString1 = \"\";\n$outputString2 = \"\";\n$hours = 0;\n$minutes = 0;\n$seconds = 0;\n\n// Select Input-Format\n//input = seconds\n//$seconds = $message['payload'];\n//input = milliseconds\n$seconds = $message['payload'] / 1000;\n\n// Calculation\nif ($seconds >= 3600)\n{\n    $hours = floor($seconds/3600);\n    $seconds = $seconds - $hours*3600;\n}\nelse\n{\n    $hours = 0;\n}\n\nif ($seconds >= 60)\n{\n    $minutes = floor($seconds/60);\n    $seconds = $seconds - $minutes*60;\n}\nelse\n{\n    $minutes = 0;\n}\n\n// Building String 1\nif($hours>0)\n{\n    $outputString1 = $outputString1.$hours;\n    if($hours==1)\n    {\n        $outputString1 = $outputString1.$strHour;\n    }\n    else\n    {\n        $outputString1 = $outputString1.$strHours;\n    }\n}\n\nif($minutes>0)\n{\n    if($hours>0)\n    {\n        if($seconds>0)\n        {\n            $outputString1 = $outputString1.$strAnd;\n        }\n        else\n        {\n            $outputString1 = $outputString1.$strLastAnd;\n        }\n    }\n    $outputString1 = $outputString1.$minutes;\n    if($minutes==1)\n    {\n        $outputString1  = $outputString1.$strMinute;\n    }\n    else\n    {\n        $outputString1  = $outputString1.$strMinutes;\n    }\n}\nif($seconds>0)\n{\n    if($hours>0 || $minutes>0)\n    {\n        $outputString1 = $outputString1.$strLastAnd;\n    }\n    $outputString1 = $outputString1.$seconds;\n    if($seconds==1)\n    {\n        $outputString1  = $outputString1.$strSecond;\n    }\n    else\n    {\n        $outputString1  = $outputString1.$strSeconds;\n    }\n}\n\nif ($hours==0 && $minutes==0 && $seconds==0)\n{\n    $outputString1  = $strElapsed;\n}\n    \n\n// Building String 2\nif($hours>0)\n{\n    $outputString2 = $outputString2.$hours.$strSeperator;\n}\nif($minutes>0 || $hours>0)\n{\n    if($minutes<10 && $hours>0)\n    {\n        $outputString2 = $outputString2.\"0\";\n    }\n    $outputString2 = $outputString2.$minutes.$strSeperator;\n}\nif($seconds<10 && ($hours>0 || $minutes>0))\n    {\n        $outputString2 = $outputString2.\"0\";\n    }\n$outputString2 = $outputString2.$seconds;\n\n//Output\n$message['payload'] = $outputString1;\noutput(0,$message);\n$message['payload'] = $outputString2;\noutput(1,$message);","inputs":1,"outputs":2,"noerr":0,"x":880,"y":270,"wires":[[{"id":"5818e2a5.7e703c","port":0}],[{"id":"5818e2a5.7e703c","port":0}]]}]

Der Node hat 2 Ausgänge.

Der 1. gibt einen String im Klartext aus, wobei überflüssige Einheiten ausgelassen werden und ein natürlicher Aufbau eingehalten wird.
Z.B.:
1 Stunde, 15 Minuten und 3 Sekunden,
2 Stunden und 1 Sekunde,
3 Minuten und 1 Sekunde oder
bei 0 Sekunden abgelaufen.
Alle Wörter und Zeichen sind als Konstanten am Anfang des Quelltext hinterlegt, somit ist mit wenigen Änderungen auch die Anpassung an andere Sprachen möglich.

Der 2. Ausgang gibt einen String im Format Stunde:Minute:Sekunde aus, wobei auch hier überflüssige Einheiten ausgelassen werden:
72 Sekunden geben also 1:12 und nicht 0:01:12.
Auch der Separator : ist am Anfang des Quelltextes definiert und kann geändert werden.

Falls Ihr Ideen, Fragen oder Anregungen habt, lasst es mich einfach wissen.

Gruß Andreas

2 Likes