[Tuto] Info batterie de Zigbee à Jeedom

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

oui oui les 2 scripts sont équivalents à la seule dif de setter la notion de battery jeedom … mon script ne fait qu’une tout petite partie de ce que je souhaite faire … mon but est de récupérer toutes les infos contenu dans Equipement / batterie … et de reussir à faire un design gestion des batteries … là j’ai fait le step 1 … récupérer toutes les infos … maintenant reste à trouver comment faire pour l’avoir dans un design … mon souhait serait de creer des équipements virtuel à la volée avec un pattern de nommage avec une commandes par info batterie avec un widget associé … :sleepy:

Et la quantité d’objets à traiter également…
Pas que ça fasse une différence énorme au niveau du temps de traitement mais chez moi c’est une liste de 1630 commandes pour 4 dont j’ai réellement besoin (les autres sont crées toutes seules).

oui oui tu as raison
Pour le moment je cherche juste a avoir les infos … l’optimisation viendra qd j’aurais toute ma solution…
Merci pour ton support @naboleo

Pour ceux comme moi qui voulait transformer le panneau Analyses / Equipments / batterie en Design … un pti script qui balaye tous les objets jeedom et ne récupère que ceux qui ont des infos batteries … il les agrège par objet jeedom … chez moi un objet jeedom correspond a une piece … il crée à la volée, par objet jeedom, un virtuel contenant autant de commande qu’il y a d’équipement dans l’objet jeedom avec des infos batteries … et il applique un widget perso battery … ce qui donne :

Structure flux json :
image

Vue virtuel crée à la volée :


Vue composant graphique :
image

Pour ceux qui veulent le script (à adapter en fonction du besoin - et certainement a améliorer pour de meilleure perf) :

$scenario->setLog("Start");
$arrayPiece= array();
foreach(jeeObject::all() as $jeeObjet) {
  $jeeObjectName=$jeeObjet->getName();
  $scenario->setLog("	* Jeedom object Name : $jeeObjectName");
  $jeeObjectEqLogic=$jeeObjet->getEqLogic();
  
  $arrayEquipement= array();
  $arraylisteEquipement=array();
  
  foreach($jeeObjectEqLogic as $eqlogic) {
    $a=$eqlogic;
    $eqLogicName = $eqlogic->getName();
    $eqLogicId=$eqlogic->getId();
    $eqLogicType=$eqlogic->getEqType_name();
    $objID=$eqlogic->getObject_id();

    switch ($eqlogic->getEqType_name()) {
      case "naEnergie":
        $returnArray=manageEquipmentNaEnergie($scenario,$eqlogic);
        if (isset($returnArray) and !empty($returnArray)) {
          array_push($arrayEquipement,$returnArray);
        }
        break;
      default:
        $returnArray=manageClassicEquipment($scenario,$eqlogic);
        if (isset($returnArray) and !empty($returnArray)) {
          array_push($arrayEquipement,$returnArray);
        }
        break;
    }		
  }
  
  if (isset($arrayEquipement) and !empty($arrayEquipement)){
	$arrayPieceToAdd=array("piece"=>$jeeObjectName,"parentId"=>$objID,"listeEquipement"=>$arrayEquipement);
  	array_push($arrayPiece,$arrayPieceToAdd);
	createVirtualAndCmds($scenario,$arrayPieceToAdd);
  }
  
}
$scenario->setLog("		* JSON infos batterie par piece : ". json_encode($arrayPiece));
$scenario->setLog("End");

function createVirtualAndCmds($scenario,$arrayPieceToAdd) {
	$scenario->setLog("	    * Function createVirtualAndCmds Start");
  	$scenario->setLog("	  	  - params : ".json_encode($arrayPieceToAdd));
	$piece = $arrayPieceToAdd['piece'];
	$parentID=$arrayPieceToAdd['parentId'];
	$listEquipment=$arrayPieceToAdd['listeEquipement'];
	list($virtual, $virtualId)=createVirtual($scenario,$piece,$parentID);
	foreach($listEquipment as $equipment) {
		createCmd($scenario,$virtual,$virtualId,$equipment);
	}	

	$scenario->setLog("	    * Function createVirtualAndCmds End");
}

