Nous allons gérer une consigne de température qui sera mémorisé globalement au niveau de node-red. Cela signifie que cette valeur sera disponible dans tous les FLOW. Les autres choix sont de conserver une variable dite de contexte au niveau du FLOW courant ou bien au niveau du NODE.
Cette consigne sera ensuite mise à profit pour décider d'une action en fonction de la comparaison entre une valeur mesurée et la valeur dite de consigne.
Ensuite, il vous appartiendra de vous entraîner en réalisant une conversion de température paramétrable.
On peut remplacer les noeuds switch et change par une fonction :
1
// La consigne affectée à global.consigne dans le NODE Set peut-être lue en js par global.get('consigne')
2
if (msg.payload>global.get('consigne') {
3
msg.payload="SUP A 20";
4
} else {
5
msg.payload="";
6
}
7
returnmsg;
// La consigne affectée à global.consigne dans le NODE Set peut-être lue en js par global.get('consigne')
if (msg.payload > global.get('consigne') {
msg.payload = "SUP A 20";
} else {
msg.payload = "";
}
return msg;
1
[{"id":"4e970ac7f7ca5aa3","type":"inject","z":"6d04155ec6875301","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"CONV_C_TO_F","payloadType":"str","x":160,"y":420,"wires":[["ece27207c956d81a"]]},{"id":"ece27207c956d81a","type":"change","z":"6d04155ec6875301","name":"Affecter payload à 10","rules":[{"t":"set","p":"payload","pt":"msg","to":"10","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":420,"wires":[["52018e40a57f8975"]]},{"id":"52018e40a57f8975","type":"function","z":"6d04155ec6875301","name":"Conversion °C en °F","func":"var F = msg.payload ;\nvar C = F*1.8 + 32;\nmsg.payload = F + \"°C = \"+C.toString()+ \"°F\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":580,"y":420,"wires":[["faaa747676b35c1f","8fd16fd4d835a00f","d8c58323c9857eeb"]]},{"id":"faaa747676b35c1f","type":"rpi-sensehat out","z":"6d04155ec6875301","name":"","x":790,"y":460,"wires":[]},{"id":"8fd16fd4d835a00f","type":"ui_text","z":"6d04155ec6875301","group":"181382cbbcf32e5c","order":3,"width":0,"height":0,"name":"","label":"Conversion T°","format":"{{msg.payload}}","layout":"row-spread","className":"","x":800,"y":420,"wires":[]},{"id":"d8c58323c9857eeb","type":"debug","z":"6d04155ec6875301","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":790,"y":380,"wires":[]},{"id":"9cd2bb2bc96d94c1","type":"comment","z":"6d04155ec6875301","name":"0003","info":"","x":90,"y":380,"wires":[]},{"id":"181382cbbcf32e5c","type":"ui_group","name":"Act","tab":"9405bf6d154d5c2c","order":1,"disp":true,"width":"6","collapse":false,"className":""},{"id":"9405bf6d154d5c2c","type":"ui_tab","name":"Test","icon":"dashboard","disabled":false,"hidden":false}]
[{"id":"4e970ac7f7ca5aa3","type":"inject","z":"6d04155ec6875301","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"CONV_C_TO_F","payloadType":"str","x":160,"y":420,"wires":[["ece27207c956d81a"]]},{"id":"ece27207c956d81a","type":"change","z":"6d04155ec6875301","name":"Affecter payload à 10","rules":[{"t":"set","p":"payload","pt":"msg","to":"10","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":420,"wires":[["52018e40a57f8975"]]},{"id":"52018e40a57f8975","type":"function","z":"6d04155ec6875301","name":"Conversion °C en °F","func":"var F = msg.payload ;\nvar C = F*1.8 + 32;\nmsg.payload = F + \"°C = \"+C.toString()+ \"°F\";\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":580,"y":420,"wires":[["faaa747676b35c1f","8fd16fd4d835a00f","d8c58323c9857eeb"]]},{"id":"faaa747676b35c1f","type":"rpi-sensehat out","z":"6d04155ec6875301","name":"","x":790,"y":460,"wires":[]},{"id":"8fd16fd4d835a00f","type":"ui_text","z":"6d04155ec6875301","group":"181382cbbcf32e5c","order":3,"width":0,"height":0,"name":"","label":"Conversion T°","format":"{{msg.payload}}","layout":"row-spread","className":"","x":800,"y":420,"wires":[]},{"id":"d8c58323c9857eeb","type":"debug","z":"6d04155ec6875301","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":790,"y":380,"wires":[]},{"id":"9cd2bb2bc96d94c1","type":"comment","z":"6d04155ec6875301","name":"0003","info":"","x":90,"y":380,"wires":[]},{"id":"181382cbbcf32e5c","type":"ui_group","name":"Act","tab":"9405bf6d154d5c2c","order":1,"disp":true,"width":"6","collapse":false,"className":""},{"id":"9405bf6d154d5c2c","type":"ui_tab","name":"Test","icon":"dashboard","disabled":false,"hidden":false}]
Afin d'éviter de décrire la construction de ce flux en y ajoutant chaque noeud, nous allons l'importer à partir de la traduction textuelle que vous trouverez ci-dessous :
A l'aide du menu Import.Clipboard, collez le texte du code ci-dessus dans la fenêtre d'import, une fois validé l'import, le texte collé est traduit en flux graphique importé à l'écran.
Cette façon de faire permet aussi de sauvegarder des flux afin de les réutiliser.
Une fois les nouvelles modifications déployées, il faut afficher l'interface utilisateur avec l'URL (IP :1880/ui).
On obtient le résultat ci-contre (ici, la valeur de 20 qui été fixée dans le noeud INJECT est envoyée à l'interface utilisateur en utilisant un noeud dashboard.text) : vous remarquerez que l'onglet et le groupe sont ajoutés directement dans le dashboard.
Attention :
Lorsque l'on importe/exporte des flux, on gère aussi l'interface utilisateur. Il est possible d'exporter plusieurs NODES avec une sélection souris de la zone à importer, un FLUX complet, ou bien l'ensemble des FLUX.
Pour vous, il sera important de sauvegarder votre travail.
Nous allons ajouter à l'UI un noeud entrée numérique (dashboard.numeric) avec le label test et des valeurs comprises entre 0 et 50
Quand cette valeur sera supérieure à 20, nous allons simplement générer un message "SUP A 20" que nous allons simplement afficher dans la zone DEBUG (ou dans un champ texte)
Ajouter un champ numérique (nommé test.
Ajouter un noeud
Ajouter un noeud
Ajouter un champ avec Résultat comme label et un noeud debug.
Exemple :
Après avoir déployé votre code, la valeur test est normalement égale à 0. Lorsque qu'elle dépasse 20, on a à la fois un message debug et le résultat SUP A 20 s'affiche.
QUE SE PASSE T-IL QUAND test repasse en dessous de 20 puis repasse au dessus de 20 ?
Il faut ajouter une condition au NODE avec. Saisir la condition >=20, validez.
Une deuxième sortie est disponible pour ajouter un nouveau NODE qui va affecter une chaîne vide à msg.payload. A la sortie, on branche le champ Résultat.
Il est bien sûr possible de rédiger une fonction en javascript :
1
// La consigne affectée à global.consigne dans le NODE Set peut-être lue en js par global.get('consigne')
2
if (msg.payload>global.get('consigne') {
3
msg.payload="SUP A 20";
4
} else {
5
msg.payload="";
6
}
7
returnmsg;
// La consigne affectée à global.consigne dans le NODE Set peut-être lue en js par global.get('consigne')
if (msg.payload > global.get('consigne') {
msg.payload = "SUP A 20";
} else {
msg.payload = "";
}
return msg;
Nous allons gérer une consigne de température qui sera mémorisé globalement au niveau de node-red. Cela signifie que cette valeur sera disponible dans tous les FLOW. Les autres choix sont de conserver une variable dite de contexte au niveau du FLOW courant ou bien au niveau du NODE.
Cette consigne sera ensuite mise à profit pour décider d'une action en fonction de la comparaison entre une valeur mesurée et la valeur dite de consigne.
Ensuite, il vous appartiendra de vous entraîner en réalisant une conversion de température paramétrable.
Ref : act-8-NR : Test (SI) avec Node-red)
On peut remplacer les noeuds
switch
etchange
par une fonction :// La consigne affectée à global.consigne dans le NODE Set peut-être lue en js par global.get('consigne')
} else {
Conseil :
Afin d'éviter de décrire la construction de ce flux en y ajoutant chaque noeud, nous allons l'importer à partir de la traduction textuelle que vous trouverez ci-dessous :
A l'aide du menu
Import.Clipboard
, collez le texte du code ci-dessus dans la fenêtre d'import, une fois validé l'import, le texte collé est traduit en flux graphique importé à l'écran.Cette façon de faire permet aussi de sauvegarder des flux afin de les réutiliser.
Une fois les nouvelles modifications déployées, il faut afficher l'interface utilisateur avec l'URL (IP :1880/ui).
On obtient le résultat ci-contre (ici, la valeur de 20 qui été fixée dans le noeud INJECT est envoyée à l'interface utilisateur en utilisant un noeud dashboard.text) : vous remarquerez que l'onglet et le groupe sont ajoutés directement dans le dashboard.
Attention :
Lorsque l'on importe/exporte des flux, on gère aussi l'interface utilisateur. Il est possible d'exporter plusieurs NODES avec une sélection souris de la zone à importer, un FLUX complet, ou bien l'ensemble des FLUX.
Pour vous, il sera important de sauvegarder votre travail.
Le flux ci-dessus permet de réaliser les 3 étapes ci-dessous
Injecter une valeur numérique de 20 (une température par exemple) au démarrage de l'application --> msg.payload = 20
Conserver cette valeur de 20 comme variable globale --> global.consigne = msg.payload
Afficher la valeur via l'UI. --> présence du champ consigne.
Réglementaire :
Nous allons ajouter à l'UI un noeud entrée numérique (dashboard.numeric) avec le label test et des valeurs comprises entre 0 et 50
Quand cette valeur sera supérieure à 20, nous allons simplement générer un message "SUP A 20" que nous allons simplement afficher dans la zone DEBUG (ou dans un champ texte)
Ajouter un champ numérique (nommé test.
Ajouter un noeud
Ajouter un noeud
Ajouter un champ avec Résultat comme label et un noeud debug.
Exemple :
Après avoir déployé votre code, la valeur test est normalement égale à 0. Lorsque qu'elle dépasse 20, on a à la fois un message debug et le résultat SUP A 20 s'affiche.
QUE SE PASSE T-IL QUAND test repasse en dessous de 20 puis repasse au dessus de 20 ?
Il faut ajouter une condition au NODE
avec
. Saisir la condition >=20, validez.
Une deuxième sortie est disponible pour ajouter un nouveau NODE
qui va affecter une chaîne vide à msg.payload. A la sortie, on branche le champ Résultat.
Truc & astuce : Avec une fonction⚓
Il est bien sûr possible de rédiger une fonction en javascript :
// La consigne affectée à global.consigne dans le NODE Set peut-être lue en js par global.get('consigne')
} else {