[Tuto] Info batterie de Zigbee à Jeedom

Je vous propose un petit tuto (mon premier) pour vous permettre de remonter les informations de batterie de vos équipements zigbee (ou autre) vers la gestion de batterie dans Jeedom. Ici pour l’exemple, j’utilise des équipement Zigbee avec le protocole MQTT à travers le plugin jMQTT et le plugin Virtuel mais tout ça reste valable de manière beaucoup plus générale lorsque vous voulez faire remonter des infos de batteries de n’importe quoi vers Jeedom.

En premier je récupère les infos de mon équipement Zigbee dans le plugin jMQTT :


Ici la commande 4717 est la valeur numérique du pourcentage de batterie d’un détecteur d’ouverture Aqara.

Ensuite comme je vais également me faire une page de design rassemblant tous mes équipements sur batterie, je créer un virtuel reprenant ces infos :


Ici la commande 2143 reprend l’info de la commande battery de l’équipement du dessus, je la nomme du nom de la batterie juste pour faire mon beau design ensuite :slight_smile:

Sur la petite roue crantée à droite de la commande 2143 de mon virtuel, je vais paramétrer l’onglet alertes, toujours pour faire mon beau design :


Ici je mets en warning à 30% de batterie et en alerte à 20%. Je rappelle que cette partie de la configuration n’est que pour mon design.

Ensuite dans la configuration avancé de mon virtuel (bouton en haut a droite.) puis dans l’onglet Alerte je vais configurer ma batterie pour Jeedom ainsi que les seuils d’alerte :


Ici je lui indique le type de batterie ainsi que les seuils de Warning et Alerte du niveau de batterie.

Ensuite il va falloir dire à Jeedom que notre équipement Virtuel à une batterie et lui indiquer son niveau, pour cela on va créer un scénario qui aura comme déclencheur les changements de notre commande de virtuel :


Ici on peut voir que j’ai ajouter toutes mes commandes d’équipements virtuels contenant une info de batterie comme déclencheur du scenario.

Le scenario contiendra uniquement un bloc code, celui-ci va modifier le cœur de l’équipement pour lui ajouter une info de batterie que Jeedom saura lire :


Pour ceux qui veulent faire du copier coller voila le code, il n’est pas parfait mais fonctionne très bien :

$trigger = cmd::cmdToHumanReadable($scenario->getRealTrigger());
$battery = cmd::byString($trigger)->execCmd();
$eq = cmd::byString($trigger)->getEqLogic();

$scenario->setLog("trigger : $trigger , battery : $battery");

if ($battery == 0) {
  $eq->batteryStatus(-1);
} else {
  $eq->batteryStatus($battery);
}

Nous avons fini avec le bricolage, maintenant il ne reste plus qu’a attendre que les infos remontent d’elles-mêmes dans Jeedom.

Voila le résultat dans la partie Analyses → Équipements → Batteries de Jeedom :


Ici avec un équipement en alertes dans la partie Analyses → Équipements → Modules en Alertes de Jeedom :

Et la sur ma page de design regroupant toutes les batteries de mes équipements :

Avec cette méthode, on voit ici que je récupère des infos de protocoles différents comme le RFXcom, Zwave, Zigbee, etc… sans aucune différence d’affichage, ce qui permet un rapide coup d’œil sur le stock de pile à préparer :slight_smile:

5 « J'aime »

Super tutoriel. Très bonne idée et bon exemple d’utilisation de la commande trigger pour ne pas avoir à multiplier les lignes dans le bloc code pour chaque équipement.

2 « J'aime »

Très propre, merci

1 « J'aime »

Bravo pour le travail et merci pour le partage. par contre j’ai une erreur dans mes logs scénarios. Sais tu d’ou ca pourrais venir?


[2020-11-02 22:26:02][SCENARIO] Start : Scenario lance manuellement.
[2020-11-02 22:26:02][SCENARIO] Exécution du sous-élément de type [action] : code
[2020-11-02 22:26:02][SCENARIO] Exécution d’un bloc code
[2020-11-02 22:26:02][SCENARIO] La commande n’a pas pu être trouvée : user => user
[2020-11-02 22:26:02][SCENARIO] Fin correcte du scénario

Merci
Et oui c’est normal, c’est lorsque tu as testé ton scénario en le lançant toi même. (première ligne)
Le scénario se déclenchera de lui même à chaque fois qu’une commande info de batterie sera mise à jour sur un équipement.

Merci.
C’est ce que j’ai constaté tard dans la soirée mais pas eu le temps de poster.
J’ai réussi en faisant une répétition immédiate du module.
Autres question, pour chaque devices il faut faire un virtuel ou je peux regrouper l’ensemble des devices sur 1 virtuel?

1 « J'aime »

L’un ou l’autre peu importe, mais perso je préfère largement faire un virtuel par fonction. :wink:

1 « J'aime »

