Modules qui ne communiquent plus

Bonjour

J’ai constaté que régulierement j’ai des modules (zwave ou zigbee principalement) qui ne communiquent plus depuis x temps ( de quelques jours à des mois). Parfois un probleme de pile hs (et non notifié) parfois autre chose.

J’aimerais créer un scénario qui vérifie 1 à 2 fois par mois, le 1er et le 15 par exemple, et m’'envoie la liste des modules qui ne communiquent plus depuis 7j.
Le probleme est que si je dois définir tous les modules manuellement, ça va vite devenir ingérable (plus d’une 100e de modules) sans compter les nouveaux modules.

Bien sur il y a déjà pour chauqe module la communication, mais là non plus je ne reçois pas automatiquement de notification.

Sauriez vous comment m’aiguiller pour creer ce scénario ? Dans l’idéal ce serait qu’il soit générique pour que chaque nouveau module soit intégrés automatiquement. Et çe je ne sais pas faire, hormis en définissant à la main chaque module individuellement, ce qui est ingérable au vu de la quantité comme cité plus haut

Merci

Bonjour,

Je ne vois pas comment il pourrait en être autrement avec un scénario ou autre…

Il n’est pas possible, à ma connaissance en tout cas, de définir un nom générique type [xxxx] [yyyy] [equipement x] avec un index x qui varie dynamiquement par l’action d’un scénario qui l’associe à un module réel existant ou nouveau.

En tout cas voici comment j’ai résolu ce double problème pour ma part (communication et batterie) en une seule passe.

J’ai créé un virtuel spécifique associé à chaque module (pas le choix donc :wink:… ), qui va me remonter pour chacun son état (communique / ne communique plus depuis x temps, et état de sa batterie le cas échéant) avec :

  • virtuel type info / numérique
  • Formule type (ici pour un capteur de température fonctionnant sur batterie dans la cuisine) : (#timestamp# - strtotime(collectdate(#[Cuisine][Capteur THP][Dernière communication]#))) < variable(Seuil_alerte_eqt HS) == 0 ? 0 : ( #[Cuisine][Capteur THP][Batterie]# > variable(Seuil_alerte_batterie) ? 1 : 2 )
  • ici dans le cas plus simple d’un détecteur de présence fonctionnant uniquement sur secteur (pas de batterie donc) : (#timestamp# - strtotime(collectdate(#[Cuisine][Détecteur présence][Dernière communication]#))) < variable(Seuil_alerte_eqt HS) == 0 ? 0 : 1

Ainsi :

  • Si l’heure de la dernière communication est hors du délai fixé par la variable ‘Seuil_alerte_eqt_HS’ (j’ai mis 8h soit 28800 secondes), je considère le module comme HS (valeur retournée = 0).
  • Si c’est OK pour le délai de communication, je regarde le pourcentage de batterie retournée (si l’équipement fonctionne sur batterie) : si elle est supérieure au seuil fixé par la variable ‘Seuil_alerte_batterie’ (j’ai mis 20%), alors la valeur retournée est 1 (OK) et sinon 2 (Attention).

J’associe ensuite cette information virtuelle à un widget qui va, pour les valeurs 0, 1 ou 2 afficher un voyant rouge (0 = pas de communication depuis plus de 8h / module HS), orange (2 = communication OK mais batterie < à 20%) ou vert (1 = communication OK et batterie >= à 20% ou fonctionne sur secteur).

Le gros avantage est que je n’utilise aucun scénario : c’est du temps réel (pas de cron). Aussitôt qu’un seuil est dépassé (délai de communication ou % de batterie), j’affiche l’alerte. On peut bien sûr déclencher également une notification si nécessaire soit directement dans le virtuel par action sur valeur (différé ou pas), soit avec un scénario si le traitement doit être plus complexe.

Le nombre de module n’est pas non plus vraiment un frein (j’en ai aussi une centaine…) : le principe reste le même pour tous, donc le copier/coller marche bien (en faisant attention de bien adresser le bon équipement). Certes ça fait du boulot au départ, mais on intègre/supprime pas tous les jours non plus des modules..

Exemple concret :

Le virtuel pour chaque capteur :

Le widget associé :

Et le résultat final sur un design :

2 « J'aime »

Bonjour ,

sinon il y a le plugin https://community.jeedom.com/tags/c/plugins/46/plugin-watchdog qui gere le truc aussi.

1 « J'aime »

Merci à tous, je vais essayer avec ça ! :+1:

Perso, j’ai des règles de nommage assez stricte et je balais avec du code PHP dans un scénario. foreach et des tableaux, pour l’ensemble de mes modules.

Salut,

Avant de réfléchir a un scénario ou a un plugin tiers c’est une fonction inclue nativement dans le core hein …
On peut ajouter une levée d’alerte si pas de communication depuis x minutes.

Si tu as beaucoup de périphériques tu as toujours la possibilité d’utiliser l’outil de maj en masse

1 « J'aime »

bonjour

oui avec ceci :

Le souci etant qu’il faille se connecter à l’interface jeedom pour voir l’alerte en pop up, noyée avec X autre (les dead et live notamment). Cela ne fonctionne pas pour un rapport mensuel par exemple envoyé par mail.

Si c’est pour un rapport mensuel ou bimestriel, il y a moyen également d’en générer un avec un peu de code php pour les modules avec batteries.

Le code php à inclure dans un bloc code de scénario :

// Liste tous les equipements qui contiennent un status battery
$nbWarning=0;
$nbDanger=0;
$nbPasReponse=0;

$batt[0]='🟢';
$batt[1]='🟠';
$batt[2]='🔴';
$depuis[0]='🟩';
$depuis[1]='⬛';

$msg="<style>table, th, td {border: 1px solid;}</style><h1>Rapport équipements sur batteries</h1><br />";
$msg .= "<table style='border-collapse: collapse;'>";
$msg .="<tr><th>État</th><th>Équipement</th><th>Niveau</th><th>Batteries</th><th>Date changement</th><th>Date information</th><th>Dernière communication</th></tr>";
$batWarning=config::byKey('battery::warning');
$batDanger=config::byKey('battery::danger');
//$scenario->setLog('Danger : '.json_encode($batDanger));
//$scenario->setLog('Warning : '.json_encode($batWarning));

$list = array();
foreach (eqLogic::all() as $eqLogic) {
  if ($eqLogic->getStatus('battery', -2) != -2 && $eqLogic->getConfiguration('battery_type', '') != 'Batterie') {
  	array_push($list, $eqLogic);
  }
}

usort($list, function($a, $b) {
      return strcmp(floatval($a->getStatus('battery'))/100, floatval($b->getStatus('battery'))/100);
  });

foreach ($list as $hbeq) {
  $eqId = $hbeq->getId();
  $value = $hbeq->getStatus('battery');
  $batteryDateTime = $hbeq->getStatus('batteryDatetime');
  $lastChange=$hbeq->getConfiguration('batterytime');
  $lastCommunication = $hbeq->getStatus('lastCommunication');
  $tsBatteryTime = strtotime($batteryDateTime); // convert batteryDatetime to timestamp
  $tsCheck = strtotime("now") - 86400;   	  // convert today to timestamp and substract 1day (86400 seconds)  
  $niveau=0;
  if ($value <= $batDanger) {
    $niveau=2;
    $nbDanger += 1;
  } elseif ($value <= $batWarning) {
    $niveau=1;
    $nbWarning += 1;
  }
  $msg .="<tr><td>" . $batt[$niveau] . "</td><td>" . $hbeq->getHumanName()." (".$eqId.")" . "</td><td align='center'> $value % </td><td align='center'>".$hbeq->getConfiguration('battery_type', '')."</td><td>". $lastChange." </td><td>".$depuis[$tsCheck > $tsBatteryTime]." $batteryDateTime </td><td>".$depuis[$tsCheck > strtotime($lastCommunication)]." $lastCommunication </td></tr>";
}
$msg .= "</table>";
//$scenario->setLog($msg);
$scenario->setLog(config::byKey('name'));
$tags = $scenario->getTags();
$tags['#jeedomName#']=config::byKey('name');
$tags['#nbWarning#'] = $nbWarning;
$tags['#nbDanger#'] = $nbDanger;
$tags['#rapport#'] = $msg;
$scenario->setTags($tags);

Puis dans le même scénario, d’envoyer par mail ce rapport tel quel avec le mot clé #rapport# dans la partie message :

image

Résultat :

Et désolé pour l’auteur original de ce code que j’utilise régulièrement (et que je remercie encore s’il se reconnaît…), je l’ai sans doute récupéré un jour sur ce forum, mais je n’arrive plus à remettre la main dessus :frowning:.

1 « J'aime »

Ben non y a ça

Et Il y a la posssibilité de faire une vue

Ensuite via un scenario programmé lancer l’action report et appeler la dite vue…
De l’exporter en png et l’envoyer par mail, telegram etc.

2 « J'aime »

Sinon on peut juste paramétrer jeedom pour envoyer un mail en cas d’alerte :wink:

1 « J'aime »

Bonsoir, ça fait partie de quelques scripts que j’ai développés pour suivre tranquillement mon Jeedom.

J’en ai un également pour les équipements qui ne communiquent plus. Je le posterai demain.

1 « J'aime »

Bonjour,

Oui, ca y est, j’ai retrouvé le fil ou j’avais trouvé ce code (il n’y a pas si longtemps…). Merci encore @537719 ! :wink:

Ça se passe par ici :

Voici le scenario qui liste les équipements avec leurs date de dernière communication (à copier dans un bloc code) :

$nbWarning=0;
$nbDanger=0;
$nbPasReponse=0;

$batt[0]='🟢';
$batt[1]='🟠';
$batt[2]='🔴';
$depuis[0]='🟩';
$depuis[1]='⬛';
$actif[0]='⛔';
$actif[1]='✅';

$n=0;
$m=0;

$exclude=array("camera","cloudsyncpro","Freebox_OS","geotrav","htmldisplay","import2calendar","jardin","mail","mode","script","sshmanager");

$msg="<style>table, th, td {border: 1px solid;}</style><h1>Rapport communication équipements</h1><br />";
$msg .= "<table style='border-collapse: collapse;'>";
$msg .="<tr><th>N°</th><th>Actif</th><th>Id</th><th>Équipement</th><th>Plugin</th><th>Alimentation</th><th>Dernière communication</th></tr>";
$batWarning=config::byKey('battery::warning');
$msg2="⚠️Alerte pas de communication depuis plus de 24 heures<br />";
$batDanger=config::byKey('battery::danger');

$list = array();
foreach (eqLogic::all() as $eqLogic) {
  if ($eqLogic->getIsEnable() && !in_array($eqLogic->getEqType_name(),$exclude)) {
  	array_push($list, $eqLogic);
  }
// }
}

usort($list, function($a, $b) {
      return strcmp($a->getStatus('lastCommunication'), $b->getStatus('lastCommunication'));
  });

foreach ($list as $hbeq) {
  $n +=1;
  $type=$hbeq->getEqType_name();
  $value = $hbeq->getStatus('battery');
  $batteryDateTime = $hbeq->getStatus('batteryDatetime');
  $lastChange=$hbeq->getConfiguration('batterytime');
  $lastCommunication = $hbeq->getStatus('lastCommunication');
  $tsCommTime = strtotime($lastCommunication); // convert batteryDatetime to timestamp
  $tsCheck = strtotime("now") - 86400;   	  // convert today to timestamp and substract 1day (86400 seconds)  
  $niveau=0;
  if ($hbeq->getIsEnable()&&$tsCheck > strtotime($lastCommunication)) {
    $m+=1;
    $msg2 .=  $hbeq->getId() . " : " . $hbeq->getHumanName() . " (" . $hbeq->getEqType_name(). ") ".$hbeq->getConfiguration('battery_type', ''). " " . $lastCommunication . "<br />";
  }
  $msg .="<tr><td>" . $n . "</td><td>" . $actif[$hbeq->getIsEnable()] . "</td><td>" . $hbeq->getId() . "</td><td>" . $hbeq->getHumanName() . "</td><td>" . $hbeq->getEqType_name(). "</td><td align='center'>".$hbeq->getConfiguration('battery_type', '')."</td><td>".$depuis[$tsCheck > strtotime($lastCommunication)]." $lastCommunication </td></tr>";
}
$msg .= "</table>";
//$scenario->setLog($msg);
$scenario->setLog(config::byKey('name'));
$tags = $scenario->getTags();
$tags['#jeedomName#']=config::byKey('name');
$tags['#nbWarning#'] = $nbWarning;
$tags['#nbDanger#'] = $nbDanger;
$tags['#nbComm#'] = $m;
$tags['#rapport#'] = $msg;
$tags['#notif#']=$msg2;
$scenario->setTags($tags);

Ensuite c’est envoyé par mél et notification. Le scenario comme celui qui contrôle l’état des piles, est exécuté chaque nuit par le scenario qui sauvegarde Jeedom.

L’inconvénient est que cela liste également des équipements qui n’ont pas vocation à communiquer. Je pense ajouter un mot-clé dans le commentaire de ce type d’équipement pour pouvoir les exclure facilement. Il faut juste trouver un peu de temps…

Dans la même veine, j’ai aussi la page santé, le listing des scenarios actifs ou non, la liste des commandes historisée…

J’avais tout ça en place il y a longtemps, les rapports issus de Jeedom n’étant pas troujours lisibles et souvent tronqués selon le format de page demandé…

Ce n’est sûrement pas le plus efficace et il y a certainement des améliorations à apporter au niveau code, mais ça a été rapide à mettre en place et ça fait ce que j’en attends.

2 « J'aime »