Node-Red vérifier état depuis 1 minute

Bonjour à tous
Je cherche à peauffiner mon ouverture de portail auto quand j’arrive en voiture.
Cependant quand je pars dans une direction, je sors de la zone et la route fait que je re rentre dans la zone une courte période. Du coup cela est assimilé à un départ de la maison puis une arrivée et un derniuer départ.
Dans mon flux node red, je déclenche sur le tracker du compagnon (= home) puis je vérifie si je suis bien au volant (avec un state node).
J’ai vu qu’il y a une option pour mettre un FOR 1 minute par exemple.
Quel est le fonctionnement précis de ce for ?
L’idée que je voudrais mettre en place c’est sortir à VRAI du state node mais seulement si la valeur de l’entité que je check à 1 (AU volant) est à 1 depuis 1 minute par exemple.
Est ce que le fait de mettre For 1 minute est valable.
J’ai beau cherché il y a peu de documentation sur le sujet.
Je ne veux pas que ça soit assimilé comme un timer qui bloque l’execution 1 minutes.
Je veux juste que quand je passe dans le state node ça sorte à vrai si l’entité est à 1 depuis 1 minute au moins.
Je résume
Au volant = false => false
Au Volant = true depuis moins d’une minute => false
Au volant = true depuis plus d’une minure => True

Question subsidiaire pour un autre usage
Si au lieu du = dans le state node on choisi >, le for n’est plus dispo.
Du coup comment faire pour tester d’un seul coup si une valeur > 50 par exemple depuis 1 minute ?

Merci pour votre aide

reponse à :

Bonjour à tous
Je cherche à peauffiner mon ouverture de portail auto quand j’arrive en voiture.
Cependant quand je pars dans une direction, je sors de la zone et la route fait que je re rentre dans la zone une courte période. Du coup cela est assimilé à un départ de la maison puis une arrivée et un derniuer départ.

99% de sueur la programmation , le reste de génie. sur votre 1ere question, je mets des temps c’est le plus simple. alors sortie de zone… on mets un trigger qui envoie 1 pendant la tempo (ici 10 secondes). si lorsque on signale une rentrée dans la zone avant la fin de zone on bloque le signalement de l’entrée…

une autre solution est de faire une zone de sortie de rayon 1km … si on sort c’est que l’on part. et une zone de rentrée pour dire que l’on arrive et ouvrir le garage. rayon 50m.

j’ai reflechis sur les zones contre les maris violents. interdiction d’etre à moins de 80 kms. pour donner du temps aux victimes de se préparer j’ai la zone de 80 km de rayon … s’il essaie de rentrer dans la zone, y a une zone de 70 km traitée comme une infraction de rentrée à moins de 80 km.

ensuite s’il passe en dessous de 70 km. on avertit qu’il a franchis les 80 km. s’il arrive en dessous de 40 km là le delit est réel. on signale qu’il est à 10 km, et à 20 km il arrive.

lorsque le trigger repasse à 0 l’info de rentrée passe et on declenche

je mettrais deux zones, une courte avant de rentrer dans la zone…

je conseillerais de mettre un node trigger :
lorsque on signale une sortie je declenche un signal à 1 pendant une duree…
si une entrée dans la zone survient pendant la tempo ce signal bloque le signal.
au bout de (ici 10 secondes) le signal de rentrée est realisé.


pour les zones imbriquées. je mettrais une info sur la sortie de zone à 1km et au retour une info de retour à moins de 100m pour ouvrir les portes.

[
    {
        "id": "e8472b788ef22c96",
        "type": "tab",
        "label": "test ",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "ba809808a909644a",
        "type": "inject",
        "z": "e8472b788ef22c96",
        "name": "sortie  de zone",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "sortie",
        "payload": "sortie de zone",
        "payloadType": "str",
        "x": 170,
        "y": 200,
        "wires": [
            [
                "c58ddbd3f3110c7b"
            ]
        ]
    },
    {
        "id": "ae8c34dfc035ab1b",
        "type": "inject",
        "z": "e8472b788ef22c96",
        "name": "entree  de zone",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "entree",
        "payload": "entree  de zone",
        "payloadType": "str",
        "x": 180,
        "y": 260,
        "wires": [
            [
                "bfa9ed965f9761d3"
            ]
        ]
    },
    {
        "id": "c58ddbd3f3110c7b",
        "type": "trigger",
        "z": "e8472b788ef22c96",
        "name": "",
        "op1": "1",
        "op2": "0",
        "op1type": "str",
        "op2type": "str",
        "duration": "10",
        "extend": false,
        "overrideDelay": false,
        "units": "s",
        "reset": "",
        "bytopic": "all",
        "topic": "topic",
        "outputs": 1,
        "x": 390,
        "y": 200,
        "wires": [
            [
                "94859a9a31b51b67",
                "bfa9ed965f9761d3"
            ]
        ]
    },
    {
        "id": "94859a9a31b51b67",
        "type": "debug",
        "z": "e8472b788ef22c96",
        "name": "debug 17",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": true,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "payload",
        "statusType": "auto",
        "x": 580,
        "y": 140,
        "wires": []
    },
    {
        "id": "bfa9ed965f9761d3",
        "type": "function",
        "z": "e8472b788ef22c96",
        "name": "function 6",
        "func": "if (msg.topic === \"sortie\") {\n    context.attente = msg.payload\n} \nif  (msg.topic === \"entree\") {\n    if  (context.attente  !== \"1\" ) {\n        return   msg; \n        }\n    else {\n        msg.payload = \"sortie  de zone  trop  courte\"\n        return  msg;\n        }\n   }\n\n\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 580,
        "y": 260,
        "wires": [
            [
                "d4c90165250dbd66"
            ]
        ]
    },
    {
        "id": "d4c90165250dbd66",
        "type": "debug",
        "z": "e8472b788ef22c96",
        "name": "debug 18",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 740,
        "y": 260,
        "wires": []
    }
]

