Table des matières
Bonjour à tous,
Dans cet article, nous allons voir comment configurer votre Raspberry Pi pour qu’il puisse contrôler vos prises CHACON/DiO.
Les prises CHACON/DiO
Les prises CHACON/DiO sont des prises électriques pilotables par commande radio. En temps normal, on utilise la télécommande fournie avec mais aujourd’hui, on va voir comment les piloter depuis un Raspberry Pi. Mon bloc TV est par exemple sur un de ces prises, il suffit d’un appui sur la télécommande pour l’allumer ou l’éteindre, cela évite de garder en veille la TV, le décodeur … Cependant, la télécommande a ses limites, notamment pour une éventuelle automatisation. J’ai par exemple un disque dur qui n’a besoin d’être alimenté que pour le temps de mes sauvegardes, le Raspberry Pi est un excellent candidat pour automatiser cette tâche, d’autant que c’est lui qui réalise la sauvegarde, mais ça, ça sera pour un autre article !
Avant d’utiliser les prises de cette marque, j’étais sur des prises 433Mhz classiques achetées dans un grand magasin de bricolage. J’avais cependant un gros problème de fiabilité. En effet, les prises ne répondaient pas toujours aux demandes effectuées. Etant donné que ma stratégie de sauvegarde nécessite l’utilisation d’une de ces prises pour l’alimentation du disque dur, j’ai dû réagir.
Je me suis tourné vers les prises DiO de la marque Chacon (j’ai pris ces prises pour être exact) sur lesquelles j’ai vu pas mal de retours positifs.
À première vue, il s’agit de prises 433MHz donc j’ai voulu les utiliser de la même manière que mes anciennes prises. J’ai rapidement fait face à un problème puisque le module de réception n’affiche aucunes valeur lors d’un appui sur la télécommande. Si on regarde mieux les caractéristiques des prises, on voit que le protocole utilisé s’appelle le DiO 1.0, un protocole maison très proche d’un protocole nommé HomeEasy.
Préparation du Raspberry Pi
Concernant le matériel hardware à utiliser sur le Raspberry Pi pour émettre (et recevoir même si nous n’en aurons pas besoin ici), j’ai déjà écrit un article sur le sujet il y a bientôt 2 ans. Je vous laisse vous y référer concernant le matériel, les ports GPIO à utiliser et l’installation de WiringPi (l’utilisation de Home Assistant dont parle l’article n’est pas du tout nécessaire pour nos besoins ici).
Petit point complémentaire dans le cas où vous utilisez un Raspberry Pi 4 avec Raspberry Pi OS 64 bits: il vous faudra utiliser un fork de WiringPi prenant en charge cette configuration (miroir ici).
Le protocole utilisé
Tout d’abord, je n’ai rien inventé, j’ai repris le travail effectué par Idleman dans cet article.
Revenons à ce fameux protocole DiO 1.0. Comme je le disais, il semblerait qu’il respecte plus ou moins un protocole radio orienté pour la domotique nommé HomeEasy dont la documentation est relativement succinte.
Les types de messages
Bref, après rétro-ingénierie, Idleman a trouvé que les informations transitent sur des messages de 32 bits composés de cette façon:
- les bits 0 à 25: l’identifiant de la télécommande
- le bit 26: le numéro de groupe (non utilisé dans notre cas)
- le bit 27: l’état (OFF = 0 et ON = 1)
- les bits 28 à 31: le numéro du bouton appuyé sur la télécommande
Afin de détecter simplement le bruit sur le signal qui transite de la télécommande à la prise, ce message sur 32 bits est ensuite encodé selon le Codage Manchester où les 0
deviennent des 01
et les 1
deviennent des 10
. Notre message sur 32 bits devient donc un message sur 64 bits où chaque duo de bit ne peut pas être 00
, si c’est le cas, ça veut que le message a été altéré.
Ce message sur 64 bits est ensuite transformé de numérique à analogique pour être ensuite transmis via les ondes.
Un point dont parle également Idleman sur ce protocole est la présence de verrous qui sont des bits émis par la télécommande avant et après chaque message pour en signaler son début et sa fin. Lors de son article en 2012, il se plaignait que les durées de chaque pulsation (durée entre chaque bit) n’étaient pas documentées, qu’il soit rassuré, ça n’est toujours pas le cas en 2021.
Le script pour envoyer des messages
Le script d’Idleman était orienté pour la réception des messages. Un autre contributeur arno0x0x a modifié ce code pour gérer l’émission des messages.
J’ai donc simplement récupéré son code auquel j’ai rajouté 2 includes nécessaires pour la compilation (et je l’ai également ré-indenté).
Vous pouvez trouver le script final sur ce dépôt git.
Le script original d’Idleman est récupérable ici (miroir ici) et celui de arno0x0x est récupérable ici (miroir ici).
La compilation et l’utilisation
Pour la compilation, rien de sorcier, vous récupérez le fichier chacon_send.cpp
et vous compilez avec la commande: g++ -o chacon_send chacon_send.cpp -lwiringPi
.
Vous pouvez ensuite installer ce script en le copiant (en tant que root) dans /usr/local/bin
(cp chacon_send /usr/local/bin
).
Pour l’utilisation, vous pouvez (en tant que root (on pourrait donner à un utilisateur spécifique les droits sur les broches GPIO, mais ça serait trop de boulot de support après dans les commentaires :)) lancer la commande: chacon_send <WiringPi_pin> <controler_code> <outlet_code> <on|off>
.
Voici le détail des différentes options à fournir:
WiringPi_pin
: cela correspond au port GPIO utilisé pour la donnée. Si on reprend mon article, on voit que pour l’émission, j’avais utilisé le port 11 (GPIO17) qui correspond au pin 0 de la librairie WiringPi (plus d’explications dans le prochain paragraphe).controller_code
: l’identifiant de la télécommande que l’on simule sur 26 bits maximum (les bits 0 à 25 du message de 32 bits qu’lon a vu tout à l’heure).outlet_code
: le numéro du bouton appuyé sur la télécommande (les 4 derniers bits du message de 32 bits).on
ouoff
: si on allume ou on éteint la prise (le bit 27 du message de 32 bits).
Correspondance ports GPIO / pins WiringPi
L’installation de la librairie WiringPi livre également un petit binaire nommé gpio
permettant notamment d’écrire et lire sur les ports GPIO.
La commande gpio readall
nous affiche la correspondance entre les ports GPIO et les pins utilisés par WiringPi. Dans mon cas, sur un Raspberry Pi 4, j’obtiens:
+-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 2 | 8 | SDA.1 | ALT0 | 1 | 3 || 4 | | | 5v | | |
| 3 | 9 | SCL.1 | ALT0 | 1 | 5 || 6 | | | 0v | | |
| 4 | 7 | GPIO. 7 | IN | 0 | 7 || 8 | 1 | ALT5 | TxD | 15 | 14 |
| | | 0v | | | 9 || 10 | 1 | ALT5 | RxD | 16 | 15 |
| 17 | 0 | GPIO. 0 | OUT | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 |
| 27 | 2 | GPIO. 2 | IN | 0 | 13 || 14 | | | 0v | | |
| 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 1 | IN | GPIO. 4 | 4 | 23 |
| | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 |
| 10 | 12 | MOSI | ALT0 | 0 | 19 || 20 | | | 0v | | |
| 9 | 13 | MISO | ALT0 | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 |
| 11 | 14 | SCLK | ALT0 | 0 | 23 || 24 | 1 | OUT | CE0 | 10 | 8 |
| | | 0v | | | 25 || 26 | 1 | OUT | CE1 | 11 | 7 |
| 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 |
| 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | |
| 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 |
| 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | |
| 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | IN | GPIO.27 | 27 | 16 |
| 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | IN | GPIO.28 | 28 | 20 |
| | | 0v | | | 39 || 40 | 0 | IN | GPIO.29 | 29 | 21 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+---------+------+---+---Pi 4B--+---+------+---------+-----+-----+
Utilisation et limitation
Pour connecter une prise avec votre Raspberry Pi, il suffit de reprendre la notice et de suivre la même démarche décrite par la notice.
Il faut donc brancher la prise sur le secteur et envoyer un signal dans les 6 secondes pour l’associer.
Si je reprends la commande précédemment montrée: chacon_send <WiringPi_pin> <controler_code> <outlet_code> <on|off>
On peut donc choisir au hasard une valeur pour le controller_code
tel que 4266642
, pour le pin WiringPi, je vous laisse voir selon votre installation (dans mon cas, c’est 0) et pour le numéro du bouton, on peut simplement mettre 1. Ce qui donne: chacon_send 0 4266642 1 on
.
La première fois, la prise s’allume et s’éteind (avec un petit tick, mais vous pouvez brancher une lampe pour mieux le remarquer) 2 fois. Vous pouvez ensuite envoyer on ou off à cette prise selon les besoins.
La première limitation est qu’on ne gère dans cet article que l’envoi de messages pour simuler une télécommande. Si vous voulez utiliser le même identifiant que votre télécommande, il faudrait réutiliser le code d’Idleman et l’adapter à ce besoin.
Conclusion
Et voilà, notre Raspberry Pi est capable de piloter des prises Chacon/DiO. On voit l’intérêt de partager à la communauté le fruit de ses travaux. En effet, Idleman a penché sur le sujet en 2012 et c’est toujours d’actualité presque 10 ans après. Personnellement, je pilote la prise de mon disque dur pour faire mes sauvegardes 2 fois par jour depuis plus d’un mois, et je n’ai jamais eu le moindre souci.