Piloter ses éclairages Legrand In One (CPL) avec Gladys

Tutoriel : piloter ses éclairages Legrand In One (CPL) avec Gladys

Ce tutoriel explique comment mettre en œuvre l’intégration Legrand In One CPL de A à Z : branchement de l’interface, passerelle série, installation, découverte des appareils, lecture des journaux, règles d’état et tableau de bord.

Prérequis : une installation Legrand In One (interrupteurs, interscénarios), une interface Legrand CPL/USB réf. 882 13, et Gladys 4.86 ou plus récent. L’intégration n’est pas affiliée à Legrand.


1. Brancher l’interface 882 13

L’interface 882 13 se branche sur un port USB de la machine qui fait tourner Gladys. Linux la voit comme un port série (/dev/ttyACM0), avec un nom stable dans /dev/serial/by-id/ :

ls -l /dev/serial/by-id/

Chez moi : usb-Btcino_Terraneo_Mod._SFERA_Tele_Loop-if00 (le nom BTicino est normal, c’est le fabricant du module).

Où la brancher ?

Machine Faisable ? Remarques
Raspberry Pi 4/5, Home Assistant Yellow Oui C’est mon cas (Yellow). Branchez-la en direct, pas via un hub USB non alimenté.
Mini PC sous Linux (Debian, Ubuntu…) Oui Identique au Pi.
NAS (Synology, QNAP) avec Docker Souvent Il faut que Docker puisse monter le périphérique (devices:). Pas testé.
Gladys dans une VM Difficile Il faut passer le port USB à la VM. Évitez si possible.
Gladys sous Windows / macOS Non La passerelle série (ci-dessous) a besoin d’un Linux.

Limite importante : l’interface doit être branchée sur une prise du même réseau électrique que vos modules In One (même tableau, idéalement même phase). Le courant porteur ne traverse ni les filtres (882 12 / 882 21 / 882 23) ni, en général, les compteurs. Si certains modules ne sont jamais entendus, c’est la première chose à vérifier.

2. Créer la passerelle série (obligatoire)

Les intégrations Gladys tournent dans un bac à sable sans accès USB. Un petit conteneur socat expose donc le port série sur un port TCP, auquel l’intégration se connecte.

Créez un dossier (par exemple ~/legrand) avec ce docker-compose.yml, en remplaçant le nom du périphérique par le vôtre :

services:
  legrand-serial:
    image: alpine/socat
    container_name: legrand-serial
    restart: always
    labels:
      - com.centurylinklabs.watchtower.enable=false
    devices:
      - /dev/serial/by-id/usb-Btcino_Terraneo_Mod._SFERA_Tele_Loop-if00:/dev/legrand
    ports:
      - "172.17.0.1:2000:2000"
    command: tcp-listen:2000,fork,reuseaddr,max-children=1 /dev/legrand,raw,echo=0,b115200,hupcl=0

Puis :

cd ~/legrand
docker compose up -d
docker ps | grep legrand-serial

Deux points à savoir :

  • 172.17.0.1 est l’adresse de l’hôte vue depuis le réseau Docker de Gladys. Elle convient sur une installation Docker standard. Si votre réseau Docker est différent, vérifiez avec docker network inspect bridge.
  • max-children=1 : une seule connexion à la fois. Si vous ouvrez un nc 172.17.0.1 2000 pour tester, l’intégration perd la passerelle jusqu’à ce que vous fermiez le test.

Test rapide, avant d’installer l’intégration :

nc 172.17.0.1 2000

Appuyez sur un interrupteur mural : une trame comme *1*1*0#15112945## doit s’afficher. Quittez avec Ctrl-C. Si nc manque : sudo apt install netcat-openbsd.

Si vous utilisez l’image Raspberry Pi de Gladys (« Gladys OS »)

L’image officielle est un Raspberry Pi OS avec Docker déjà installé. La passerelle se crée donc exactement comme ci-dessus ; il faut seulement ouvrir un terminal sur le Pi via SSH.

