Jeezigbee et les Friendly name de Zigbee2mqtt

Bonsoir,

Je crois avoir eu la fausse bonne idée de mettre un Friendly name à mes périphériques sous Zigbee2Mqtt. Je ne m’en suis pas aperçu de suite mais il semble qu’avec un friendly name qui n’est plus celui par défaut, les messages MQTT reçus ne sont plus parsés par le plugin JeeZigbee
Les infos ne remontent pas dans JeeZigbee mais les actions passent, on peut toujours piloter les périphériques.
Voici un extrait du log en débug de mqtt2

[2023-03-26 18:26:05][DEBUG] : Received message on topic : zigbee2mqtt/bridge/logging => {"level":"info","message":"MQTT publish: topic 'zigbee2mqtt/Séjour - Prise leds', payload '{\"child_lock\":\"UNLOCK\",\"current\":0.44,\"energy\":38.6,\"indicator_mode\":\"off/on\",\"last_seen\":\"2023-03-26T20:26:05+02:00\",\"linkquality\":160,\"power\":64,\"power_outage_memory\":\"restore\",\"state\":\"ON\",\"update\":{\"installed_version\":192,\"latest_version\":192,\"state\":\"idle\"},\"update_available\":false,\"voltage\":241}'"}
[2023-03-26 18:26:05][DEBUG] : Received message on topic : zigbee2mqtt/Séjour - Prise leds => {"child_lock":"UNLOCK","current":0.44,"energy":38.6,"indicator_mode":"off/on","last_seen":"2023-03-26T20:26:05+02:00","linkquality":160,"power":64,"power_outage_memory":"restore","state":"ON","update":{"installed_version":192,"latest_version":192,"state":"idle"},"update_available":false,"voltage":241}
[2023-03-26 18:26:05][DEBUG] : Received message on topic : zigbee2mqtt/bridge/logging => {"level":"info","message":"MQTT publish: topic 'zigbee2mqtt/Séjour - Prise leds', payload '{\"child_lock\":\"UNLOCK\",\"current\":0.44,\"energy\":38.6,\"indicator_mode\":\"off/on\",\"last_seen\":\"2023-03-26T20:26:05+02:00\",\"linkquality\":160,\"power\":64,\"power_outage_memory\":\"restore\",\"state\":\"ON\",\"update\":{\"installed_version\":192,\"latest_version\":192,\"state\":\"idle\"},\"update_available\":false,\"voltage\":241}'"}
[2023-03-26 18:26:05][DEBUG] : Received message on topic : zigbee2mqtt/Séjour - Prise leds => {"child_lock":"UNLOCK","current":0.44,"energy":38.6,"indicator_mode":"off/on","last_seen":"2023-03-26T20:26:05+02:00","linkquality":160,"power":64,"power_outage_memory":"restore","state":"ON","update":{"installed_version":192,"latest_version":192,"state":"idle"},"update_available":false,"voltage":241}
[2023-03-26 18:26:05][DEBUG] : Send data to jeedom : {"zigbee2mqtt":{"bridge":{"logging":{"level":"info","message":"MQTT publish: topic 'zigbee2mqtt/Séjour - Prise leds', payload '{\"child_lock\":\"UNLOCK\",\"current\":0.44,\"energy\":38.6,\"indicator_mode\":\"off/on\",\"last_seen\":\"2023-03-26T20:26:05+02:00\",\"linkquality\":160,\"power\":64,\"power_outage_memory\":\"restore\",\"state\":\"ON\",\"update\":{\"installed_version\":192,\"latest_version\":192,\"state\":\"idle\"},\"update_available\":false,\"voltage\":241}'"}},"Séjour - Prise leds":{"child_lock":"UNLOCK","current":0.44,"energy":38.6,"indicator_mode":"off/on","last_seen":"2023-03-26T20:26:05+02:00","linkquality":160,"power":64,"power_outage_memory":"restore","state":"ON","update":{"installed_version":192,"latest_version":192,"state":"idle"},"update_available":false,"voltage":241}}}
[2023-03-26 18:26:06][DEBUG] : Received message on topic : zwave/_EVENTS/ZWAVE_GATEWAY-Jeedom/node/statistics_updated => {"data":[{"id":30,"inited":true,"status":4,"isControllerNode":false,"interviewStage":5,"deviceClass":{"basic":"Routing Slave","generic":"Binary Switch","specific":"Binary Power Switch","mandatorySupportedCCs":["Basic","Binary Switch","All Switch"],"mandatoryControlCCs":[]},"zwavePlusVersion":1,"ready":true,"zwavePlusRoleType":5,"isListening":true,"isFrequentListening":false,"canSleep":false,"isRouting":true,"supportedDataRates":[40000,100000],"maxDataRate":100000,"supportsSecurity":false,"isSecure":false,"supportsBeaming":true,"protocolVersion":3,"firmwareVersion":"3.94","manufacturerId":600,"manufacturer":"Shenzhen Neo Electronics Co., Ltd.","productId":4231,"productDescription":"Wall Plug Switch","productType":3,"productLabel":"NAS-WR01Z","deviceDatabaseUrl":"https://devices.zwave-js.io/?jumpTo=0x0258:0x0003:0x1087:3.94","keepAwake":false},{"commandsTX":1,"commandsRX":283,"commandsDroppedRX":0,"commandsDroppedTX":0,"timeoutResponse":0,"rtt":150}]}
[2023-03-26 18:26:06][DEBUG] : Received message on topic : zwave/30/50/0/value/66561 => {"time":1679855166314,"value":246.35}
[2023-03-26 18:26:06][DEBUG] : Received message on topic : zwave/_EVENTS/ZWAVE_GATEWAY-Jeedom/node/node_value_updated => {"data":[{"id":30,"inited":true,"status":4,"isControllerNode":false,"interviewStage":5,"deviceClass":{"basic":"Routing Slave","generic":"Binary Switch","specific":"Binary Power Switch","mandatorySupportedCCs":["Basic","Binary Switch","All Switch"],"mandatoryControlCCs":[]},"zwavePlusVersion":1,"ready":true,"zwavePlusRoleType":5,"isListening":true,"isFrequentListening":false,"canSleep":false,"isRouting":true,"supportedDataRates":[40000,100000],"maxDataRate":100000,"supportsSecurity":false,"isSecure":false,"supportsBeaming":true,"protocolVersion":3,"firmwareVersion":"3.94","manufacturerId":600,"manufacturer":"Shenzhen Neo Electronics Co., Ltd.","productId":4231,"productDescription":"Wall Plug Switch","productType":3,"productLabel":"NAS-WR01Z","deviceDatabaseUrl":"https://devices.zwave-js.io/?jumpTo=0x0258:0x0003:0x1087:3.94","keepAwake":false},{"commandClassName":"Meter","commandClass":50,"property":"value","propertyKey":66561,"endpoint":0,"newValue":246.35,"prevValue":245.83,"propertyName":"value","propertyKeyName":"Electric_V_Consumed"}]}
[2023-03-26 18:26:06][DEBUG] : Received message on topic : zigbee2mqtt/bridge/logging => {"level":"info","message":"MQTT publish: topic 'zigbee2mqtt/Jardin - Vanne arrosage 4 voies', payload '{\"last_seen\":\"2023-03-26T20:26:06+02:00\",\"linkquality\":136,\"power_on_behavior_l1\":\"off\",\"power_on_behavior_l2\":\"off\",\"power_on_behavior_l3\":\"off\",\"power_on_behavior_l4\":\"off\",\"state_l1\":\"OFF\",\"state_l2\":\"OFF\",\"state_l3\":\"OFF\",\"state_l4\":\"OFF\"}'"}
[2023-03-26 18:26:06][DEBUG] : Received message on topic : zigbee2mqtt/Jardin - Vanne arrosage 4 voies => {"last_seen":"2023-03-26T20:26:06+02:00","linkquality":136,"power_on_behavior_l1":"off","power_on_behavior_l2":"off","power_on_behavior_l3":"off","power_on_behavior_l4":"off","state_l1":"OFF","state_l2":"OFF","state_l3":"OFF","state_l4":"OFF"}

