Comptabiliser un changement d'état

Bonjour,

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)

J’ai pensé utilisé stateDuration mais cela ne convient pas car ma commande :

stateDuration(#[Chambre Lyne][MiBox_V][Statut]#,1) > 300

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.

Merci

Bonjour,

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

oui mais ça ne répond pas non plus à ce que je souhaite faire je pense.
Je viens de tester dans le Testeur d’Expression il me sort un chiffre : 3280 …

lastChangeStateDuration(#[Chambre Lyne][MiBox_V][Statut]#,1)

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

En effet un peu trop rapide à répondre.

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
1 « J'aime »

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 :

(#timestamp#-valuedate([Chambre Lyne][MiBox_V][Statut],U)) > 300

Je vais évaluer : (1603974562-1603973983) > 300
Résultat : true

punaise bien compliqué pour juste savoir si le statut : 1 est depuis x minutes …

#timestamp# c’est le temps UNIX / LINUX.

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.

Ok merci j’ai converti timestamp pour me rendre compte de la date et de l’heure.

du coup j’ai fais ça avec un SI qui test si 1
et je renvoie le deuxième SI avec la condition de temps :

j’ai tout bon ? :slight_smile:

merci

En regardant en diagonal ta condition, cela me paraît OK car elle ne peut être juste sans que #[Chambre Lyne][MiBox_V][Statut]# ne soit égal à 1.

1 « J'aime »

Comment tu récupères le statut de la mibox ? Tu px l’allumer, l’éteindre aussi ? Changer de chaîne etc… ?
Merci

Avec le plugin network, il y a un ping qui est fait

Ok donc juste le statut et pas de contrôle de la mibox ? Tu as essayé avec Google cast de prendre le contrôle ?

Bonjour,

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

Local Time est à la bonne heure :
pi

Bonjour,

Là ça dépasse mes compétences.
La formule que je t’ai donné fonctionne chez moi mais sur une VM sous Debian Buster.

En plus la mibox se réveil (tjs en veille) de temps en temps pour ca hyper important de tester si elle est vraiment pendant x minutes… :

en fonctionnement

C’est corrigé kwet :wink:

1 « J'aime »

je viens d’enlever le petit PS : merci à toi :wink:

2 « J'aime »

apparemment un bug connu en V4 que le valuedate perde les valeurs :

1 « J'aime »

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.

oui après faut savoir convertir la fonction en bloc code…

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.