Contrôler du 433MHz sur Raspberry Pi avec Home Assistant

Bonjour à tous,
Aujourd’hui nous allons parler un peu de radio fréquence et comment la contrôler avec home assistant.
Alors pour être précis la fréquence n’est pas 433 mais 433,92 Mega Hertz.

Mais pourquoi cette fréquence ?

L’avantage de cette fréquence est qu’elle est libre d’utilisation, et déjà largement utilisée pour des communications à courte portée.
Comme par exemple dans des télécommandes de portails, des thermomètres d’extérieurs, des volets électriques et plein d’autres objets connectés.

Plusieurs émetteurs/récepteurs “clés en main” existent sur le marché, mais ceux-ci sont généralement onéreux.
Si vous êtes comme moi et que vous n’avez pas envie de vous ruiner dans des dongles USB, type Rfxcom, je vous propose une alternative : des émetteurs / récepteurs à souder soi-même.

À l’action

Avant de regarder comment les intégrer dans Home Assistant, nous allons voir comment les utiliser avec notre Raspberry PI.
Pour commencer, il nous faut un objet commandé par du 433MHz. Pour mon exemple, des douilles d’ampoules et leur télécommande :

(clic pour agrandir)

J’ai trouvé les miennes en grande surface, mais vous pouvez en acheter ici.

Et un Raspberry PI avec Raspbian. Si vous n’avez pas réalisé votre installation, je vous laisse regarder ce billet : Installez son Raspberry PI.

Ok jusque là, ça va.
Maintenant, nous allons utiliser les ports GPIO de notre Raspberry Pi pour commander nos émetteurs / récepteurs.

Euh… GPIO ?

GPIO pour General Purpose Input/Output sont les pins disponibles sur notre Raspberry PI. Mais si ! Ceux-là :

L’avantage de ces ports est qu’ils peuvent être utilisés en entrées comme en sorties (ok, si vous parlez un petit peu anglais, vous l’aviez déjà deviné grâce au IO…).
Donc si vous voulez recevoir une info extérieure comme un signal 433MHz par pur hasard, ou émettre ce type de signal encore par pur hasard, c’est grâce à eux que nous pouvons le faire.

Je vous laisse regarder cette page : GPIO, qui explique très bien leurs utilisations.

Installations

Pour pouvoir contrôler nos GPIO plus simplement, nous allons utiliser la librairie WiringPi.
Depuis votre console SSH rentrez ces quelques lignes :

git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

Maintenant nous allons installer l’utilitaire de ninjablocks pour gérer nos communications.

git clone git://github.com/ninjablocks/433Utils.git
cd 433Utils/RPi_utils
make

Update du 27/09: Dernièrement, certaines personnes ont rencontré des erreurs suite au make. Il on reçu un message ressemblant à ceci make: *** no rule toi make target’../rc-switch/RCSwitch.o , needed by ´send’. Arrêt. Pour régler le problème il suffit d’exécuter les commandes suivantes:

git submodule init
git submodule update
make

Merci à Ferkco qui nous a signalé le problème et la solution en commentaire 😉

On attaque les branchements

La librairie RPi_utils utilise par défaut le port Wiring PI 0 pour l’émission et le 2 pour la réception.
Ceux-ci peuvent être modifiés dans les fichiers codeSend.cpp et RFSniffer.cpp dans le répertoire ~/433Utils/RPi_utils (notez que si vous modifiez ceux ci, vous devrez relancer la commande make).
Pour notre test, nous allons garder la configuration d’origine, c’est-à-dire :

WiringPIGPIOpin réel
Émetteur01711
Récepteur2Rev1 : 21 / Rev2 : 2713

Si vous voulez connaître toutes les correspondances des pins Wiring PI et des pins réels, je vous redirige sur cette page : WiringPi Pins.

Le branchement final devrait ressembler à ça :

Une petite photo si vous avez des doutes :

(clic pour agrandir)

On teste

Pour tester que notre branchement est fonctionnel, on va écouter depuis une console et envoyer un code sur une autre :

Dans la première console :

cd 433Utils/RPi_utils
./RFSniffer

Dans la deuxième :

cd 433Utils/RPi_utils
./codeSend 12345
//vous devriez voir la ligne suivante
sending code[12345]

Le résultat de la première devrait ressembler à ça :

Bon ça y est, notre montage fonctionne, testons avec la télécommande des douilles.
Sur ma télécommande, je dispose pour la Douille A d’un bouton ON et un OFF, du coup je vais “Sniffer” les 2 boutons pour pouvoir allumer et éteindre mon ampoule.

