J’étais partis dans l’idée de vérifier, avec mes volets, si l’état avait bougé après avoir donné l’ordre.
A la vue des lectures de ce post, il aurait été plus malin de donner une cible. Bref ce n’est pas vraiment finalisé je voulais essayer un truc quand j’ai vu que personne ne réagissait à ce post du 2 avril.
La fonction à ajouter dans user.function.class.php :
public static function ZwaveOrderCheck($_mycmd, $_mystate, $_mysleep='5') {
$_mycmd = '#'.trim($_mycmd).'#';
$_mycmdName = cmd::byString($_mycmd)->getHumanName();
$_mystate = '#'.trim($_mystate).'#';
$_mystateName = cmd::byString($_mystate)->getHumanName();
$_statebefore = cmd::byString($_mystate)->execCmd();
//log::add('zwaveordercheck', 'info', 'Lancement fonction ZwaveOrderCheck');
log::add('zwaveordercheck', 'info', '[Action demandée] -> '.$_mycmdName);
log::add('zwaveordercheck', 'info', '[Etat avant] -> '.$_mystateName.' : '.$_statebefore);
// Information sur l'état de la Queue Zwave
$networkState = openzwave::callOpenzwave('/network?type=info&info=getStatus');
$queueSize=$networkState['result']['outgoingSendQueue'];
//log::add('zwaveordercheck', 'info', '[Info] -> queuSize : '.$queueSize);
$i = 0;
$_stateafter = $_statebefore;
while ($_stateafter == $_statebefore) { // Tant que la valeur de l'état après action est différente de l'état avant action, on recommence
if ($queueSize == 0) {
cmd::byString($_mycmd)->execCmd(); // Execution de la commande demandée
if ($i > 1) {
log::add('zwaveordercheck', 'warning', '[Action] -> '.$_mycmdName.' [execution '.$i.']');
} else {
log::add('zwaveordercheck', 'info', '[Action] -> '.$_mycmdName);
}
if ($i == 3) {
break;
} // Si 3 retry on abandonne
sleep($_mysleep); // Stoppe pour $_mysleep secondes (5 par defaut)
$_stateafter = cmd::byString($_mystate)->execCmd();
log::add('zwaveordercheck', 'info', '[Etat après] -> '.$_mystateName.' : '.$_stateafter);
$i++;
} else {
log::add('zwaveordercheck', 'info', '[Info] -> queuSize : '.$queueSize);
sleep(1);
// Information sur l'état de la Queue Zwave
$networkState = openzwave::callOpenzwave('/network?type=info&info=getStatus');
$queueSize=$networkState['result']['outgoingSendQueue'];
}
}
if ($_stateafter == $_statebefore) {
log::add('zwaveordercheck', 'warning', '[Info] -> '.$_mycmdName. ' ne semble pas avoir été éxécutée');
return 0;
} else {
log::add('zwaveordercheck', 'info', '[Action éxécutée] -> '.$_mycmdName);
return 1;
}
}
L’idée étant de lancer la commande de cette façon :
La commande pour un UP du volet donc : ZwaveOrderCheck([Bureau][Bureau][Up],[Bureau][Bureau][Etat],7)
On peux donc fournir 2 ou 3 paramètres :
- Le nom de la commande à lancer
- Le nom de l’état qui est à vérifier
- Le temps d’attente pour check si l’état a bougé (optionnel et défini à 5 secondes sinon)
Note : ne pas mettre le nom de la commande entre # sinon elle est interprétée avant d’arriver à la fonction, je n’ai pas trouvé le moyen de la récupérer sans cette feinte, surement un truc que je n’ai pas compris.
Pour les logs j’ai installé le plugin LogManager afin d’avoir une entrée « zwaveordercheck » bien distinct
Il y a assurément mieux à faire et c’est pour ça que je demandais si quelqu’un de plus calé ne voulais pas se lancer mais ça peut faire une base à quelqu’un qui s’y connait un peu mieux et qui voudrait l’améliorer 