Automatisation IoT

Guide rtl_433 MQTT : capter les stations météo et détecteurs d'ouverture 433 MHz

Transformez une clé SDR bon marché en récepteur 433 MHz avec rtl_433, publiez stations météo et détecteurs d'ouverture via MQTT, et ne relayez que vos propres capteurs vers un broker privé en TLS.

Clé SDR USB recevant les signaux de capteurs sans fil et les transmettant sous forme de messages rtl_433 MQTT
Essayez-le sur votre propre broker MQTTObtenez un broker MQTT privé et managé avec l’offre Free et partez d’exemples de code prêts à l’emploi.
Essayer gratuitement Exemples de code Aucune carte bancaire requise

Avec la sortie rtl_433 MQTT, une clé SDR USB bon marché devient un récepteur pour des centaines d'appareils sans fil : stations météo, thermomètres de piscine, détecteurs d'ouverture, capteurs de pression des pneus et bien d'autres. Dans ce guide, vous allez installer rtl_433, publier les relevés décodés directement vers le serveur MQTT public gratuit, puis construire un petit relais qui ne transmet que vos propres capteurs vers un broker privé en TLS.

Comment fonctionne rtl_433

De nombreux capteurs bon marché émettent de courtes salves non chiffrées sur 433,92 MHz (ou 868 MHz dans une partie de l'Europe, 915 MHz sur le continent américain). Ils ne s'appairent à rien ; ils diffusent simplement toutes les 30 à 60 secondes en espérant qu'un récepteur écoute. rtl_433 est un programme open source qui écoute via une clé SDR à base de RTL2832U, démodule ces salves et les décode grâce à plus de 200 décodeurs de protocoles intégrés.

Chaque message décodé devient un enregistrement structuré, par exemple :

{"time":"2026-10-16T09:41:07","model":"Acurite-Tower","id":11524,"channel":"A","battery_ok":1,"temperature_C":18.4,"humidity":61}

À partir de là, MQTT est le moyen naturel de le diffuser. Dans une maison connectée, domotique, tableaux de bord et bases de données s'abonnent tous au broker au lieu d'avoir chacun leur propre radio. Home Assistant, Jeedom et Domoticz savent d'ailleurs tous communiquer en MQTT. Pour un rappel sur ce modèle, consultez ce que fait un broker MQTT.

Matériel et installation

Il vous faut :

  • Une clé SDR RTL2832U. Les modèles avec TCXO (oscillateur compensé en température) restent mieux calés en fréquence en chauffant.
  • L'antenne fournie, ou un simple fil quart d'onde : environ 17 cm pour 433 MHz.
  • Un Raspberry Pi ou n'importe quelle machine Linux.

Sous Debian ou Raspberry Pi OS, le paquet se trouve dans les dépôts standard :

sudo apt update
sudo apt install rtl-433

Le pilote DVB-T du noyau peut s'emparer de la clé en premier. Si rtl_433 indique que le périphérique est occupé, mettez ce pilote sur liste noire :

echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/blacklist-rtl.conf
sudo modprobe -r dvb_usb_rtl28xxu

Lancez rtl_433 sans argument. Il écoute sur 433,92 MHz et affiche chaque message décodé. Laissez-le tourner quelques minutes et notez le model et l'id des capteurs qui vous appartiennent ; vous verrez presque certainement aussi les appareils d'un voisin.

Pour les capteurs 868 MHz, utilisez rtl_433 -f 868M -s 1024k.

Étape 1 : envoyer les données rtl_433 en MQTT vers le serveur MQTT public gratuit

rtl_433 dispose d'une sortie MQTT intégrée. Pour l'essayer, utilisez le serveur MQTT public gratuit broker.connectmq.com avec un préfixe de topic aléatoire. Tout ce qui s'y trouve est lisible par n'importe qui, ce qui est acceptable pour des données météo de test, mais pas pour ce que vous ne voudriez pas partager.

rtl_433 -C si -M time:iso \
  -F "mqtt://broker.connectmq.com:1883,retain=0,events=connectmq/demo/r5n2xc/rtl[/model][/id]"

Rôle des options :

Option Signification
-C si Convertit les unités en système métrique
-M time:iso Horodatages ISO 8601
mqtt://host:port Sortie MQTT ; mqtts:// active TLS sur 8883
retain=0 Ne retient pas les messages
events=... Un message JSON par relevé, sur un topic complété par [/model] et [/id]

Observez le résultat :

mosquitto_sub -h broker.connectmq.com -p 1883 -i watch-r5n2xc \
  -t 'connectmq/demo/r5n2xc/#' -v

Format events ou devices

rtl_433 propose trois formats MQTT. events envoie l'enregistrement JSON complet en un seul message. devices répartit chaque champ sur son propre topic, comme .../temperature_C, ce qui est pratique pour des consommateurs simples mais multiplie le nombre de messages. states publie des résumés d'état périodiques. Sur le broker public, préférez events : vous restez largement sous la limite de 10 messages par seconde et par client, et la profondeur des topics ne dépasse pas huit niveaux.

Par défaut, rtl_433 publie aussi un topic availability sous son topic de base, avec un online retenu et un Last Will offline.

Étape 2 : pourquoi la production nécessite un relais

La sortie intégrée est parfaite pour les tests, mais elle présente deux limites avec un broker privé :

  1. Le client ID. rtl_433 génère son propre client ID (rtl_433- suivi d'un hash) et n'offre aucune option pour le définir. ConnectMQ, comme de nombreux brokers MQTT managés, émet un client ID lié à votre nom d'utilisateur et à votre mot de passe ; la sortie intégrée ne peut donc pas le présenter.
  2. Le filtrage. rtl_433 publie tout ce qu'il entend, y compris les appareils de vos voisins. Vous voulez généralement une liste d'autorisation.

La solution consiste à laisser rtl_433 écrire des lignes JSON sur la sortie standard et à les envoyer par un pipe vers un petit relais qui publie avec vos propres identifiants, votre client ID, votre organisation de topics et votre filtre.

Étape 3 : construire le relais rtl_433 MQTT

Enregistrez ceci sous /opt/rtl/rtl_relay.py. Il utilise paho-mqtt 2.x :

#!/usr/bin/env python3
import json
import os
import sys

import paho.mqtt.client as mqtt

HOST = os.getenv("MQTT_HOST", "broker.connectmq.com")
PORT = int(os.getenv("MQTT_PORT", "8883"))
USER = os.environ["MQTT_USER"]
PASSWORD = os.environ["MQTT_PASSWORD"]
CLIENT_ID = os.environ["MQTT_CLIENT_ID"]
BASE = os.getenv("MQTT_BASE", "home/rtl433")

# Ne transmettre que les capteurs qui vous appartiennent : "model:id"
ALLOW = {"Acurite-Tower:11524", "Generic-Remote:4521"}

def on_connect(client, userdata, flags, reason_code, properties):
    print("connected:", reason_code, flush=True)
    client.publish(f"{BASE}/status", "online", qos=1, retain=True)

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=CLIENT_ID)
client.username_pw_set(USER, PASSWORD)
client.tls_set()
client.will_set(f"{BASE}/status", "offline", qos=1, retain=True)
client.on_connect = on_connect
client.reconnect_delay_set(min_delay=1, max_delay=60)
client.connect(HOST, PORT, keepalive=60)
client.loop_start()

for line in sys.stdin:
    line = line.strip()
    if not line.startswith("{"):
        continue
    try:
        msg = json.loads(line)
    except ValueError:
        continue
    key = f"{msg.get('model')}:{msg.get('id')}"
    if key not in ALLOW:
        continue
    topic = f"{BASE}/{msg['model']}/{msg['id']}"
    client.publish(topic, json.dumps(msg), qos=1, retain=True)

client.loop_stop()
client.disconnect()

Lancez-le dans un pipe :

export MQTT_USER=YOUR_USERNAME MQTT_PASSWORD=YOUR_PASSWORD MQTT_CLIENT_ID=YOUR_CLIENT_ID
rtl_433 -C si -M time:iso -F json | python3 /opt/rtl/rtl_relay.py

Les relevés sont retenus ; un tableau de bord ouvert plus tard affiche donc immédiatement la dernière température. Le topic status indique aux consommateurs si le récepteur lui-même est actif. Si les lignes arrivent par rafales plutôt qu'une par une, placez stdbuf -oL devant rtl_433 pour forcer la mise en tampon par ligne.

Choisir une organisation de topics

Le relais publie chaque capteur sur home/rtl433/<model>/<id>, ce qui garde des topics stables et faciles à suivre avec des wildcards comme home/rtl433/+/+. Si vous préférez des noms plus parlants, remplacez l'ensemble d'autorisation par un dictionnaire qui associe model:id à un nom comme garden ou freezer, et publiez plutôt sur home/rtl433/garden. Les noms parlants facilitent aussi le remplacement d'un capteur hors service : mettez à jour une entrée du dictionnaire, et tous les tableaux de bord continuent de fonctionner.

Étape 4 : l'exécuter comme service

Créez /etc/systemd/system/rtl433-mqtt.service :

[Unit]
Description=rtl_433 to MQTT relay
After=network-online.target
Wants=network-online.target

[Service]
Environment=MQTT_USER=YOUR_USERNAME
Environment=MQTT_PASSWORD=YOUR_PASSWORD
Environment=MQTT_CLIENT_ID=YOUR_CLIENT_ID
ExecStart=/bin/sh -c 'stdbuf -oL rtl_433 -C si -M time:iso -F json | /usr/bin/python3 /opt/rtl/rtl_relay.py'
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Activez-le avec sudo systemctl enable --now rtl433-mqtt et suivez les journaux avec journalctl -u rtl433-mqtt -f. Restreignez les permissions du fichier d'unité, ou déplacez les secrets dans un EnvironmentFile lisible uniquement par root.

Pièges pratiques

  • Les identifiants changent après un remplacement de pile. De nombreux capteurs bon marché choisissent un ID aléatoire à la mise sous tension. Gardez la liste d'autorisation dans un fichier de configuration pour la mettre à jour rapidement.
  • Les détecteurs d'ouverture ne sont pas des dispositifs de sécurité. Les capteurs 433 MHz ne sont pas chiffrés et sont faciles à rejouer ou à brouiller. Utilisez-les pour des automatisations de confort, pas pour des alarmes.
  • Le placement de l'antenne compte plus que le logiciel. Des relevés manquants viennent presque toujours d'un problème de réception ; éloignez la clé des ports USB 3 et des alimentations bruyantes avec une courte rallonge.
  • Les doublons sont normaux. La plupart des capteurs répètent chaque salve plusieurs fois. Dédupliquez dans votre consommateur si vous comptez des événements.

Où vont ensuite les données

Une fois les relevés sur le broker, n'importe quel client MQTT peut les utiliser. Envoyez-les dans une base de séries temporelles avec Telegraf, affichez-les dans Grafana ou combinez-les avec une station ESP32 issue du guide de la station météo DIY. Les réseaux Zigbee et Z-Wave peuvent partager le même broker ; consultez le guide Z-Wave JS UI MQTT et la présentation de l'automatisation IoT. La documentation du projet rtl_433, y compris la liste complète des décodeurs, se trouve sur GitHub.

Un broker MQTT managé comme ConnectMQ convient bien ici : le relais maintient une seule connexion TLS sortante, les retained messages conservent le dernier relevé de chaque capteur, et les règles d'alerte sur seuil du portail peuvent signaler un capteur de congélateur qui se réchauffe trop.

Mettez vos capteurs 433 MHz sur ConnectMQ

Créez un broker Serverless gratuit sur app.connectmq.com sans carte bancaire, copiez le nom d'utilisateur, le mot de passe et le client ID générés dans l'environnement du relais, et regardez vos capteurs apparaître dans l'explorateur de topics en direct.

Questions fréquentes

rtl_433 prend-il en charge MQTT nativement ?

Oui. La sortie -F mqtt://host:port,... publie des événements, des topics par champ ou des états, et mqtts:// active TLS. Elle ne permet pas de définir le client ID, d'où l'intérêt d'un relais pour les brokers qui lient les client IDs aux identifiants.

Quelle clé SDR fonctionne avec rtl_433 ?

Toute clé à base de RTL2832U fonctionne. Les modèles dotés d'un oscillateur compensé en température restent mieux calés en fréquence dans le temps.

Comment empêcher rtl_433 de publier les capteurs de mes voisins ?

Filtrez par model et id. Le relais de ce guide ne transmet qu'une liste d'autorisation de capteurs qui vous appartiennent.

rtl_433 peut-il recevoir des capteurs 868 MHz ?

Oui. Lancez-le avec -f 868M -s 1024k, à condition que votre clé et votre antenne couvrent cette bande.

Articles liés

Guide d'installation de Zigbee2MQTT : du coordinateur au tableau de bord

Installez Zigbee2MQTT avec Docker, configurez le coordinateur et la connexion MQTT, appairez et renommez les appareils, pilotez-les via MQTT et affichez leurs états sur un tableau de bord, en testant d'abord sur le serveur MQTT public gratuit.

8 min de lecture

Tous les articles →

Votre broker MQTT privé, à quelques clics

Créez un compte, récupérez les identifiants de votre broker et connectez votre premier appareil — aucun serveur à installer, mettre à jour ou dimensionner.