Home Assistant, ZHA & Legrand

Attention : voir l'Edit important plus bas !

Il existe des devices plus ou moins bien intégrés et c'est le cas du contacteur Legrand 412170 (16A) ou 412171 (20A) (doc) qui de base est configuré en HP/HC via le signal fourni par le compteur et ou rien dans l'intégration ne permet à ce jour de la passer en mode on/off. On verra plus loin qu'il existe également une sortie de câble connectée avec ses particularités...

Vous allez me dire qu'il y est très bien géré en Zigbee2MQTT, ou que je pourrais utiliser quelque chose de moins cher (120 €). Là n'est pas la question, mon client (et ami) ne veut que du Legrand dans son tableau et pour simplifier au maximum je ne veux pas de modules externes, d'où ZHA.

L'intégration du contacteur sous ZHA se fait avec le petit bouton qui passe en rouge.

  • Assurez-vous que la passerelle (ZHA) n'est pas en mode d'appairage
  • Appuyez 5 à 8 secondes environ jusqu'à ce qu'il devienne rouge (reset)
  • Passez maintenant votre passerelle ZHA en mode d'appairage
  • Appuyez sur le bouton de réinitialisation 5 à 8 secondes environ pour lancer la procédure d'appairage
  • Effectuez des clics successifs sur ce bouton toutes les secondes, jusqu'à ce que la LED devienne verte

La légende dit que les produits Legrand ne fonctionneraient que sur le canal 11, mon réseau est en 15 et d'autres l'on fait fonctionner en 25...

En cherchant sur la toile je me suis aperçu que nos collègues amateurs de Jeedom avaient réussit à changer les choses via deconz/Phoscon. J'avais donc les valeurs à changer, mais je n'ai pas réussit à les intégrer. 

Pour info le cluster 64513 (en décimal) = FC01 (en hexa)

{"endpoint" : 1,"cluster":64513,"attribute":0,"manufacturer":64513,"name":"Mode","type":"select","values":[{"value":3,"name":"on/off"},{"value":4,"name":"hp/hc"}]},

Sous ZHA en natif on ne peut rien faire sur les clusters à ce niveau. Avec l'excellent ZHA Toolkit il y beaucoup plus de possibilités. Encore fallait t'il bien connaitre le domaine Zigbee afin de trouver le type de valeur d'attribut à configurer. Et là je remercie mdeweerd pour sa gentillesse et sa patience (je vous laisse lire l'échange ici).

Mise en place

