Raspberry : réception 433 MHz en tâche de fond avec 433Utils

Problématique du jour : comment utiliser le petit module de réception 433 MHz sur le Raspberry Pi, sans être pour autant coincé sur la seule réception ?

raspberry433

En bas à droite, récepteur 433 MHz

Je m’explique : ce petit récepteur est installé avec les outils 433Utils (procédure d’installation sur ce billet). Pour recevoir un code 433 MHz, la solution de base était de le récupérer via une simple commande :

sudo ./RFSniffer

chaque code reçu était alors affiché à l’écran du terminal, une méthode totalement inexploitable pour venir détecter le code, le comparer à une liste, et lancer des actions appropriées. Par exemple, je reçois le code 12345, je détecte qu’il s’agit de mon alarme incendie, je peux donc envoyer un email d’alerte. Avec le RFSniffer actuel, c’est impossible !

Nous allons donc légèrement modifier ce RFSniffer pour qu’il vienne enregistrer le code reçu dans un bête fichier .txt :

sudo su
nano ./RFSniffer.cpp

et modifions la partie qui se trouve sous } else:

//
// Sauvegarde du code recu dans /home/pi/recu.txt
//
          FILE *f = fopen(« /home/pi/recu.txt », « w »);
fprintf(f, « %i », value );
//
// Supprimez ou commentez la ligne ci dessous pour n avoir aucun affichage
//
//          printf(« recu %i/n », value );
          fclose(f);

Lançons maintenant RFSniffer en tâche de fond :

./RFSniffer &

Il fonctionnera en permanence, et désormais tout code reçu se trouvera dans /home/pi/recu.txt, à vous alors de venir le récupérer. Si vous souhaitez interrompre RFSniffer, pensez à noter le nombre indiqué lors de son lancement en tâche de fond :

root@raspberrypi:~/433Utils/RPi_utils# ./RFSniffer &
[2] 2578
root@raspberrypi:~/433Utils/RPi_utils#

2578 ici, nous allons donc supprimer la tâche avec :

kill 2578

Si vous avez zappé ce nombre, exécutez la commande :

ps

et observez le résultat :

root@raspberrypi:~/433Utils/RPi_utils# ps
PID TTY          TIME CMD
2120 pts/0    00:00:00 sudo
2121 pts/0    00:00:00 su
2122 pts/0    00:00:01 bash
2578 pts/0    00:00:02 RFSniffer
2581 pts/0    00:00:00 ps
root@raspberrypi:~/433Utils/RPi_utils#

On identifie le processus RFSniffer, et son numéro de tâche : 2578 ! Simple non ? 🙂

CONCLUSION :

Il ne vous reste désormais plus qu’à écrire un script avec une boucle lisant /home/pi/recu.txt et exécutant certaines commandes selon le code reçu, et à lancer RFSniffer au démarrage de la Framboise bien entendu.

Au boulot 🙂