Comme vous pouvez le voir sur l’image ci-dessus, j’aurais pour le bouton ON le code 16762196, et pour le OFF 16762193.
Allez on test tout ça, branchez les douilles, réutilisez le batch codeSend avec le code du bouton ON, et voila !

Et Home Assistant dans tout ça

Pour pouvoir utiliser notre petit émetteur 433MHz via Home Assistant, nous avons besoin d’installer rpi-rf.

sudo apt-get install python3-pip
sudo pip3 install rpi-rf

Une fois rpi-rf installé, nous pouvons passer à la configuration de Home Assistant.

Dans le fichier configuration.yaml, nous allons rajouter ces quelques lignes :

switch:
platform: rpi_rf
gpio: 17
switches:
a:
code_on: 16762196
code_off: 16762193

D’autres options sont disponibles, je vous laisse regarder cette page Switch.rpi-rf pour les découvrir.

Après avoir redémarré Home Assistant, vous devriez avoir ça sur votre page state :

Cliquez sur le bouton, et Well done!!

Conclusion

Nous venons de voir comment connecter un émetteur et un récepteur 433MHz à notre Raspberry PI et le contrôler via Home Assistant.
J’espère que vous avez réussi, n’hésitez pas à poser des questions en commentaire si vous avez des problèmes.

Expert technique en développement web et Android dans une société de service, je suis passionné par les nouvelles technologies et l’IOT.

Tu aimes cet article ? Alors partage le Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInPin on PinterestShare on RedditShare on Tumblr