Est-ce que j’ai fait une mauvaise manip en renommant mes périphériques, un problème connu, un bug ou est-ce « by design » ?
Quand je vois le contenu d’une ligne de log dans mqtt2, je n’y vois pas un id unique comme son IEEE Address qui permettrai de l’identifier avec certitude.

Il semble que le rename de l’Identification depuis z2m ne remonte pas dans Zigbee2mqtt et qu’inversement, le changement du friendly name dans Zigbee2mqtt ne soit pas vu pas vu par z2m.
D’où des infos qui ne redescendent plus vers Jeedom en cas de changement du friendly name.
Pouvoir ordonner ses devices dans Ziogbee2Mqtt sous une forme plus lisible que les IEEE address serait bien, pouvoir utiliser en friendly name un nom structuré sous la forme nom_dossier \ nom_objet est un vrai plus.

Bonjour,
C’est pas si simple si vous activez ça si vous renommez comment jeedom fait le le lien ? Vous changez le topic donc forcement jeedom ne sait plus retrouver l’équipement, c’est simplement impossible avec la méthode d’envoi de z2m.

Clairement faut eviter meme si c’est plus jolie en cas de renommage vous perdez tout et faudra tout refaire dans jeedom… C’est pour que qu’on ne le supporte pas officiellement. Officieusement il faut dans les options de z2m activer include_device_information et normalement c’est bon.

