Scénario sur front montant

Ok merci, je test demain, j’ai coché les cases entourées en jaune.

J’y réfléchis…

J’allais te dire de programmer des horaires spécifiques mais je vois que @loic est en train de répondre :sweat_smile:

J’avais jamais fais gaffe à ça !!
repetitionScenario

Effectivement maintenant que tu le dis ça parait évident

C’est mieux comme ça ? :sweat_smile:

A priori oui :disappointed_relieved:

Je test aussi sur mes scénarios de consigne de chauffage pour limiter les appels inutiles justement !

Edit: Nickel !!

[2019-11-04 22:30:27][SCENARIO] Exécution du sous-élément de type [condition] : if
[2019-11-04 22:30:27][SCENARIO] Evaluation de la condition : [21 > 20+0.5] = Vrai
[2019-11-04 22:30:27][SCENARIO] Non exécution des actions pour cause de répétition
[2019-11-04 22:30:27][SCENARIO] Fin correcte du scénario

En méditant à ce que tu proposes Loïc, j’ai le risque que la commande s’active alors que je suis la zone rouge alors que je souhaite uniquement le déclencher au front montant dans la zone jaune :face_with_monocle:

:no_mouth::zipper_mouth_face:

Normalement ça ne s’activera que lors du front montant grâce au blocage des répétitions de valeur (que ce soit sur l’info en elle-même ou dans le scénario).

J’avais justement le même besoin, j’ai préféré agir directement sur la commande pour éviter que la valeur se répète, et donc un scénario de cette commande = 1 ne s’activera que lors du front montant.

Après quelques tests, le bloquage des répétitions n’est pas la solution. Est ce que une condition existe afin de prendre uniquement un front montant ? Ce qui exclut la condition binaire 1 ou 0.

Bonjour
Je vois pas pk ça ne marcherait pas… Si tu dis que quand ça vaut 1 et que une fois tant qu’on repasse pas par 0 alors c’est équivalent a un front montant

Exemple:
Le déclencheur est mon absence de la zone de géolocalisation

Dans ma condition j’ai « si je suis présent dans la zone et que mes clés sont absentes » alors j’ouvre le portillon mais cette condition s’exécute Également quand je pars de chez moi. C’est pour cette raison que je cherche le moment du passage de 0=>1

Et en introduisant une variable ?

Si Etat == 1 ET Variable_Etat == 0 → ouverture portillon
Variable_Etat = Etat

Oulalala, je n’ai pas réussi à te suivre, je ne suis pas à l’aise avec les variables…

S’il n’y a pas de répétition de valeurs il n’y a aucune raison pour que ton scénario s’exécute quand tu t’en vas. J’utilise tous les jours des scénarios basés sur des fronts montant uniquement (typiquement pour détecter une arrivée) et il n’y a aucun soucis.

@artpol

Dans scénario il y a une partie « Variables »
image

Je proposais de définir une variable servant à mémoriser le dernier état de ta géolocalisation (LastGeocState)

Donc de rajouter au niveau de la flêche bleue un contrôle sur ce LastGeocState pour savoir s’il était à 0 ou 1 afin de vérifier si tu as un passage de 0 à 1 ou de 1 à 0.

Dans le bloc « Si » il faudrait donc ajouter la condition : variable(LastGeocState) == 0

En dehors du bloc « Si » pour que l’action s’exécute toujours, pousser la valeur de [géolocalisation][Eta] dans cette variable LastGeocState :
Action : variable
Nom : LastGeocState
Valeur : [géolocalisation][Eta]

Tu vois l’idée ?

Voici une manière plus générale pour déterminer un front.

Merci pour ta réponse, je m’intéresser à l’intégration de la variable

Dans le fond ça me parait bien mais c’est la mise en forme dans mon scénario que je ne saurai pas faire…
Merci encore !

Tu peux mettre ça en scène de cette manière :

/*
Détermine pour une commande info historisée si elle est en front montant ou en front descendant
Le tag #FRONT# retourné prend les valeurs suivantes
	0 : Front Descendant
	1 : Front Montant
	2 : Pas de Front
	3 : Commande info non historisée
	4 : Commande inexistante
*/

$cmdName = '#[Ma][Commande Info][Historisée]#';
$front = 4;
try {  
  $cmd = cmd::byString($cmdName);
  $front = 3;
  $scenario->setLog('bdd ' . $cmd->getId() . ' : ' . $cmd->getHumanName());
  $debut = date("Y-m-d H:i:s", strtotime("2 months ago"));
  $fin = date("Y-m-d H:i:s", strtotime("now"));  
  $all = history::all($cmd->getId(), $debut, $fin);
  $valCmdAct = count($all) ? $all[count($all) - 1]->getValue() : null;
  $valCmdPre = count($all) >=2 ? $all[count($all) - 2]->getValue() : null;
  if (($valCmdAct <> null) and ($valCmdPre <> null)) {
    $front = 2;
    $scenario->setLog('Valeur Précédente : ' . $valCmdPre);
    $scenario->setLog('Valeur Actuelle : ' . $valCmdAct);
    if ($valCmdAct > $valCmdPre) {
      $front = 1;
    }
    if ($valCmdAct < $valCmdPre) {
      $front = 0;
    }
  }
} catch(Exception $e) {
  message::add('Scénario ' . $scenario->getHumanName(),$e->getMessage(),'Détermination d\'un Front');
}
    
$scenario->setLog('Front : ' . $front);  

$tags['#FRONT#'] = $front;
$scenario->setTags($tags);

Salut
Peux-tu expliquer comment tu arrives avec : #[Ma][Commande Info][Historisée]#
Si je prends un capteur de porte xiaomi (#[Laborat][OpenClose 2][Ouverture]#) par exemple dans mon cas je mets quoi ?
Le declencheur du scenario c’est bien ta commande ?

D’avance merci

Je ne connais pas ce type d’équipement, mais si c’est une commande info et qu’elle est historisée ben tu mets ça.

Le déclencheur, c’est ce que tu veux quand tu veux savoir si tu es en front montant ou en front descendant.

1 « J'aime »