function createVirtual($scenario,$piece,$parentID) {
	$scenario->setLog("	  	    * Function createVirtual Start");
	$scenario->setLog("	  	      - params : $piece,$parentID");
  	$virtualName="vBattery".str_replace(' ', '_', $piece);
  	
  	$virtual = eqLogic::byLogicalId($virtualName, 'virtual');
    if (!is_object($virtual)) {
      $scenario->setLog("	  	        - Logic Equipment not exist $virtualName==> need to create with parent id $parentID ");
      $virtual = new virtual();
      $virtual->setName($virtualName);
      $virtual->setLogicalId($virtualName);
      $virtual->setEqType_name('virtual');
      $virtual->setObject_id($parentID);
      $virtual->setIsEnable(1);
      $virtual->setIsVisible(1);
      $virtual->save();
    } else {
      $scenario->setLog("	  	        - Logic Equipment  exist $virtualName==> no need to create it");
    }
    $vId=$virtual->getId();
	$scenario->setLog("	  	    * Function createVirtual End ==> $vId" );
  	return array($virtual,$vId);
}

function createCmd($scenario,$virtual,$virtualId,$equipment) {
	$scenario->setLog("	  	    * Function createCmd Start");
	$scenario->setLog("	  	      - params : $virtualId,".json_encode($equipment));
  	$cmdName=str_replace(array(' ','.'), '_', $equipment["equipement"]);
  	$scenario->setLog("	  	        - creation de la commande :$cmdName");
  
  	$virtuelCmd=$virtual->getCmd(null, $cmdName);
    if (!is_object($virtuelCmd)) {
        $scenario->setLog("	  	          - cmd do not exist ==> need to create if");
        $virtuelCmd = new virtualCmd();
        $virtuelCmd->setName($cmdName);
        $virtuelCmd->setEqLogic_id($virtualId);
        $virtuelCmd->setLogicalId($cmdName);
        $virtuelCmd->setType('info');
        $virtuelCmd->setSubType('string');
      	$virtuelCmd->setTemplate('dashboard', 'customtemp::wBatteryJson');
	    $virtuelCmd->setIsHistorized(1);
    	$virtuelCmd->setUnite('%');
    	$virtuelCmd->setConfiguration("maxValue", "100");
    	$virtuelCmd->setConfiguration("minValue", "0");
    	$virtuelCmd->save();
    } else {
      	$scenario->setLog("	  	          - cmd exist ==> no need to create if");
    }
	$value=json_encode($equipment);
    $virtual->checkAndUpdateCmd($cmdName, $value);
	$scenario->setLog("	  	    * Function createCmd End");

}
function manageArrayEquipment($returnArray,$arrayEquipement) {
  if (isset($returnArray) and !empty($returnArray)) {
     array_push($arrayEquipement,manageClassicEquipment($scenario,$eqlogic));
  }
}