je vais regarder ce soir et te tiens au courant
Du coup le FOR dans le node que j’utilise sert à quoi ?

je comprends pas trop votre analyse. j’ai fait un petit flows pour implanter la tempo de blocage des signalement d’entrées.

L’idée que je voudrais mettre en place c’est sortir à VRAI du state node mais seulement si la valeur de l’entité que je check à 1 (AU volant) est à 1 depuis 1 minute par exemple.

le for d’un trigger va déclencher un compteur de temps. et eventuellement il envoie un message, contenu d’un flow.set etc… lorsque le temps est ecoulé il envoie un autre message et se remets en attente.

Moi non plus en fait.
Je suis pas sur d’avoir bien formulé et je ne comprends tjs pas le for du state node (et non du triger ou de l’event).

Mon objectif est d’evaluer l’etat courant d’une entité (ca pas de soucis) mais j’ai besoin de rajouter en condition de sortie le fait que la variable soit dans l’eta précisé (la condtition native du state node) depuis X minutes.

Je ne veux pas de boucle ou de tempo, je veux juste savoir si mon etat est à 1 depuis X minutes.
Si il est a 1 mais depuis plus de x minutes seulement => true
Dans tous les autres cas false.

Merci pour votre aide

Comment on peut faire ca ?
C’est une autre solution mais pas sur qu elle soit géniale dans mon cas car l’ecole ou je vais est a moins de 500m a vol d’oiseau et la route me fait sortir de ma zone home pour y re rentrer 1 minute et en ressortir…
Avec la precision gps ca risque d’etre sport…
Sachant qu’en plus on a la precision a 200m par defaut dans les sensors de l’app compagnon…

Salut,

Pourquoi reinventer la roue carrée ? Le node events state propose la combinaison du IF et du FOR de base…

Je ne comprends pas
Tu parles d’un noeud events all et la capture montre un state node (comme celui que j’ai avec le for). Je n atrive pas a teouver la doc de ce nœud…

Pour toi quelle est la signification du for ?

  • depuis X minutes (now - X minues à now)
  • pendant X minutes (now à now + X minutes)
    -…

Ce noeud state node integre t il une tempo ?

Pour quoi quand je mets une condition differente de =, le for disparait.
On ne peut ainsi pas faire si < 1 depuis X minutes
Meme topo ce que je cherche a faire c est de tester de now - X minutes à Now
Now etant l’instant ou je passe dans mon state node

EDIT
Pour meilleure compréhension voici mon flow

C’est ici: Events: state | node-red-contrib-home-assistant-websocket

1 « J'aime »

Exact, c’est bien events state, j’ai corrigé mon post précédent

C’est une mécanique comme suit : état = XX et que durée de cet état pendant Y minutes le noeud déclenche le flow

Je ne vois pas d’= au mieux un => ou un <= et un IS (==)

1 « J'aime »

Ou exact, je parlais du IS
Par contre dès que je mets un >, >=, < ou <= le FOR disparait… Normal ?
Tu n’as pas l’air d’avoir ça dans ta capture.


EDIT : on parle pas du même node…
Tu parles du events state => je suis ok avec toi le FOR est présent tout le temps
Je parles du curent state => le FOR est présent uniquement pour la condition IS, IS NOT, quelques autres mais en revanche pas pour >, <

Non => curent state qui est différent du event state.
Mon problème ou ma problematique concerne le curent state

On va y arriver :wink:

Comme tu le vois sur ma copie d’écran, le for reste avec le events state

Je suis ok avec toi
Mais comme expliqué mon flow se déclenche par un EVENTS STATE (entrée dans la zone) , puis je rentre dans un CURENT STATE (un boolen qui m’indique si je suis au volant). C’est ce current state dont j’ai besoin de comprendre le fonctionnement du FOR et pour lequel j’ai besoin de continuer mon flow uniquement si ce boolen est à VRAI depuis plus de X minutes.

J’ai le même besoin pour un entier mais je dois tester si il est supérieur à une valeur… La le FOR dispairait

Pourquoi pas 2 events state justement

Tu lies comment 2 events state ?
Avant de vérifier si je suis au volant, j’ai besoin de declencher mon flow par l’entrée dans la zone…

D’autre part dans le doc du curent node
ils disent

For

  • Type: number

The amount of time the entity state needs to constant for the « If state » to be true

C’est pas bien clair. Est ce que c’est éuivalent à un DEPUIS x minutes ou POUR x minutes ?
En gros now - X minutes à Now ou bien Now à now + X minutes.
Si dernier cas ça veut dire que le state node fait une tempo de X minutes… ce que je ne souhaite pas

Tu peux lier 2 déclencheurs

Et la mécanique un est DEPUIS (FOR en anglais)

Merci mais c’est pas ce que je veux en fait. Ou c’est trop complexe.
Comme tu dit on va pas réinventer la roue.
J’ai créé un flow de test donc je confirme bien que le FOR du current state fonctionne de la manière suivante :
Il n’insère aucune tempo. Il teste la condition ET la date du dernier changement de l’état. C’est donc bien ce que je veux. En gros il regarde la durée entre NOW et le DERNIER CHANGEMENT.

Selon toi pourquoi le for disparait quand on utilise le > ou < ?

1 « J'aime »

Salut

as tu trouvé pour avoir toujours le FOR

Merci à toi