Funktions-Knoten: Debuggen und Woher weiß ich, dass er Informationen von allen Nodes bekommen hat?

Node-RED als CCU3/RaspberryMatic Addon, WebApp, HomeKit, ...

Moderator: Co-Administratoren

Antworten
mickbrisgau
Beiträge: 74
Registriert: 17.10.2018, 07:14

Funktions-Knoten: Debuggen und Woher weiß ich, dass er Informationen von allen Nodes bekommen hat?

Beitrag von mickbrisgau » 18.05.2019, 11:43

Ich bin ja gerade dabei die gefühlte Temperatur zu programmieren.

Dazu hätte ich ein paar Fragen (vielleicht kann mir dabei ja jemand helfen):
  • Kann man den Funktions-Knoten debuggen? Wenn ja, wie?
  • Mein Funktions-Knoten braucht Informationen von mehreren anderen (CCU-)Knoten.
    Bekommt er immer alle, wenn er sie anfordert oder nur, wenn die sie ihm schicken?
CCU3 mit Raspberrymatic. Addons: Redmatic mit HomeKit Plugin und Alex Skill

Hypnos
Beiträge: 276
Registriert: 06.01.2018, 12:48
Hat sich bedankt: 19 Mal
Danksagung erhalten: 3 Mal

Re: Funktions-Knoten: Debuggen und Woher weiß ich, dass er Informationen von allen Nodes bekommen hat?

Beitrag von Hypnos » 18.05.2019, 12:06

Hallo,

Du kannst im Funktions Knoten Debug Meldungen ausgeben, Warnungen und Fehler werden auch in der Sidebar ausgegeben., sonstige Logausgaben im Log. Alternativ kannst du auch einen 2. Ausgang für Debug Meldungen nehmen.

Das Script im Funktionsknoten läuft los wenn eine Nachricht reingeht. Es kann dann auch selber wieder Funktionen haben die zeitgesteuert (Interval, timeout) laufen.

Im Funktionsknoten hat man die Daten der Eingangsnachricht(en) und in Contexte gespeicherte.

Um zu sehen ob man alle Daten hat muss man die prüfen.

Den Homematic CCU Konfigurations Knoten kann man einstellen das er Daten der HomeMatic Kanäle, Variablen,... In einem globalen Context persistiert. Dann kann man da auch vom Funktionsknoten aus zugreifen ohne dass man da alles reinschicken muss.

Meiner Meinung nach ist es aber einfacher alles reinzuschicken.

Steht ausführlich hier
https://nodered.org/docs/writing-functions

mickbrisgau
Beiträge: 74
Registriert: 17.10.2018, 07:14

Re: Funktions-Knoten: Debuggen und Woher weiß ich, dass er Informationen von allen Nodes bekommen hat?

Beitrag von mickbrisgau » 18.05.2019, 14:45

Danke für die Info.

Das https://nodered.org/docs/writing-functions habe ich schon mehrfach gelesen. Ohne das hätte ich mein Gefühlte Temperatur nicht schreiben können. :D

Hast Du mal ein Code-Beispiel für loggen im Debug-Fenster?
Um zu sehen ob man alle Daten hat muss man die prüfen.
Auch dafür würde mir ein Code-Beispiel helfen?
CCU3 mit Raspberrymatic. Addons: Redmatic mit HomeKit Plugin und Alex Skill

Hypnos
Beiträge: 276
Registriert: 06.01.2018, 12:48
Hat sich bedankt: 19 Mal
Danksagung erhalten: 3 Mal

Re: Funktions-Knoten: Debuggen und Woher weiß ich, dass er Informationen von allen Nodes bekommen hat?

Beitrag von Hypnos » 18.05.2019, 23:03

mickbrisgau hat geschrieben:
18.05.2019, 14:45
Hast Du mal ein Code-Beispiel für loggen im Debug-Fenster?
Um zu sehen ob man alle Daten hat muss man die prüfen.
Auch dafür würde mir ein Code-Beispiel helfen?
Zum Debuggen, nutze ich gerne:

Code: Alles auswählen

node.warn("text hier");
unter https://nodered.org/docs/writing-functions steht:

Code: Alles auswählen

node.log("Something happened");
node.warn("Something happened you should know about");
node.error("Oh no, something bad happened");
The warn and error messages also get sent to the flow editor debug tab.
Ich würde an deiner Stelle das einfach in deinem code wie folgt erweitern:

Code: Alles auswählen

...
var wind   = context.get('wind')||null;
var temp   = context.get('temp')||null;
var feucht = context.get('feucht')||null;

if (wind === null || temp === null || feucht === null) {
	return null;
}


msg.topic = "0/CurrentTemperature"

if (temp !== null) {
...
Damit passiert hier nichts, wenn nicht alle 3 Werte vorhanden sind.

hobbyquaker
Beiträge: 3388
Registriert: 12.07.2009, 20:01
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Funktions-Knoten: Debuggen und Woher weiß ich, dass er Informationen von allen Nodes bekommen hat?

Beitrag von hobbyquaker » 18.05.2019, 23:13

var wind = context.get('wind')||null;
var temp = context.get('temp')||null;
var feucht = context.get('feucht')||null;
Vorsicht - Fallstrick: Das würde bei einer Temperatur von 0°C oder bei 0km/h Wind zu false udn damit zu null evaluieren und dann bricht der Flow ab ;-)