3 « J'aime »

Merci, je me doutais qu’il existait un paramètre de ce style mais je ne l’avais pas trouvé.

En tout cas, je viens de tester, en l’activant, on récupère bien les infos mais par contre si on utilise la notation avec un séparateur en / on perd les infos.
https://www.zigbee2mqtt.io/guide/usage/mqtt_topics_and_messages.html#zigbee2mqtt-friendly-name

TIP

You can use the / separator in friendly_name to structure devices and groups. For example, using a friendly_name like kitchen/floor_light would result in a corresponding MQTT structure with kitchen as folder containing floor_light in MQTT Explorer.

Pour la fonction de rename, Jeedom devrait pouvoir mettre à jour le nom également dans z2m d’après ce que j’ai lu ici : Rename device

zigbee2mqtt/bridge/request/device/rename
Allows you to change the friendly_name of a device on the fly. Payload format is {"from": deviceID, "to": deviceID} where deviceID can be the ieee_address or friendly_name of the device, example: {"from": "my_bulb", "to": "my_bulb_new_name"}. Response will be {"data":{"from":"my_bulb","to":"my_bulb_new_name","homeassistant_rename":false},"status":"ok"}.

In case you are using Home Assistant discovery and also want to update the entity ID according to this new name, send e.g. {"from": "my_bulb", "to": "my_bulb_new_name","homeassistant_rename":true}

In case you want to rename the last joined device, omit the from property and set last to true. Example: {"last": true, "to": "my_bulb_new_name"}.

Si cela était implémenté, on devrait pouvoir se passer de l’option include_device_information: true n’est-ce pas ?

PS : j’avais juste terminé un roll-back du nom de 75 devices à la main pour remettre le friendly name = IEEE address :crazy_face: juste avant de lire la réponse pour le include_device :frowning_face: :smile:

1 « J'aime »

Bonjour,
Non cette option est obligatoire si tu es pas en IEEE que jeedom integre le rename ou non.

Et non jeedom ne va pas aller renommer dans z2m ce n’est pas le but ni utile.

1 « J'aime »

Ok, par contre, tu peux voir si tu peux supporter l’utilisation du / dans le friendly name de z2m stp ?

1 « J'aime »

Ça n’est pas possible ça désolé ça demanderait de refaire toute une recherche avec une profondeur en plus, hormis le temps de dev qui serait assez élevé ça ralentirai aussi pas mal la partie analyse a la réception de commande. Après si tu insistes je transmets la demande a jeedom sas qui tranchera.

1 « J'aime »