20 réflexions sur « Raspberry : réception 433 MHz en tâche de fond avec 433Utils »

  1. deennoo

    Merci pour ton tuto

    je n y connais rien en programmation mais avec beaucoup de bonne volonté j arrive a comprendre, a reproduire et a « depanner »

    J ai un soucis avec ton rajout :
    – faut il le faire avant le make ?
    – si oui j ai essayer et bonjour les erreurs de non déclaré.
    – si non : chez moi le fichier.txt ne ce cree pas.

    Est il possible de partage ton fichier RFSniffer.cpp ?

    1. blog Auteur de l’article

      Nous sommes deux alors, mais on apprend vite en surfant un peu 🙂
      Oui, il faut modifier le .cpp AVANT de faire le make. Une fois fait, il compile avec make et hop, ça fonctionne.

      Voici mon RFSniffer.cpp in extenso, il va écrire le code reçu dans /home/pi/recu.txt. Tu peux vérifier la réception du code en supprimant les // en début de ligne, j’ai rajouté des commentaires en français pour aider. Pour le lancer en tâche de fond, ajoute un espace et le signe & simplement. Bien penser à le « killer » par contre AVANT toute modif, compilation et re-lancement :

      /*
      RF_Sniffer

      Hacked from http://code.google.com/p/rc-switch/

      by @justy to provide a handy RF code sniffer
      */

      #include « RCSwitch.h »
      #include
      #include

      RCSwitch mySwitch;

      int main(int argc, char *argv[]) {

      // This pin is not the first pin on the RPi GPIO header!
      // Consult https://projects.drogon.net/raspberry-pi/wiringpi/pins/
      // for more information.
      int PIN = 2;

      if(wiringPiSetup() == -1)
      return 0;

      mySwitch = RCSwitch();
      mySwitch.enableReceive(PIN); // Receiver on inerrupt 0 => that is pin #2

      while(1) {

      if (mySwitch.available()) {

      int value = mySwitch.getReceivedValue();

      if (value == 0) {
      printf(« Unknown encoding »);
      } else {
      //
      // Sauvegarde du code recu dans /home/pi/recu.txt
      //
      FILE *f = fopen(« /home/pi/recu.txt », « w »);
      fprintf(f, « %d », value );
      //
      // Supprimez la ligne ci dessous pour n avoir aucun affichage
      //
      // printf(« recu %i\n », mySwitch.getReceivedValue() );
      // printf(« recu %d\n », value );
      fclose(f);
      }

      mySwitch.resetAvailable();

      }

      }

      exit(0);

      }

  2. deennoo

    Super merci !

    1 – Sur le site je lis, copie et colle des « erreur de compilation – alors que chez moi je dois mettre des « , du coup je venais juste de resoudre le probleme.

    2 – Je souhaite utiliser ta modif pour « ecouter » les telecommande et ainsi mettre a jour mon system domoticz

    Explication : biensur je vais utiliser mon install domo avec mon rpi, ma tablette et mon tel et meme ouvrir et fermer le portail en fonction de ma position gps (via tasker, le plug ssh et codesend),

    Mais ma femme elle pense télécommande, je veux allumer, j’appuie sur le bouton on, je veux eteindre, j’appuie sur le bouton off.

    Domoticz de son coter a en memoire le dernier etat qu il a donner aux prises, il ne connait pas l’action des telecommandes.

    J’en arrive a vouloir ecouter les telecommandes, enregistré les codes emis par elle (date heure code) et les sauvegarder en log.

    Ta modification de RFSniffer cree un fichier a chaque nouveau code, au lieu de le mettre a jour, as tu une idée pour modifier cela ?

    1. blog Auteur de l’article

      ah non, ici le RFSniffer ne me génère pas un fichier par code : il remplace le code se trouvant précédemment dans recu.txt par le nouveau code reçu, et c’est tout. Si tu as un fonctionnement différent, ça ne provient pas de RFSniffer à priori car je confirme, je n’ai qu’un recu.txt.

      Avec un script python, je vais aller lire recu.txt en boucle, vérifier s’il y a un changement, et dans ce cas là lancer un code, un script, etc. avant de revenir scanner recu.txt pour un nouveau code, et ainsi de suite.

      J’avais imaginer pouvoir générer une sorte d’interruption à chaque code reçu, mais là je manque de compétences en programmation pour bien faire 🙂

  3. deennoo

    Ok j’avais bien compris le principe du remplacement et a la limite cela me va meme si de temps a autre j’ai un code parasite qui apparait quand j actionne un bouton des telecommandes.

    J’ai bien compris ton principe de fonctionnement, RFSniffer en espion est une bonne solution, a moi d aller dire a domoticz de lire recu.txt en boucle.

    Encore merci pour ton aide

    1. blog Auteur de l’article

      Ah le code parasite, j’ai aussi oui, mais comme il ne correspondra de toute façon à rien dans le script de lecture de codes, ça importe peu.

      Si domoticz peut lancer un script python, voici comme je lis recu.txt, en prenant soin de vérifier qu’il n’est pas vide, sinon erreur de script. J’utilise un fichier zero.txt qui contient un simple ZERO (0, à créer de préf avec l’éditeur jed car nano ajoute systématiquement un retour à la ligne) pour venir « réinitialiser » recu.txt une fois lu :

      #!/usr/bin/python3
      #
      # Lecture du code de télécommande reçu par RFSniffer (version modifiée, en tâche de fond)
      # le code reçu se trouve dans /home/pi/recu.txt
      #
      import os
      import time
      #
      # Boucle de detection sans fin
      #
      # var = 1
      while True :

      #
      # Ouverture et lecture de recu.txt
      #
      f = open(‘/home/pi/recu.txt’, encoding=’utf-8′)
      #
      # Detectons si le fichier est vide (0) ou pas et placons son contenu dans la variable g
      #
      statinfo = os.stat(‘/home/pi/recu.txt’).st_size
      if statinfo > 0 :
      g = int(f.read())

      # détection du code
      # puis remise à zero de recu.txt en copiant zero.txt à sa place
      # (zero.txt contient un simple 0)
      #

      #
      # activation relai 0 du PiFace : ON puis OFF
      #
      if g == 4195665:
      print (« Relai 0 »)
      #
      # activation du relai 0 de l’interface PiFace
      # en lancant un script python output.py
      #
      # os.system(‘sudo python /home/pi/output.py 0’)
      #
      # et on efface recu.txt en lui mettant un joli 0
      #
      os.system(‘sudo cp /home/pi/zero.txt /home/pi/recu.txt’)

  4. deennoo

    Super merci beaucoup !

    Domoticz lit les Pythons, et permet de mettre a jours l’etat des « devices » via json.

    Il me reste a modifier ton script pour y ajouter le json de mise a jour.

  5. matyoo

    Pour ecrire dans un fichier j’ai modifier le RFSniffer.cpp comme ceci :

    #include

    else {

    printf(« %i\n », mySwitch.getReceivedValue() );

    std::ofstream fichier(« /home/pi/donnees.txt »);
    fichier << mySwitch.getReceivedValue();
    fichier.close();
    }

  6. tiboys

    Bonjour, j’ai essayé la modification de mon fichier RFSniffer.cpp avec l’ajout des lignes pour enregistrer dans un fichier texte mais rien ne se passe. Il faut dire que la partie « make » m’est inconnue.
    Si je comprends bien, tant que le rpi est lancé, le fichier d’origine reste celui utilisé à chaque demande.
    Pourriez-vous me préciser la méthode pour remplacer ce fichier ?
    Merci par avance.
    Tiboys

    1. blog Auteur de l’article

      Oui, s’il n’y a pas eu de compilation avec make, le .cpp modifié n’est pas pris en compte.
      Il faut installer le compilateur sur le Raspberry donc, pour pouvoir compiler, etc.

  7. tiboys

    Merci beaucoup pour votre aide. Je vais donc chercher à installer un compilateur sur mon rpi pour modifier ce fichier

    1. blog Auteur de l’article

      à priori sudo apt-get install make devrait le faire, si je ne me trompe pas trop.

  8. tiboys

    merci pour le code, j’avais finalement réussi à l’installer grâce à cette ligne : « apt-get install build-essential ».
    Ensuite la commande « g++ RCSwitch.o RFSniffer.cpp -o RFSniffer -lwiringPi » a permis de compiler et ça fonctionne. Je souhaiterais toutefois une modification à ce nouveau code .. que le fichier texte ne conserve qu’une ligne .. hors là i revient à la ligne et en ajoute un autre. Mon fichier risque de devenir très long à force. J’ai bêtement tenté d’insérer une ligne type « fseek ($fp, 0); » mais j’obtient désormais une erreur lorsque je compile. Avez-vous une solution ?
    Encore merci pour votre aide.

  9. tiboys

    Je me réponds .. j’avais mis a et non w .. du coup ça ajoutait la suite .. 🙁

    1. blog Auteur de l’article

      bon ben tout marche alors ? 😉
      Je suis curieux, quel est le projet pour ce RFSniffer du coup ?

      Ici la domotique a pas mal évolué, elle détecte désormais des entrées, des mouvements, via les petits ESP8266 et toujours le Raspi en chef d’orchestre 😉

  10. tiboys

    oui tout fonctionne .. j’ai cru voir passer un script qui permet de lire un fichier texte et lancer des actions en fonction. J’ai tenté le tuto d’idleman mais je n’arrive pas à faire tourner son radioreception .. ça fait juste mouliner la tite bête. Mon utilisation du rfsniffer étant de simplifier l’utilisation du rpi .. j’ai demandé à une page web d’afficher le contenu du fichier txt .. il me reste à trouver comment lancer rfsniffer à chaque démarrage ( ou le lancer via une commande onclick ). Mon rpi me sert principalement à ouvrir mes volets ( relais filaires ) et allumer prises ( émission de codes récupérés avec rfsniffer ) . le tout en local ou à distance grâce au serveur web installé .. très, très pratique 😉 Mes pages web sont plus des bidouillages de pages récupérées à mes besoins que des conceptions .. ce qui lui ferait pas de mal mais je ne maîtrise pas assez !!

    1. blog Auteur de l’article

      Alors, pour lancer au boot, il faut éditer /etc/rc.local et ajouter la ligne sudo /le_bon_chemin/RFSniffer &

      Le & permet de le démarrer en tâche de fond, plutôt pratique pour ne pas être coincé.

      Déjà, là, il sera simple de faire un « cat recu.txt » après chaque envoi de code 433 MHz, et voir s’il capte bien. C’est la première chose à tester avant de venir lire recu.txt et détecter son contenu.

  11. tiboys

    merci pour la réponse, il faut ajouter cette ligne après exit 0 ?
    Le contenu de mon fichier possède déjà : _IP=$(hostname -I) || true
    if [ « $_IP » ]; then
    printf « My IP address is %s\n » « $_IP »
    fi

    exit 0

  12. guiboy

    Bonjour merci pour vos commentaires qui m’ont jusqu’ici bien aidés pour démarrer mon kit E/R 433Mhz avec RFSniffer.

    Je n’arrive pas à compiler RFSniffer.cpp dès lors que j’ajoute les commandes permettant d’ouvrir le fichier recu.txt

    Voici le code erreur affiché lors de la compilation
    RFSniffer.cpp:47:7: error: stray ‘\302’ in program
    FILE *f = fopen(« /home/pi/recu.txt », « w »);

    J’ai bien ajouté les droits nécessaires pour pouvoir ouvrir le fichier en écriture depuis l’utilisateur Pi…

    J’ai l’impression qu’il me manque l’inclusion d’une librairie permettant d’utiliser la fonction « fopen ».

    Pouvez-vous éclairer ma lanterne car ca fait quelques heures que je galère sans trouver de solution…

    Merci pour votre aide!!!

  13. guiboy

    bonjour à tous désolé j’ai trouvé il s’agissait de l’utilisation du caractère  » qui était interprété par mon navigateur web puis collé dans le fichier .cpp avec le mauvais format.

Les commentaires sont fermés.