J’essaye de faire un scénario qui peut être déclenché par le changement de valeur de plusieurs commandes.
Ce que je souhaite faire, c’est à la fois :
Copier la nouvelle valeur de la commande qui a déclenché le scénario dans une variable
Copier la précédente valeur de la commande qui a déclenché le scénario dans une autre variable
Pour cela, j’utilise la commande TriggerValue() pour avoir la nouvelle valeur et pour l’ancienne valeur, j’utilise Lastbetween combiné avec la commande trigger().
Autant la récupération de la nouvelle valeur fonctionne sans souci
Autant, je n’ai pas le résultat escompté pour l’ancienne valeur. J’obtiens un résultat vide.
Voilà le contenu du log :
Ce que je ne comprends pas, c’est que si j’utilise le testeur d’expression avec la commande en dur, j’ai bien un résultat.
(au passage, je suis obligé de laisser vide le 2è argument de Lastbetween sinon, la commande me retourne une valeur vide… pas très logique mais en l’état, ça fonctionne)
Et en positionnant une variable temporaire pour vérifier que ce Trigger() me renvoie la bonne commande, j’ai bien le résultat escompté :
Pour le cas concret :
J’ai ma commande qui a la valeur 98 à l’instant T-1
A l’instant T, avec un curseur (+), je passe à 99
Mon scénario se déclenche et envoie le 98 dans une variable et 99 dans une autre.
L’idée derrière ça c’est d’avoir une liste de priorité pour des consommateurs électriques.
Imaginons que j’en ai 4 :
(J’ai un autre scénario qui va analyser les priorités et allumer les équipements en partant de la plus forte jusqu’à la plus faible, mais c’est pas le sujet.)
Par exemple :
A → 100
B → 99
C → 98
D → 97
Ces 4 priorités sont des commandes Info dans un virtuel.
Je veux pouvoir passer C à 99 mais que du coup, que B passe à 98 afin de ne pas avoir 2 priorités identiques.
Le principe de mon scénario est donc d’enregistrer la valeur qui vient de changer et son ancienne valeur pour savoir quelle place a été libérée. Cela remonte dans des variables communes (NouvelleValeur et AncienneValeur).
A côté, j’ai 1 scénario par équipement dont le déclencheur est que la NouvelleValeur soit égale à la priorité enregistré dans le virtuel. Ce scénario remplace simplement la priorité de l’équipement par AncienneValeur.
En résumé :
C passe de 98 à 99
Ca déclenche le scénario principal
98 → AncienneValeur
99 → NouvelleValeur
Le passage à 99 de NouvelleValeur déclenche le scénario individuel de B
AncienneValeur → Priorité B
(Normalement le scénario individuel de C va également être déclenché par rebond mais je vérifierai si le changement est très récent et donc j’interromprai le scénario)
A la fin j’ai :
Pour ce qui est du log, là ça m’intéresse car effectivement j’ai des doutes sur l’interprétation des expressions. J’ignore hélas comment procéder, je veux bien des infos.
Pour que le passage en 4.5 ne perturbe pas ton scénario, je te conseil ceci :
$tags = $scenario->getTags(); // récupère les tags existants.
if (!isset($tags['#trigger_id#'])) {
$trigger = $scenario->getRealTrigger(); // existe plus en 4.5
$tags['#trigger_id#'] = str_replace('#', '', $trigger);
$scenario->setTags($tags);
}
En gros en 4.5 le tag trigger_id contient déja l’id du trigger, l’idée avec ce bloc code, c’est que si pas de trigger_id ( donc < 4.5 ) tu set trigger_id avec la fonction getRealTrigger, sinon ( >= 4.5) tu fait rien car déja existant.
C’est exactement ce que je suis venu proposer. Dans le scénario :
1- variable last value = variable new value
2- variable new value = commande
Avec évidemment en déclencheur la commande.