1. Se connecter en SSH. Depuis un ordinateur du même réseau :

ssh pi@gladys.local

(ou ssh pi@ADRESSE_IP_DU_PI). Les identifiants sont ceux de l’image de la fondation : login pi, mot de passe raspberry. Sur Windows, utilisez PowerShell ou PuTTY. Au premier accès, changez le mot de passe avec passwd.

2. Repérer l’interface 882 13. Branchez-la, puis :

ls -l /dev/serial/by-id/

Notez le nom qui commence par usb-Btcino_....

3. Créer la passerelle. Toujours dans le terminal SSH :

mkdir -p ~/legrand && cd ~/legrand
nano docker-compose.yml

Collez le docker-compose.yml ci-dessus (le clic droit colle dans la plupart des terminaux), remplacez le nom du périphérique par le vôtre, enregistrez avec Ctrl-O puis Entrée, quittez avec Ctrl-X. Lancez ensuite :

docker compose up -d
docker ps | grep legrand-serial
  • « permission denied » : ajoutez sudo devant, ou ajoutez votre utilisateur au groupe Docker (sudo usermod -aG docker pi, puis déconnectez-vous et reconnectez-vous).
  • docker compose inconnu (ancienne image) : essayez docker-compose up -d, avec un tiret.

4. Vérifier avec le test nc ci-dessus. Le conteneur redémarre tout seul avec le Pi (restart: always).

La même procédure vaut pour un mini PC sous Debian ou Ubuntu avec Docker : seul l’identifiant SSH change. L’image Gladys ne couvre pas le Raspberry Pi 5 ; pour celui-ci, Gladys s’installe par Docker à la main, et la passerelle se crée de la même façon.

3. Installer l’intégration

Dans Gladys : Intégrations → catalogue, cherchez « Legrand In One CPL », Installer. Les mises à jour se feront ensuite depuis le catalogue.

4. Configuration

Trois réglages :

  • Adresse de la passerelle série : 172.17.0.1 (par défaut).
  • Port TCP : 2000 (par défaut).
  • Appareils liés (Règle 1 à Règle 12) : laissez vide pour l’instant, on y revient au chapitre 8.

Cliquez sur Enregistrer la configuration. Le badge Connecté en haut concerne la liaison avec Gladys ; la liaison avec la passerelle se vérifie dans l’onglet Journaux, qui doit afficher Connected to 172.17.0.1:2000.

5. Découverte : faire parler l’installation

Le bus In One ne sait pas lister ses équipements. L’intégration apprend chaque circuit en l’entendant : il faut donc appuyer sur les boutons.

  1. Ouvrez l’onglet Journaux dans une fenêtre, pour voir les trames arriver.
  2. Faites le tour de la maison et appuyez une fois sur chaque touche de chaque interrupteur et de chaque interscénario, y compris les touches de scénario, même celles qui ne sont programmées sur rien. Un interscénario dont seule la touche marche/arrêt a parlé est reconnu comme un simple « inter » ; dès qu’une de ses touches de scène parle, il devient « inter scenario ».
  3. Revenez dans Découverte et cliquez sur Scanner.

Chaque touche apparaît comme un appareil :

  • Legrand 944559-1 (inter) : une touche d’interrupteur, avec une fonction Éclairage On/Off ;
  • Legrand 648966-1 (inter scenario) : la touche marche/arrêt d’un interscénario ;
  • Legrand scenario 648966-3 : une touche de scénario, exposée comme un bouton « Clic ».

Le nombre 944559-1 est le numéro de circuit : identifiant du module (944559) et numéro de touche (1). Il revient partout : journaux, règles, paramètres techniques. Notez-le pour chaque appareil.

Si une touche manque, appuyez dessus de nouveau et relancez le scan. La liste des circuits connus est conservée au redémarrage.

6. Ajouter les appareils à Gladys

Cliquez sur Ajouter à Gladys pour chaque appareil utile, puis choisissez sa pièce dans l’onglet Appareils.

