Récupération de la valeur précédente d'une commande dans un scénario

Bonjour,

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.
image
(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é :

Du coup, je ne comprends pas pourquoi je ne récupère pas mon ancienne valeur.

La seule chose où j’ai un doute, c’est que Trigger() me renvoie le nom de la commande sans les # autour. Y aurait-il une erreur de syntaxe ?

Salut, hum est ce que tu peux stp donner un cas concret d’utilisation pour qu’on puisse comprendre le cas d’usage et t’aiguiller au mieux ?

Non justement, c’est « normal » avec cette syntaxe la. Tu as essayé de les ajouter dans ta formule ?

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 :

  • A → 100
  • B → 98
  • C → 99
  • D → 97

Pour la syntaxe, du coup je ne comprends pas la réponse.

J’ai bien fait ou il faut que je me débrouille pour rajouter les # ?
Dans ce cas, je ne vois pas comment procéder.

Ben lastBetween(#trigger()#,1 min ago) ?

Non, j’ai déjà essayé, ça marche pas.

Tu peux écrire dans un log pour voir comment jeedom l’interprète ?

Sinon peut être passer par un tag intermédiaire qui contiendrait #trigger()# et tu ajoute ce tag dans ta formule ensuite ?

Pour le tag, j’avais pas testé mais j’étais passé par une variable. Ca semble avoir le même fonctionnement et du coup, ça ne fonctionne pas mieux.


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.

Ben plutot que d’utiliser la commande variable pour mettre à jour une variable, tu utilises la commande log

OK, merci

Hélas, rien de bien concluant :


Bonsoir,

Tu ne pourra pas le faire, lastBetween attend un id en paramètre, hors tu lui envoie le humanName ( [piece][equipement][commande] )

Et pas possible de récupérer l’ID du trigger ?

Par bloc code oui.

Là ça dépasse mes compétences… :face_with_spiral_eyes:

Attendre la 4.5.

Finalement en tâtonnant un peu et en récupérant du code à droite à gauche, j’ai réussi à me débrouiller à récupérer l’ID :

$scenarioTriggerID = $scenario->getRealTrigger();
$equipmentID = str_replace('#', '', $scenarioTriggerID);	
$tags['#ID_Trigger#'] = $equipmentID;
$scenario->setTags($tags);

Et ça marche !!


Merci à tous pour votre aide !

2 « J'aime »

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.

tu ne peut pas recopier ta valeur te ta variable « declencheur » dans « last declencheur » avant de l’affecter avec la nouvelle valeur ?

1 « J'aime »

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.