Salut,
Si c’est bien le renommage qui vous crée des problèmes, je ne rencontre pas ce souci avec zigbeelinker. (ou alors j’ai mal compris et j’en suis désolé)

2 « J'aime »

Si on renomme le device dans z2m, jeedom le perd sauf à ajouter l’option indiquée par Loic. Elle rend les messages mqtt plus complets et ils transportent egalement l’adresse ieee permettant à Jeedom de retrouver quel équipement est concerné par l’information reçue.

Tu as pu voir si possible que le plugin supporte le / dans le friendly name car même avec option include_device_information: true , le message mqtt n’est pas traité.

Bonjour,
J’ai deja répondu hier je sais pas quoi te dire de plus

Loic,
Désolé, j’avais pas vu ou reçu la notification de ta réponse « ça n’est pas possible » et ensuite le message de Furaxworld s’est intercalé. :crazy_face:

Le support du / serait une fonctionnalité « nice to have » mais pas essentielle dans Jeedom. Elle le serait plus si elle permettait d’intégrer directement l’objet de z2m si friendly name = objet parent dans jeedom / nom du device. Mais c’est en dehors du scope du plugin je pense.

En tout cas merci du thread de partage: je vais éviter d’essayer cela :slight_smile:

Pour les néophytes et en l’absence de documentation, l’option se trouve dans le menu « Réseaux Zigbee », onglet « Configuration »

1 « J'aime »

Bonjour à tous,

J’ai eu le même besoin que @JC38 :

  • organiser les équipements par branche du coté zigbee2mqtt avec le « / »
  • Pouvoir garder la réception des informations par Jeedom grâce à l’identifiant XX:XX:XX:XX:XX:XX:XX:XX comme prévu par le plugin.

J’ai pu lire cette discussion et suite aux peu de solution trouvées à ce jour je me suis permis de corriger le code du plugin z2m afin de répondre à mes propre besoins.

J’ai pu faire la modification nécessaire à la ligne 263 du fichier « /plugins/z2m/core/class/z2m.class.php »

Ce serait bien que le support puisse s’inspirer ou reprendre ma modif dans le but de l’intégrer dans la prochaine release…?

De mon coté c’est parfait les informations remontent dans Jeedom alors que j’ai bien mis des friendlyName avec « / » dans zigbee2mqtt.


MQTT

Voici mes modifications effectuées dans le fichier « plugins/z2m/core/class/z2m.class.php ».

Le principe consiste à aller chercher l’identifiant dans les sous branches du topic reçu seulement si l’identifiant n’as pas été trouvé a la racine.

Pour cela, j’ai ajouté créé la fonction

« public function findIeeeAddrRecursive($data) »

Puis j’ai ajouté un ELSE dans la fonction

« public static function handleMqttMessage($_datas) »

Voici les deux fonctions à coller à la place de la fonction original « public static function handleMqttMessage($_datas) » (Ligne 263) :