Un conseil : ne renommez pas les appareils. Gardez Legrand 944559-1 (inter) comme nom, éventuellement complété (Legrand 944559-1 (inter) Spot Cuisine), de façon à conserver le numéro de circuit visible. C’est lui qui fait le lien avec les journaux et les règles ; sans lui, on ne s’y retrouve plus. Le nom « joli » se donne dans le tableau de bord, où chaque tuile peut avoir son propre libellé (chapitre 9).

Astuce : vous pouvez ne pas ajouter les touches de scénario non programmées ni les interrupteurs qui ne pilotent rien.

7. Comprendre les journaux

Chaque ligne raconte ce qui se passe sur le bus. Les trames sont au format Open Web Net *QUI*QUOI*OÙ## :

Ligne Sens
Frame received: *1*1*0#15112945## (944559-1) une touche d’éclairage a envoyé allumer (*1*1). L’adresse 15112945 correspond au circuit 944559-1.
Frame received: *1*0*0#15112945## (944559-1) la même touche a envoyé éteindre (*1*0).
Light 944559-1 … is now on l’état affiché dans Gladys a changé. Cette ligne n’apparaît que si l’état change : appuyer deux fois sur « allumer » ne la produit qu’une fois.
Frame received: *25*11*0#10383459## (648966-3) une touche de scénario a été pressée (*25*11).
Scenario 648966-3 … clicked le bouton Gladys correspondant a reçu un clic.
Frame received: *25*16*… fin d’appui du scénario, ignorée.
Linked light 944559-1 is now off (from 648966-3) une règle d’appareils liés a mis à jour l’état (chapitre 8). Rien n’est envoyé sur le bus.
Sent *1*0*#15112945## (944559-1 off) Gladys a envoyé une commande au bus. La réponse *#*1## est l’accusé de réception.

Le lien entre une trame et un appareil est l’adresse : adresse = identifiant × 16 + numéro de touche. 944559 × 16 + 1 = 15112945. L’intégration fait le calcul et affiche le numéro de circuit entre parenthèses, vous n’avez pas à le faire.

8. Les règles « Appareils liés »

Pourquoi elles existent

Dans le système In One, seules les touches parlent sur le bus. Un récepteur (le relais qui commande la lampe) écoute les touches qu’il a apprises et réagit, sans jamais rien dire. Gladys ne peut donc pas savoir qu’une lampe est allumée : il n’y a aucune trame pour cela, et aucune demande d’état n’est possible.

Conséquence : un appareil Legrand 648966-1 dans Gladys est une touche, pas une lampe. Quand cette touche allume la cuisine, les appareils « Spot Cuisine » et « Plafonnier Cuisine » restent affichés éteints dans Gladys, puisque leurs propres touches n’ont pas parlé. Les règles corrigent cela : elles disent à l’intégration quelles lumières suivent quel bouton, dans Gladys uniquement. Rien n’est envoyé sur le bus.

Les deux formes de règle

Une touche d’éclairage à gauche : les lumières de droite copient son état.

648966-1 -> 944559-1, 944559-2

Quand la touche 648966-1 passe à allumé (depuis le mur ou depuis Gladys), 944559-1 et 944559-2 passent à allumé dans Gladys ; à éteint, pareil. C’est la règle pour un interrupteur qui pilote plusieurs récepteurs, ou pour deux interrupteurs qui commandent la même lampe (va-et-vient) :

929520-1 -> 944561-1
929521-1 -> 944561-1

Une touche de scénario à gauche : chaque lumière prend l’état écrit après =.

648966-3 -> 944559-1=off, 944559-2=off, 648966-1=off

Un scénario n’a pas d’état on/off, seulement un appui : vous dites donc ce qu’il fait à chaque lampe (=on ou =off). Pensez à inclure les touches qui pilotent ces lampes (ici 648966-1=off), sinon le bouton de la touche resterait affiché allumé.

