NodeRed, faire une addition avec 2 variables

Mon problème

Bonjour,
Voila, je suis nouveau sur Node Red et je souhaiterai additionner 2 valeurs numérique contenu dans 2 variables différentes.

Résultat = Var1 + Var2

Pour cela, j’utilise une fonction (je ne sais pas si c’est la bonne solution) mais le résultant n’est pas là.

msg.Total = Number(msg.efi_Inst) + Number(msg.efi_Prod);
return msg.Total;

Debug ‹ efi_inst › donne bien la valeur attendue, Debug 'efi_Prod également. Ce sont toutes les 2 des valeurs de type num…

Merci pour votre aide, Nicolas

Ma configuration


System Information

version core-2022.11.2
installation_type Home Assistant Container
dev false
hassio false
docker true
user root
virtualenv false
python_version 3.10.7
os_name Linux
os_version 5.10.0-19-amd64
arch x86_64
timezone Europe/Paris
config_dir /config
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Dashboards
dashboards 1
resources 0
views 1
mode storage
Recorder
oldest_recorder_run 10 novembre 2022 à 21:48
current_recorder_run 19 novembre 2022 à 23:26
estimated_db_size 1869.46 MiB
database_engine sqlite
database_version 3.38.5
___

Salut,

Je ne crois pas que la logique NR marche de cette façon.
(A confirmer si un plus expert que moi passe par là.)

Dans NR ce sont des flux qui commencent avec un trigger et qui ensuite se déroulent suivant les différents nœuds du flux.
Là ce que tu as, pour moi c’est 2 flux différents et indépendants, qui von a un moment ou un autre passer par le node fonction.
Donc comme tes flux son indépendants l’un de l’autre ils vont appeler une instance différente de la fonction…
Aussi le flux transmet entre chaque nœud la structure message avec toutes les variables utiles… efi_Prod & efi.Inst n’existent que dans leur flux respectif.

En gros, il faudra revoir la logique en gardant en mémoire le fonctionnement de NR.

Le principe de nodered, c’est de prendre un « truc » en entrée à gauche et d’avancer dans le flot en faisant différentes choses. Quand on est arrivé à la fin du flot, le contexte n’existe plus.
Dans ton cas, tu as deux entrées les « event » à gauche et en application de la ligne du dessus, à chaque event le flot va s’exécuter mais, la valeur de l’autre, celui qui n’a pas déclenché, sera inconnu. Donc, le problème ce n’est pas la fonction, c’est la « logique » du flot qui est à revoir.

En fait dans l’un ou l’autre cas de déclenchement, il faudrait aller chercher la valeur du sensor manquant, le mettre dans msg.xyz (efi_Inst ou efi_Prod) et là, tu pourras faire l’addition. C’est une façon de faire. Il y en a d’autres…

1 « J'aime »

Bonjour,
je partage l’analyse de @AlexHass mais ne suis pas expert !
Passes par des variables globales que tu déclares dans tes noeuds Résultat et tu pourras alors faire l’addition dans ta fonction3.

Si besoin d’exemple j’ai ça sous la main.

Bob

Merci Bob,
Je veux bien un exemple

Bof… :wink:
Les experts nodered sur discourse.nodered.org déconseillent l’utilisation des variables globales. Ce n’est pas l’« esprit » de nodered.

En plus, à la première exécution, l’autre variable sera inconnue et ça va rater.

Je pense que la « logique » nodered c’est après chaque noeud résultat, aller chercher l’autre valeur via le noeud « current state » et faire l’addition. Pas besoin de variable globale et ça marche toujours.

@golfvert est toujours de bon conseil sur Node Red, suis plutôt ses conseils mais je te donne tout de même une solution avec les variables globales, ici l’addition de deux températures.

Le flow à importer que je ne sais toujours pas mettre sur une ligne ! :

Bob

