NEWS
Debug Messages
-
Hallo,
wie kann man in einem Flow die Ausgangswerte aller Nodes nach einer Aktion ansehen?
Ich sehe immer nur den Wert am Debug-Node.
-
Kannst du näher erklären (vlt. ein Beispiel-flow) was du sehen willst?
Eigentlich ist der debug-node dafür zuständig.
In einem function-node gibt es weitere Möglichkeiten, wie node.status, node.log, node.warn, node.error
-
Ich hänge mich mit meiner Frage mal mit in diesen Thread. Die Überschrift jedenfalls passt schon mal.
Wie kann ich mir die Werteänderung in einer Schleife ausgeben lassen.
Im Moment erstelle ich auf dieser Plattform https://js.do/ meine Programme. Vorteil, ich kann mir am Bildschirm sofort das Ergebnis ansehen und über die docment.write () Methode die Zwischenwerte anzeigen lassen.
Jetzt frage ich mich schon seit Tagen, wie man so etwas in Node Red und dem Debug Node hinbekommt.Alle Eigenversuche sind kläglich gescheitert. Eine Möglichkeit beschreibt Steve in einem seiner unzählgen Tutorials (http://www.steves-internet-guide.com/no … functions/).
Beispiel-Flow:
! ````
[{"id":"3d5127fd.3db03","type":"function","z":"2b7b8fd1.2a4c68","name":"","func":"var m_out=[]; //rray for message objects\nvar message=0;\nfor (i=0;i<5;i++){\n message=message+i; //add count to message\n var newmsg={payload:message, i}\n m_out.push(newmsg);\n}\nreturn[m_out];\n","outputs":1,"noerr":0,"x":360,"y":1000,"wires":[["dab0af1f.5344c8"]]},{"id":"59f7ba79.67264c","type":"inject","z":"2b7b8fd1.2a4c68","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":1000,"wires":[["3d5127fd.3db03"]]},{"id":"dab0af1f.5344c8","type":"debug","z":"2b7b8fd1.2a4c68","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":510,"y":1000,"wires":[]}]Die Möglichkeit funktioniert zwar, ist aber in der Handhabung nicht gerade eine schlanke Lösung. Und was es mit dem node.send () so auf sich hat erschließt sich mir auch nicht so wirklich. Was sendet diese Möglichkeit wann wohin. Das User Guide von nodered.org [https://nodered.org/docs/writing-functions](https://nodered.org/docs/writing-functions) ist ja nicht schlecht, nur manchmal wäre so ein kleines Beispiel schon sehr hilfreich. Ich hoffe ihr (insbesondere rewenode) versteht mein Anliegen und habt eine Lösung für mich. :mrgreen:
-
Ich hoffe, ich hab dich richtig verstanden.
Also, beim Debugging muss man unterscheiden, zwischen:
1. dem einfachen Ausgeben der Message(s) zwischen nodes
Variante 1:
An der gewünschten Stelle einen Debug-Node hängen:
Vorteil:Man kann den debug-nodes eigene Namen geben und/oder neuerdings den node-status aktivieren und erhöht so die Übersichtlichkeit im Debug-Panel
Nachteil:
Man benötigt pro debug-msg einen debug-node. Da kann der flow schnell absaufen.
Variante 2:
Man macht sich die Tatsache zu Nutze, dann innerhalb eines Flows NIEMALS Messages GLEICHZEITIG eintreffen können.
Daraus folgt, das man eigentlich nur einen debug-node braucht, an den man alle zu debuggenden Ausgänge pappen kann.
Vorteil:
Man braucht nur einen debug-node.
Nachteil:
Man kann im Debug-Panel nicht mehr ohne Weiteres sehen, wo der debug-wert herkommt.
2. dem Debugger innerhalb eines Function-nodes (das meinst du wohl)
Dein mitgeliefertes Beispiel ist dazu eher nicht geeignet, weil es darin eher darum geht, wie man aus einem Functions-node mehrere MSG's nacheinander über EINEN Ausgang senden kann.
Zum Debuggen sind eher node.send, node.log, node.warn, node.error interessant.
node.send
Eigentlich nicht unbedingt fürs debugging gedacht, läßt es sich aber gut dafür nutzen.
Damit kann innerhalb eines function-nodes an jeder Stelle eine Nachricht an den Ausgang gesendet werden.
Aber Achtung! Das ist dann eine ganz normale Nachricht. Man muss daran denken, wie evtl. nachfolgende Nodes darauf reagieren.
Wenn ich sowas einsetze, pack ich die auszugebende debug-Nachricht in ein eigenes debug-property.
node.log
Die eigentlich vorgesehene Logging-Möglichkeit. Allerdings muss hier das Logging-Ziel in der settings.js konfiguriert werden.
siehe https://nodered.org/docs/user-guide/logging
node.warn / node.error
Damit kann man aus einem Functions-node eine AUSGABE direkt ans debug-panel schicken OHNE das eine normale Message am Ausgang erzeugt wird.
Das ist eigentlich ideal um mal eben eine debugg-ausgabe zu erzeugen.
Na und dann besteht natürlich die Supermöglichkeit, mit node.status eine Ausgabe direkt unter das Function-node zu erstellen. Für Loops allerdings nicht besonders geeignet.
Apropos Loop
Loops im Function-Node können sehr gefährlich sein. Das Function-node läuft in einer Sandbox als ein Tread. Will sagen, solange dein Loop läuft steht der restliche Flow.
Da ist es häufig sinnvoller, den Loop mit mehreren nodes aufzubauen. Da gibt es mehrere Verfahren. Aber das ist ein anderes Thema
Beispielflow der verschiedenen Degug-Varianten im function-loop:
! ````
[
{
"id": "ef40cde8.11b9c8",
"type": "function",
"z": "17cf8153.2cd2b7",
"name": "output debug messages for loop",
"func": "let p = 0;\nfor (i=0;i<5;i++){\n p += 1; //only increment payload\n \n // method 1\n // simple but effective for debugging\n node.send({payload: {"actual": p,\n " i": i}});\n \n // method 2\n // standard logging\n // must be configure in settings.js\n node.log("log - actual: "+p+ " i: "+ i);\n\n // method 3 normally reserved for warnings\n // outpot in debug panel\n node.warn("warn - actual: "+p+ " i: "+ i);\n\n // method 4\n // normally reserved for errors\n node.error("error - actual: "+p+ " i: "+ i);\n\n \n}\n\nmsg.payload = p;\nreturn msg;\n",
"outputs": 1,
"noerr": 0,
"x": 580,
"y": 480,
"wires": [
[
"529c808c.0440c"
]
]
},
{
"id": "b8cd2edd.b104b",
"type": "inject",
"z": "17cf8153.2cd2b7",
"name": "Input_payload = 0",
"topic": "",
"payload": "0",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 300,
"y": 480,
"wires": [
[
"ef40cde8.11b9c8"
]
]
},
{
"id": "529c808c.0440c",
"type": "debug",
"z": "17cf8153.2cd2b7",
"name": "debug(i) and output = 5",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": true,
"complete": "payload",
"x": 890,
"y": 480,
"wires": []
}
] -
Was soll ich sagen, Du hast alles richtig verstanden und den Nagel im Zentrum auf den Kopf getroffen. :lol:
Wieder etwas zum besseren Verständnis im Umgang mit Node Red dazu gelernt. Genau solche Beispiele brauche ich zum Lernen. Im Netz und auch auf Youtube konnte ich dazu nicht wirklich etwas finden. In die richtige Richtung habe ich schon geschielt und mit meiner Einschätzung dass es doch auch einfacher gehen muss lag ich ja nicht ganz verkehrt.
Das Loggen brauche ich als Hobbyprogrammierer nur zur Fehlersuche und zum Testen.
Ohne deine Hilfe hätte ich sicher noch lange im Netz gesucht.
Vielen Dank dafür.
-
Nicht dafür
-
Nicht dafür `
Sehe ich aber ganz anders.Heute schon in Anwendung gebracht. Funktioniert 1A. Damit hast Du mir eine große Freude gemacht. Für mich ist heute schon Weihnachten.
Nochmals vielen Dank und schon einmal schöne Weihnachtstage.
Gruß Garf
-
Ach und was ich inzwischen weis, mit VSCode kann man sogar den Code innerhalb von function-nodes direkt debuggen. Mit Breakpoints und allem drum und dran.
Ich nutz das, für mein erstes (im Entstehen begriffenes) eigenes Node. Das teste ich quasi erstmal als Code im function-node. Und da ist ein echter Debugger schon klasse.
Das klappt auch dann, wenn node-red als Docker-Container ausgeführt wird.
VSCode entwickelt sich immer mehr zum Schweizer Taschenmesser für alle möglichen Sprachen.
-
Ich nutz das, für mein erstes (im Entstehen begriffenes) eigenes Node. Das teste ich quasi erstmal als Code im function-node. Und da ist ein echter Debugger schon klasse. ` Da machst Du mich schon wieder neugierig. Halt uns bitte da mal auf dem Laufenden.