@JcDenis super tuto merci
Quelles infos lies tu dans la commande Etat du virtuel crée ?
Je viens de voir que tout mes équipement zigbee et netatmo avait une gestion de la batterie intégrée et visible dans Equipement / Batteries …


Par contre je ne trouve pas la commande associée pour l’appliquée a un virtuel … :sleepy: …du coup je ne sais pas trop comment faire … il n’est pas possible d’intégrer nu lien direct sur mon design vers la page Equipement / Batteries ?
Si je veux gérer l’envoie de notification sur l’app jeedom si une batterie est en dessous de l’alerte il faut passer par le scénario ou une option dans l’équipement concerné est possible ?
Par avance merci
Chris94440

Pour le moment la seule solution que j’ai trouvé est de créer une commande sur chaque équipement pour récupérer l’état de batterie


Et après je peux faire le virtuel comme tu le décris …

1 « J'aime »

Tu passes par quel plugin pour ces équipements ?

Je ne connais pas les équipements Netatmo and co, il se peux que l’info de batterie passe direct à Jeedom sans avoir de commande info mais ça m’étonne quand même. Sinon oui il faut créer une commande info comme tu l’as fait.

Pour les notifications, si tu as configuré l’onglet Alertes de ta commande info de virtuel ou l’onglet Alertes de la Configuration avancée de l’équipement, cette alerte peut être gérée dans le menu Jeedom : Réglages => Système => Configuration => Onglet Logs.

Et autre réponse, il n’est pas possible (sauf utiliser un bloc html) de lier directement la page des batteries dans un design.

@JcDenis
Merci pour ton retour.
Ne voulant pas surcharger tous mes équipement deconz qui n’ont pas de base une commande info batterie je souhaiterais récupérer l’info de la batterie dans la santé du plugin car elle est présente

Du coup je suis passé par un pti script pour lister tous les équipement de type deconz pour récupérer l’info battery …

foreach(eqLogic::byType("deconz") as $eqLogic) {
  $eqLogicName=$eqLogic->getName();
  $batteryStatus = $eqLogic->getStatus('battery');;
  $scenario->setLog("	* nom equipement : $eqLogicName");
  $scenario->setLog("	  # batteryStatus : $batteryStatus");
  foreach($eqLogic->getCmd() as $cmd) {
    $cmdName = $cmd->getName();
    $cmdId=$cmd->getId();
    $scenario->setLog("		- Cmd : $cmdName | $cmdId");
    //  $batteryValue=executeCommande($cmdId,$scenario);
    //  if ($batteryValue < 20) {
    //    $message="La batterie du composant : $cmdName est inférieure à 20% ($batteryValue) => virtuel : $eqLogicName";
    //    sendMessage($message);
  }
}

Le résultat est celui que j’attendais … :slight_smile: … du coup le premier step est OK
image

Au travers de ce script, qu’on schedule 1 fois par jour, on peut gérer les alertes égalements sur les niveaux de batteries avec une notif mail, app ou autre … par contre j’ai un soucis sur un type d’équipement qui a plusieurs statut de batteries


Sachant qu’une pièce représente un équipement logique … avec mon script je n’obtiens qu’une seule valeur …
image
Saurais-tu comment je dois m’y prendre pour avoir toutes les infos ?

L’idéee derrière tout cela est supprimer l’abonnement d’une commande a un script lors d’un changement de valeur (cf ton exemple) mais gérer cela par un schedule d’un script qui parcours tous les types d’équipements souhaités pour gérer les infos batterie … je sais pas si je suis hyper clair…:slight_smile:

Je suis pas bien réveillé :stuck_out_tongue: mais à première vue, ce n’est pas faisable. C’est pour ça que chez moi les pièces de la maison sont des objets Jeedom, puis je décompose avec un virtuel par fonction comme ça pas de doublon :confused:

moi aussi les pieces de ma maison sont des objets jeedom … je l’avais pas entrevu comme cela … je vais essayer de lister tous les équipements d’un objet jeedom … merci @JcDenis

Bon j’ai avancé un peu je vous partage tout cela …un script qui liste tous les objets jeedom et récupère tous les équipements qui ont une info batterie… on se rapproche de la fonction Equipement / batterie …
Scenario :

