Pas de soucis
Sur ma vraie VM, la variable est créé par un scénario qui surveille l’activation de mes lumières ou prises sur lesquelles j’ai défini des durées d’activation max.
Quand le compteur arrive à 0, cela me demande si je veux couper ou non l’équipement (coupure en cas de non réponse) et sinon je repousse avec un délai de mon choix.
L’objectif ici est que :
- si l"équipement est activé et que le compteur commence
- mais que j’éteins l’équipement avant que le compteur n’arrive à 0
- cela efface le compteur pour qu’à la prochaine activation, il reparte de X (par exemple 3h pour 15 minutes
Je ne sais pas si c’est clair
Au cas où
Le scénario en question (fonctionne depuis une dizaine d’année), cron à 5 minutes
require_once dirname(__FILE__) . '/../../data/php/user.function.class.php'; //Ajout des fonctions personnelles
function demande($cmd_id,$question,$reponse,$variable_reponse,$timeout) {
$options_cmd = array('title' => '', 'message' => $question, 'answer' => explode(';', $reponse), 'timeout' => $timeout, 'variable' => $variable_reponse);
$cmd = cmd::byString($cmd_id);
$cmd->setCache('ask::variable', $variable_reponse);
$cmd->setCache('ask::endtime', strtotime('now') + $timeout);
$cmd->setCache('ask::answer', $options_cmd['answer']);
$cmd->execCmd($options_cmd);
$occurence = 0;
$value = '';
while (true){
$dataStore = dataStore::byTypeLinkIdKey('scenario', -1, $variable_reponse);
if (is_object($dataStore)){
$value = $dataStore->getValue();
}
if ($value != ''){
break;
}
if ($occurence > $timeout){
break;
}
$occurence++;
sleep(1);
}
if ($value == ''){
$value = 'Aucune réponse';
$cmd->setCache('ask::variable', 'none');
$dataStore = dataStore::byTypeLinkIdKey('scenario', -1, $variable_reponse);
$dataStore->setValue($value);
$dataStore->save();
}
return $value;
}
//Récupération du demandeur
$tags = $scenario->getTags();// Récupération des tags passés
(empty($tags['#TelegramSource#'])) ? $tags['#TelegramSource#'] = '#[Communication][Telegram][Maison - -]#' : null;// Vérification de l'existance du tag, si ce dernier n'existe pas, on le crée avec la valeur souhaité.
$cmdmsg_id = $tags['#TelegramSource#'];
$surveillance = array(
array('Commandes suivies','Libellé','Type (Singulier/Pluriel)','Seuil en minutes'),
array('#[Bureau][FWP][Etat]#','La prise de l\'imprimante','S','#[Configuration][Lumières - Timers][Imprimante]#'),
array('#[Salle de bain][Brosse à dents][Etat]#','La base de la brosse à dents','S','#[Configuration][Lumières - Timers][Brosse à dents]#'),
array('#[Extérieur][Lumière][Etat]#','La lumière de dehors','S','#[Configuration][Lumières - Timers][Extérieur - Lumière]#'),
array('#[Extérieur][Lumière Baie][Etat]#','La lumière de la baie','S','#[Configuration][Lumières - Timers][Extérieur - Lumière Baie]#'),
array('#[Zone Nuit][Spots][Etat]#','Les spots du couloir','P','#[Configuration][Lumières - Timers][Zone Nuit - Spots]#'),
array('#[Salon][Spots][Etat]#','Les spots du salon','P','#[Configuration][Lumières - Timers][Salon - Spots]#'),
array('#[Cuisine][Spots][Etat]#','Les spots de la cuisine','P','#[Configuration][Lumières - Timers][Cuisine - Spots]#'),
array('#[Cuisine][Lumière Table][Etat]#','La lumière de la table de la cuisine','S','#[Configuration][Lumières - Timers][Cuisine - Lumière Table]#'),
array('#[Cuisine][Lumière Evier][Etat]#','La lumière de l\'évier de la cuisine','S','#[Configuration][Lumières - Timers][Cuisine - Lumière Evier]#')
);
$scenario->setLog('Lancement de la boucle de surveillance');
for($i = 0; $i < count($surveillance); $i++) {
if ($i > 0) {
$cmd = cmd::byString($surveillance[$i][0]);
$cmd_id = $cmd->getId();
$cmd_name = $cmd->getHumanName();
$cmd_subtype = $cmd->getSubType();
$value = $cmd->execCmd();
$eqlogic_id = $cmd->getEqLogic_id();
$eqlogic = eqLogic::byId($eqlogic_id);
$eqlogic_name = $eqlogic->getName();
$eqlogic_object = substr($eqlogic->getHumanName(),1,strlen($eqlogic->getHumanName())-1-2-strlen($eqlogic_name)-1);
$eqlogic_name2 = str_replace(' ','',$eqlogic_name);
$eqlogic_object2 = str_replace(' ','',$eqlogic_object);
$seuil = cmd::byString($surveillance[$i][3])->execCmd();
$scenario->setLog($i . ' - ' . $surveillance[$i][0] . ' - ' . $surveillance[$i][1] . ' - ' . $surveillance[$i][2] . ' - ' . $seuil);
// Calcul durée On
$duree_on = 0;
if ($cmd_subtype == 'binary' && $value == 1) {
$duree_on = scenarioExpression::laststateduration($cmd_id,1);
} else if ($cmd_subtype == 'numeric' && $value >= 1) {
$duree_on = scenarioExpression::lastChangeStateDuration($cmd_id,0) - scenarioExpression::lastStateDuration($cmd_id,0);
}
// Si dépassement du seuil : action
$seuil_en_sec = $seuil*60;
if ($duree_on > $seuil_en_sec) {
$scenario->setLog('- Allumage de ' . $cmd_name . ' depuis ' . $duree_on . ' secondes (seuil : ' . $seuil_en_sec . ').');
$variable_reponse = 'Suivi_'. $eqlogic_object2 . '_' . $eqlogic_name2; // nom de la variable qui stockera la réponse
$variable_compteur = $variable_reponse . '_compteur';
// Si compteur actif est supérieur à la dernière diminution de 5 minutes, on modifie le compteur sinon action
if ($scenario->getData($variable_compteur) > (5 / 60)) {
$scenario->setData($variable_compteur,round($scenario->getData($variable_compteur) - 1 * 5 / 60,4));
} else if ($cmd_name <> '[Salle de bain][Brosse à dents][Etat]' || ($surveillance[$i][0] == '[Salle de bain][Brosse à dents][Etat]' && (date('Hi')>0620 && date('Hi')<2240))) {
$scenario->removeData($variable_reponse);
//Paramètres du ask
if ($surveillance[$i][2] == 'P') {
$question = $surveillance[$i][1] . ' sont allumés depuis plus de ' . userFunction::secondsToTime($seuil_en_sec) . '. Souhaitez-vous les éteindre ?';
} else {
$question = $surveillance[$i][1] . ' est allumée depuis plus de ' . userFunction::secondsToTime($seuil_en_sec) . '. Souhaitez-vous l\'éteindre ?';
}
$reponse = 'Oui;Non';
$timeout = '60'; // time out pour la réponse
$scenario->setData($variable_reponse,'');//On vide la variable
$value = demande($cmdmsg_id,$question,$reponse,$variable_reponse,$timeout);
//Traitement de la reponse
if ($value == 'Aucune réponse' || $value == 'Oui'){
$cmd = cmd::byString('#[' . $eqlogic_object . '][' . $eqlogic_name . '][Off]#');
$cmd->execCmd();
$msg = 'J\'ai éteint ' . strtolower($surveillance[$i][1]) . '.';
$cmd = cmd::byString($cmdmsg_id);
$cmd->execCmd($options=array('title'=> "empty=1",'message'=> $msg), $cache=0);
$scenario->removeData($variable_reponse);
} else if ($value == 'Non'){
$scenario->removeData($variable_reponse);
//Paramètres du ask
$question = 'Pendant combien d\'heures souhaitez-vous reporter le suivi ?';
$reponse = '1;2;3;4;5;6';
$variable_reponse = $variable_compteur;
$timeout = '60'; // time out pour la réponse
$scenario->setData($variable_reponse,'');//On vide la variable
$value = demande($cmdmsg_id,$question,$reponse,$variable_reponse,$timeout);
//Traitement de la reponse
if ($value == 'Aucune réponse'){
$msg = 'Mise en place d\'un délai d\'1 heure.';
$cmd = cmd::byString($cmdmsg_id);
$cmd->execCmd($options=array('title'=> "empty=1",'message'=> $msg), $cache=0);
} else {
if ($scenario->getData($variable_reponse) == 1) {
$msg = 'Mise en place d\'un délai d\'1 heure.';
} else {$msg = 'Mise en place d\'un délai de ' . $scenario->getData($variable_reponse) . ' heures.';}
$cmd = cmd::byString($cmdmsg_id);
$cmd->execCmd($options=array('title'=> "empty=1",'message'=> $msg), $cache=0);
}
}
}
}
}
}