Comment utiliser une variable comme déclencheur (listener)?

Bonjour,

pour le plugin « Séquencement d’action », je souhaiterais proposer à l’utilisateur d’utiliser les variables du core et non uniquement des commandes comme déclencheur.

Pour ça j’ai ajouté dans la page de configuration le « sélectionneur de variable » lié au JS suivant

$("body").off('click','.bt_selectDataStoreTrigger').on( 'click','.bt_selectDataStoreTrigger', function (event) {
  var el = $(this).closest('.form-group').find('.expressionAttr[data-l1key=cmd]');
  jeedom.dataStore.getSelectModal({cmd: {type: 'info'}}, function (result) {
    el.value(result.human);
  });
});

Jusque là pas de soucis, ça me génère un truc du genre #variable(nom_variable)#.

Ensuite lors de la création de ma commande, j’utilise le même code que si l’utilisateur me passait une commande pour passer cette variable dans ma commande (commande de type ‹ info ›) : $cmd->setValue($sensor['cmd']);

Une fois la commande créée je vois bien ma variable dans le champ « Commande déclenchant une mise à jour » (format #variable(nom_variable)#, avec les #).

Et dans ma fonction execute, si je retourne jeedom::evaluateExpression($this->getValue()) alors je vois des trucs du genre #6#. Donc je vire les # avec :

return str_replace('#', '', jeedom::evaluateExpression($this->getValue()));

Jusque là si je change ma valeur de variable via un scenario ou via l’interface de gestion des variables, je vois bien dans les logs la valeur de la variable (en temps réel).

Les soucis commencent quand je veux un « listener » sur cette variable.

  • Premier problème :
    Pour mettre un listener sur une commande je fais :
        $listener = listener::byClassAndFunction('sequencing', 'triggerLaunch', array('sequencing_id' => intval($this->getId())));
        if (!is_object($listener)) { // s'il existe pas, on le cree, sinon on le reprend
          $listener = new listener();
          $listener->setClass('sequencing');
          $listener->setFunction('triggerLaunch'); // la fct qui sera appelée a chaque event sur une des sources écoutée
          $listener->setOption(array('sequencing_id' => intval($this->getId())));
        }
        $listener->addEvent($cmd->getValue()); // on ajoute les event à écouter de chacun des capteurs definis. On cherchera le trigger a l'appel de la fonction

        log::add('sequencing', 'debug', $this->getHumanName() . ' - sensor listener set - cmd :' . $cmd->getHumanName() . ' - event : ' . $cmd->getValue());

        $listener->save();

Ici si le $listener->addEvent($cmd->getValue()); est une variable, avec les # ou sans (j’ai testé les 2), la fonction associée au listener n’est jamais appelée.

Ma question est donc : est-il possible d’associer un listener sur une variable ? et oui comment ? si non : comment faire autrement ? On regarde dans la fonction execute si on a reçu un truc avec des # et si c’est le cas on en déduit que c’est une variable et donc on appelle la fonction qui va bien ?? C’est un peu lourd, non ?

  • Second problème :
    Si au lieu de changer la valeur de ma variable via un scenario ou manuellement sur l’interface, j’utilise l’API http (http://#IP_JEEDOM#/core/api/jeeApi.php?apikey=#APIKEY#&type=variable&name=#NAME#&value=#VALUE#), alors dans ma fonction execute, je ne reçois plus la valeur, mais juste «  » (string vide). Et à partir de là toute nouvelle valeur de la variable, quelque soit la methode d’assignation est reçu comme une string vide. Il faut relancer l’enregistrement de l’eqLogic pour (parfois) retrouver le comportement initial…
    Bref, ca marche pas du tout !

Auriez-vous des solutions ou des pistes (quels plugins gère ça ?) pour arriver à gérer des variables comme déclencheurs ?

Merci d’avance !
AgP