// Ajout BeGood 07/08/2023
  public function findIeeeAddrRecursive($data) {
    // MQTT Manager ne transmet que les topics mis à jour donc l'appel à la recursivité n'est pas un problème
        $ret = null; // Variable pour stocker le résultat
        foreach ($data as $key => $value) {
            if (is_array($value)) { // Vérifie si la valeur est un tableau
                if(isset($value['device'])) { // Vérifie si la clé 'device' existe dans le tableau
                    log::add('z2m', 'debug', json_encode($data[$key])); // Debug Log
                    if (isset($value['device']['ieeeAddr'] )) { // Vérifie si la clé 'ieeeAddr' existe dans le sous-tableau 'device'
                        $ret =  $data[$key]; // Stocke le sous-tableau actuel dans la variable de résultat
                    }
                }
                if($ret === null) { // Si le résultat est on cherche dans plus loin dans le tableau
                    $ret = self::findIeeeAddrRecursive($value); // Appelle récursivement la fonction avec le sous-tableau actuel pour chercher dedans
                }
            }
        }
        return $ret; // Renvoie le résultat (peut être null si aucun 'ieeeAddr' n'a été trouvé)
    }
 
  public static function handleMqttMessage($_datas) {
    log::add('z2m', 'debug', json_encode($_datas));
    if (!isset($_datas['zigbee2mqtt'])) {
      return;
    }
    foreach ($_datas['zigbee2mqtt'] as $key => $values) {
      if ($key == 'bridge') {
        self::handle_bridge($values);
        continue;
      }
      if (isset($values['device'])) {
        $key = $values['device']['ieeeAddr'];
      }
      else{
      	// Ajout BeGood 07/08/2023
      	// On recherche IeeeAddr de l'équipement dans les topics enfants 
        $dev = self::findIeeeAddrRecursive($values);
          if ($dev !== null) {
         $key = $dev['device']['ieeeAddr'];
         $values = $dev;          
        }
      }
      log::add('z2m', 'debug', 'Identifiant : ' . $key);
           

      $eqLogic = eqLogic::byLogicalId(self::convert_to_addr($key), 'z2m');
      if (is_object($eqLogic)) {
        foreach ($values as $logical_id => &$value) {
          if ($value === null) {
            continue;
          }
          if ($logical_id == 'device') {
            continue;
          }
          $raw_value = $value;
          if ($logical_id == 'last_seen') {
            $value = (is_numeric($value)) ? date('Y-m-d H:i:s', intval($value) / 1000) : date('Y-m-d H:i:s', strtotime($value));
          }
          if ($logical_id == 'color') {
            $bri = (isset($values['brightness'])) ? $values['brightness'] : 255;
            $color = z2mCmd::convertXYToRGB($value['x'], $value['y'], $bri);
            $value = sprintf("#%02x%02x%02x", $color['red'], $color['green'], $color['blue']);
          }
          log::add('z2m', 'debug', $eqLogic->getHumanName() . ' Check for update ' . $logical_id . ' => ' . json_encode($value) . ', raw : ' . json_encode($raw_value));
          $eqLogic->checkAndUpdateCmd($logical_id, $value);
          if ($eqLogic->getConfiguration('multipleEndpoints', 0) == 1) {
            $explode = explode('_', $logical_id);
            log::add('z2m', 'debug', $eqLogic->getHumanName() . ' Searching for Child' . self::convert_to_addr($key) . '|' . end($explode));
            $eqLogicChild = eqLogic::byLogicalId(self::convert_to_addr($key) . '|' . end($explode), 'z2m');
            if (is_object($eqLogicChild)) {
              log::add('z2m', 'debug', $eqLogicChild->getHumanName() . ' Updating Child' . $logical_id . ' => ' . $value);
              $eqLogicChild->checkAndUpdateCmd($logical_id, $value);
              if (explode('|', $logical_id)[0] == 'battery') {
                $eqLogicChild->batteryStatus(round($value));
              }
            }
          } else {
            if (explode('|', $logical_id)[0] == 'battery') {
              $eqLogic->batteryStatus(round($value));
            }
          }
        }
        continue;
      }
    }
  }
1 « J'aime »

Essaie de le proposer dans le github du plugin

Dams

1 « J'aime »

Bonjour,
La modification sera disponible demain en beta, pour le moment j’ai pas testé donc je vous laisse me faire un retour.

3 « J'aime »

Bonjour Loic et merci pour votre prise en compte.

je tenais à préciser que :

Avec ma modification, si on renomme le friendlyNames du côté zigbee2mqtt

  • Les infos sont bien remontées dans Jeedom
  • Les actions apparaissent dans un topic à part dans MQTT.

Mais si l’utilisateur veut actions et informations dans le même topic (peu probable que ce soit indispensable) alors il ne renommera pas les FriendlyNames dans zigbee2mqtt et il aura le fonctionnement initial.

1 « J'aime »

avec FriendlyNames renommés dans zigbee2mqtt :

  • EN BLEU l’action Jeedom qui prend comme topic l’identifiant du module.
  • EN JAUNE les informations avec FriendlyNames

En esperant que mes explications sont limpides… :grin: