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 !
- On commence par installer ZHA Toolkit
- 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 :