Monitoring batterie modules xiaomi

Bonjour à tous,

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 ?

Merci beaucoup pour vos conseils :slight_smile:
Manu

Hello,

Tu peux voir ça dans Analyse > équipements, perso j’ai aussi affiché BatteriePourcent sur ma vue

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.

moi j’ai juste faite ceci dans les reglages du module :

Sauf erreur on peut aussi fixer le seuil de manière générale via Configuration > équipements histoire de ne pas avoir à le faire pour chaque module.

Effectivement, pour les seuils batteries. C’est pratique.

Par contre je n’ai jamais trouvé pour l’alerte communication… Obligé de le spécifier pour chaque équipements…

Oui tu as raison :
Configuration > Equipement pour fixer les seuils
Configuration > Logs pour gérer les alertes associées

Essaies le code ci-dessus. Il marche très bien !

Waou quel engouement :slight_smile:

Merci beaucoup pour toutes ces pistes, je vais mettre tout ça en oeuvre.

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 :

  1. 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.

  2. 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.

  3. 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.

1 « J'aime »

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).

Je pense qu’on peut juste créer une commande virtuelle et aller chercher la valeur : Scénarios : Petits codes entre amis

$value = cmd::byString('#[Maison][infos][test]#')->execCmd();

Ou alors utiliser une variable :

$myVar = $scenario->getData('maVariable');