[{« id »:« 01a63541077d22de »,« type »:« function »,« z »:« 6cefb841c43b034d »,« name »:«  »,« func »:« msg.payload = msg.payload;\nvar temp1 = global.get(‹ val1 ›);\nvar temp2 = global.get(‹ val2 ›);\nvar addtemp = temp1 + temp2;\n\nmsg.payload = Number(addtemp);\nreturn msg; »,« outputs »:1,« noerr »:0,« initialize »:«  »,« finalize »:«  »,« libs »:[],« x »:900,« y »:160,« wires »:[[« 8cbcbaedda1c1c4e »]]},{« id »:« 8cbcbaedda1c1c4e »,« type »:« debug »,« z »:« 6cefb841c43b034d »,« name »:« debug 64 »,« active »:true,« tosidebar »:true,« console »:false,« tostatus »:false,« complete »:« false »,« statusVal »:«  »,« statusType »:« auto »,« x »:1140,« y »:160,« wires »:[]},{« id »:« d8cd1fc5b7e2669f »,« type »:« api-current-state »,« z »:« 6cefb841c43b034d »,« name »:«  »,« server »:« 443ff1c5.63d78 »,« version »:3,« outputs »:1,« halt_if »:«  »,« halt_if_type »:« str »,« halt_if_compare »:« is »,« entity_id »:« sensor.psalon_temperature »,« state_type »:« num »,« blockInputOverrides »:false,« outputProperties »:[{« property »:« payload »,« propertyType »:« msg »,« value »:«  »,« valueType »:« entityState »},{« property »:« data »,« propertyType »:« msg »,« value »:«  »,« valueType »:« entity »},{« property »:« t1 »,« propertyType »:« msg »,« value »:«  »,« valueType »:« entityState »}],« for »:« 0 »,« forType »:« num »,« forUnits »:« minutes »,« override_topic »:false,« state_location »:« payload »,« override_payload »:« msg »,« entity_location »:« data »,« override_data »:« msg »,« x »:380,« y »:140,« wires »:[[« 0cbfed6f285f7813 »]]},{« id »:« cfef959b2fcdecfd »,« type »:« api-current-state »,« z »:« 6cefb841c43b034d »,« name »:«  »,« server »:« 443ff1c5.63d78 »,« version »:3,« outputs »:1,« halt_if »:«  »,« halt_if_type »:« str »,« halt_if_compare »:« is »,« entity_id »:« sensor.psalon2_temperature »,« state_type »:« num »,« blockInputOverrides »:false,« outputProperties »:[{« property »:« payload »,« propertyType »:« msg »,« value »:«  »,« valueType »:« entityState »},{« property »:« data »,« propertyType »:« msg »,« value »:«  »,« valueType »:« entity »},{« property »:« t2 »,« propertyType »:« msg »,« value »:«  »,« valueType »:« entityState »}],« for »:« 0 »,« forType »:« num »,« forUnits »:« minutes »,« override_topic »:false,« state_location »:« payload »,« override_payload »:« msg »,« entity_location »:« data »,« override_data »:« msg »,« x »:390,« y »:200,« wires »:[[« 279a8fb74ccedeb2 »]]},{« id »:« 133ffd74ce0972ca »,« type »:« inject »,« z »:« 6cefb841c43b034d »,« name »:«  »,« props »:[{« p »:« payload »},{« p »:« topic »,« vt »:« str »}],« repeat »:«  »,« crontab »:«  »,« once »:false,« onceDelay »:0.1,« topic »:«  »,« payload »:«  »,« payloadType »:« date »,« x »:120,« y »:160,« wires »:[[« d8cd1fc5b7e2669f »,« cfef959b2fcdecfd »]]},{« id »:« 49f0a545787155f8 »,« type »:« debug »,« z »:« 6cefb841c43b034d »,« name »:« debug 65 »,« active »:true,« tosidebar »:true,« console »:false,« tostatus »:false,« complete »:« payload »,« targetType »:« msg »,« statusVal »:«  »,« statusType »:« auto »,« x »:1000,« y »:60,« wires »:[]},{« id »:« 8ffe6335a0b09820 »,« type »:« debug »,« z »:« 6cefb841c43b034d »,« name »:« debug 66 »,« active »:true,« tosidebar »:true,« console »:false,« tostatus »:false,« complete »:« payload »,« targetType »:« msg »,« statusVal »:«  »,« statusType »:« auto »,« x »:1000,« y »:240,« wires »:[]},{« id »:« 0cbfed6f285f7813 »,« type »:« function »,« z »:« 6cefb841c43b034d »,« name »:« function 1 »,« func »:« msg.payload = msg.payload;\nglobal.set(‹ val1 ›, msg.payload);\nreturn msg; »,« outputs »:1,« noerr »:0,« initialize »:«  »,« finalize »:«  »,« libs »:[],« x »:700,« y »:140,« wires »:[[« 01a63541077d22de »,« 49f0a545787155f8 »]]},{« id »:« 279a8fb74ccedeb2 »,« type »:« function »,« z »:« 6cefb841c43b034d »,« name »:« function 2 »,« func »:« msg.payload = msg.payload;\nglobal.set(‹ val2 ›, msg.payload);\nreturn msg; »,« outputs »:1,« noerr »:0,« initialize »:«  »,« finalize »:«  »,« libs »:[],« x »:700,« y »:200,« wires »:[[« 01a63541077d22de »,« 8ffe6335a0b09820 »]]},{« id »:« 443ff1c5.63d78 »,« type »:« server »,« name »:« Home Assistant »,« version »:5,« addon »:true,« rejectUnauthorizedCerts »:true,« ha_boolean »:« y|yes|true|on|home|open »,« connectionDelay »:true,« cacheJson »:true,« heartbeat »:false,« heartbeatInterval »:30,« areaSelector »:« friendlyName »,« deviceSelector »:« friendlyName »,« entitySelector »:« friendlyName »,« statusSeparator »:"at: ",« statusYear »:« hidden »,« statusMonth »:« short »,« statusDay »:« numeric »,« statusHourCycle »:« h23 »,« statusTimeFormat »:« h:m »,« enableGlobalContextStore »:true}]