34 réponses

  1. Mareau dit :

    Bonjour,
    Tout d’abord merci pour cet article.

    J’ai acheté un lot de prises RF (chez lidl). J’essaie d’allumer et d’éteindre ces prises mais ça ne fonctionne pas…
    J’ai récupéré les codes envoyés par la télécommande vie RFSniffer. Pour chaque prise, il y a 4 codes pour ON et 4 pour OFF.
    J’ai écrit le fichier configuration.yaml comme suit (ne pas faire attention aux indentations) :

    switch:
    – platform: rpi_rf
    gpio: 17
    switches:
    prise_silvercrest_a:
    code_on: 80176,618864,703808,975536
    code_off: 42896,196256,853536,992016
    prise_silvercrest_b:
    code_on: 80180,618868,703812,975540
    code_off: 42900,196260,853540,992020
    prise_silvercrest_c:
    code_on: 80188,618876,703820,975548
    code_off: 42908,196268,853548,992028
    prise_silvercrest_d:
    code_on: 42898,196258,853538,992018
    code_off: 80178,618866,703810,975538
    prise_silvercrest_master:
    code_on: 42906,196266,853546,992026
    code_off: 80186,618874,703818,975546

    Lorsque je clique sur l’interface d’Home Assistant, les codes précédents sont bien envoyés car visible par RFSniffer mais rien ne se produit sur les prises….

    Auriez-vous une idée d’où pourrait provenir le problème ?

    Merci d’avance !
    Julien

  2. Romain Bonnetier dit :

    Bonjour Julien
    Alors, si tu as 4 codes, je pense que tes prises fonctionnent avec un code tournant.
    As tu appuyé longtemps sur le bouton jusqu’à trouver une suite logique pour avoir ces 4 codes, ou à chaque nouvel appuis, un code différents était généré?
    Je n’ai pas encore eu se genre de matériel, par contre lorsque tu fais “code_on: 42906,196266,853546,992026” , ça va lancer les 4 codes dans la foulée, ce qui peut être utilisé pour allumer plusieurs devices 433, et non un code tournant à mon sens.
    As tu essayé de ne mettre qu’un code et de jouer avec les 2 variables signal_repetitions et pulselength? (https://home-assistant.io/components/switch.rpi_rf/)
    Voir est ce que sur tes prises / télécommandes tu peux désactivés se code tournant?
    tu as une référence pour tes prises?

  3. Flavien dit :

    Bonjour,
    J’ai fait sur le montage sur un RPi 1 et un RPi3 mais je n’arrive pas à capter les télécommandes (j’ai essayé avec 3 différentes).
    Soit je n’ai pas de chance et mes télécommandes n’utilisent pas la fréquence 433MHz ou j’ai louper quelque chose !
    J’ai testé de mettre une led entre GND et DATA de l’émetteur quand j’appuis sur les télécommandes la led clignote pourtant bien.

    • Romain Bonnetier dit :

      Bonjour Flavien,
      As tu essayé démettre un signal en 433 avec ton rpi? Pour voir si tu recevais ce signal?
      Ce post parle de rc-switch, cette api est utilisable seulement pour émettre ou recevoir des codes simple et non roulant, du coup as tu les spec pour savoir si le code et tournant ? Et est ce qu’elles émettent un code ou des données plus complexes?

      • Flavien dit :

        Bonjour Romain,
        Je remet sur le projet (j’avais du stopper suite à un probleme bref.)
        Donc oui j’ai tester avec le rpi en utilisant le gpio 25 pour l’émetteur (j’ai changer le pin dans codesend.cpp pour PIN=6) et gpio 27 pour le recepteur (PIN=2)
        J’ai bien sending code[12345] mais aucune réponce du coté de RFSniffer

        Comment je peut savoir pour le type de code? Par exemple la ref de la télécommande des prise est TR-502MSV

      • Romain Bonnetier dit :

        Salut Fabien,
        Question bête, tu as bien fais un make après pour recompilé le cpp ? 🙂
        En recherchant sur github, je suis tombé sur ce commentaire :
        https://github.com/sui77/rc-switch/issues/103#issuecomment-275911081
        n’ayant pas cette télécommande, je ne peux pas tester, mais il semble qu’il ajoute un protocole dans le fichier rc-switch.cpp avec la référence de ta télécommande :

        { 650, { 1, 10 }, { 1, 2 }, { 2, 1 }, true } // protocol 9 (Mandolyn/Lidl TR-502MSV/RC-402/RC-402DX)

        Bonne chance.
        Tiens nous au courant.

      • Flavien dit :

        J’ai récupérer le forck, ajouter la ligne puis re-compiler.
        Quand j’envoie des codesend, RFSniffer ne reçois rien.
        Par contre en laissant tourner RFSniffer quelle temps il à réagi : https://jpst.it/11PP9
        Sans doute des code extérieur ! Je peut supposer que le récepteur marche ?
        J’ai brancher une led en le data de l’émeteur et la masse. quand j’utilise codesend la led s’allume.
        Je sais pas trop quoi pensez ?!

      • Romain Bonnetier dit :

        Désolé du temps de latence…
        En effet cela veut bien dire que le récepteur fonctionne.
        J’ai vu récemment que la librairie rc switch à été modifié, je regarde ce que je peux faire et te tiens au courant

  4. Chevalier Pierre dit :

    Bonjour,
    merci pour ce tuto
    j’ai fait les branchements sur mon raspberry 3
    j’ai testé avec RFSniffer et codesend 12345
    cela fonctionne correctement
    je fais le test avec ma télécommande DI-O en appuyant sur les touches ON ou OFF
    rien ne se passe au niveau de RFSniffer
    pouvez vous m’aider ?
    Cordialement
    Pierre Chevalier
    06.86.91.37.82

  5. Ferkco dit :

    Bonjour, merci pour le tuto. J’ai un problème de débutant visiblement. Au moment de lancer la commande make, j’ai un message
    make: *** no rule toi make target’../rc-switch/RCSwitch.o , needed by ´send’. Arrêt.
    Savez vous comment corriger ce problème ?

  6. RZM dit :

    J’ai le même problème, avez vous trouvé une solution depuis le temps ?

  7. Merci pour le lien il semble ne effet que les commandes suivantes régle le problème

    git submodule init
    git submodule update
    make

    Je ne les ai pas testé personnellement mais je vais regarder (j’ai justement besoin de paramétrer un ou deux nouveaux périphériques 433 😉 )

    Update:
    Je confirme j’ai bien le même soucis que vous. Les commandes ci-dessus règlent le problème. Je met l’article à jour de suite 😉

  8. Flavien dit :

    J’ai trouver grâce au git mes télécommande utilisait 20bit au lieux de 24bit. (en utilisant ./RFSniffer -v sur le fork de Martin-Laclaustra)
    On peut tout simplement le changer le nombre de bit, voir ici : https://github.com/sui77/rc-switch/issues/165

  9. RM VICTOR dit :

    j’ ai un doute sur les branchements présentés sur la photo du montage : P0 et P2 sont inversés non ?

  10. Antoine dit :

    Merci pour pour tuto. Connaissez-vous un moyen de permettre à home-assistant de réagir en fonction des codes reçus (par exemple par la télécommande physique) ?

  11. Hugues dit :

    Bonjour quand je tape ./RFSniffer.cpp
    il me disent : -bash: ./RFSniffer.cpp: Permission denied
    Je ne sais pas d’ou vient le problèmes
    Merci de votre aide a bientôt

    • Romain Bonnetier dit :

      Bonjour,
      Ceci est normale, ce n’est pas le fichier cpp qu’il faut exécuter.
      le fichier cpp est le code source et non le binaire généré par le make
      la bonne commande est : ./RFSniffer

  12. Antoine G dit :

    Bonjour à tous,
    D’abord merci pour le tuto!
    Pour ma part, j’ai branché l’émetteur et le récepteur, tout fonctionne parfaitement bien.
    Lorsque que j’envoie un code avec l’émetteur, je reçoit bien le même code sur le récepteur.

    Par contre, j’ai des prises de marque Homdox, qui fonctionnent en 433MHz, controllées par une télécommande.
    Lorsque j’envoie des commandes avec la télécommande, je peut sniffer les codes envoyés avec ./RFSniffer, jusque là, tout va bien.
    Par contre, lorsque j’envoie ces mêmes codes avec l’émetteur, le récepteur les capte, mais aucune action ne se produit sur les prises.

    Je pense à un problème d’appairage peut être, mais je ne sais pas comment résoudre mon problème.
    J’ai cherché la doc de ces prises sur internet, mais sans résultat.
    Quelqu’un à une idée ?

    Merci d’avance 🙂

  13. Flavien dit :

    J’avais le même problème, regarde ici : https://github.com/sui77/rc-switch/issues/165
    Que donne “sudo ./RFSniffer -v” avec ta télécommande?

    • Antoine G dit :

      Ok, je vais regarder ton lien.
      Le “sudo ./RFSniffer -v” affiche la même chose que sans le “-v”, à savoir “Received 10049036”

      • Flavien dit :

        Tu à bien un protocol 24 bit, suis la procédure de Matin en ajoutant le protocole proposer avec le -v à la suite
        { 176, { 1, 31 }, { 1, 3 }, { 3, 1 }, false }
        Et teste avec : sudo ./codesend $toncode $numeroprotocol

      • Antoine G dit :

        Ca marche !!! 😀

        Alors, pour fonctionner, j’envoie la trame “sudo ./codesend 10049033 { 176, { 1, 31 }, { 1, 3 }, { 3, 1 }, false }”

        @Romain, j’ai essayé également le “sudo ./codesend 10049033 176” –> aucune réaction de mes prises.

        Merci beaucoup pour vos réponses en tout cas! 😀

  14. Antoine G dit :

    En fait, j’avais pas vu l’article de Matin Laclaustra.
    Du coup voici mes résultats lorsque je fais le sudo ./RFSniffer -v :

    Received 10049033

    =============================================
    =============================================

    GENERAL
    =======
    Received 10049033
    Bitlength 24
    Protocol 0
    Delay(pulse length in us) 176
    (delay provided from rc-switch)

    STATISTICS
    ==========
    Duration of data bits in pulse train : 16905
    Data bit duration = 704 and standard deviation = 17.61
    Coefficient of variation of data-bit duration = 2.50 % (should be less than 10%)
    Do not use the rest of the information if big coefficient of variation
    Long-to-short duration ratio for data bits (rounded) = 3
    Sync bit (in multiples of the pulseLength) = 1 31

    Proposed protocol for RCswitch
    { 176, { 1, 31 }, { 1, 3 }, { 3, 1 }, false }

    STATISTICS OF VARIATION BY LEVELS
    =================================
    (Differences here are probably artifacts from signal creation or detection)
    (This might be completely ignored, but pay attention to them if big differences are present and emission does not work)
    number of bits set (in 10049033): 10
    longup, longdown, shortup, shortdown
    521, 528, 170, 189
    this might be useful for tweaking emmitting algorithms

    =============================================

    RAW SIGNAL (us)
    ===============
    first level down
    5386
    527 189 189 522 181 520 520 244 476 182 152 543 156 537 548 160
    176 524 524 188 189 520 516 202 176 524 529 178 536 173 153 543
    158 534 167 530 177 518 190 520 514 202 175 521 154 542 529 177
    152
    =============================================

  15. Antoine G dit :

    Ca marche !!! 😀

    Alors, pour fonctionner, j’envoie la trame “sudo ./codesend 10049033 { 176, { 1, 31 }, { 1, 3 }, { 3, 1 }, false }”

    @Romain, j’ai essayé également le “sudo ./codesend 10049033 176” –> aucune réaction de mes prises.

    Merci beaucoup pour vos réponses en tout cas! 😀

  16. Flavien dit :

    Tu peut éditer ton fichier rc-switch/RCSwitch.cpp
    A la suite de :
    { 380, { 1, 6 }, { 1, 3 }, { 3, 1 } }, // protocol 4
    { 500, { 6, 14 }, { 1, 2 }, { 2, 1 } }, // protocol 5
    Ajoute une 6eme ligne:
    { 176, { 1, 31 }, { 1, 3 }, { 3, 1 }, false },
    Comme ça tu pourra utiliser :
    sudo ./codesend 10049033 6

  17. Antoine G dit :

    En effet, c’est bien mieux!! 🙂
    Merci beaucoup ^^

  1. 29 avril 2017

    […] Lire l’article complet sur le site original […]

Laisser un commentaire