Récupérer le OK dans les devices Zigbee

Hello,

De temps en temps j’ai certains modules qui décrochent.
J’imagine que le « Accessible » est fiable pour savoir si le module est bien opérationnel.

Je cherche pouvoir récupérer tous les devices par défaut (pas besoin de faire de config lorsque j’ajoute ou je retire des devices) et leur état dans un virtuel par ex.

@Phpvarious a fourni un code pour la meme chose pour les items avec une batterie.

$tags = $scenario->getTags(); // Récupère la liste des tags.
$eqLogicsAll = eqLogic::all();
$tags['alert'] = 0;
foreach ($eqLogicsAll as $eqLogic) {
  if ($eqLogic->getStatus('batterywarning', 0) != 0 || $eqLogic->getStatus('batterydanger', 0) != 0) {
    $tags['alert'] = 1;
    break;
  }
}
$scenario->setTags($tags); // Enregistre les tags.

J’imagine qu’il est possible de faire la meme avec du zigbee.

Merci

Bonjour

Le plugin zigbee est obsolète pour info.

Antoine

Hello,
Je veut pas dire d’erreur mais le « Accessible » est, me semble t-il, ni plus ni moins la même chose que le timeout disponible sur la config de l’équipement, sauf que la, il est gérer par Z2M :

Si tu configure correctement tes équipements :

image

(avec une valeur plus élevée pour un End device)

tu pourras utiliser le même bloc code, il suffit simplement de modifier la condition :

if ($eqLogic->getStatus('batterywarning', 0) != 0 || $eqLogic->getStatus('batterydanger', 0) != 0) {

Par

  if ($eqLogic->getStatus('timeout', 0) != 0) {

Et si tu veux remonter que les équipements d’un plugin (jMQTT pour mon exemple) et pas les autres :

  if ($eqLogic->getStatus('timeout', 0) != 0 && $eqLogic->getEqType_name() == 'jMQTT') {

merci encore @Phpvarious je vais tester

hello @Phpvarious

J’ai testé avec le plugin deconz:

$tags = $scenario->getTags(); // Récupère la liste des tags.
$eqLogicsAll = eqLogic::all();
$tags['alert1'] = 0;
foreach ($eqLogicsAll as $eqLogic) {
  if ($eqLogic->getStatus('timeout', 0) != 0 && $eqLogic->getEqType_name() == 'deconz') {
    $tags['alert1'] = 1;
    break;
  }
}
$scenario->setTags($tags); // Enregistre les tags.

et pourtant le tag reste à 0:

[2025-03-02 14:33:07][SCENARIO] -- Début : Scenario lance manuellement.
[2025-03-02 14:33:07][SCENARIO] - Exécution du sous-élément de type [action] : code
[2025-03-02 14:33:07][SCENARIO] Exécution d'un bloc code
[2025-03-02 14:33:07][SCENARIO] - Exécution du sous-élément de type [action] : action
[2025-03-02 14:33:07][SCENARIO] Changement de [Système][Batterie Warning][Warning] à 0
[2025-03-02 14:33:07][SCENARIO] - Exécution du sous-élément de type [action] : code
[2025-03-02 14:33:07][SCENARIO] Exécution d'un bloc code
[2025-03-02 14:33:07][SCENARIO] - Exécution du sous-élément de type [action] : action
[2025-03-02 14:33:07][SCENARIO] Changement de [Système][Device Warning][Device Warning] à 0
[2025-03-02 14:33:07][SCENARIO] Fin correcte du scénario

J’ai essayé avec un D majuscule mais idem, j’ai du raté qq chose

Il faudrait adapter le tag du post au bon plugin…

ceci n’est pas bon ?

$eqLogic->getEqType_name() == 'deconz')

Aucune idée. Mais tu tagues plugin-zigbee (plugin obsolète) et dans le poste tu parles du plugin-deconz
Donc oui le tag est faux.

Antoine

Hello,

Je croit que tu as pas compris mon message :

Il n’y a qu’en configurant correctement le timeout dans la configuration avancée de ton équipement, que le code pourra fonctionner.
Le bloc code ne va pas vérifier la valeur « Accessible » !

1 « J'aime »

en effet je n’ai pas du comprendre.
Mon souhait est d’avoir une alerte sur mon design lorsqu’un device (ex un capteur deconz qui à encore de la batterie mais à perdu sa communication) ne communique plus.

Mais la de ce que je comprends c’est en se basant sur la batterie ?

Non c’est en se basant sur la date de la dernière communication (timeout).
comme j’ai dit, le core te permet déja de configurer ceci, et c’est grâce a cet configuration que le bloc code fonctionnera.
Il ne peut pas récupérer le « accessible » directement dans le plugin.

Merci pour la précision, je viens enfin de comprendre …

Mais existe t il un moyen que par défaut tous les devices deconz par ex ait la config de timeout pour la communication, cela évite a avoir à passer sur tous les devices ?

Merci

non, cela n’existe pas. en plus le mieux est de ne pas mettre le même temps entre un end device (sur batterie) et un device routeur (sur secteur).

1 « J'aime »

ok ,merci @Phpvarious
Dernière chose, sais-tu comment récupérer le nom du Device lorsqu’il est ko ?

merci

Dans le bloc code ? car actuellement le bloc code ressort une synthèse, donc si tu veut le nom du device c’est possible mais il peut y en avoir plusieurs en même temps, donc plusieurs nom de devices.

yes c’est exactement cela, si j’ai plusieurs devices KO le bloc code ressort autant de noms :slight_smile:

Ok mais comment tu veux que les équipements ressortent du bloc code ? un tag avec les équipements délimité par un caractère (ex : Eq1 | Eq2 ). Que veut-tu faire de cette info ?

Exactement, info que je mets sur mon design, c’est la seule vue que j’ai en permanence.

$tags = $scenario->getTags(); // Récupère la liste des tags.
$eqLogicsAll = eqLogic::all();
$tags['alert'] = 0;
$tags['eqLogic'] = '';
foreach ($eqLogicsAll as $eqLogic) {
  if ($eqLogic->getStatus('timeout', 0) != 0 && $eqLogic->getEqType_name() == 'deconz') {
    $tags['alert'] = 1;
    $tags['eqLogic'] .= ($tags['eqLogic'] != '') ? ' | ' . $eqLogic->getHumanName() : $eqLogic->getHumanName();
  }
}
$scenario->setTags($tags); // Enregistre les tags.

image
tag(alert,0) == 1 && tag(eqLogic) != ""

merci @Phpvarious

J’ai ajouté ceci :

            echo $scenario->setLog( $tags['eqLogic']);

Je vois donc dans les logs un capteur en KO:

Par contre je n’ai pas compris le if à la fin.
De ma compréhension il faut que je récupère $tags[‹ eqLogic ›] pour le mettre en variable et le mettre sur le design