Merci @Henri .
Je n’ai pas les mêmes besoins que toi. Ca n’a rien à voir avec le nombre de commandes que tu as.
J’ai besoin d’afficher ou de récupérer les temps restants avant retour à l’état initial dans 5 applications différentes :
- Temps restant avant reprise d’un brasseur d’air mis en pause forcée de 30 mn
- Temps restant d’un minuteur de cuisine
- Temps restant d’arrosage du jardin
- Temps restant du cycle d’une couveuse avant de passer au cycle suivant
- Temps restant d’un traitement thermique automatisé
J’ai vu que d’autres gens avaient des besoins similaires (comme Sarakha et sa tondeuse La domotique pour une Maison Connectée Élégante ou d’autres sur le forum. Il suffit de taper « minuteur ».)
Chacun trouve sa façon de faire.
Les scénarios sont une façon de faire, car on peut tout faire avec, mais je trouve dommage d’utiliser des scénarios pour ça. Je préfère les utiliser pour de l’automatisme ou des workflows.
J’ai donc développé les fonctions qui me manquaient et les ai ajoutées dans mon fichier user.function.class.php.
Voici les fonctions si d’autres souhaitent s’en inspirer voir compléter (par exemple modifier dynamiquement la valeur d’un retour d’état ou le temps avant retour d’état) :
// Retrieve returnStateTime configuration of a command
public static function getCmdReturnStateTimeConfiguration($_cmd = '') {
$cmd = cmd::byString($_cmd);
if (is_object($cmd)) {
return $cmd->getConfiguration('returnStateTime', null);
}
}
// Retrieve returnStateValue configuration of a command
public static function getCmdReturnStateValueConfiguration($_cmd = '') {
$cmd = cmd::byString($_cmd);
if (is_object($cmd)) {
return $cmd->getConfiguration('returnStateValue', null);
}
}
// Retrieve the scheduled timestamp when a command will return to its returnStateValue
public static function getCmdReturnStateScheduledTimestamp($_cmd = '') {
$cmd = cmd::byString($_cmd);
if (is_object($cmd)) {
$value = $cmd->execCmd();
if (is_numeric($cmd->getConfiguration('returnStateTime')) && $cmd->getConfiguration('returnStateTime') > 0 && $value != $cmd->getConfiguration('returnStateValue') && trim($cmd->getConfiguration('returnStateValue')) != '') {
$cron = cron::byClassAndFunction('cmd', 'returnState', array('cmd_id' => intval($cmd->getId())));
if (is_object($cron)) {
$returnStateDate = $cron->getNextRunDate();
$returnStateDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $returnStateDate);
return $returnStateDateTime->getTimestamp();
}
}
}
}
// Retrieve the remaining time in seconds before a command returns to its returnStateValue
public static function getCmdReturnStateRemainingDuration($_cmd = '') {
$cmd = cmd::byString($_cmd);
if (is_object($cmd)) {
$value = $cmd->execCmd();
if (is_numeric($cmd->getConfiguration('returnStateTime')) && $cmd->getConfiguration('returnStateTime') > 0 && $value != $cmd->getConfiguration('returnStateValue') && trim($cmd->getConfiguration('returnStateValue')) != '') {
$cron = cron::byClassAndFunction('cmd', 'returnState', array('cmd_id' => intval($cmd->getId())));
if (is_object($cron)) {
$now = new DateTime("now");
$returnStateDate = $cron->getNextRunDate();
$returnStateDateTime = DateTime::createFromFormat('Y-m-d H:i:s', $returnStateDate);
return $returnStateDateTime->getTimestamp()-$now->getTimestamp();
}
}
}
}
// Retrieve the remaining time in H:i:s before a command returns to its returnStateValue
public static function getCmdReturnStateRemainingDurationHis($_cmd = '') {
$seconds = self::getCmdReturnStateRemainingDuration($_cmd);
if (is_numeric($seconds)) {
return gmdate('H:i:s', $seconds);
}
return $seconds;
}
On peut ainsi les utiliser n’importe où : dans des scénarios, dans des commandes info virtuelles, …
Universel et je ne pollue pas ma liste de scénario d’un n-ème scénario spécifique.
Il me reste à travailler sur le widget pour avoir un timer dynamique tout en évitant de « rafraichir » la commande. Je ne souhaite pas solliciter inutilement Jeedom pour un besoin d’affichage dynamique.
Je pense utiliser le widget de @Bad qui répond à mon besoin Décompte à la seconde / Widgets v4 - #22 par Bad
PS : c’est effectivement un cron qui est lancé pour faire un retour d’état. Le cron disparaît une fois que le retour d’état a eu lieu → Pas de cron, pas de retour d’état en cours.
Je vais chercher les infos en base puisqu’il est associé à la commande.
Voir documentation de la fonction cmd->checkReturnState() (https://jeedom.github.io/documentation/phpdoc/classes/cmd.html)
public function checkReturnState($_value) {
if (is_numeric($this->getConfiguration('returnStateTime')) && $this->getConfiguration('returnStateTime') > 0 && $_value != $this->getConfiguration('returnStateValue') && trim($this->getConfiguration('returnStateValue')) != '') {
$cron = cron::byClassAndFunction('cmd', 'returnState', array('cmd_id' => intval($this->getId())));
if (!is_object($cron)) {
$cron = new cron();
}
$cron->setClass('cmd');
$cron->setFunction('returnState');
$cron->setOnce(1);
$cron->setOption(array('cmd_id' => intval($this->getId())));
$next = strtotime('+ ' . ($this->getConfiguration('returnStateTime') + 1) . ' minutes ' . date('Y-m-d H:i:s'));
$cron->setSchedule(cron::convertDateToCron($next));
$cron->setLastRun(date('Y-m-d H:i:s'));
$cron->save();
}
}
Pour finir, un grand merci @kiboost pour son super article qui m’a donné la piste pour coder ses fonctions
L’article m’a donné des tas d’exemple de code et m’a mené à la doc officielle sur l’ajout de fonctions :
https://doc.jeedom.com/fr_FR/core/4.0/scenario#Ajout%20de%20fonction%20php
Merci également à de nombreux autres dont les exemples postés sur le forum m’ont permis d’ajuster ces fonctions. Comme @winhex : [tuto] bloc code PHP scénario (petite commande simple) - Forum Communauté Jeedom
Et enfin merci @Bad pour son tuto vidéo sur les Widgets, et son widget de décompte. Tout est dans cette discussion Décompte à la seconde / Widgets v4 - #22 par Bad