[Tuto] Info batterie de Zigbee à Jeedom

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

@jerome6994
Je viens de regarder le code la réponse va dépendre de ce que tu veux faire … si tu veux avoir une couleur du text commune a tous les consommateurs du widget alors il suffit :

  • ajouter l’attribut color dans la class .battery#uid#:after
	.battery#uid#:after {
  content: '';
  display: block;
  position: absolute;
  top: 5px;
  left: 0;
  right: 0;
  /border: 1px solid #fff;
  border-radius: 2px;
  content:attr(data-before);
  font-size:12px;
  font-weight: bold;
  color:var(--track-textColor, black);
}

Et après modifier la couleur que tu souhaites (soit en param, soit en dur) dans le code …

var cmd = $('.cmd[data-cmd_id=#id#]');
          cmd.find('.battery#uid#').css('--track-textColor', 'green');

Si tu veux modifier la couleur du texte en fonction du niveau de batterie c’est un peu plus compliqué … si c’est ton besoin fait moi le savoir je regarderais la meilleure manière de faire

Concernant la notion de theme dark ou light … plusieurs possibilité
tester le theme en cours :

var stateTheme = jeedom.widgets.getThemeImg("light","dark");
          console.log("after gettheme : " + stateTheme);

Apres tu test la valeur de cette variable etfait ce que tu veux … mais cette technique ne fonctionne que lorsque tu charges la page … si tu veux que cela soit ‹ ‹ dynamique › › c’est à dire aussi lorsque tu es sur ton affichage et que le theme passe de light à dark alors il faut mettre un handler de changement de theme comme décrit ci-dessous :

$('body').on('changeThemeEvent', function (event, theme) {
  $('.cmd[data-cmd_id=#id#]').trigger('changeThemeEventCmd',theme);
});

Et après faire ce que tu veux lorsque ce handler est déclenché

 cmd.off('changeThemeEventCmd').on('changeThemeEventCmd',function (event, theme) {
            console.log("Theme change : " + theme);
          });

Je te remets le code du widget avec ces propositions.
cmd.info.string.wBatteryJsonByColumn.txt (7,7 Ko)

J’espère que cela répond à tes questions.
@chris94440

Bonjour

Merci de ce retour rapide
Je suis sur mobile donc je te fais un retour dès que je passe sur mon ordi

Pour ce qui est des écritures colorées de la valeur cela va dépendre de ce que je vois donc je te redis

Et si tu veux gerer la couleur en fonction du pourcentage de batterie il faut :

  • rajouter en css les couleurs que tu veux … exemple
  [data-color=blue] {
    color:blue !important
  }
  
  [data-color=red] {
    color:red !important
  }
  
  [data-color=orange] {
    color:orange !important
  }

Les appeler dans le javascript :

if (value >= 50) {
          divBatteryH.className = "battery-level#uid#";	
          divBattery.setAttribute('data-color', "blue");
      } else if (value >= 20 && value < 50) {
          divBatteryH.className = "battery-level#uid# warn";
          divBattery.setAttribute('data-color', "orange");
      } else {
          divBatteryH.className = "battery-level#uid# critical";
          divBattery.setAttribute('data-color', "red");
		  
      }

et apres faire un mix en fonction de ton theme (dark ou light) … ce qui donne dans l’exemple
image

Pas très lisible mais c’est qu’un exemple …
Voila je pense que tu as tout … grâce à toi je vais peaufiner ce widget … qd j’aurais le temps … :slight_smile:

1 « J'aime »

Bonjour,

Je vais peut-être poser une question bête mais quel est l’avantage de faire cela par rapport aux infos déjà données par jeedom dans l’onglet général équipements svp ?
Merci

Je me posais la même question sans oser le faire.

Faut oser comme ça, on se couchera sûrement moins bêtes :wink:

Pour ma part il y a que le widget en lui même qui m’intéresse afin d’organiser par groupe comme je le souhaite sur un design ou bien individuellement sur les tuiles
Juste esthétique pour moi

Mais je crois qu’à la lecture du code je n’ai pas du tout la même chose en faite :upside_down_face:

cmd.info.numeric.Batterie_Statut_valeur.html.txt (4,2 Ko)

C’est pourquoi je ne trouvais pas au début ce que l’on me disait mais mon pb est le même quand même

1 « J'aime »

Les infos dans l onglet general ne sont pas integrable dans un design … si tu veux avoir ces infos au travers d un design ou d un dashboard …cest une solution

Mais du coup tu as ta reponse ou pas… j avoue ne pas comprendre ta reponse

Mais pourquoi l’afficher dans un design alors que tu peux être informé par SMS, mail où tout autre moyen dès qu’une pile atteint un niveau « warning »?

@mich0111…tu as raison mais j aime bien gerer decouvrir par moi meme …mais en soit cela n apporte aucune evolution …tu peux surcharger tout cela avec du predictif de commandes de batteries… et pleins d autres choses…:grin: