Monitoring équipements

Salut.
Ma question a probablement été traitée mais je n’ai pas réussi à trouver la réponse. Je viens de m’apercevoir que j’ai un équipement qui ne communique plus depuis plusieurs mois.

Quels solutions utilisez vous pour surveillez vos équipements et avoir des alertes pour des événements de type batterie faible, absence de communication depuis x jour, etc ?

Salut,

Je n’ai jamais eu l’occasion de l’essayer mais il me semble que c’est le but du plugin WatchDog

Bonjour

Ce qui est built-in dans le core :wink:

Ok, je viens voir pour la batterie on peut configurer un seuil global.
Par contre pour s’assurer que les équipements sont toujours en vie, il y a t’il un paramètre global ?

Pas global, en tout cas pas en v3, je n’ai pas vérifié en v4 mais je ne pense pas.
Mais il y a une « alerte communication » dans la config avancée des équipements

Ok, merci à vous deux. Il ne me reste plus qu’à choisir la solution qui me conviendra le mieux.

Bonjour,

J’ai été confronté au même problème. Je l’ai résolu via un scenario et bloc de code. Pour le moment, je ne l’execute que le lundi.
Je teste l’info batterie et sa date de mise à jour. Si elle est plus ancienne que 1 jour et ou valeur inférieure à 40.
J’envois un message.
Voici le code.

// Liste tous les equipements qui contiennent un status battery
$list = array();
foreach (eqLogic::all() as $eqLogic) {
	$battery_type = str_replace(array('(', ')'), array('', ''), $eqLogic->getConfiguration('battery_type', ''));
	if ($eqLogic->getStatus('battery', -2) != -2) {
		array_push($list, $eqLogic);
	}
}
foreach ($list as $hbeq) {
    $value = $hbeq->getStatus('battery');
    $batteryDateTime = $hbeq->getStatus('batteryDatetime');
    $tsBatteryTime = strtotime($batteryDateTime); // convert batteryDatetime to timestamp
	$tsCheck = strtotime("now") - 86400;   	  // convert today to timestamp and substract 1day (86400 seconds)  
	if (($value < 40) || ($tsCheck > $tsBatteryTime)) {
       	// envoi d'un message (ici: PushOver)
   		$Msgcmd=cmd::byString('#[Message][Jeedom][Msg]#');
		$Msgcmd->execCmd($options=array('title'=>'Warning batterie', 'message'=> "Warning: Batterie de " . $hbeq->getHumanName(). " a $value%, Date info: $batteryDateTime"), $cache=0);
    }
}

Bonne utilisation

2 « J'aime »

Ah oui pas mal, çà évite d’avoir a déclarer tous les équipements.
Je vais surement adopter ta solution et l’adapter pour surveiller aussi la dernière communication, merci.

Mon adaptation pour surveiller mes équipements et répondre à mon besoin. Je m’en servirai pour faire des rapports ou envoyer des notifications.
Merci @henribi pour m’avoir aiguillé.

$idleMax = new DateTime("1 week ago"); // Délai maximum toléré dernière communication
$tsIdleMax = $idleMax->getTimestamp();

// Fonction de tri des équipements basée sur la date de communication
function lastCommunication_sort ($a, $b) {
  if ($a["lastCommunication"] == $bl["lastCommunication"]) {
    return 0;
  }
  return ($a["lastCommunication"] < $b["lastCommunication"]) ? -1 : 1;
}

$eqList = array();
foreach (eqLogic::all() as $eqLogic) {
  // Récupération de tous les équipements z-wave et zigbee (zigate) avec une date
  if (in_array($eqLogic->getEqType_name(), ["openzwave", "zigate"]) && $eqLogic->getStatus("lastCommunication")) {
    array_push($eqList, ["lastCommunication" => $eqLogic->getStatus("lastCommunication"), "eqLogic" => $eqLogic]);
  }
}
usort($eqList, "lastCommunication_sort");

foreach (array_values($eqList) as $item) {
  $eqLogic = $item["eqLogic"];
  $tsLastCommunication = strtotime($eqLogic->getStatus("lastCommunication"));
  $dateFR = date("d/m/Y \à H\hi", $tsLastCommunication);
  $messageLevel = $tsLastCommunication < $tsIdleMax ? "[WARNING]" : "[INFO]";
  $scenario->setLog("$messageLevel Dernière communication le $dateFR : ". $eqLogic->getHumanName());
}
2 « J'aime »

Bonjour,
Merci pour cette solution élégante! Par contre, je n’ai jamais utilisé un bloc Code dans les scénarios. Comment envoyer le message texte généré par le bloc ?
Merci!

Hello
Il y a pt être des solutions autres, toutefois je sais qu’on peut passer par une variable de scénario qui est positionnée dans le bloc CODE et qui ensuite peut être utilisée dans une commande de type message (email, Telegram…) via variable(mavariable). Pour mettre le texte souhaité au sein du code il faut utiliser la syntaxe :

$scenario->setData(« maVariable », « mon message »);

toutefois ici nous avons un bloc code qui fait un message par équipement donc il faudra concaténer tous les messages dans une seule variable de type $monTexte via

$monTexte .= « texte suivant »

Bonjour
Pour ma part, j’ai créé un scénario par appareil à surveiller sans bloc code
Je l’exécute tous les jours à 12h
Il calcul le temps écoulé depuis la dernière réception information et me préviens si cela dépasse 7 jours avec une condition du genre:
#timestamp#-collectDate(#[Extérieur][Détecteur Crépusculaire][Nuit]#,U) > 7243600
Si cela peut servir

Petite question sur cet ancien fil… Est-il possible d’exclure certains appareils, par exemple tous les téléphones (qui sont tous dans l’objet [Phone]) de cette routine ?

Merci !