Utilisation de variables dans node red (via un regex)

Bonjour,

Petite question node red sur l’utilisation de variables.
Je veux faire une recherche d’entités via un regex basé sur une variable précédemment stockée, mais je pense que je n’ai pas la bonne syntax dans le regex:
sensor.pc_{{id}}_temperature_depart

J’ai aussi testé sans succès:
sensor.pc_{{msg.id}}_temperature_depart

Alors que ça fonctionne avec :
sensor.pc_rdc_temperature_depart

Nb: dans le cas présent, pas forcément besoin d’un regex, un string suffit, mais je souhaite connaitre la bonne syntax, sachant qu’en string ça ne marche pas mieux.


[{"id":"75d28f93.55434","type":"ha-get-entities","z":"c8f6bacd.b33d38","server":"74685640.813718","name":"Get Depart","rules":[{"property":"entity_id","logic":"is","value":"sensor.pc_{{id}}_temperature_depart","valueType":"re"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"depart","output_results_count":1,"x":930,"y":960,"wires":[["65d405e7.c8e23c"]]},{"id":"65d405e7.c8e23c","type":"debug","z":"c8f6bacd.b33d38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"depart","targetType":"msg","statusVal":"","statusType":"auto","x":1150,"y":960,"wires":[]},{"id":"4d19aea.d750f5","type":"inject","z":"c8f6bacd.b33d38","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":580,"y":1000,"wires":[["bab2fe67.cf7ff"]]},{"id":"bab2fe67.cf7ff","type":"change","z":"c8f6bacd.b33d38","name":"Set id","rules":[{"t":"set","p":"id","pt":"msg","to":"rdc","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":750,"y":1000,"wires":[["75d28f93.55434","3aabf4fc.aaf7ec","28847bb4.0da794"]]},{"id":"3aabf4fc.aaf7ec","type":"ha-get-entities","z":"c8f6bacd.b33d38","server":"74685640.813718","name":"Get Retour","rules":[{"property":"entity_id","logic":"is","value":"sensor.pc_{{id}}_temperature_retour","valueType":"re"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"retour","output_results_count":1,"x":930,"y":1040,"wires":[["761000f4.02e1b"]]},{"id":"761000f4.02e1b","type":"debug","z":"c8f6bacd.b33d38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"retour","targetType":"msg","statusVal":"","statusType":"auto","x":1150,"y":1040,"wires":[]},{"id":"28847bb4.0da794","type":"debug","z":"c8f6bacd.b33d38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"id","targetType":"msg","statusVal":"","statusType":"auto","x":910,"y":1100,"wires":[]},{"id":"74685640.813718","type":"server","name":"Home Assistant","addon":true}]

image

Une piste?

Salut,
Tu peux contourner le problème en faisant comme ca:

[{"id":"3ca4f35.9c34e0c","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"75d28f93.55434","type":"ha-get-entities","z":"3ca4f35.9c34e0c","server":"74685640.813718","name":"Get Depart","rules":[{"property":"entity_id","logic":"is","value":"payload","valueType":"msg"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"depart","output_results_count":1,"x":510,"y":160,"wires":[["65d405e7.c8e23c"]]},{"id":"65d405e7.c8e23c","type":"debug","z":"3ca4f35.9c34e0c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"depart","targetType":"msg","statusVal":"","statusType":"auto","x":730,"y":160,"wires":[]},{"id":"4d19aea.d750f5","type":"inject","z":"3ca4f35.9c34e0c","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"rdc","payloadType":"str","x":110,"y":100,"wires":[["bab2fe67.cf7ff"]]},{"id":"bab2fe67.cf7ff","type":"change","z":"3ca4f35.9c34e0c","name":"Set id","rules":[{"t":"set","p":"id","pt":"msg","to":"payload","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"sensor.pc_xxx_temperature_retour","tot":"str"},{"t":"change","p":"payload","pt":"msg","from":"xxx","fromt":"str","to":"id","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":290,"y":200,"wires":[["75d28f93.55434","3aabf4fc.aaf7ec","28847bb4.0da794"]]},{"id":"3aabf4fc.aaf7ec","type":"ha-get-entities","z":"3ca4f35.9c34e0c","server":"74685640.813718","name":"Get Retour","rules":[{"property":"entity_id","logic":"is","value":"payload","valueType":"msg"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"retour","output_results_count":1,"x":510,"y":240,"wires":[["761000f4.02e1b"]]},{"id":"761000f4.02e1b","type":"debug","z":"3ca4f35.9c34e0c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"retour","targetType":"msg","statusVal":"","statusType":"auto","x":730,"y":240,"wires":[]},{"id":"28847bb4.0da794","type":"debug","z":"3ca4f35.9c34e0c","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":510,"y":300,"wires":[]},{"id":"b3d99ca6.6c3ae","type":"inject","z":"3ca4f35.9c34e0c","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"chanbre1","payloadType":"str","x":120,"y":160,"wires":[["bab2fe67.cf7ff"]]},{"id":"380db706.916a38","type":"inject","z":"3ca4f35.9c34e0c","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"salon","payloadType":"str","x":110,"y":220,"wires":[["bab2fe67.cf7ff"]]},{"id":"74685640.813718","type":"server","name":"Home Assistant","addon":true}]

A adapter en fonction de ton besoin final !

Merci pout ta réponse.

En gros, au lieu de faire la concaténation dans le node final, elle est faite en amont via un change node.
En adaptant, j’arrive à mes fins:


[{"id":"4451cb8.6610e34","type":"ha-get-entities","z":"c8f6bacd.b33d38","server":"74685640.813718","name":"Get Depart","rules":[{"property":"entity_id","logic":"is","value":"id_sensor_depart","valueType":"msg"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"depart","output_results_count":1,"x":890,"y":1060,"wires":[["bb770f4.014e2f"]]},{"id":"bb770f4.014e2f","type":"debug","z":"c8f6bacd.b33d38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"depart[0].state","targetType":"msg","statusVal":"","statusType":"auto","x":1130,"y":1060,"wires":[]},{"id":"c1d9039c.94f74","type":"inject","z":"c8f6bacd.b33d38","name":"rdc","props":[{"p":"id","v":"rdc","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":490,"y":1060,"wires":[["c714628e.1d967"]]},{"id":"c3f1a376.4fc31","type":"ha-get-entities","z":"c8f6bacd.b33d38","server":"74685640.813718","name":"Get Retour","rules":[{"property":"entity_id","logic":"is","value":"id_sensor_retour","valueType":"msg"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"retour","output_results_count":1,"x":890,"y":1140,"wires":[["4217d472.4c019c"]]},{"id":"4217d472.4c019c","type":"debug","z":"c8f6bacd.b33d38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"retour[0].state","targetType":"msg","statusVal":"","statusType":"auto","x":1130,"y":1140,"wires":[]},{"id":"c714628e.1d967","type":"change","z":"c8f6bacd.b33d38","name":"Set variables","rules":[{"t":"set","p":"id_sensor_depart","pt":"msg","to":"sensor.pc_xxx_temperature_depart","tot":"str"},{"t":"set","p":"id_sensor_retour","pt":"msg","to":"sensor.pc_xxx_temperature_retour","tot":"str"},{"t":"change","p":"id_sensor_depart","pt":"msg","from":"xxx","fromt":"str","to":"id","tot":"msg"},{"t":"change","p":"id_sensor_retour","pt":"msg","from":"xxx","fromt":"str","to":"id","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":690,"y":1100,"wires":[["4451cb8.6610e34","c3f1a376.4fc31"]]},{"id":"f26a50ed.38747","type":"inject","z":"c8f6bacd.b33d38","name":"etage","props":[{"p":"id","v":"etage","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":490,"y":1100,"wires":[["c714628e.1d967"]]},{"id":"d40c2eae.c0152","type":"inject","z":"c8f6bacd.b33d38","name":"grenier","props":[{"p":"id","v":"grenier","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":490,"y":1140,"wires":[["c714628e.1d967"]]},{"id":"74685640.813718","type":"server","name":"Home Assistant","addon":true}]

Pour ma culture perso (et pour d’autres besoins) si quelqu’un a la réponse sur le fonctionnement initial, je suis preneur, mais au moins je suis débloqué sur mon besoin.

Merci!

Je pense qu’un truc pas loin de ça doit faire l’affaire:

[{"id":"4451cb8.6610e34","type":"ha-get-entities","z":"c8f6bacd.b33d38","server":"74685640.813718","name":"Get Depart","rules":[{"property":"entity_id","logic":"is","value":"id_sensor_depart","valueType":"msg"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"depart","output_results_count":1,"x":890,"y":1060,"wires":[["bb770f4.014e2f"]]},{"id":"bb770f4.014e2f","type":"debug","z":"c8f6bacd.b33d38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"depart[0].state","targetType":"msg","statusVal":"","statusType":"auto","x":1130,"y":1060,"wires":[]},{"id":"c1d9039c.94f74","type":"inject","z":"c8f6bacd.b33d38","name":"rdc","props":[{"p":"id","v":"rdc","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":490,"y":1060,"wires":[["c714628e.1d967"]]},{"id":"c3f1a376.4fc31","type":"ha-get-entities","z":"c8f6bacd.b33d38","server":"74685640.813718","name":"Get Retour","rules":[{"property":"entity_id","logic":"is","value":"id_sensor_retour","valueType":"msg"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"retour","output_results_count":1,"x":890,"y":1140,"wires":[["4217d472.4c019c"]]},{"id":"4217d472.4c019c","type":"debug","z":"c8f6bacd.b33d38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"retour[0].state","targetType":"msg","statusVal":"","statusType":"auto","x":1130,"y":1140,"wires":[]},{"id":"c714628e.1d967","type":"change","z":"c8f6bacd.b33d38","name":"Set variables","rules":[{"t":"set","p":"id_sensor_depart","pt":"msg","to":"sensor.pc_xxx_temperature_depart","tot":"str"},{"t":"set","p":"id_sensor_retour","pt":"msg","to":"sensor.pc_xxx_temperature_retour","tot":"str"},{"t":"change","p":"id_sensor_depart","pt":"msg","from":"xxx","fromt":"str","to":"id","tot":"msg"},{"t":"change","p":"id_sensor_retour","pt":"msg","from":"xxx","fromt":"str","to":"id","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":690,"y":1100,"wires":[["4451cb8.6610e34","c3f1a376.4fc31"]]},{"id":"f26a50ed.38747","type":"inject","z":"c8f6bacd.b33d38","name":"etage","props":[{"p":"id","v":"etage","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":490,"y":1100,"wires":[["c714628e.1d967"]]},{"id":"d40c2eae.c0152","type":"inject","z":"c8f6bacd.b33d38","name":"grenier","props":[{"p":"id","v":"grenier","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":490,"y":1140,"wires":[["c714628e.1d967"]]},{"id":"74685640.813718","type":"server","name":"Home Assistant","addon":true}]

jsonata :heart:

Merci @golfvert, mais je ne vois pas la différence avec mon code du dessus.
Il n’y a pas une erreur de copier/coller?

Oups…

[{"id":"478ba9db.4a5ae8","type":"ha-get-entities","z":"d59703d6.87ebf","server":"d28c9492.f419c8","name":"","rules":[{"property":"entity_id","logic":"jsonata","value":"$contains($entity().entity_id,payload)","valueType":"jsonata"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"payload","output_results_count":1,"x":410,"y":4740,"wires":[["cbed35c6.632478"]]},{"id":"fcf2d3e3.15392","type":"inject","z":"d59703d6.87ebf","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"/rdc|etage|grenier/","payloadType":"jsonata","x":190,"y":4740,"wires":[["478ba9db.4a5ae8"]]},{"id":"cbed35c6.632478","type":"debug","z":"d59703d6.87ebf","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":630,"y":4740,"wires":[]},{"id":"d28c9492.f419c8","type":"server","name":"hassio","legacy":false,"addon":false,"rejectUnauthorizedCerts":false,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]

Beaucoup mieux :).
En adaptant un peu, j’arrive a ce que je veux avec ce JSONata, et j’économise des variables intermédiaires:

$contains(
   $entity().entity_id,
   "sensor.pc_" & id & "_temperature_depart"
)

Nb: j’ai du coup utilise « id » au lieu de payload car un seul injecteur pour plusieurs ids.


[{"id":"478ba9db.4a5ae8","type":"ha-get-entities","z":"c8f6bacd.b33d38","server":"74685640.813718","name":"Get Depart","rules":[{"property":"entity_id","logic":"jsonata","value":"$contains(\t   $entity().entity_id,\t   \"sensor.pc_\" & id & \"_temperature_depart\"\t)\t","valueType":"jsonata"}],"output_type":"array","output_empty_results":false,"output_location_type":"msg","output_location":"depart","output_results_count":1,"x":970,"y":1200,"wires":[["cbed35c6.632478"]]},{"id":"fcf2d3e3.15392","type":"inject","z":"c8f6bacd.b33d38","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"str","x":650,"y":1200,"wires":[["59707348.453c7c","4c4c5a33.573d74"]]},{"id":"cbed35c6.632478","type":"debug","z":"c8f6bacd.b33d38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"depart[0].state","targetType":"msg","statusVal":"","statusType":"auto","x":1190,"y":1200,"wires":[]},{"id":"59707348.453c7c","type":"change","z":"c8f6bacd.b33d38","name":"rdc","rules":[{"t":"set","p":"id","pt":"msg","to":"rdc","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":790,"y":1180,"wires":[["478ba9db.4a5ae8"]]},{"id":"4c4c5a33.573d74","type":"change","z":"c8f6bacd.b33d38","name":"etage","rules":[{"t":"set","p":"id","pt":"msg","to":"etage","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":790,"y":1220,"wires":[["478ba9db.4a5ae8"]]},{"id":"74685640.813718","type":"server","name":"Home Assistant","addon":true}]

Merci!

Sauf si tu as besoin des noeuds change au milieu pour autre chose, si tu injectes du jsonata comme dans mon exemple, ca te fait pareil sans avoir besoin des noeuds change…
Et en sortie, tu auras un tableau que tu peux aussi traiter facilement.
Mais, bon, c’est affaire de goût.

Ouai j’ai vu que je peux regrouper cela, mais visuellement ça me permet de voir exactement les entrées que je passe ou pas, puis lors de tests je peux facilement/visuellement « débrancher » une partie de flow. Après pour d’autres flows avec beaucoup d’entrées, ce sera certainement mieux (notamment quand je vais m’attaquer à la gestion automatique de mes volets via l’Azimuth)

OK. Tu sais sans doute qu’avec le flot tel que tu l’écris, tu n’as pas de garantit sur la synchronicité ou pas des traitements et si au milieu tu as des variables globales, ça peut mettre la grouille.
Si tu as un seul chemin (comme mon exemple), là tu es sûr que c’est séquentiel. Je ne dis pas que c’est mieux ou moins bien… Juste différent :slight_smile:

Avec le peu que j’ai pu voir dans node red, j’ai bien compris qu’on peux arriver à nos fins avec des centaines de combinaisons différentes :).

Tu m’as un peu fait peur :). Juste pour me rassurer, avec des variables locales, donc en msg.xxx, je n’est pas ce risque on est d’accord? (Je n’utilise même pas, encore du moins, de flow.xxx). La dans mon cas, je suppose que c’est comme si j’avais 3 fois mes blocs (je peux toujours les copier/coller, mais c’est dommage :slight_smile: ).

Oui. Pleins de méthodes…

De ce que j’ai compris, tu ne cours effectivement aucun risque. Mais, comme je n’ai pas les détails des noeuds qui suivent, c’était juste une info.

Je pense, oui. Tu peux d’ailleurs les regrouper dans un subflow. C’est assez pratique quand on a plusieurs instances d’un même traitement. dans ton cas, pas forcément utile, cependant.