Monitorer les équipements Zigbee et BLEA (avec alertes), quelles solutions idéales?

Bonjour à tous,

J’ai parcouru plusieurs sujets à ce propos et j’avoue que je n’ai pas trouvé de solution à ma problématique.
Mon souhait est de monitorer mes équipements Zigbee et BLEA. J’ai une clé conbee 3 et le Bluetooth du RPI3+ pour mes nuts. Mes équipements Zigbee (AQARA) sont tous sur pile (bientôt des ZBMINIL2 pour mes des prises).

Le but est de savoir combien d’équipement Zigbee sont « déconnecté » et lesquelles si déconnection (pareil pour BLEA). Quand je parle de déconnexion je souhaite savoir après un timeOut défini les équipements qui posent problème (pas eu de connexion depuis X temps). Ce n’est pas le temps de dernière maj d’une commande qui m’interesse mais bien la dernière fois que l’équipement à communiquer avec le système Jeedom.
J’ai créé un virtuel qui doit contenir le nombre d’équipement Zigbee défaillant et les équipements défaillant.

J’ai essayé le plugin WatchDog mais mes actions ne sont pas exécutées, j’ai essayé pleins de paramétrages (seul l’action avant analyse a été bien interprété). Je ne sais pas si le plugin est maintenu…

J’ai essayé le plugin Monitor sensor mais mes équipements Zigbee ne sont jamais remontés. Ok pour BLEA mais je ne suis pas allé plus loin.

J’ai regardé du côté des alertes équipement mais je dois paramétrer chaque équipement 1 par 1 ? et comment faire le calcul du nombre etc…

Que me conseillez vous ? Je suis ouvert à tout type de proposition (plugin, scénarios, autres).

Config : RPI3B+, Disque SSD mSATA, Debian 32 bits

Merci pour votre aide.

Cordialement,

Reis

J’ai eu le même besoin, de remontée de pb de communication. J’avais aussi constaté des pbs de com sur des commandes alors que l’equipement communiquait bien.

J’ai donc fait un scenario qui test la communication d’un équipement sur la base de la derniere remontée de valeur (valueDate) d’une commande de l’equipement (temperature/humidité/…)
et qui met un message dans le centre de message

En parametre les plugins concernés et les Noms des commandes pour ces plugins

$plugins = explode(',', 'z2m,jmqtt,mqtt2');
$cmds = explode(',', 'Température, Humidité');
$delayNoNewValue = 24;  // Délai en heures avant Alerte

$alertedEqLogics = [];  // Tableau pour garder une trace des équipements déjà mentionnés

foreach ($plugins as $plugin) {
    $scenario->setLog('| Plugin : ' . $plugin);
    foreach (eqLogic::byType($plugin, true) as $eqLogic) {
        $eqLogicId = $eqLogic->getId();
        $alerted = false;  // Flag pour savoir si l'équipement a déjà été logué
        $latestValueDate = 0;  // Stocke le timestamp de la dernière valeur reçue par l'équipement
        foreach ($cmds as $cmd) {
            // Récupérer la commande
            $command = cmd::byEqLogicIdCmdName($eqLogicId, $cmd);
            if (!empty($command)) {
                $valueDate = $command->getValueDate();
                $valueDateTimestamp = strtotime($valueDate);

                // Mettre à jour la date de dernière communication si elle est plus récente
                if ($valueDateTimestamp > $latestValueDate) {
                    $latestValueDate = $valueDateTimestamp;
                }
                // Si la commande n'a pas de valeur ou que la date de la dernière valeur dépasse le délai d'alerte
                if (empty($valueDate) || ( time() - $latestValueDate ) >= ( $delayNoNewValue * 60 * 60 )) {
                    // Si l'équipement n'a pas déjà été logué
                    if (!$alerted && !in_array($eqLogicId, $alertedEqLogics)) {
                        // Format de la date de la dernière communication
                        $lastCommunication = ($latestValueDate > 0) ? date('Y-m-d H:i:s', $latestValueDate) : 'Aucune donnée';
                        
                        // Loguer l'équipement avec la date de dernière communication
                        $scenario->setLog('|    Equipement en alerte : ' . $eqLogic->getHumanName() . ' - Dernière communication : ' . $lastCommunication);
                        message::add('Alerte équipement', 'Equipement ' . $eqLogic->getHumanName() . ' - pas de nouvelle donnée depuis plus de ' . $delayNoNewValue . 'h');
                        
                        // Ajouter l'équipement à la liste des alertés
                        $alertedEqLogics[] = $eqLogicId;  
                        $alerted = true;  // Marquer l'équipement comme déjà alerté
                    }
                }
            }
        }
    }
}

Norbert

1 « J'aime »

Bonsoir Norbert,

Merci beaucoup pour ton retour.
Un scénario me convient très bien et le tiens m’a l’air vraiment pas mal pour débuter. Je vais lui apporter quelques modifications. J’ai remarqué que j’avais une commande info « Dernière communication » (logical_ID = last_seen). Ce champ est présent sur l’ensemble de mes équipements zigbee et semble correspondre à mon besoin.

Je te montrerai le script (et demanderai de l’aide si besoin).
Une question, pourquoi parcourir les plugin jmqtt et mqtt2 ?
Pour des équipements aec pile 24h c’est sûr à 99% qu’il a eu une déconnexion ?

