Trigger non détecté par moment

Bonsoir,

J’ai mis du temps à comprendre le phénomène, je tourne sur la dernière stable Jeedom. Je n’avais pas ce phénomène avant de passer en 4.4 d’ailleurs.

J’ai des virtuels avec des infos qui sont mises à 1 par une action et qui repassent à 0 à partir d’un certain temps.
Par exemple, quand je lance un délestage sur la piscine, des conditions font un ON pour le délestage. Mais si plus de nouveau ON, le délestage doit passer à 0 au bout de X min.
Jusque là tout va bien.


et deux actions classiques ON/OFF :

Si le délestage s’arrête au bout de 6min, je détecte par un trigger dans un scénario, rien de plus.

Et dans les conditions de traitement du scénario, mon SI est basé sur :

(#trigger# == "[Piscine][Piscine (Panel)][Délestage]" AND #[Piscine][Piscine (Panel)][Délestage]# == 0) AND #[Piscine][Piscine (Panel)][Délestage]# == 0 AND #[Piscine][Piscine (Panel)][Filtration]# == 1)

Et il fait un OFF sur la filtration.

Je n’ai pas de log sous la main car il pleut depuis 3 jours, mais vendredi, la filtration ne s’est pas arrêtée. Mais j’ai l’historique.

image

On voit bien que le délestage (bleu) s’est arrêté à 14h30 mais que la filtration a continué à tourner.
J’ai remarqué que si je « sauve » le virtuel de nouveau, le scénario se lance.

Pour parer le truc à la vavite, j’ai modifié le scénario pour qu’il tourne avec un cron à 1min en plus des conditions et modifier le SI pour vérifier si le délestage est tombé dans les 2 dernières minutes.

(#trigger# == "[Piscine][Piscine (Panel)][Délestage]" AND #[Piscine][Piscine (Panel)][Délestage]# == 0) OU (#trigger# == "schedule" AND lastStateDuration(#[Piscine][Piscine (Panel)][Délestage]#,0) <= 120 AND #[Piscine][Piscine (Panel)][Délestage]# == 0 AND #[Piscine][Piscine (Panel)][Filtration]# == 1)

J’ai observé ce souci aussi pour mes bornes de recharge. J’utilise ce principe pour savoir si un véhicule est plein. Si un courant est détecté, il met une info « Charge fin différée » à 1 via un cron 5min qui fait d’autres trucs. S’il n’y a plus de courant, charge fin différée tombe à 0 au bout de 5min.
Et des fois il reste à 1. Même principe pour le scénario et le trigger.

En voyant la documentation, je vois qu’elle est sur une page 4.3
https://doc.jeedom.com/fr_FR/core/4.3/scenario

Mais que #trigger# est déprécié. Serait-ce la cause ?

Merci !

Il y a des chances oui.

Petit test rapidos en allumant une lumière en 4.4.19

Pas pour longtemps, il revient en 4.5.

Hum je suis pas vraiment sur que ça change réellement quelque chose cette différence entre #trigger# et trigger() …

Pour en être certain, perso je ferais deux scénarios type « coquille vide » qui ne font pas grand chose avec les deux fonctions en déclencheur et en comparant les logs tu va vite voir si il y a des différences de déclenchement entre les deux.

Est ce que le souci ne serait pas par exemple plusieurs changements à la même seconde ou suffisamment rapprochés pour que le scénario ne se relance pas car la précédente exécution n’était pas terminée ?
Est ce que tu as coché la case multi exécution ou non ?

Bonjour,

Il y a une erreur pour moi dans la syntaxe lors du test sur le déclencheur :

(#trigger# == "[Piscine][Piscine (Panel)][Délestage]" AND #[Piscine][Piscine (Panel)][Délestage]# == 0) AND #[Piscine][Piscine (Panel)][Délestage]# == 0 AND #[Piscine][Piscine (Panel)][Filtration]# == 1)

La condition qui vérifie que le déclencheur est bien le changement d’état de l’info virtuelle Délestage devrait être :

SI trigger(#[Piscine][Piscine (Panel)][Délestage]#)
ALORS…

Si c’est la valeur du déclencheur qui doit être testée (0 en l’occurrence), alors c’est plutôt triggerValue qu’il faut utiliser :
SI triggerValue(#[Piscine][Piscine (Panel)][Délestage]#)==0
ALORS…

S’il faut déclencher des actions avec un test sur des conditions différentes, il faut les chaîner comme ceci par exemple :
SI triggerValue(#[Piscine][Piscine (Panel)][Délestage]#)==0 && triggerValue(#[Piscine][Piscine (Panel)][Filtration]#) == 1
ALORS…

Attention :
La syntaxe #trigger# ne fonctionne pas en 4.4.19 (et je le confirme…), mais comme l’a dit @Jeandhom , ce sera bien cette syntaxe qu’il faudra réutiliser avec la prochaine version 4.5 (à noter !!!).

[EDIT]

#trigger# == "[Piscine][Piscine (Panel)][Délestage]"

Autant pour moi, l’expression est correcte et fonctionne en effet.
A noter que ce n’est pas #[xxx][yyy][zzz]# qui est utilisé, mais bien "[xxx][yyy][zzz]".

2 « J'aime »

Bonjour,

La fonction triggerValue ne prend aucun argument ! il faut l’utiliser comme ceci :
triggerValue() == 0

Si si elle fonctionne.

C’est faux aussi, en 4.5 il faudra utiliser #trigger_name#

2 « J'aime »

Euh sinon… je fais quoi du coup ?

je garde #trigger# ou trigger() ?

@danielJ, je veux bien que la syntaxe ne soit pas bonne, mais je n’ai jamais eu aucun souci pendant plus de 2 ans que ces scénarios sont utilisés avant mon passage en 4.4 (ou 4.3).

J’ai déjà passé quelques scénarios en trigger() pour voir si impact ou non.

@Aurel, effectivement, la case multi exécution n’est pas cochée ; je vais l’activer.

Bonjour,

Ce qui fonctionnait avant peut ne pas fonctionner après une mise à jour…
Je comprend que c’était OK jusqu’à la mise à jour en 4.4.x où les problèmes ont commencés, c’est bien correct ?

La documentation dit qu’en v3.3.x, la syntaxe pour la fonction trigger doit être celle-ci :

En v4.4.x, on doit avoir ceci :

Et enfin avec la future v4.5, on devra respecter celle-ci :

(je n’invente rien, c’est disponible ici ! :wink:)

La fonction retourne que la valeur du déclencheur qui a lancé le scénario. C’est pour cela qu’elle n’a pas besoin d’argument car il est unique.

Oui, OK, je suis d’accord et je me rends compte que j’ai dit un truc faux en effet, désolé :

Ça ne marche dans aucun cas en effet…
On ne peut pas chaîner deux tests sur un triggerValue, puisque le scénario ne sera déclenché que sur le changement de valeur d’un seul des déclencheurs uniquement.

Je refait mes tests pour être sûr, encore désolé pour la confusion…

1 « J'aime »

Bon, ok, j’ai presque tout faux…
Je me suis (bien) planté ce matin avec mes tests, j’ai dû me mélanger en voulant aller trop vite. J’ai effacé mon post qui ne peut que prêter à confusion du coup…

Je résume (v4.4.19) :

  • Pour la fonction trigger

Ce qui fonctionne :
trigger() == "schedule" (ou autre, comme start)
#trigger# == "schedule"
trigger() == "[xxx][yyy][zzz]"
trigger(#[xxx][yyy][zzz]#)
#trigger# == "[xxx][yyy][zzz]"

Ce qui ne fonctionne pas :
#trigger#
trigger()
#trigger# == #[xxx][yyy][zzz]#
trigger() == #[xxx][yyy][zzz]#

  • Pour la fonction triggerValue

Ce qui fonctionne :
triggerValue(#[xxx][yyy][zzz]#) == X
triggerValue() == X

Ce qui ne fonctionne pas :
triggerValue(#[xxx][yyy][zzz]#) == X && triggerValue(#[aaa][bbb][ccc]#) == Y
triggerValue() == X && triggerValue() == Y

Oui, vu, c’est dans la doc en v4.5 effectivement…

Dans ce cas, je ne devrai avoir aucun souci, AVANT lors de ma migration en 4.4 car j’étais en :

(#trigger# == "[Piscine][Piscine (Panel)][Délestage]" AND #[Piscine][Piscine (Panel)][Délestage]# == 0) AND #[Piscine][Piscine (Panel)][Délestage]# == 0 AND #[Piscine][Piscine (Panel)][Filtration]# == 1)

Là j’ai peut être fait une erreur car - en 4.4 - sur les 3 scénarios clés de la maison (j’en ai d’autres avec trigger mais c’est pas le plus urgent) j’ai mis :

(trigger() == "[Piscine][Piscine (Panel)][Délestage]" AND #[Piscine][Piscine (Panel)][Délestage]# == 0) AND #[Piscine][Piscine (Panel)][Délestage]# == 0 AND #[Piscine][Piscine (Panel)][Filtration]# == 1)

et il vaudrait mieux que je mette :

(trigger(#[Piscine][Piscine (Panel)][Délestage]#) AND #[Piscine][Piscine (Panel)][Délestage]# == 0) AND #[Piscine][Piscine (Panel)][Délestage]# == 0 AND #[Piscine][Piscine (Panel)][Filtration]# == 1)

C’est ça ?

Pour moi, cette syntaxe fonctionne correctement,

Et celle-ci aussi…

Pour moi les syntaxes d’origines sont bonnes, surtout si elles marchaient avant MaJ.
Il faut poursuivre les recherches sur une autre voie.

Mes sans log, avec un morceau de capture du virtuel et du scénario, cela semble compliqué de pouvoir t’aider.

commence par ici, c’est pas le comportement attendu. fait une save et regarde le log du scénario qui t’indiquera qui est-ce qu’il l’a déclenché.

Pour l’instant, ça marche correctement.
Hier soir, la fin de charge s’est bien mis à 0 toute seule et a basculé le changement d’état.
Et il faut être devant le log au moment où ça arrive… et ça je ne peux pas !

15h56, le routage s’arrête.
16h02 (6min après donc), la charge s’arrête et la machine d’états bascule. Fonctionnement OK !

image

Pour la piscine, j’ai pas de délestage en ce moment, mais vendredi je l’aurai lol !

Par contre pour l’heure, mes scénarios sont sur :

trigger() == "[Garage][Borne électrique (Panel)][Chargée]" AND #[Garage][Borne électrique Garage (Panel)][Chargée]# == 1 AND #[Garage][Borne électrique Garage (Panel)][Branchée]# == 1

EDIT : seul changement, j’ai activé la multi exécution comme recommandé.

Ben pourquoi ?
Le log ne s’efface pas comme par magie après …

Sinon je renouvelle ma proposition :

Quand je regarde le log il ne remonte pas assez haut en temps. Car le scénario mine de rien est appelé un paquet de fois… trop peut-être.

Je viens de regarder un peu le fonctionnement avec 2 scénarios, c’est kif kif. Rien de particulier de ce côté.