Besser:

Code: Alles auswählen

const wind   = context.get('wind');
const temp   = context.get('temp');
const feucht = context.get('feucht');

if (typeof wind === 'undefined' || typeof temp ===  'undefined' || typeof feucht ===  'undefined') {
	return null;
}

mickbrisgau
Beiträge: 74
Registriert: 17.10.2018, 07:14

Re: Funktions-Knoten: Debuggen und Woher weiß ich, dass er Informationen von allen Nodes bekommen hat?

Beitrag von mickbrisgau » 19.05.2019, 14:29

Vielen Dank an euch!

Werde meinen Code ändern und dann testen.
CCU3 mit Raspberrymatic. Addons: Redmatic mit HomeKit Plugin und Alex Skill

mickbrisgau
Beiträge: 74
Registriert: 17.10.2018, 07:14

Re: Funktions-Knoten: Debuggen und Woher weiß ich, dass er Informationen von allen Nodes bekommen hat?

Beitrag von mickbrisgau » 20.05.2019, 08:52

@hobbyquaker
Habe den Code jetzt geändert.

Allerdings nicht mit const. Den das sind ja Konstanten die einmal festgelegt und erst beim Neustart von RedMatic wieder verändert werden.

Der neue Code ist hier

Nochmals vielen Dank an euch für die Hilfe.
CCU3 mit Raspberrymatic. Addons: Redmatic mit HomeKit Plugin und Alex Skill

hobbyquaker
Beiträge: 3388
Registriert: 12.07.2009, 20:01
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Funktions-Knoten: Debuggen und Woher weiß ich, dass er Informationen von allen Nodes bekommen hat?

Beitrag von hobbyquaker » 20.05.2019, 17:17

mickbrisgau hat geschrieben:
20.05.2019, 08:52
Allerdings nicht mit const. Den das sind ja Konstanten die einmal festgelegt und erst beim Neustart von RedMatic wieder verändert werden.
Nein, der Lebenszyklus der const Deklaration endet sobald der Function Node verlassen wird, also mit einem impliziten oder expliziten return. Auf jeden Fall solltest Du kein var verwenden (das ist eine "Altlast" und führt wegen seines function Scopes und dem Hoisting u.U. zu Verwirrung und wird von so gut wie jedem gängigen Styleguide mittlerweile untersagt) - nutze besser entweder const oder let.

mickbrisgau
Beiträge: 74
Registriert: 17.10.2018, 07:14

Re: Funktions-Knoten: Debuggen und Woher weiß ich, dass er Informationen von allen Nodes bekommen hat?

Beitrag von mickbrisgau » 22.05.2019, 14:46

hobbyquaker hat geschrieben:
20.05.2019, 17:17
mickbrisgau hat geschrieben:
20.05.2019, 08:52
Allerdings nicht mit const. Den das sind ja Konstanten die einmal festgelegt und erst beim Neustart von RedMatic wieder verändert werden.
Nein, der Lebenszyklus der const Deklaration endet sobald der Function Node verlassen wird, also mit einem impliziten oder expliziten return. Auf jeden Fall solltest Du kein var verwenden (das ist eine "Altlast" und führt wegen seines function Scopes und dem Hoisting u.U. zu Verwirrung und wird von so gut wie jedem gängigen Styleguide mittlerweile untersagt) - nutze besser entweder const oder let.
Ich habe es mit const getestet. Das funktioniert dann nicht. Die Werte ändern sich nicht! Erst nach dem Neustart von RedMatic.

Ich werde mal let testen und Bescheid geben
CCU3 mit Raspberrymatic. Addons: Redmatic mit HomeKit Plugin und Alex Skill

hobbyquaker
Beiträge: 3388
Registriert: 12.07.2009, 20:01
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Funktions-Knoten: Debuggen und Woher weiß ich, dass er Informationen von allen Nodes bekommen hat?

Beitrag von hobbyquaker » 22.05.2019, 20:07

mickbrisgau hat geschrieben:
22.05.2019, 14:46
Ich habe es mit const getestet. Das funktioniert dann nicht. Die Werte ändern sich nicht! Erst nach dem Neustart von RedMatic.
Ich bin 100% und ohne jeden Zweifel sicher dass da dann was anderes nicht gestimmt hat. Const hat (wie let) Block Scope. Der Block ist in dem Fall der Function Node selbst. Sobald das Script im Function Node endet oder auf ein return Statement stößt ist der Lebenszyklus der Const Deklaration vorbei. Hier ein einfacher Testflow um es zu verdeutlichen, Wenn Du da den Inject Node anklickst siehst wie die mit const deklarierte Variable "test" bei jedem Klick einen neuen Wert annimmt:

Code: Alles auswählen

[{"id":"14c8cb21.d65275","type":"inject","z":"4d8a8ce0.8c4334","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":280,"y":240,"wires":[["81884fb2.12c18"]]},{"id":"81884fb2.12c18","type":"function","z":"4d8a8ce0.8c4334","name":"","func":"const test = msg.payload\nreturn {payload: test};","outputs":1,"noerr":0,"x":460,"y":240,"wires":[["52e9e987.153ee8"]]},{"id":"52e9e987.153ee8","type":"debug","z":"4d8a8ce0.8c4334","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":640,"y":240,"wires":[]}]

Antworten

Zurück zu „RedMatic“