$scenario->setLog("Start");
foreach(jeeObject::all() as $jeeObjet) {
  $jeeObjectName=$jeeObjet->getName();
  $scenario->setLog("	* Jeedom object Name : $jeeObjectName");
  $jeeObjectEqLogic=$jeeObjet->getEqLogic();
  foreach($jeeObjectEqLogic as $eqlogic) {
    	$a=$eqlogic;
        $eqLogicName = $eqlogic->getName();
        $eqLogicId=$eqlogic->getId();
        $eqLogicType=$eqlogic->getEqType_name();
        switch ($eqlogic->getEqType_name()) {
            case "naEnergie":
                manageEquipmentNaEnergie($scenario,$eqlogic);
                break;
          default:
            	manageClassicEquipment($scenario,$eqlogic);
            	break;
        }
  }
}
$scenario->setLog("End");
function manageEquipmentNaEnergie($scenario,$eqNaEnergie) {
  	$eqNaEnergieName=$eqNaEnergie->getName();
  	$cmd = $eqNaEnergie->getCmd(null, 'eqmodules');
  	$cmdJSON = $cmd->execCmd();
  	$eqmodules = json_decode($cmdJSON, true);
   	$cmdName = $cmd->getName();
  	$cmdId=$cmd->getId();
  	$scenario->setLog("			# [".$eqNaEnergie->getEqType_name()."] Equipment : " .$eqNaEnergie->getName());
	foreach ($eqmodules as $eqmodule) {
		$batteryStatus = $eqmodule['battery_percent'];
      	if (isset($batteryStatus) and $batteryStatus !== ""){
      		$scenario->setLog("				# id " . $eqmodule['id'] ." => batteryStatus : $batteryStatus ");
        }
	}
}
function manageClassicEquipment($scenario,$eqNaEnergie) {
  	$batteryStatus = $eqNaEnergie->getStatus('battery');
  	if (isset($batteryStatus) and $batteryStatus !== ""){ 
    	$scenario->setLog("			# [".$eqNaEnergie->getEqType_name()."] Equipment : " .$eqNaEnergie->getName() ."  => battery : ". $batteryStatus);
    }
}
function manageEquipmentDeconz($scenario,$eqNaEnergie) {
  	$batteryStatus = $eqNaEnergie->getStatus('battery');
  	if (isset($batteryStatus) and $batteryStatus !== ""){ 
    	$scenario->setLog("			# [".$eqNaEnergie->getEqType_name()."] Equipment : " .$eqNaEnergie->getName() ."  => battery : ". $batteryStatus);
    }
  	/*
  	foreach($listeCmd as $cmd) {
        $cmdName = $cmd->getName();
        $cmdId=$cmd->getId();
      	$batteryStatus = $eqLogic->getStatus('battery');
        $scenario->setLog("			# cmd : $cmdName | $cmdId");
      }
    */
}

Avec comme résultat :

Il y a une petite specificité pour les équipements de type naEnergie car un equipement peut avoir plusieurs valeur info batterie

Maintenant il ne reste plus qu’a réfléchir à comment intégrer cela dans un ou plusieurs virtuel et créer un composant garphique pour la gestion des batteries
Chris94440

1 « J'aime »

Merci d’utiliser </> au lieu de citation les caractères ne seront pas ainsi transformés …

2 « J'aime »

Hello,

Sans le formatage, c’est un peu long/dur à lire mais j’ai l’impression que tu ne fais que l’affichage texte .(via les logs)… Non ?

Merci @olive je me disais bien que cele ne faisait pas comme d’hab’ … je sais pas ou j’avais la tête … c’est corrigé dans tous mes posts de la journée … :grin:

2 « J'aime »

Tu jetteras un oeil à ce que j’ai dans un coin :
ça te donnera des idées

#Valeur du champs à chercher
$batterie = 'battery';
#Nom interne du plugin
$plugin = 'jMQTT';

#On récupére toutes les eqlogics d'un coup, mais du plugin seulement
$eqLogics = eqLogic::byType($plugin);
foreach($eqLogics as $eqLogic)
{
  // si la commande batterie n'existe pas, une exception est levée, donc on essaye
  try{
    $cmd = cmd::byString('#' . $eqLogic->getHumanName() . '['. $batterie .']#');
    #On récupére la dernière valeur
    $batteryPercent = $cmd->execCmd();
    #On récupére la dernière date de la mise à jour
    $batteryDateTimeValue = $cmd->getCollectDate();
    #On valorise ces infos dans l'objet lui-même, dans la zone spécifique jeedom
    $eqLogic->batteryStatus($batteryPercent,$batteryDateTimeValue);
    #blabla
    $scenario->setLog( '-- Equipement ' . $eqLogic->getHumanName() . ', du plugin ' . $eqLogic->getEqType_name() . '. Mise à jour du niveau de la batterie à '.$batteryPercent.'%, reçu le '.$batteryDateTimeValue);
  } catch (Exception $e) {
    // pas d'info batterie
    //$scenario->setLog( 'Exception!');
  }
}

A partir de là la gestion des alertes sur le niveau de batterie est natif à jeedom, j’ai pas besoin de passer par un scénario

Merci @naboleo mais là tu auras juste une vue dans Equipement / batterie … pas d’intégration dans un design… non ?

Si j’en crois ton script, ça fait juste de l’affichage texte , non ? (d’où ma question plus haut)
Là c’est pareil à 3 points prêts.

  • On va récupérer les eqlogic directement, c’est plus rapide que de passer par tous les objets 1 à 1
  • Bon du coup, les objets sont pas forcement ordonnés par « pièce » (c’est pê faisable)
  • L’infos remontent en plus dans les alertes jeedom

Comme les logs sont présents également, à première vue, ça me semble équivalent