Pour un scénario « tout éteindre », listez toutes vos lumières :

950680-3 -> 944556-1=off, 944556-2=off, 944559-1=off, 944559-2=off, 944560-1=off, 944560-2=off, 944561-1=off, 944561-2=off, 648966-1=off, 929521-1=off, 929520-1=off, 929523-1=off, 929528-1=off

Pour un scénario « tout éteindre sauf le salon » : même liste, avec 944560-1=on.

Règles pratiques

  • Une règle par champ (Règle 1 à Règle 12). Plus de 12 règles ? Mettez-en plusieurs dans un champ, séparées par ;.
  • Les règles s’appliquent dès l’enregistrement, sans redémarrage.
  • Une règle invalide est ignorée sans erreur : si rien ne se passe, vérifiez les numéros.
  • Un lien ne s’applique que sur un niveau : A -> B puis B -> C ne propage pas de A à C. Ça évite les boucles.
  • Pour vérifier une règle : appuyez sur la touche et regardez les lignes Linked light … (from …) dans les journaux.

Comment trouver ce que fait chaque touche

Faites l’inventaire pièce par pièce : pour chaque interrupteur et chaque scène, notez quelles lampes s’allument ou s’éteignent réellement. C’est l’information que l’intégration ne peut pas deviner. Un tableau comme celui-ci aide :

Touche Effet réel Règle
648966-1 (entrée, marche/arrêt) allume/éteint spot et plafonnier cuisine 648966-1 -> 944559-1, 944559-2
950680-3 (scène 3) éteint toute la maison 950680-3 -> … tout =off
950680-4 (scène 4) allume plafonniers salon et séjour 950680-4 -> 944560-1=on, 944560-2=on

9. Le tableau de bord

Dans le tableau de bord, créez des blocs « Appareils » par pièce et donnez à chaque tuile le nom lisible (Spot, Plafonnier, Applique…). C’est ici que les noms parlants prennent place, l’appareil gardant son numéro de circuit.

Les touches de scénario peuvent aussi servir de déclencheur de scène Gladys : « quand Legrand scenario 950680-3 est cliqué, faire… » (couper une prise, prévenir, etc.).

10. Si ça ne marche pas

  • Aucune trame dans les journaux : vérifiez docker ps | grep legrand-serial, puis que rien d’autre n’est connecté au port 2000 (une seule connexion possible). docker restart legrand-serial libère la passerelle ; l’intégration se reconnecte seule.
  • ECONNREFUSED 172.17.0.1:2000 : la passerelle n’écoute pas, ou pas sur cette adresse.
  • Une lampe n’apparaît pas : son interrupteur n’a pas encore parlé, ou il est sur un autre circuit électrique (filtre, autre phase).
  • L’état d’une lampe est faux : il manque une règle, ou la règle ne cite pas la bonne touche. Les journaux montrent la touche qui a parlé.
  • La commande depuis Gladys ne fait rien : regardez la ligne Sent … et la réponse. *#*1## = accepté par l’interface ; *#*0## = refusé. Si c’est accepté mais que rien ne bouge, le récepteur n’a pas appris cette touche.

Matériel testé et limites

Testé sur mon installation (22 appareils) : inter double 672 02, inter simple 672 01, interscénario d’éclairage 672 08, interscénario émetteur 672 80, Gladys 5.3 sur Home Assistant Yellow. Les autres inters marche/arrêt de la gamme devraient fonctionner ; les variateurs seulement en marche/arrêt ; les volets ne sont pas pris en charge dans cette version. Les retours sur d’autres modules sont les bienvenus sur le dépôt : GitHub - XDECO/gladys-integration-legrand-inone: Unofficial Gladys Assistant integration to control Legrand In One (PLC) lights through the Legrand 882 13 USB interface. · GitHub

Code sous licence Apache-2.0, développé avec l’aide de Claude (Anthropic) et validé sur mon installation. Je ne suis pas développeur : les relectures de développeurs confirmés sont les bienvenues.