Début avec les plug-in

Bonjour,

J’essaye de développer un plug-in, après avoir lut le tutoriel de ZygOm4t1k je rencontre un pb.

En effet pour commencer je voulais juste que mon plug-in créer un commande info (numeric) et une action (un spider) pour pouvoir la modifier. Le tout avec les widget de basse.

La création se passe bien, je peu modifier manuellement ma commande info (via un scénario) par contre ma commande action reste sans effet.

ci dessous ma fonction postSave et mon plugin s’appelle « liteAuto »

  public function postSave() {
		$info = $this->getCmd(null, 'duree');
		if (!is_object($info)) {
			$info = new liteAutoCmd();
			$info->setLogicalId('duree');
			$info->setName(__('Durée', __FILE__));
			$info->setIsVisible(0);
			$info->setisHistorized(0);
		}
		$info->setEqLogic_id($this->getId());
		$info->setType('info');
		$info->setSubType('numeric');
		$info->save();

		$action = $this->getCmd(null, 'var_duree');
		if (!is_object($action)) {
			$action = new liteAutoCmd();
			$action->setLogicalId('var_duree');
			$action->setName(__('Var_Durée', __FILE__));
		}
		$action->setEqLogic_id($this->getId());
		$action->setConfiguration('infoName', $info->getId());
		$action->setValue($info->getId());
		$action->setType('action');
		$action->setSubType('slider');
		$action->save();
  }

Je ne vois pas quoi changer.
Merci

Bonjour,

Changer pour faire quoi?

si vous voulez que la commande action fasse une action alors il faut coder … l’action ! ca ne va pas se faire tout seul
cf. la doc et la methode execute


sinon c’est inutile de refaire le save des commandes à chaque postSave si la commande existe déjà

Bonjour,

Je pensait qu’en utilisant les widget standard cela fonctionnerait.

Sur le dashbord j’obtient la tuille suivante :
Capture d’écran 2024-03-17 à 17.49.56

et lorsque que fait varié le spider la Durée ne varie pas.

Hello,

C’est un slider pas un spider :wink:.

Un widget n’est qu’un affichage, il ne se passera donc rien en faisant bouger le slider sauf changer la valeur du slider lui même.

Il faut donc prendre en compte ce changement dans le code du plugin, comme l’indique Mips, et faire les actions souhaité donc par exemple définir la valeur de la commande info.

Bonjour,
J’ai eu le même besoin.

Ma commande a un id logic ‹ consigne_cursor ›
Quand on bouge le slider, cela lance la fonction execute.
Je souhaite mettre à jour ma commande de type info pour voir la valeur qui s’appelle consigne. voilà le bout de code que j’ai mis en place et qui fonctionne :

class thermoPIDCmd extends cmd {
  // Exécution d'une commande
  public function execute($_options = array()) {
    if ($this->getLogicalId() == 'consigne_cursor') {
      $eqlogic = $this->getEqLogic();
      $cmd = $eqlogic->getCmd('info', 'consigne');
      $cmd->event($_options['slider']);
      //$eqlogic->execute();
    }
  }
}

Je ne pense pas qu’il soit utile de vous répéter sans avoir fait le moindre changement de votre côté, cf. ma réponse précédente :wink:

Il manque un bout important car ce code ne fonctionne pas :wink:
(Toujours la méthode execute)

De ce que j’avais compris c’est le widget qui va fournir le code .execute :

    mySlider1773.on('change', function(values, handle) {
      jeedom.cmd.execute({id: '1773', value: {slider: values[handle].replace('', '').trim()}})
    })

Qui permet de mettre à jour la valeur de la commande info ?

ok, merci.

Je pense avoir compris, il faut que je modifie la fonction public function execute($_options = array()) de mon fichier liteAuto.class.php ?

1 « J'aime »

Le widget execute la commande action, le code de la commande action est dans la methode execute de la class

Mais tout ca est expliqué dans la doc que vous avez commencez, (re)lisez la doc.

