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 🙂

Publications similaires

  • |

    Alexa : on a testé, on n’aime pas !

    Fervents utilisateurs de Google Home depuis des mois, appréciant particulièrement tout l’interfaçage possible avec des solutions domotiques, mais également l’intelligence de cet appareil, nous avons voulu tester, lors d’une promotion Amazon, la concurrente, Alexa. Nous ne reviendrons pas ici sur les différentes fonctionnalités, évoquées à maintes reprises sur de multiples sites internet : nous allons nous concentrer sur le côté utile, affectif, de la solution. Force est de constater que le niveau espéré n’y est pas, mais alors pas du…

  • X96 : debriquer votre appareil

    Il peut arriver qu’une box Android X96 soit briquée, et là c’est le drame ! Commencez par aller chercher le firmware d’origine sur ce lien. Décompressez et mettez l’image de côté. Avec Github, venez installer AML Flash Tool sur votre ordinateur : git clone https://github.com/osmc/aml-flash-tool puis : cd aml-flash-tool et vous voici dans le bon répertoire, prêt à flasher. Prenez votre X96, prévoyez un câble USB pour aller sur votre ordinateur mais ne le branchez pas encore, une rallonge USB…

  • Test platine relai Tuya Zigbee

    Sur Aliexpress vous trouverez un nombre impressionnant de platines relais Zigbee. J’ai choisi d’en tester une, la plus simple, donnée comme fonctionnant avec Tuya, mais ce n’est pas ce qui nous intéresse le plus au final : sans cloud chinois, la vie est plus simple, plus folle 😉 Livrée avec un bout de documentation, cette platine fait parfaitement le boulot : elle s’alimente entre 7 et 32V (on ne rigole pas…), dispose d’un bouton d’apairage et d’un bouton de commutation…

  • Cable Matters SuperSpeed : un nouvel écran en USB

    Ajouter un écran à un ordinateur déjà existant n’a parfois rien de simple, sauf avec la solution proposée par Cable Matters : l’adaptateur SuperSpeed. Relié en USB 2.0 voir mieux, en USB 3.0, ce petit adaptateur vous offrira une sortie Hdmi vidéo ET audio supplémentaire. « ET audio », c’est important, car tous les adaptateurs ne le permettent pas. La mise en oeuvre est on ne peut plus simple : un cd de drivers pour Windows, OS/X ou Linux et vous êtes…

  • |

    MQTT : découverte

    MQTT, vous connaissez ? Non, alors allez faire un saut sur Wikipedia par exemple, il s’agit d’un protocole à destination de ces IoT, l’internet des objets, ou encore les objets connectés, ces petits modules qui vont rapidement envahir notre univers et consommer nos adresses IP pour venir communiquer, qui une température, qui une mesure de l’air, une vitesse du vent, une luminosité, un taux de remplissage d’un container, etc. Curieux, je me suis intéressé à Mosquitto, un serveur que j’ai…

  • Vieilles Charrues 2010

    Petit rappel : si vous avez l’intention de vous rendre au festival des Vieilles Charrues 2010 à Carhaix, en plein centre Bretagne (14-18 Juillet), Infracom sera lui aussi présent sur place durant tout le festival. Notre prestation sera simple : épauler les équipes techniques lors de l’installation du matériel WiFi servant au réseau interne de l’association installer deux points d’accès WiFi (hotspots) mis gratuitement à la disposition des festivaliers durant les 4 jours de la manifestation : détectez le réseau,…

20 commentaires

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Merci beaucoup pour votre aide. Je vais donc chercher à installer un compilateur sur mon rpi pour modifier ce fichier

  8. 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. Je me réponds .. j’avais mis a et non w .. du coup ça ajoutait la suite .. 🙁

    1. 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. 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. 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. 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. 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. 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.