Une question purement pratique, comment gérez-vous le monitoring du niveau de batterie de vos modules sans fil comme les Aqara Xiomi par exemple afin d’anticiper le remplacement des piles et d’être alertés ?
Tu peux fixer des alertes batteries dans config/logs de ton jeedom.
Tu peux aussi gérer les alertes individuellement dans chaque équipement sur les commandes batterie.
Un peu hors sujet, mais qui peut intéresser :
J’avais récupéré un code de je ne sais plus trop qui, pour ajouter un contrôle de communication des modules à piles. Ce code alerte quand un module ne communique plus depuis un certain temps et donc potentiellement avec un pb de pile !
Je le lance toutes les 2h
$maxTime = 43200; // temps en secondes - 12h maximum
$scenario->setLog("Temps : " . $maxTime);
$batterie = "Batterie"; // Nom de la commande à rechercher
$excludeEq = array("[Xiaomi][Aspirateur]" => 1, "[Xiaomi][Bouton Alarme]" => 1); // Liste des équipements à ignorer (qui contiennent la commande "$batterie")
$errEqLogics = array();
$_format = '%Y-%m-%d %H:%M:%S';
$eqLogics = eqLogic::all();
$scenario->setLog('Début monitoring');
$scenario->setData('monitor', '');
foreach($eqLogics as $eqLogic)
{
if ($excludeEq[$eqLogic->getHumanName()] == 1){
$scenario->setLog( '-- Equipement ' . $eqLogic->getHumanName() . ' ignoré');
continue;
}
try{
if (isset($batterie)){
// si la commande n'existe pas, une exception est levée
$cmd = cmd::byString('#' . $eqLogic->getHumanName() . '['. $batterie .']#');
}
$scenario->setLog( '-- Equipement ' . $eqLogic->getHumanName());
$allCmds = $eqLogic->getCmd('Info');
$maxDate = date($_format, "1970-1-1 00:00:00");
if (count($allCmds) > 0)
{
foreach($allCmds as $cmd)
{
$cmd->execCmd();
$collectDate = $cmd->getCollectDate();
$scenario->setLog( 'Commande ' . $cmd->getHumanName() . ' - ' . $collectDate);
$maxDate = max($maxDate, strtotime($collectDate));
}
$scenario->setLog( 'Date max ' . date('c', $maxDate));
$elapsedTime = time() - $maxDate;
if ($elapsedTime > $maxTime){
// -- /!\alert
$errEqLogics[] = $eqLogic->getHumanName(). '=> '. date('c', $maxDate);
$scenario->setLog('ALERTE');
}
}
}catch (Exception $e)
{
// pas de commande
}
}
$scenario->setData('monitor', implode(",", $errEqLogics));
// log fin de traitement
$scenario->setLog( 'fin monitoring');
ensuite tu fais un si variable(monitor)!="" alors : et là tu mais ta commande d’alerte.
Un grand merci jplp pour le partage de ton script.
Cela m’a donné une très bonne base pour monitorer mes AQARA.
Comme il marchait mal avec mon capteur inondation, j’ai cherché à mieux comprendre comment il fonctionne et j’ai fait quelques modifications :
Au lieu de regarder que les équipements avec « Batterie » je regarde que les équipements où j’ai ajouté un tag « monitor_connexion » (dans paramètres avancés de l’équipement, avec une vigule entre chaque tag si besoin) pour faire un choix à l’équipement quelque soit le nom de la commande Batterie/Battery/Battery_level…
C’est juste une autre stratégie.
Au lieu de balayer la date max de toutes les commandes, je récupère juste la date de la dernière communication de l’équipement. Cela allège le script et semble mieux marcher pour mon capteur d’inondation.
Quelques broutilles au niveau des variables car dans mon virtuel j’ai ajouté une info NB_test_OK pour s’avoir combien de capteurs sont connectés à chaque test. En j’en profite pour mettre à jour le nombre total de capteurs testés dans la valeur max de cette info.
Encore une fois merci beaucoup, car sans ton partage je ne serais jamais arrivé à ça.
$maxTime = 14400; // temps en secondes - 4h maximum
$scenario->setLog("Temps : " . $maxTime);
$tag_monitor = "monitor_connexion"; // Nom du tag à rechercher
$excludeEq = array(); // Liste des équipements à ignorer
$errEqLogics = array();
$nb_checked = 0; // Nombre d'équipements testés
$nb_KO = 0; // Nombre d'équipements testés Ok
$_format = '%Y-%m-%d %H:%M:%S';
$eqLogics = eqLogic::all();
$scenario->setLog('Début monitoring');
$scenario->setData('monitor', '');
foreach($eqLogics as $eqLogic)
{
// Des équipements à exclures ?
if ($excludeEq[$eqLogic->getHumanName()] == 1){
$scenario->setLog( '-- Equipement ' . $eqLogic->getHumanName() . ' ignoré');
continue;
}
// Lecture des tags de l'équipements
$tags = explode(",",$eqLogic->getTags());
//$scenario->setLog( '-- Tag ' . implode(",",$tags));
if (in_array($tag_monitor,$tags) == true){ // tag de monitoring trouvé, nous testons
$scenario->setLog( '-- Equipement ' . $eqLogic->getHumanName());
$nb_checked = $nb_checked + 1;
//$maxDate = date($_format, "1970-1-1 00:00:00");
$maxDate = strtotime($eqLogic->getStatus('lastCommunication'));
$scenario->setLog( 'Last Communication Date ' . date('c', $maxDate));
$elapsedTime = time() - $maxDate;
if ($elapsedTime > $maxTime){
// -- /!\alert
$errEqLogics[] = $eqLogic->getHumanName(). '=> '. date('c', $maxDate);
$nb_KO = $nb_KO + 1;
$scenario->setLog('! ALERTE !');
}
}
}
// Sauvegarde des erreurs pour envoie
$scenario->setData('monitor', implode(",", $errEqLogics));
// Sauvegarde des nouvelles valeurs (Max et valeur) du nombre de modules Ok.
$maCmd = cmd::byString('#[Maison][Remontée des capteurs][NB_test_OK]#');
$maCmd->setConfiguration('maxValue',$nb_checked);
$maCmd->save();
$maCmd->event($nb_checked - $nb_KO);
// log fin de traitement
$scenario->setLog( 'fin monitoring');
On doit pouvoir faire mieux en mettant la sauvegarde des valeurs en dehors du script pour ne pas avoir en dur le nom de la commande. Mais je n’ai pas trouvé comment faire pour changer la valeur max hors script.
Merci @jplp et @F_yann pour vos partages. Je suis en train de faire un mix des deux pour regarder les commandes batterie, rssi et un tag pour les derniers équipements.
Ce n’est pas gênant vu qu’en cas de mise à jour du nom de la commande, cela met à jour le bloc code (ce qui est quand même assez pratique).