Oui, c’est vrai, j’ai oublié un bout important

Edit : j’ai modifié mon exemple

Il est préférable d’utiliser la fonction checkAndUpdateCmd() de l’eqLogic. Cette fonction effectue quelques vérifications (est-ce que l’équipement est actif, par exemple) et valide la valeur avant d’appeler la fonction event() de la commande.

checkAndUpdateCmd($_logicalId, $_value, $_updateTime = null)
$_logicalId peut être le logicalId de la commande à mettre à jour ou un objet cmd.

1 « J'aime »

Bonjour,

du coup j’ai modifier ma fonction execute de la façon suivante :

  public function execute($_options = array()) {
    $eqlogic = $this->getEqLogic()->getId();
    log::add('liteAuto','debug','Exécution de la fonction Execute par ' . eqLogic::byId($eqlogic)->getHumanName());
    $eqlogic = $this->getEqLogic()->getId();
    switch ($this->getSubType()) {
    	case 'slider':
        	log::add('liteAuto','debug','- Action sur Slider');
        	$virtualCmd = virtualCmd::byId($this->getConfiguration('infoName'));
        	$value = $_options['slider'];
        	$result = jeedom::evaluateExpression($value);
        	$virtualCmd->event($result);
    	break;
    }
  }

Il faut donc que je mette ce code dans la fonction checkAndUpdateCmdet que je modifie mes widget pour l’appeler ?

le code est un peu brouillon

  • y a 3 appels à getEgLogic qui ne servent à rien.
  • d’où vient ce « infoName » ? que veux-tu faire en fait?
  • les 2 lignes avec evaluateExpression ne servent à rien

Non.

Bonjour,

Je pense n’être pas trop mal ou, au moins, moins brouillons :

  public function execute($_options = array()) {
        log::add('liteAuto','debug','Exécution de la fonction Execute par ' . $this->getEqLogic()->getHumanName());
        switch ($this->getSubType()) {
        	case 'slider':
                log::add('liteAuto','debug','- Action sur Slider   ');
                $virtualCmd =virtualCmd::byId( $this->getConfiguration("infoName"))->getLogicalId();//Récupération du logicalId de la commande à modifier.
              	$eqlogic->checkAndUpdateCmd($virtualCmd, $_options['slider']);
        	break;
        }
  }

le « infoName » est définit dans le postSave et définit la commande de type info à modifier associé avec la commande

c’est pas la peine, c’est déjà géré par le core, c’est la value d’une commande action

sinon ca c’est pas clair:

$virtualCmd =virtualCmd::byId( $this->getConfiguration("infoName"))->getLogicalId();
  1. la variable se nomme virtualCmd mais tu y met un logicialId (un string), c’est trompeur; (et ca n’a rien d’une commande d’un virtuel :wink: )
  2. et en fait c’est inutile, passe l’objet commande directement à checkAndUpdateCmd qui gère ca;
  3. tu appelles la class virtualCmd qui appartient au plugin virtuel! si le plugin n’est pas installé, ton code crash.
  4. $eqlogic n’est défini null part, ca ne peut pas fonctionner

donc ces points ensembles donnent:

                $cmd = cmd::byId($this->getValue()); //Récupération de la commande à modifier.
              	$this->getEqLogic()->checkAndUpdateCmd($cmd, $_options['slider']);
              	// ou $cmd->event($_options['slider']; // comportement légèrement différent

(je n’ai pas testé, juste écrit ca sur community)

mais je ne comprend toujours pas le but :upside_down_face:

Donc la ligne suivante du postSave est inutile :

$action->setConfiguration('infoName', $info->getId());

sinon le code fonctionne.

Le but était de comprendre comment fonctionne les plug-in, le tutoriel de ZygOm4t1k est vraiment bien fait mais il n’explique pas comment modifier une commande info depuis une action (pas en passant le $cmd en argument à checkAndUpdateCmd).