Très simple !

  1. On commence par installer ZHA Toolkit
  2. Ensuite il n'y a qu'à lancer cette séquence dans les outils de développement (et on replace la valeur de l'attribut à 4 si on veut revenir au mode HP/HC)
service: zha_toolkit.attr_write
data:
  ieee: 00:04:74:00:00:83:f4:f6
  endpoint: 1
  cluster: 64513
  attribute: 0
  attr_val: [3, 0]
  attr_type: 0x09  # Devrait être facultatif si la lecture précède l'écriture.
  # manf: 4129     # Ne pas définir le fabricant car cela ne semble pas nécessaire dans le cas présent.
  event_done: legrand_done
  write_if_equal: false

EDIT 01/10/2024

Oubliez tout ça, il y a enfin quelqu'un qui a écrit un custon quirk. Et ça change tout ! Qu'il en soit remercié !

Bonus

Sur le même principe il est possible de configurer le comportement de la Led. Ca ne m'a pas intéressé mais voici les valeurs.

    {"endpoint" : 1,"cluster":64513,"attribute":1,"manufacturer":64513,"name":"Led dark","type":"select","values":[{"value":0,"name":"Off"},{"value":1,"name":"On"}]}
    {"endpoint" : 1,"cluster":64513,"attribute":2,"manufacturer":64513,"name":"Led if on","type":"select","values":[{"value":0,"name":"Off"},{"value":1,"name":"On"}]}

Consommation

Pour l'instant l'intégration ne présente que la puissance en W ou A (encore que je n'ai pas testé). Je vais voir quand j'aurais du temps si on peut ajouter le cumul en kWh, mais c'est toujours possible sous HA avec Reiman ou Powercalc. Voici avec Powercalc qui s'il est bien configuré a l'avantage de créer les utilility_meter: à coller dans Energy...

sensor:
  - platform: powercalc
    name: ECS
    entity_id: switch.legrand_ecs
    power_sensor_id: sensor.legrand_ecs_active_power

J'ai passé pas mal de temps (trop car j'ai aussi un job...) sur cette affaire, mais ça m'a permis d'explorer un peu les possibilité de ZHA Toolkit et comprendre qu'il est possible d'intégrer des objets ou des fonctions non reconnues.

Le cas de la sortie de câble connectée

Dans le même genre on trouve une sortie de câble connectée sous différentes références (0 648 79/82/83/98). Ici encore l'intégration ZHA est très incomplète, contrairement à Z2M comme on peut le voir ici. En effet ce module supporte plusieurs modes, alors que le seul appairage est géré directement sous ZHA, ainsi que la puissance instantanée en watts.

Mode dimmer : (ce mode nécessite un firmware récent)

  • 0x0100 : dimmer_on :
  • 0x0100 : dimmer_off

Mode contacteur :

  • 0x0003 : mode switch : Fonctionnement en on/off
  • 0x0004 : mode auto : Fonctionnement en auto, je suppose en HP/HC mais il n'y a pas d'entrée pour le pilotage. Ou domotique Legrand...

Mode fil pilote : (pilot wire)

  • 0x0002 : pilot_on :  Attente des commandes
  • 0x0001 : pilot_off :  Désactivation, on repasse en on/off ?

L'idée est bien sur de contourner ce manque, et si c'est faisable avec Z2M, il n'y a pas de raisons de ne pas y parvenir avec ZHA afin de pouvoir soutenir cet objet sur des installations les plus légères possible.

Changer de mode

service: zha_toolkit.attr_write
data:
  ieee: 00:04:74:00:00:23:3d:b5
  cluster: 64513
  attribute: 0
  manf: 4129
  attr_type: 9
  attr_val:
    - 2      #  Pilot Wire mode
    - 0
  event_done: legrand_done

Piloter un convecteur disposant d'un fil pilote

Le fil pilote est un truc bien Français né de l'abondance de l'électricité atomique qu'il fallait alors promouvoir. Pour faire simple on envoie des commandes qui vont faire adopter une consigne pré réglée sur le convecteurs et qui interagira avec la sonde interne. Bien sur la sonde interne est nécessairement faussée car trop proche des éléments d chauffe. C'est pourquoi sous Home Assistant on dispose de plusieurs composant de thermostats virtuel (le tout dernier est ici) plus ou moins évolués, mais qui se basent sur une sonde externe bin plus réaliste de la température ambiante.

Avec un convecteur ainsi piloté, on peu don soit envoyer des commandes prédéfinie, soit faire un fake switch avec confort (une sorte de on avec un préréglage haut sur le convecteur) et off et le piloter avec un thermostat virtuel.

Il faut savoir qu'un convecteur avec fil pilote ne répond pas à un simple on/off (sauf à insérer une diode dans le circuit). Il va donc falloir sous ZHA pouvoir envoyer les bonnes commandes, et à minima Confort et Off.

Commandes disponibles :

  • 0x00 : Confort
  • 0x01 : Confort -1
  • 0x02 : Confort -2
  • 0x03 : Eco
  • 0x04 : Hors Gel
  • 0x05 : Off

Il ne s'agit pas ici d'écrire un attribut comme pour changer le mode, mais d'envoyer une commande. Et c'est ici que ça se complique

service: zha_toolkit.zcl_cmd
data:
  ieee: 00:04:74:00:00:23:3d:b5
  cmd: 0
  args: [3]
  cluster: 64576
  endpoint: 1
  manf:  0x1021
  event_done: legrand_done

Ensuite on peut lire l'attribut afin de considérer que la commande est acceptée :

service: zha_toolkit.attr_read
data:
  ieee: 00:04:74:00:00:23:3d:b5
  endpoint: 1
  cluster: 64576
  attribute: 0
  event_done: legrand_done

Ce qui va nous retourner :

event_type: legrand_done
data:
  zha_toolkit_version: v0.8.35
  zigpy_version: 0.53.0
  zigpy_rf_version: 0.9.2
  ieee_org:
    - 181
    - 61
    - 35
    - 0
    - 0
    - 116
    - 4
    - 0
  ieee: 00:04:74:00:00:23:3d:b5
  command: attr_read
  command_data: null
  start_time: "2023-02-17T14:54:41.625317+00:00"
  errors: []
  params:
    cluster_id: 64576
    attr_id: 0
    dir: 0
    manf: 4129
    tries: 1
    expect_reply: true
    args: []
    state_id: var.legrand
    state_attr: unique_attr_name_for_ieee
    allow_create: true
    event_done: legrand_done
    read_before_write: true
    read_after_write: true
  attr_type: "0x30"
  write_is_equal: false
  result_read:
    - "0": 5
    - {}
  success: true
origin: LOCAL
time_fired: "2023-02-17T14:54:41.737600+00:00"
context:
  id: 01GSFXXJJ9GYVB5E0S54DVB2YP
  parent_id: null
  user_id: null

Afin de pouvoir l'exploiter on va écrire le résultat dans un état :

service: zha_toolkit.attr_read
data:
  ieee: 00:04:74:00:00:23:3d:b5
  cluster: 0xFC40
  attribute: 0
  manf:  0x1021
  event_done: legrand_done
  state_id: var.legrand
  state_attr: unique_attr_name_for_ieee
  allow_create: true          

Que l'on pourra plus facilement lire :

"{{ is_state_attr('var.legrand', 'unique_attr_name_for_ieee', 5) }}"

Fake Switch

Etant donné que je ne vais pas utiliser le fil pilote autrement que pour faire du on/off afin de commander mon convecteur par un thermostat virtuel associé à une sonde externe, il me faut un switch: à associer au thermostat.

Je vais commencer par faire deux scripts: ON et OFF. Ceux ci ont deux fonction :

  • Envoyer la commande Confort ou OFF
  • Lire l'état afin de confirmer sa prise en compte
script:
  pilot_wire_on:
    alias: "Pilot Wire ON"
    sequence:
      - service: zha_toolkit.zcl_cmd
        data:
          ieee: 00:04:74:00:00:23:3d:b5
          cmd: 0
          args: '0'
          cluster: 64576
          endpoint: 1
          manf:  0x1021
          event_done: legrand_done     
      - service: zha_toolkit.attr_read
        data:
          ieee: 00:04:74:00:00:23:3d:b5
          cluster: 0xFC40
          attribute: 0
          manf:  0x1021
          event_done: legrand_done
          state_id: var.legrand
          state_attr: unique_attr_name_for_ieee
          allow_create: true

Ensuite je crée mon switch: virtuel (pour l'instant je n'ai pas trouvé mieux que de l'associer à un input_boolean: ... à retravailler) :

input_boolean:
  dummy:

switch:
  - platform: template
    switches:
      pilot_wire_sdb:
        friendly_name: 'Convecteur : Salle de Bain'
        # value_template: "{{ is_state('switch.pilot_wire_sdb', 'on') }}"
        value_template: "{{ is_state('input_boolean.dummy', 'on') }}"
        turn_on:
          - service: input_boolean.turn_on
            entity_id: input_boolean.dummy
          - service: script.pilot_wire_on

        turn_off:
          - service: input_boolean.turn_off
            entity_id: input_boolean.dummy          
          - service: script.pilot_wire_off

Et pour terminer je vais créer un binary_sensor: qui va me permettre d'afficher l'état réel en fonction de la lecture :

template:
  - trigger:
      - platform: event
        event_type: legrand_done
        event_data:
          ieee: 00:04:74:00:00:23:3d:b5
          command: attr_read
      - platform: state
        entity_id: binary_sensor.pilot_wire_3
        to: "off"
    binary_sensor:
      name: pilot_wire_3
      icon: "{{ (is_state_attr('var.legrand', 'unique_attr_name_for_ieee', 5)) | iif('mdi:radiator', 'mdi:radiator-off') }}"
      state: "{{ is_state_attr('var.legrand', 'unique_attr_name_for_ieee', 5) }}"

Pour l'instant la puissance en watts (entre autres mais c'est celle ci qui serait utile) ne remonte pas. Je continue à chercher, mais sur une charge fixe, un convecteur par exemple, le contournement simple consiste à utiliser PowerCalc pour la déduire...

Tout cela est certainement perfectible, mais ça nous donne les base pour exploiter totalement ce couteux objet ! En attendant une hypothétique réelle intégration, comme cela a été fait sous Z2M.

Un grand merci à Mario, l'auteur de ZHA Toolkit, pour sa grande patience !

Liens

En vrac, mes sources :

 

Commentaires (34) -

  • Bonjour
    Merci pour ces éléments et ce travail...
    J'ai parcouru le Github également mais l'anglais dépasse parfois mes deux neurones.....

    Mais comment fais tu pour arriver à cela ? :

    https://github.com/mdeweerd/zha-toolkit/issues/85#issuecomment-1244356155

    Merci !!
    • Il suffit de l'intégrer à ZHA de base... si c'est la question ?
      • Non ce n'est pas cela ma question mais je me suis mal exprimé....
        Moi j'ai avec les télérupteurs Legrand :

        type: entities
        entities:
          - entity: switch.inter_sejour_1
          - entity: select.inter_sejour_1_device_mode
          - entity: sensor.inter_sejour_1_device_mode
          - entity: sensor.inter_sejour_1_power
          - entity: sensor.inter_sejour_1_linkquality
        title: Inter Montée Escalier

        En visuel j'ai
        un switch
        le mode (auto ou switch)
        l'affichage du mode
        la puissance en W
        Le linkquality en lqi

        Toi je vois que tu as :
        Binary input
        Electrical measurement en W
        Electrical power
        Electrical "quelquechose" en A
        Electrical "quelquechose" en V


        • Moi je n'ai pas le télérupteur mais le contacteur (ref Legrand 412171). Tu es bien ZHA ? Car sous Z2M les entités ne sont pas le mêmes.
  • Re Hello
    Je pense que les deux ont les même fonctions....
    Dans Z2M du moins ils ont les mêmes remontées d'infos

    Je vais les comparer dans ZHA....
    Mais je comprends toujours pas comment ajouter ces fonctions dans ZHA avec Toolkit....

    • Il suffit de lancer le service avec le bon code qui dépend de ce que tu veux obtenir et d eton modèle (que je ne connais pas, mais je pensais en commander un). Quele ref ?
  • Je comprends le principe....
    Il faut que je teste en live sur le legrand 412170

    Si tu en as à l'occasion un sous la main et que tu "recode" et si tu en as le temps alors merci d'avance

    Et bravo pour ta réactivité sur ton site, c'est très pro

    Claude
  • Bonjour et merci pour votre blog :)
    Je dispose d'une infra Zigbee pleinement opérationnelle qui repose sur un Synology.
    Docker HA + Docker Zigbee2mqtt + MQTT Broker Mosquitto.
    Disposant de 3 contacteurs drivia Legrand 20A j'ai voulu me lancer dans l'appairage plutôt que de passer par HomeKit qui ne me donne pas vraiment satisfaction.
    J'ai suivi la procédure de reset et d'appairage mais rien y fait. La LED du module legrand reste verte clignotante et Zigbee2mqtt ne voit rien passer.
    2 choses : Soit je ne maitrise pas la procédure d'inclusion (j'en doute) soit la portée de mon réseau ZigBee ne plait pas à Mr Legrand.
    J'ai pourtant d'autres devices d'autres marques à proximité....
    D'avance un grand merci pour vos conseils ;)
    Stéphane
    • Possible que ton installation zigbee soit sur un canal non supporté par Legrand qui n'accepte de souvenir que le canal 11 (à vérifier)
    • Bonjour Steph,
      as tu résolu ton problème ?
      J'ai le même souci que toi...
  • Bravo pour ce travail, mais petite question, j'"essaie sur mes interrupteur legrand de faire allumer la LED quand la lumière est eteinte,
    J'ai trouver ces informations :

    attribute 0x0001
    Data 0x01 > enable led in dark
    Data 0x00 > disable led in dark

    mais quand j'utilise le service ZHA Toolkit: Write Attribute, il me ressort une erreur "Échec de l'appel du service zha_toolkit.attr_write. Unknown error"

    serait-tu comment faire ?
    • Aucune idée, ça date un peu, je te conseille de poser la question à Mario qui l'auteur de ZHA Toolkit.
  • Bonjour,
    Merci bien pour ce travail, ça m'a permis d'ajouter mon contacteur directement dans ZHA.

    Je reviens juste sur une chose, depuis le temps que tu as écrit cet article, as-tu réussi à intégrer la consommation dans Energy ?
    • Oui avec Powercalc, j'avoue que je n'ai pas cherché plus loin. Ensuite tu mets l'Utility Metter dans Energy et ca fait le taff...
      • Je l'ai installé et effectivement ca fait le taf.
        J'ai enfin ma conso de mon chauffe-eau qui remonte bien.
        • Au passage, pour remonter une charge fixe avec Powercalc il n'y a pas besoin d'un compteur dans le relais.... le on/off suffit ;-)
          • Oui ca peut etre bien.
            Mais ca ne prend qu'une valeur fixe et sur un chauffe eau par exemple, le thermostat peut couper la conso, enfin surtout si tu lui donnes une grande plage de chauffe.
            • Oui j'utilise ça sur un convecteur que je pilote en on/off (thermostat interne forcé)
  • Hello , j'essaie de suivre ton tuto pour la sortie de câble connectée Legrand mais j'obtiens un résultat différent du tiens quand je lis l'attribut :

    zha_toolkit_version: v1.1.8
    zigpy_version: 0.60.1
    zigpy_rf_version: 0.22.2
    ieee_org:
      - 225
      - 39
      - 22
      - 0
      - 0
      - 116
      - 4
      - 0
    ieee: 00:04:74:00:00:16:27:e1
    command: attr_read
    command_data: null
    start_time: "2023-12-15T12:18:28.227618+00:00"
    errors: []
    params:
      endpoint_id: 1
      cluster_id: 64576
      attr_id: 0
      dir: 0
      tries: 1
      expect_reply: true
      args: []
      event_done: legrand_done
      read_before_write: true
      read_after_write: true
    attr_type: "0x30"
    write_is_equal: false
    result_read:
      - "0": 3
      - {}
    success: true

    Notamment le "0" et peu importe la valeur que je mets dans la commande d'écriture (je sais pas si c'est super clair ^^') J'essaie de l'intégrer comme contrôleur de mon radiateur, je suis bien perdu ... et je souhaiterai éviter de devoir migrer toute mon installation zigbee sous Z2M
    • Ne migre rien, on va y arriver. J'ai l'impression que le comportement est différent selon la version du frirmware. quel est le tien ?
      • Hello, j'ai celle-ci : 0x00174203 J'ai essayé maintenant que le radiateur est en place, mais j'ai aucun retour et j'entends rien au passage confort/off, le radiateur reste allumé en rouge (en chauffe d'aprés la notice)
        • J’hésite à supprimer de ZHA et essayer de le reappairer, parce que j’ai aucune remontée d’info dans HA (ni tension ni conso etc..) je sais pas si ça fera le moindre changement 😅
        • Parfois il faut mettre le radiateur dans la position de recevoir les ordres, notamment dans les appareil récents qui ont également une prog interne.
          • J'ai rien trouvé a ce sujet, c'est un radiateur assez ancien que l'on m'a donné... Mais ce qui m'etonne c'est que meme la conso en W et la puissance restent a 0 sur la prise...
            • La conso on s'en fout, facile à résoudre car puissance fixe. Donc au pire avec PowerCalc. Concentre toi sur les ordres (mais as tu réussit à l'appairer en ZHA ?)
              • Je viens de le reappairer avec ZHA , j'arrive a faire basculer le relais pour faire On/off mais c'est tout pour le moment
                • Cool. A partir de la il faut lui envoyer les instructions pour le passer en mode fil pilote. Et ensuite le commander avec le fake switch (off/comfort si tu as un Climate local ou les autres ordres sans thermostat virtuel.
                  • Peu importe la valeur que je mets dans cmd: 0 , j'ai la meme reponse que mon commentaire du départ et aucun changement, aucun bruit sur la prise, rien
              • Le passage en mode fil pilote semble fonctionner, je perds le contrôle du on/off mais aprés ça rien du tout, la commande donne la meme chose qu'au départ
  • Bonjour,
    Merci pour les informations partagées ici, ça m'a bien aidé a mettre en route mon compteur Legrand 412015 chez moi.
    J'ai bien galéré pour l’appairer mais votre tuto m'a aidé. Ensuite il a été parfaitement reconnu par ZHA, et comme il ne compte pas les kWh j'ai utilisé Powercalc en suivant vos conseils.
  • Il y a quelqu'un qui a écrit un custom quirk, et ça change tout !
    https://github.com/zigpy/zha-device-handlers/issues/3339#issuecomment-2335663494
  • Bonjour, j'ai un legrand 412171. Detecte par zha sans soucis. Par contre rien ne se passe. J'ai mis le quirk de zigpy et dans mon configuration.yaml
    zha:
      custom_quirks_path: /config/custom_zha_quirks/

    Quelquesoit l endroit ou je clique commutateur ou autre j'ai Zigbee_delivery_failed :3074
    Une idée?
    Merci
  • je me reponds a moi meme. J'avais change le canal de com en 11 pour respecter ce que j ai lu. En remettant le canal a auto, il s est remis sur le 25 et cela a marche apres exclusion/inclusion. Donc ne pas changer son canal zigbee :-)

Ajouter un commentaire

Loading