Remonté de l'information des batteries avec le plugin MQTT

Bonjour à tous,

Je continue d’améliorer mon installation domotique qui se composent en majorité d’équipements Zigbee (capteurs Xiaomi Aqara, Module Netatmo by Legrand, volets Profalux).

Pour communiquer avec ces équipements, j’ai mis en place le projet Zigbee2MQTT.
Tous ces équipements sont donc intégrés dans Jeedom à travers le plugin MQTT.

Dans un souci de fiabiliser le tout, je cherchais à afficher l’état des capteurs sur batterie dans la page d’Analyse des équipements.
Malheureusement, il semblerait que les équipements n’envoient pas cette information au système.

J’ai trouvé une solution de contournement mais j’aimerais la valider avec vous. Est-ce qu’il y a quelque chose de plus propre? Est-ce qu’il y a des risques à manipuler des données « système » dans un scénario?

Description de la solution proposée:

  • création d’un scenario qui tourne à intervalle réguliers (fréquence de quelques heures par exemples)
  • dans ce scénario, ajout d’un bout de code
  • dans ce bout de code, pour chacun des capteurs de type MQTT, récupération du niveau de batterie et de la date de collecte grâce à la commande correspondante
  • sur l’objet eqLogic, on fait appelle à la méthode « setStatus » pour ajouter les informations « battery » et « batteryDatetime »

Si certains d’entre vous sont interessés, faites moi signe et je partagerais mon scenario.

Merci pour vos retours / commentaires.
Alexis

Bonjour,
Cela m’intéresse beaucoup.
J’utilise Zigbee2MQTT avec le plugin JMQTT, et il est vrai que le niveau de batterie de mon capteur de porte remonte bien.
Cependant il n’est pas dans les équipements en effet.J’ai séché sur la question et suis passé par les virtuels pour gérer ça.

Bonne journée

Il suffit d’utiliser un bloc code dans un scénario comme indiqué dans ce post de l’ancien forum.

Merci beaucoup, ça fonctionne très bien aprés modif.
bonne journée

Salut @PanoLyon
Je suis une bille en code… Peux tu me faire une copie du tien pour que je comprenne un peu mieux quoi changer? Je vois le nom de l’équipement a modifier, et l’équipement apparaît bien dans l’onglet Analyse, mais la valeur est fixée dans le scénario… Merci!

Bien entendu le voici :

$scenario->setLog("Mise à jour equipements sur batterie");
$objet = "#[Cuisine][Zb2 Porte entree][Batterie]#";
$cmd=cmd::byString($objet);     //objet selectionné
$o=$cmd->getEqLogic();		
$battery=$cmd->execCmd();	//valeur de l'objet
if ($battery == 0) {
  $o->batteryStatus(-1);
} else {
  $o->batteryStatus($battery);
}
$resultat = $o->getStatus('battery');
$scenario->setLog("Pour $objet Equipement battery, mise à jour avec : $battery, nouveau statut : $resultat");

enjoy

1 « J'aime »

Merci pour vos retours!

Cela confirme que mon bout de code ne va rien « casser » (j’utilise maintenant la méthode batteryStatus :slight_smile:).

Voici le code que j’ai ajouté dans un de mes scenarios de monitoring.
La condition pour que celui-ci marche: il faut que l’objet est une commande nommée « battery »

$batterie = "battery";

$eqLogics = eqLogic::all();
foreach($eqLogics as $eqLogic)
{  
  if ($eqLogic->getEqType_name() == 'MQTT') {
    
    $scenario->setLog( '-- Equipement ' . $eqLogic->getHumanName() . ', type: ' . $eqLogic->getEqType_name() . '. Mise à jour du niveau de la batterie...');
    try{
      if (isset($batterie)){
          // si la commande n'existe pas, une exception est levée
          $cmd = cmd::byString('#' . $eqLogic->getHumanName() . '['. $batterie .']#');
      }
    
      $batteryPercent = $cmd->execCmd();
      $batteryDateTimeValue = $cmd->getCollectDate();
      
      //$eqLogic->setStatus('battery', $batteryValue);
      //$eqLogic->setStatus('batteryDatetime', $batteryDateTimeValue);
      $eqLogic->batteryStatus($batteryPercent,$batteryDateTimeValue);
      
    } catch (Exception $e) {
      // pas de commande
      $scenario->setLog( 'Exception!');
    }
  } else {
    $scenario->setLog('-- Equipement ' . $eqLogic->getHumanName() . ' ignoré');
  }
}
2 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.