Envoi message si je ne suis pas dans la zone

Bonjour,

J’utilise actuellement ce type de schéma Node-Red pour mes capteurs :

Je souhaiterais pouvoir réaliser l’envoi du message uniquement si je ne suis pas dans la zone.
J’ai donc essayer cette structure (avec mon device_tracker de mon Iphone à « home ») mais elle ne fonctionne pas car je pense qu’elle perd le message.

Comment puis-je contourner le problème ?

Merci.
Aurel

Bonjour @aurelb87-smilorel

Moi je ferai comme ceci avec un switch, là je suis chez moi donc le debug du haut sort la valeur home, le debug du bas rien, mais si différent de « home » tu passerai le switch.


Contenu du switch:
image
Sortie du haut du switch tu branches ton nœud d’envoi de message.

Bob

Merci @Bob pour ton aide.

J’avais pensé à utiliser un switch. Je vois néanmoins un problème dans cette solution: je perds mes messages OUV/FER.

Une manière de contourner ce problème serait peut-être de mettre une boucle if dans ma fonction c’est à dire que je repartirai avec ma 1ère solution (avec les 2 messages reliés à ma fonction) puis aussi avec ta solution où le switch serait également relié à ma fonction.
Dans ce cas, il faudrait que je fasse un if{mon_switch == home} alors j’envoie le message.

Y’a-t-il une manière de faire référence à mon switch dans ma fonction ?

Merci.
Aurel

Peux-tu partager ton flow pour que l’on puisse savoir ce qu’il y a surtout dans ta fonction.
Ce que tu souhaites c’est recevoir un message au changement d’état du capteur de porte ?
Dans la fonction tu pourrais ajouter une variable.

global.set('etatPorte', msg.payload);

Que tu récupères dans un noeuds suivant :

var maPorte = global.get('etatPorte');

Bob

Si je mets en image ce que j’ai expliqué dans mon post précédent:

Edit: J’ai plusieurs capteurs, donc j’aurai plusieurs {« Events:state »+Msg OUV/FER}. Je n’en ai représenté qu’un pour faciliter la compréhension.

Dans ma fonction, je récupère un message de l’un ou l’autre capteur et je l’envoi via Telegram. Il est sous la forme suivante :

msg.payload = {
...
}
return msg;

Je pensais ajouter un « if » pour tester si la valeur de mon switch est à « home », si oui j’envoie le message si non, je ne fais rien.

La logique de nodered est, sauf exception, purement séquentielle. Pour le dire visuellement, ca commence à gauche et LE message traverse les noeuds vers la droite en étant testé/modifié/supprimé à chaque étape.
Les doubles entrées comme ton dernier schéma (un avec la porte et l’autre avec le téléphone) ne peuvent pas faire ce que tu veux sans jonglage avec des noeuds comme la « machine à état finie » (node-red-contrib-finite-statemachine (node) - Node-RED). Donc, pour ton cas, il vaut mieux faire la logique NodeRed.
Comme l’indique Bob, en sortie du noeud event du capteur, tu sauvegarde l’état de msg.payload dans une variable.
Tu requête l’état du tracker de téléphone et en sortie, tu mets un switch et après tu reprends la variable et tu passes à ta fonction.
De gauche à droite :slight_smile:

Ok @golfvert,

J’avais pourtant l’impression de respecter le gauche vers droite que j’avais bien compris « théoriquement »! :wink:

Je veux bien sauvegarder l’état du msg.payload dans une variable mais, pour le faire, dois-je passer par une fonction ou y’a t-il un nœud pour le faire ?

Merci.

Le noeud change fait ça très bien.
L’autre règle implicite de NodeRed (programmation de feignant) c’est le moins de fonction possible :slight_smile: En plus, c’est moins performant vu comment est développé NodeRed. Bon, pour des flots de domotique, la perf est un problème assez théorique…

Je pense avoir trouvé la solution grâce à votre aide.
Ci-dessous ce que j’ai appliqué :
(Je stocke dans une variable globale l’état de mon téléphone (à la maison ou non).)
image

J’ai appliqué la proposition de @Bob sur le noeud « Change » ci-dessus :
image

Puis en reprenant mon schéma initial, j’ai modifié la fonction :

var etat_tel = global.get('etat_iphone');   # Je reprends l'état de la variable globale

if(etat_tel != "home"){                              # Si l'état de la variable est != "home" alors j'envoie un message.
..
}

Sur les 1ers tests cette solution semble fonctionner. :+1:

Merci @Bob, @golfvert
Aurel

Salut,

Sans les variables il y a aussi moyen de mettre un ‹ point › de blocage des messages :

Tu es là => gate fermé, tu es pas là gate => ouvert

Il y a des variantes intéressantes pour cumuler les messages en attendant l’ouverture

Je n’avais pas vu cette possibilité « graphique ».
image

Je l’ai fait en Javascript, pour un système de renouvellement automatique de certificat.
Ce serait cool de partager ton flow, ça donne toujours des idées (je n’ai toujours pas vu comment partager un flow dans un post sur une ligne… :upside_down_face: )
Bob

Merci @Pulpy-Luke, je viens d’installer les deux « gate » :wink:

1 « J'aime »

C’est une méthode. Il y en a d’autres :slight_smile: Pulpy suggère les « gate ». Dans le même genre on a « traffic light ».
Et on peut faire comme ça aussi:

Avec du jsonata pour extraire les valeurs et préparer le payload du noeud telegram (ici le debug).

[{"id":"73405909abdfb2db","type":"server-state-changed","z":"89990f99.a6d4e","name":"Capteur de porte","server":"d28c9492.f419c8","version":3,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"Capteur de porte","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"","halt_if_type":"str","halt_if_compare":"is","outputs":1,"output_only_on_state_change":true,"for":0,"forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"porte","propertyType":"flow","value":"{extraction}","valueType":"jsonata"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":270,"y":100,"wires":[["b2999b5038954466"]]},{"id":"b2999b5038954466","type":"api-current-state","z":"89990f99.a6d4e","name":"","server":"d28c9492.f419c8","version":3,"outputs":2,"halt_if":"Home","halt_if_type":"str","halt_if_compare":"is","entity_id":"","state_type":"str","blockInputOverrides":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"{ \t    \"type\": 'message',\t    \"chatId\": 12345689,\t    \"transport\": 'telegram',\t    \"content\": 'La porte est' & $flowContext(\"porte\")\t}\t","valueType":"jsonata"},{"property":"data","propertyType":"msg","value":"","valueType":"entity"}],"for":0,"forType":"num","forUnits":"minutes","override_topic":false,"state_location":"payload","override_payload":"msg","entity_location":"data","override_data":"msg","x":480,"y":100,"wires":[["d490a03a3160303b"],[]]},{"id":"d490a03a3160303b","type":"debug","z":"89990f99.a6d4e","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":710,"y":100,"wires":[]},{"id":"d28c9492.f419c8","type":"server","name":"hassio","version":2,"addon":false,"rejectUnauthorizedCerts":false,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true,"heartbeat":false,"heartbeatInterval":30}]

Les noeuds de la palette de connexion NR → HA ont beaucoup d’options…