function manageEquipmentNaEnergie($scenario,$eqNaEnergie) {
  	//$scenario->setLog("	* NaEnergie WidgetBattery : ".$eqNaEnergie->batteryWidget());
  	$eqNaEnergieName=$eqNaEnergie->getName();
  	$cmd = $eqNaEnergie->getCmd(null, 'eqmodules');

  	$cmdJSON = $cmd->execCmd();
  	$eqmodules = json_decode($cmdJSON, true);
   	$cmdName = $cmd->getName();
  	$cmdId=$cmd->getId();
  	
  	
  	$batteryStatus = $eqNaEnergie->getStatus('battery');
  	$batteryDanger= $eqNaEnergie->getConfiguration('batterydanger');
  	$batteryWarning= $eqNaEnergie->getConfiguration('batterywarning');
  	$batteryDateTime= $eqNaEnergie->getStatus('batteryDatetime');
	$batteryType= $eqNaEnergie->getConfiguration('battery_type', '');
  	$equipementName=$eqNaEnergie->getName()." Netatmo";

  	foreach ($eqmodules as $eqmodule) {
		$batteryStatus = $eqmodule['battery_percent'];
      	if (isset($batteryStatus) and $batteryStatus !== ""){
          $scenario->setLog("			# [".$eqNaEnergie->getEqType_name()."] - id " . $eqmodule['id'] ." => batteryStatus : $batteryStatus |$batteryDanger | $batteryWarning | $batteryDateTime | $batteryType ");
          	$array=array("equipement"=>$equipementName,"batteryValue"=>$batteryStatus,"batteryCollectedDate"=>$batteryDateTime,"typePile"=>$batteryType);
          	//$scenario->setLog("				# ".json_encode($array));
        }
	}
  	return $array;
}

function manageClassicEquipment($scenario,$eq) {
  	$batteryStatus = $eq->getStatus('battery');
  	$batteryDanger= $eq->getStatus('batterydanger');
  	$batteryWarning= $eq->getStatus('batterywarning');
  	$batteryDateTime= $eq->getStatus('batteryDatetime');
	$batteryType= $eq->getConfiguration('battery_type', '');
  
  	if (isset($batteryStatus) and $batteryStatus !== ""){ 
      	//$scenario->setLog("	* Other WidgetBattery : ".$eqNaEnergie->batteryWidget());
    	$scenario->setLog("			# [".$eq->getEqType_name()."] Equipment : " .$eq->getName() ."  => battery : ". $batteryStatus . " |$batteryDanger | $batteryWarning | $batteryDateTime | $batteryType ");
      	$array=array("equipement"=>$eq->getName(),"batteryValue"=>$batteryStatus,"batteryCollectedDate"=>$batteryDateTime,"typePile"=>$batteryType);
    }
  	return $array;
}

Le script est schedulé tous les jours…

Et le widget qui lit du json … :slight_smile:cmd.info.string.wBatteryJson.html.txt (5,3 Ko)

Petit update pour ceux qui ne veulent pas creer trop de commandes virtuel … le même script mais qui ne crée qu’un commande Battery_infos par équipment jeedom


Script : scenario.txt (10,4 Ko)
Widget qui gère ce nouvel input : cmd.info.string.wBatteryJsonByColumn.html.txt (7,1 Ko)
Avec un param items qui permet de gérer le nb item (batterie) par colonne d’affichage …

On peut donc facilement obtenir une vue agrégée des batteries dans un design …

Chris94440

5 « J'aime »

Joli widget
Par contre je ne vois pas où tu mets la couleur de la valeur en % dans ton code ?
J’aimerais l’adapter en fonction du thème black ou non.

Merci par avance

Hello @jerome6994
Je jette un oeil demain dans le code pour voir ça

C’est ce que j’ai fait et j’ai pas trouvé
Sinon je ne poserais pas la question :wink:

Je précise aussi que je ne connais rien en code et que je tente aussi de comprendre
Mais je ne trouve nul par font ou color etc

Pas de soucis … pas dispo ce soir pour regarder mais demain je trouverais le temps…:hugs:

Alors j’ai trouvé ceci :

:root {
      --juice_alert_color: red;
      --juice_inter_color: orange;
      --juice_ok_color:green;
      --battery_color:grey;
      --battery_level_color:white;
      --widget_width:60px;
	  --widget_height:30px;
      --font-size:12px;

Mais quand on change la partie : --battery_level_color:white;
cela donne ceci :
Capture d’écran 2021-02-07 à 23.25.59

Et quand on change la partie : --battery_color:white; c’est l’ensemble en blanc
image

Je souhaiterais changer la couleur du 40% seulement.

Ensuite comment faut il faire pour que si thème dark alors un choix de batterie et si Ligth une autre batterie de couleur plus adaptée.

Merci