Merci.

Reis

Parce que j’ai d’autres jeedom et je récupère des équipements z2m ou mqtt (comme des volets velux via klf200) directement en mqtt sur jmqtt ou mqtt2 (anciennement jeelink). Et ces équipements sont aussi succeptibles d’avoir des pbs de com

Super, merci !

Tu vois que tu fait de la programmation :grin:

Pas du tout :yum:
Sans ChatGPT, je serai bien embêté… A force, j’ai appris quelques trucs en PHP, mais ça se limite vraiment à des choses basiques et à de la copie reproduction de ce que d’autres ont déjà fait.

Salut,

Alors du coup j’avance sur mon script et j’apprend des choses. J’aime bien comprendre ce que je fais du coup je vais souvent faire des recherches et consulte de la doc etc…

J’ai une question concernant la ligne suivante :
$valueDate = $command->getValueDate();
La fonction getValueDate() retourne quelle information ? La date de la dernière mise à jour de la commande ?
En partant de ce principe, j’ai voulu récupérer la valeur également avec getValue() mais j’ai toujours un retour vide.
Exemple : $value = $command->getValue();

J’ai bien compris le principe du scénario qui est de parcourir les équipements (eqLogic) de type z2m et de récupérer la commande « Dernière Communication » pour moi.

Je suis allé voir dans l’API mais c’est pas évident de se retrouver sans explication et d’exemple lol. Il y a juste les noms de fonctions utilisables.

Merci pour ton aide.

Reis

La commande getValueDate renvoie la date de la dernière valeur MODIFIEE (sauf si la coche « Répéter les valeurs identiques » est cochée ou cette commande evoluée meme si la valeur n’est pas modifiée.
Si tu souhaite avoir la date de la derniere reception d’une valeur (identifique ou non), c’est getCollectDate
Tu as donc toujours getValueDate <= getCollectDate

Pour recuperer la valeur, c’est execCmd()

Merci pour le retour.

Du coup j’ai fait ce script qui répond à mon besoin :

// Initialisation des paramètres du scénario
$plugin = 'z2m'; // Plugin à parcourir
$cmd = 'Dernière communication'; // Commande dont on veut récupérer la date de dernière mise à jour
$delayNoNewValue = 600;  // Délai en seconde avant alerte
$zk = '#[Réseau][vSurveillanceEquipements][Nombre équip. Zigbee KO]#'; // Commande info qui recense le nombre d'équipement Zigbee déconnecté depuis x temps
$zigbeeKO = 0; // Variable qui permet de calculer le nombre d'équipement Zigbee concerné par une déconnexion

$scenario->setLog('[INF] Plugin en surveillance : '.$plugin.' | Traitement avec la date de dernière mise à jour de la commande : '.$cmd);

// Parcours de l'ensemble des équipements Zigbee (plugin z2m)
foreach (eqLogic::byType($plugin, true) as $eqLogic) {
  $eqLogicId = $eqLogic->getId(); // Récupération de l'ID de l'équipement traité
  $command = cmd::byEqLogicIdCmdName($eqLogicId, $cmd); // Récupération de la commande concernée pour l'équipement traité

  // Si la commande existe
  if (!empty($command)) {
    $valueDate = $command->getCollectDate(); // Récupération de la date de la dernière mise de la commande (date)
    $valueDateTimestamp = strtotime($valueDate); // Conversion de la date en secondes

    // Si la commande n'a pas de valeur ou que la date de la dernière valeur dépasse le délai d'alerte alors l'équipement à probablement été déconnecté
    if (empty($valueDate) || (time() - $valueDateTimestamp) >= $delayNoNewValue) {
      $scenario->setLog('[WAR] Equipement en alerte : '.$eqLogic->getName().' | Dernière communication : '.$valueDate.' (+ de '.$delayNoNewValue.' secondes)');
      $zigbeeKO = $zigbeeKO + 1; // Incrémentation du nombre d'équipement déconnecté
    }
  
  } else {
    // La commande n'existe pas pour cet équipement
    $scenario->setLog('[ERR] L\'équipement : '.$eqLogic->getName().' n\a pas de commande'.$cmd.' !');
  }
}

// Mise à jour de la valeur de la commande dans le virtuel
cmd::byString($zk)->event($zigbeeKO);

Il me reste à remplir le champ du virtuel pour savoir lesquels sont « déconnectés » et faire mon un bel affichage d’infos dans JC.

Au début je voulais faire un seul script pour vérifier également quelques équipements BLEA (des nuts) mais en fait je vais plutôt faire 2 scénarios différents, un par protocole car il y a trop de spécificités :

  • Pas la même commande à traiter
  • Cas spécifique des nuts à ne pas vérifier si absent de la maison etc…

Je fera un scénario par protocole pour plus de facilité et de visibilité.

Merci pour ton aide.

C’est 2 sujets très differents, mais si ca peut te donner quelques idées …

Oui j’ai parcouru le sujet et je pense que je vais m’y mettre un peu plus sérieusement. Mais j’avais un peu décrocher car plugin-sshcommander n’est plus dispo sur le market je crois non ?
Est-il remplaçable par * plugin-sshmanager ?

La partie pile et mise à jour pour l’OS je vais les mettre en place je pense dès que je pourrai.

Oui, ce n’est pas tout à fait le même principe mais c’est totalement remplaçable

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.