Comment faire pour importer le flow?

https://nodered.org/docs/user-guide/editor/workspace/import-export

J’avais bien la bonne méthode, mais il semble que json n’aime as les doubles chevrons

Le même entre balises code…


[{" id ":" 01a63541077d22de "," type ":" function "," z ":" 6cefb841c43b034d "," name ":"  "," func ":" msg.payload = msg.payload;\nvar temp1 = global.get(‹ val1 ›);\nvar temp2 = global.get(‹ val2 ›);\nvar addtemp = temp1 + temp2;\n\nmsg.payload = Number(addtemp);\nreturn msg; "," outputs ":1," noerr ":0," initialize ":"  "," finalize ":"  "," libs ":[]," x ":900," y ":160," wires ":[[" 8cbcbaedda1c1c4e "]]},{" id ":" 8cbcbaedda1c1c4e "," type ":" debug "," z ":" 6cefb841c43b034d "," name ":" debug 64 "," active ":true," tosidebar ":true," console ":false," tostatus ":false," complete ":" false "," statusVal ":"  "," statusType ":" auto "," x ":1140," y ":160," wires ":[]},{" id ":" d8cd1fc5b7e2669f "," type ":" api-current-state "," z ":" 6cefb841c43b034d "," name ":"  "," server ":" 443ff1c5.63d78 "," version ":3," outputs ":1," halt_if ":"  "," halt_if_type ":" str "," halt_if_compare ":" is "," entity_id ":" sensor.psalon_temperature "," state_type ":" num "," blockInputOverrides ":false," outputProperties ":[{" property ":" payload "," propertyType ":" msg "," value ":"  "," valueType ":" entityState "},{" property ":" data "," propertyType ":" msg "," value ":"  "," valueType ":" entity "},{" property ":" t1 "," propertyType ":" msg "," value ":"  "," valueType ":" entityState "}]," for ":" 0 "," forType ":" num "," forUnits ":" minutes "," override_topic ":false," state_location ":" payload "," override_payload ":" msg "," entity_location ":" data "," override_data ":" msg "," x ":380," y ":140," wires ":[[" 0cbfed6f285f7813 "]]},{" id ":" cfef959b2fcdecfd "," type ":" api-current-state "," z ":" 6cefb841c43b034d "," name ":"  "," server ":" 443ff1c5.63d78 "," version ":3," outputs ":1," halt_if ":"  "," halt_if_type ":" str "," halt_if_compare ":" is "," entity_id ":" sensor.psalon2_temperature "," state_type ":" num "," blockInputOverrides ":false," outputProperties ":[{" property ":" payload "," propertyType ":" msg "," value ":"  "," valueType ":" entityState "},{" property ":" data "," propertyType ":" msg "," value ":"  "," valueType ":" entity "},{" property ":" t2 "," propertyType ":" msg "," value ":"  "," valueType ":" entityState "}]," for ":" 0 "," forType ":" num "," forUnits ":" minutes "," override_topic ":false," state_location ":" payload "," override_payload ":" msg "," entity_location ":" data "," override_data ":" msg "," x ":390," y ":200," wires ":[[" 279a8fb74ccedeb2 "]]},{" id ":" 133ffd74ce0972ca "," type ":" inject "," z ":" 6cefb841c43b034d "," name ":"  "," props ":[{" p ":" payload "},{" p ":" topic "," vt ":" str "}]," repeat ":"  "," crontab ":"  "," once ":false," onceDelay ":0.1," topic ":"  "," payload ":"  "," payloadType ":" date "," x ":120," y ":160," wires ":[[" d8cd1fc5b7e2669f "," cfef959b2fcdecfd "]]},{" id ":" 49f0a545787155f8 "," type ":" debug "," z ":" 6cefb841c43b034d "," name ":" debug 65 "," active ":true," tosidebar ":true," console ":false," tostatus ":false," complete ":" payload "," targetType ":" msg "," statusVal ":"  "," statusType ":" auto "," x ":1000," y ":60," wires ":[]},{" id ":" 8ffe6335a0b09820 "," type ":" debug "," z ":" 6cefb841c43b034d "," name ":" debug 66 "," active ":true," tosidebar ":true," console ":false," tostatus ":false," complete ":" payload "," targetType ":" msg "," statusVal ":"  "," statusType ":" auto "," x ":1000," y ":240," wires ":[]},{" id ":" 0cbfed6f285f7813 "," type ":" function "," z ":" 6cefb841c43b034d "," name ":" function 1 "," func ":" msg.payload = msg.payload;\nglobal.set(‹ val1 ›, msg.payload);\nreturn msg; "," outputs ":1," noerr ":0," initialize ":"  "," finalize ":"  "," libs ":[]," x ":700," y ":140," wires ":[[" 01a63541077d22de "," 49f0a545787155f8 "]]},{" id ":" 279a8fb74ccedeb2 "," type ":" function "," z ":" 6cefb841c43b034d "," name ":" function 2 "," func ":" msg.payload = msg.payload;\nglobal.set(‹ val2 ›, msg.payload);\nreturn msg; "," outputs ":1," noerr ":0," initialize ":"  "," finalize ":"  "," libs ":[]," x ":700," y ":200," wires ":[[" 01a63541077d22de "," 8ffe6335a0b09820 "]]},{" id ":" 443ff1c5.63d78 "," type ":" server "," name ":" Home Assistant "," version ":5," addon ":true," rejectUnauthorizedCerts ":true," ha_boolean ":" y|yes|true|on|home|open "," connectionDelay ":true," cacheJson ":true," heartbeat ":false," heartbeatInterval ":30," areaSelector ":" friendlyName "," deviceSelector ":" friendlyName "," entitySelector ":" friendlyName "," statusSeparator ":"at: "," statusYear ":" hidden "," statusMonth ":" short "," statusDay ":" numeric "," statusHourCycle ":" h23 "," statusTimeFormat ":" h:m "," enableGlobalContextStore ":true}]

Dans fonction1: idem pour la 2 mais avec val2.

msg.payload = msg.payload;
global.set('val1', msg.payload);
return msg;

Dans fonction :

msg.payload = msg.payload;
var temp1 = global.get('val1');
var temp2 = global.get('val2');
var addtemp = temp1 + temp2;

msg.payload = Number(addtemp);
return msg;

On pourrait se passer de quelques lignes mais c’est un exemple.

Bob

Bon, aller, je continue de chipoter… Les noeuds fonctions, ça marche. Mais, là encore, c’est à éviter pour des questions de performances et de lisibilité.
Les perfs, on s’en fout. Moins la lisibilité.
Le noeud change permet de mettre msg.payload dans une variable.

Avec jsonata, on sait aussi ajouter deux variables globales.

1 « J'aime »

Bonsoir,
Autrement, si vous étes allergique au code, vous pouvez utiliser cette palette et plus précisément le node
image