Depuis un moment, j’avais envie de tester le protocole EnOcean et surtout les appareils sans pile comme un détecteur d’ouverture de porte ou de fenêtre, des thermomètres ou des télécommandes.
Donc j’ai acheté le contrôleur EnOcean USB 300. Je l’ai positionné sur un port USB et j’ai redémarré Home Assistant. Au redémarrage, j’ai ajouté l’intégration EnOcean depuis le menu HA : configuration et intégrations. Il ne pose qu’une seule question, où se trouve la clé ? Mais comme il offre un menu déroulant, il suffit de sélectionner la seul clé USB 300 qu’il a détecté au démarrage … Trop cool !!!

Avec la clé USB 300, j’ai pris juste une télécommande NodOn soft remote EnOcean Cozy grey … Une télécommande à quatre boutons.

J’ai beau appuyé sur la télécommande, je vois rien bougé dans HA … Si on en réfère a la doc de HA, (https://www.home-assistant.io/integrations/enocean/) c’est super simple, sauf pour un petit détail dont il ne parle pas vraiment et qui fait toute la différence … Où trouve-t-on, le numéro d’identifiant de la télécommande ? On a bien sur la notice, la référence EEP (EnOcean Equipment Profiles) correspondant au type d’appareil, comme par exemple F6-02-02 pour une télécommande, mais en aucun cas l’identifiant !!! Ce code EEP : F6-02-02 correspond a un binary_sensor sous HA.
Comment trouver l’identifiant EnOcean ?
Dans un premier temps, il faut autoriser les logs pour EnOcean. Pour ce faire il faut, il faut éditer le fichier configuration.yaml puis rajouter les lignes suivantes :
logger:
default: info
logs:
homeassistant.components.enocean: debug
Vous redémarrez HA, puis vous vous positionnez dans les logs : configuration et journaux. Vous cliquez une fois sur un des boutons de votre télécommande et vous regardez la dernière ligne des logs … Vous devez trouver une ligne comme ci-dessous :
2020-08-10 17:07:05 DEBUG (Thread-2) [homeassistant.components.enocean.dongle] Received radio packet: 0A:55:E6:AD->FF:FF:FF:FF (-74 dBm): 0x01 ['0xf6', '0x0', '0x0', '0x34', '0xf6', '0x89', '0x30'] ['0x0', '0xff', '0xff', '0xff', '0xff', '0x4a', '0x0'] OrderedDict()
En début de code, après les mots « Received radio packet » il y a votre identifiant. Vous trouve quatre valeur hexadécimal (0A:55:E6:AD) que vous notez bien soigneusement pour votre télécommande. Vous pouvez aussi les convertir en décimal et les mémoriser. Vous allez ensuite éditer le fichier binary_sensor.yaml et rajouter votre code comme ci-dessous, avec le nom que vous souhaitez lui donner et 0x devant chaque valeur hexadécimal :
- platform: enocean
id: [0x0A,0x55,0xE6,0xAD]
name: Télécommande Led Salon
A partir de là, vous avez déclaré votre télécommande et vous pouvez vous en servir ! Ne chercher pas un appareil (device) dans HA, vous n’en trouverez pas, pour la simple raison, que cette télécommande est un simple événement ! Elle envoi un court télégramme au moment d’une action sur un bouton, donc cela devient juste un événement … La seule solution pour l’utiliser est de créer un script ou un automatisme associé aux événements de la télécommande.
Automatiser votre télécommande EnOcean :
Concernant les événements lors d’appui sur les boutons, nous avons trois valeurs booléennes possibles. Le première est l’appui sur une touche ou son relâchement : pushed. Il est a 1 quand on appui sur le bouton et a 0 quand on le relâche. La deuxième valeur est la rangé des boutons : which. La rangé + ou – réponds a la valeur 1 et la rangé O vide ou O plein, réponds a la valeur 0. Puis la dernière valeur, onoff. Qui correspond a Marche ou Arrêt, le O plein et le O Vide ou encore au + et au –. Je vous laisse tester ces différentes valeurs en vous appuyant sur l’exemple ci dessous. C’est juste un automatisme pour incrémenter la lumière du salon quand on appui sur la touche + de la télécommande :
- id: '111111111111'
alias: Telecomande NodOn On
description: ''
trigger:
- event_data:
id:
- 10
- 85
- 230
- 173
onoff: 0
pushed: 1
which: 1
event_type: button_pressed
platform: event
condition: []
action:
- data: {}
entity_id: light.led_salon
service: light.turn_on
mode: single
Comme vous pouvez le voir, les valeurs sont ici notifié en décimal … Pour les mettre en hexadécimal, mettez 0x devant la valeur hexadécimal. Par exemple, 10 = 0x0A, 230 = 0xE6. Mais il me semble que HA les affiche en Héxa dans les logs et qu’il les utilise en décimal … ou les traduit en décimal si vous les écrivez en héxa …
Comment utiliser votre télécommande EnOcean dans Node Red ?
Maintenant nous allons compliquer les choses et utiliser Node Red. Il existe des modules pour EnOcean dans Node Red, mais je vais rester simple et utiliser les modules de base pour HA avec un peu de programmation. Plus haut, on a déclaré la télécommande EnOcean dans les fichiers de HA pour qu’elle soit utilisable par HA et par Node Red … Dans le cas contraire, elle ne sera pas utilisable, ni dans HA, ni dans Node Red !
Dans un premier temps nous allons rajouter le Node EVENT : ALL. et dans le champ event type, vous allez mettre : button_pressed. Puis vous rajouter une node DEBUD pour lire les info qui arrive a chaque touche pressée ou relâchée.

Vous déployez le FLOW et vous vous amusez a lire les informations correspondants a chaque combinaison de le télécommande. Vous les notez bien soigneusement !!! Pour ma part, j’ai noté cela :

Ce tableau va nous servir par la suite, car nous aurons besoin des valeurs binaires, même si je les gère en tant que chaîne de caractères. Dans un premier temps, nous allons construire la fin, ce qui nous intéresse … Pour simplifier les choses, je me suis fait un bouton intermédiaire input_nimber de 0 à 100 avec un incrément de 10, ce qui donnera 0% = éteint, 100% allumé a fond, et incrément ou décrément de 10% … pour commande une lampe variable :

Pour la détection du bouton, je met une Node EVENT STATE et je lui donne l’entity id : input_number.led_salon et le reste est en string. Je mets ensuite une Node CALL SERVICE avec les informations classiques de votre lumière variable. Dans le DATA, vous devez mettre : {« brightness_pct »: {{payload}}} pour récupérer la valeur du changement de bouton. Comme vous le voyez, je joue uniquement sur la luminosité, pas sur les couleurs, que je réserve pour les alarmes. Vous pouvez ainsi tester que le bouton change bien le luminosité de votre ampoule.
Pour les commandes de lampes, on va utiliser une Node CALL SERVICE, en définissant le domaine, le service et votre entity id, qui va changer l’état du bouton input_number uniquement.

Vous remplissez la Node de façon classique. Dans le champ SERVICE, vous mettez set_value et dans le champ DATA, vous insérez {« value »: »100″} pour allumer ou {« value »: »0″} pour éteindre. Pour changer la luminosité, vers plus ou vers moins, vous mettez le SERVICE à increment ou le SERVICE à decrement et le DATA reste vide. Cela donne les quatre Node en bleu …
Ensuite, je vais mettre une Node SWITCH pour sélectionner l’une des quatre valeur sur une touche pressée, qui va ainsi créer les quatre commandes de gestion d’une lampe : On, Off, Incrémente, Décrémente … Pour ce faire renseigner le switch comme l’image ci dessous avec vos valeurs selon les touches de votre télécommande. (idem au tableau ci-dessus)

Cela fonctionne comme un aiguillage, si vous appuyez sur le touche qui réponds a 100, c’est la sortie 1 qui enverra les information pour la commande. A revérifier en fonction de vos valeurs !!! Jusque là c’est simple et compréhensif …. Mais nous avons un problème, car il se peut et c’est une certitude, qu’il y ai plusieurs télécommandes ou autre appareils et qu’il faut vérifier l’identifiant du bouton et envoyer le code au switch …
Et si on utilisait une Node FUNCTION ?
Cela nous permettra de programmer un bout de code. Vous déposez la Node FUNCTION entre la sortie de la NODE Buton_pressed et l’entrée de la Node Switch. comme l’image ci-dessous …

Ensuite, vous lui donnez un nom et vous sélectionnez l’onglet Function pour y mettre le texte ci-dessous :
var id_ok = "10-85-230-173"
var id = String(msg.payload.event.id[0]) + "-"
id = id + String(msg.payload.event.id[1]) + "-"
id = id + String(msg.payload.event.id[2]) + "-"
id = id + String(msg.payload.event.id[3])
if (id === id_ok){
var resultat = String(msg.payload.event.pushed)
resultat = resultat + String(msg.payload.event.which)
resultat = resultat + String(msg.payload.event.onoff)
msg.payload = (resultat)
return msg
}
On commence par placer VOTRE Identifiant de télécommande sur la première ligne pour la valeur id_ok. Chaque valeur décimale, doit être séparée par un tiret, cela permet de connaître la vérité. Exemple : 1-0-32-145 ne peut pas être égal à 10-3-2-145 d’où l’utilité des tiret !!!
La variable id récupère automatiquement la valeur de l’identifiant de votre télécommande. Si id = id_ok c’est que l’identifiant envoyé par votre télécommande est bien celui que vous avez notifié sur la première ligne. Si c’est faux, on ne fait rien, mais si c’est vrai, on récupère les trois valeur booléennes et on les mets au format chaîne de caractère pour être traité par le Node SWITCH ….
Si vous avez plusieurs appareil EnOcean, on peut imaginer séparer la Node FUNCTION en deux, une pour récupérer l’identifiant et l’autre pour récupérer les valeurs booléennes et le tout gérer par des Node SWITCH.