Je souhaite réaliser un scénario qui allume la lumière de la chambre si la MiBox est allumée plus de 5 minutes le soir (et d’autres conditions, voir la capture écran)
Cela m’a comptabilisé le changement d’état de 0 à 1 (ce que je souhaite) mais également j’ai constaté dans l’autre sens c’est à dire depuis quand elle n’est plus à l’état 1…
Dans la log en dessous j’ai éteins la Mibox (elle a bien l’état 0) depuis 1227 secondes comme indiqué :
(log : ------------------------------------
[2020-10-29 10:40:09][SCENARIO] Start : Scenario lance manuellement.
[2020-10-29 10:40:09][SCENARIO] Exécution du sous-élément de type [condition] : if
[2020-10-29 10:40:09][SCENARIO] Evaluation de la condition : [(1 == 1 OU 0 == 1 OU 0 == 1) ET 0 == 0 ET 0 == 1 ET 1227 > 300] = Faux
[2020-10-29 10:40:09][SCENARIO] Exécution du sous-élément de type [action] : else
[2020-10-29 10:40:09][SCENARIO] Fin correcte du scénario
)
Comment faire pour seulement dire quand
#[Chambre Lyne][MiBox_V][Statut]# est à 1 depuis 5 minutes.
Tu n’utilises pas la bonne fonction il me semble : stateDuration(commande) : Donne la durée en secondes depuis le dernier changement de valeur lastChangeStateDuration(commande,valeur) : Donne la durée en secondes depuis le dernier changement d’état à la valeur passée en paramètre
Je souhaite que lorsqu’elle passe à 1 donc allumée, qu’il regarde si cela fait bien au moins 5 minutes (je suis obligé de faire ça, car la mibox en veille de temps en tems il y a un ping sur la journée)
Après je pourrais le faire avec un wait mais je pense qu’il doit bien y avoir une fonction qui le fait en natif… enfin j’espère
La fonction que tu cherches est un peu plus bas dans la doc (que je t’invite à parcourir) : valueDate(cmd,[format]) : Renvoie la date de la dernière donnée pour la commande donnée en paramètre, le 2ème paramètre optionnel permet de spécifier le format de retour (détails ici)
Il te faut une condition qui teste le dernier changement d’état :
(#timestamp#-valuedate([Chambre Lyne][MiBox_V][Statut],U)) > 300
couplée à une autre qui teste l’état (ou alors 1 seule condition avec un ET, ou alors l’état est un déclencheur ) :
En pseudo-code :
SI BOX = 1
ALORS
SI (#timestamp#-valuedate([Chambre Lyne][MiBox_V][Statut],U)) > 300
Je comprends le principe de récuperer la valeur en temps et la tester par contre contre je comprends pas le résultat donné, voici ce que m’indique le testeur d’expression alors que la mix box est éteinte depuis 13h19 :
300 c’est des secondes. Ca fait donc bien plus de 5 minutes depuis le dernier changement d’état. D’où le TRUE en résultat et d’où le fait de l’utiliser tel quel dans une condition.
Sauf que valuedate indique le dernier changement d’état sans savoir si c’était vers 0 ou 1. D’où la 2ème condition nécessaire pour savoir si l’état actuel est 0 ou 1.
Après quelques jours en fonctionnement, ce n’est pas trop ça j’ai trouvé des erreurs :
J’ai des valeurs timestamp qui sont vide et en plus j’ai un décalage horaires (mon rpi est bien en horaires Europe: France) :
Quand tu convertis les valeurs timestamp : il y a 1h de décalage…
[2020-10-30 22:05:30][SCENARIO] Start : Scenario execute automatiquement sur evenement venant de : [Chambre Lyne][MiBox_V][Statut].
[2020-10-30 22:05:30][SCENARIO] Exécution du sous-élément de type [condition] : if
[2020-10-30 22:05:30][SCENARIO] Evaluation de la condition : [(1 == 1 OU 1 == 1 OU 0 == 1) ET 0 == 0 ET 1 == 1 ET 1 == 1] = Vrai
[2020-10-30 22:05:30][SCENARIO] Exécution du sous-élément de type [action] : then
[2020-10-30 22:05:30][SCENARIO] Pause de 35 seconde(s)
[2020-10-30 22:06:05][SCENARIO] Exécution d'un bloc élément : 578
[2020-10-30 22:06:05][SCENARIO] Exécution du sous-élément de type [condition] : if
[2020-10-30 22:06:05][SCENARIO] Evaluation de la condition : [0 ET (1604091965-**""**) > 30] = Faux
[2020-10-30 22:06:05][SCENARIO] Exécution du sous-élément de type [action] : else
[2020-10-30 22:06:05][SCENARIO] Exécution d'un bloc élément : 564
[2020-10-30 22:06:05][SCENARIO] Exécution d'un bloc élément : 579
[2020-10-30 22:06:05][SCENARIO] Exécution du sous-élément de type [condition] : if
[2020-10-30 22:06:05][SCENARIO] Evaluation de la condition : [ 0 ET (1604091965-**1604091930**) > 30] = Faux
[2020-10-30 22:06:05][SCENARIO] Exécution du sous-élément de type [action] : else
[2020-10-30 22:06:05][SCENARIO] Fin correcte du scénario
En effet mais ce n’est pas clair si ça concerne uniquement la collecte de l’info en bloc code ou bien également en passant par la fonction.
En attendant la 4.1 le sujet que tu as linké donne une solution en bloc code.