IoT-Automatisierung

rtl_433 und MQTT: 433-MHz-Wettersensoren und Türkontakte empfangen

Machen Sie aus einem günstigen SDR-Stick mit rtl_433 einen 433-MHz-Empfänger, veröffentlichen Sie Wetterstationen und Türkontakte per MQTT und leiten Sie nur Ihre eigenen Sensoren per TLS an einen privaten Broker weiter.

USB-SDR-Stick, der Funksignale von Sensoren empfängt und als rtl_433-MQTT-Nachrichten weiterleitet
Probieren Sie es auf Ihrem eigenen MQTT-Broker ausHolen Sie sich im Free-Tarif einen privaten, verwalteten MQTT-Broker und starten Sie mit fertigen Codebeispielen.
Kostenlos testen Codebeispiele Keine Kreditkarte erforderlich

Mit der MQTT-Ausgabe von rtl_433 wird ein günstiger USB-SDR-Stick zum Empfänger für Hunderte drahtloser Geräte: Wetterstationen, Poolthermometer, Türkontakte, Reifendrucksensoren und mehr. In dieser Anleitung installieren Sie rtl_433, veröffentlichen dekodierte Messwerte zunächst direkt an einen öffentlichen MQTT-Broker und bauen dann ein kleines Relay, das nur Ihre eigenen Sensoren per TLS an einen privaten Broker weiterleitet.

So funktioniert rtl_433

Viele preiswerte Sensoren senden kurze, unverschlüsselte Funkimpulse auf 433,92 MHz (in Teilen Europas, auch im DACH-Raum, auf 868 MHz, in Amerika auf 915 MHz). Sie koppeln sich mit nichts; sie senden einfach alle 30 bis 60 Sekunden und hoffen, dass ein Empfänger zuhört. rtl_433 ist ein Open-Source-Programm, das über einen SDR-Stick mit RTL2832U-Chip mithört, diese Impulse demoduliert und sie mit mehr als 200 eingebauten Protokolldecodern entschlüsselt.

Jede dekodierte Nachricht wird zu einem strukturierten Datensatz, zum Beispiel:

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

Von dort ist MQTT der natürliche Weg zur Verteilung. Hausautomation, Dashboards und Datenbanken abonnieren alle den Broker, statt jeweils einen eigenen Funkempfänger zu brauchen. Wenn Sie dieses Modell auffrischen möchten, lesen Sie, was ein MQTT-Broker macht.

Hardware und Installation

Sie brauchen:

  • Einen SDR-Stick mit RTL2832U. Modelle mit TCXO (temperaturkompensiertem Oszillator) halten die Frequenz besser, wenn sie warm werden.
  • Die mitgelieferte Antenne oder einen einfachen Lambda-Viertel-Draht: etwa 17 cm für 433 MHz.
  • Einen Raspberry Pi oder einen beliebigen Linux-Rechner.

Unter Debian oder Raspberry Pi OS liegt das Paket in den Standard-Repositories:

sudo apt update
sudo apt install rtl-433

Der DVB-T-Treiber des Kernels kann den Stick zuerst beanspruchen. Meldet rtl_433, dass das Gerät belegt ist, setzen Sie ihn auf die Blacklist:

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

Starten Sie rtl_433 ohne Argumente. Es hört auf 433,92 MHz und gibt jede dekodierte Nachricht aus. Lassen Sie es einige Minuten laufen und notieren Sie model und id Ihrer eigenen Sensoren; mit ziemlicher Sicherheit sehen Sie auch Geräte Ihrer Nachbarn.

Für 868-MHz-Sensoren verwenden Sie rtl_433 -f 868M -s 1024k.

Schritt 1: rtl_433-Daten per MQTT an einen öffentlichen MQTT-Broker senden

rtl_433 hat eine eingebaute MQTT-Ausgabe. Zum Ausprobieren nutzen Sie den kostenlosen öffentlichen MQTT-Broker unter broker.connectmq.com mit einem zufälligen Topic-Präfix. Alles dort ist für jeden lesbar; für Wetterdaten in einem Test oder Prototyp ist das in Ordnung, für Produktionsdaten oder alles, was Sie nicht teilen möchten, dagegen nicht.

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

Was die Optionen bewirken:

Option Bedeutung
-C si Einheiten ins metrische System umrechnen
-M time:iso Zeitstempel nach ISO 8601
mqtt://host:port MQTT-Ausgabe; mqtts:// aktiviert TLS auf 8883
retain=0 Nachrichten nicht retainen
events=... Eine JSON-Nachricht pro Messwert, auf einem mit [/model] und [/id] erweiterten Topic

Das Ergebnis beobachten:

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

Format events oder devices

rtl_433 bietet drei MQTT-Formate. events sendet den gesamten JSON-Datensatz als eine Nachricht. devices teilt jedes Feld auf ein eigenes Topic auf, etwa .../temperature_C, was für einfache Abnehmer bequem ist, aber die Zahl der Nachrichten vervielfacht. states veröffentlicht periodische Zustandszusammenfassungen. Auf dem öffentlichen MQTT-Broker sollten Sie events bevorzugen: So bleiben Sie deutlich unter dem Limit von 10 Nachrichten pro Sekunde und Client, und die Topic-Tiefe bleibt innerhalb von acht Ebenen.

Standardmäßig veröffentlicht rtl_433 unter seinem Basis-Topic außerdem ein availability-Topic mit einem retained online und einem Last Will offline.

Schritt 2: Warum der Produktivbetrieb ein Relay braucht

Die eingebaute Ausgabe ist ideal zum Testen, hat für einen privaten Broker aber zwei Grenzen:

  1. Client ID. rtl_433 erzeugt seine eigene Client ID (rtl_433- gefolgt von einem Hash) und bietet keine Option, sie zu setzen. ConnectMQ stellt wie viele gehostete Broker eine an Benutzername und Passwort gebundene Client ID aus, die die eingebaute Ausgabe daher nicht verwenden kann.
  2. Filterung. rtl_433 veröffentlicht alles, was es empfängt, auch die Geräte Ihrer Nachbarn. Meist möchten Sie eine Allowlist.

Die Lösung: rtl_433 schreibt JSON-Zeilen auf die Standardausgabe, und diese werden per Pipe an ein kleines Relay übergeben, das mit Ihren eigenen Zugangsdaten, Ihrer Client ID, Topic-Struktur und Ihrem Filter veröffentlicht.

Schritt 3: Das rtl_433-MQTT-Relay bauen

Speichern Sie dies als /opt/rtl/rtl_relay.py. Es verwendet 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")

# Nur eigene Sensoren weiterleiten: "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()

Führen Sie es in einer Pipe aus:

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

Die Messwerte sind retained, sodass ein später geöffnetes Dashboard sofort die letzte Temperatur zeigt. Das Topic status teilt Abnehmern mit, ob der Empfänger selbst läuft. Kommen die Zeilen schubweise statt einzeln an, stellen Sie stdbuf -oL vor rtl_433, um Zeilenpufferung zu erzwingen.

Eine Topic-Struktur wählen

Das Relay veröffentlicht jeden Sensor unter home/rtl433/<model>/<id>, was Topics stabil hält und Abonnements mit Wildcards wie home/rtl433/+/+ erleichtert. Bevorzugen Sie sprechendere Namen, ersetzen Sie das Allowlist-Set durch ein Dictionary, das model:id auf einen Namen wie garden oder freezer abbildet, und veröffentlichen Sie stattdessen unter home/rtl433/garden. Sprechende Namen machen auch den Austausch eines defekten Sensors schmerzlos: Sie aktualisieren einen Dictionary-Eintrag, und jedes Dashboard funktioniert weiter.

Schritt 4: Als Dienst betreiben

Legen Sie /etc/systemd/system/rtl433-mqtt.service an:

[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

Aktivieren Sie ihn mit sudo systemctl enable --now rtl433-mqtt und verfolgen Sie die Logs mit journalctl -u rtl433-mqtt -f. Schränken Sie die Rechte der Unit-Datei ein oder verschieben Sie die Geheimnisse in eine EnvironmentFile, die nur root lesen kann.

Typische Stolperfallen

  • IDs ändern sich nach einem Batteriewechsel. Viele günstige Sensoren wählen beim Einschalten eine zufällige ID. Halten Sie die Allowlist in einer Konfigurationsdatei, damit Sie sie schnell aktualisieren können.
  • Türkontakte sind keine Sicherheitsgeräte. 433-MHz-Sensoren sind unverschlüsselt und lassen sich leicht wiederholen oder stören. Nutzen Sie sie für Komfortautomatisierungen, nicht für Alarmanlagen.
  • Antennenposition schlägt Software. Fehlende Messwerte sind fast immer ein Empfangsproblem; bringen Sie den Stick mit einem kurzen Verlängerungskabel weg von USB-3-Ports und störenden Netzteilen.
  • Duplikate sind normal. Die meisten Sensoren wiederholen jeden Impuls mehrmals. Deduplizieren Sie im Abnehmer, wenn Sie Ereignisse zählen.

Wohin die Daten als Nächstes gehen

Sobald die Messwerte auf dem Broker liegen, kann jeder MQTT-Client sie nutzen. Speisen Sie sie mit Telegraf in eine Zeitreihendatenbank, zeigen Sie sie in Grafana an oder kombinieren Sie sie mit einer ESP32-Station aus der Anleitung zur DIY-Wetterstation. Zigbee- und Z-Wave-Netzwerke können denselben Broker nutzen; siehe die Anleitung zu Z-Wave JS UI und MQTT und den Überblick zur IoT-Automatisierung. Die Dokumentation des rtl_433-Projekts, einschließlich der vollständigen Decoderliste, finden Sie auf GitHub.

Ein verwalteter MQTT-Broker wie ConnectMQ passt hier gut: Das Relay hält eine ausgehende TLS-Verbindung, retained Messages speichern den letzten Messwert jedes Sensors, und die Schwellwert-Alarmregeln des Portals können einen Gefrierschranksensor melden, der zu warm wird.

Dasselbe Prinzip eignet sich auch für einfache Umgebungsmessungen in Gewerbe und Mittelstand, etwa Temperatur und Luftfeuchte in einem Lager oder einer Werkshalle. Für sicherheitsrelevante oder qualitätskritische Messungen in der Produktion sind die unverschlüsselten 433-MHz-Sensoren allerdings nicht geeignet; dort gehören verschlüsselte Funkstandards oder kabelgebundene Sensoren an der SPS hin.

Bringen Sie Ihre 433-MHz-Sensoren auf ConnectMQ

Erstellen Sie einen kostenlosen Serverless-Broker unter app.connectmq.com ohne Kreditkarte, kopieren Sie den generierten Benutzernamen, das Passwort und die Client ID in die Umgebung des Relays und sehen Sie zu, wie Ihre Sensoren im Live-Topic-Explorer erscheinen.

Häufig gestellte Fragen

Unterstützt rtl_433 MQTT nativ?

Ja. Die Ausgabe -F mqtt://host:port,... veröffentlicht Events, Geräte-Topics pro Feld oder Zustände, und mqtts:// aktiviert TLS. Die Client ID lässt sich jedoch nicht festlegen, weshalb ein Relay bei Brokern sinnvoll ist, die Client IDs an Zugangsdaten binden.

Welcher SDR-Stick funktioniert mit rtl_433?

Jeder Stick mit RTL2832U funktioniert. Modelle mit temperaturkompensiertem Oszillator halten die Frequenz über die Zeit besser.

Wie verhindere ich, dass rtl_433 die Sensoren meiner Nachbarn veröffentlicht?

Filtern Sie nach model und id. Das Relay in dieser Anleitung leitet nur eine Allowlist Ihrer eigenen Sensoren weiter.

Kann rtl_433 868-MHz-Sensoren empfangen?

Ja. Starten Sie es mit -f 868M -s 1024k, sofern Ihr Stick und Ihre Antenne dieses Band abdecken.

Verwandte Artikel

Zigbee2MQTT einrichten: Vom Koordinator bis zum Dashboard

Installieren Sie Zigbee2MQTT mit Docker, konfigurieren Sie Koordinator und MQTT-Verbindung, lernen Sie Geräte an und benennen Sie sie um, steuern Sie sie per MQTT und zeigen Sie ihre Zustände auf einem Dashboard an, zuerst getestet auf einem kostenlosen öffentlichen MQTT-Broker.

8 Min. Lesezeit

Alle Artikel →

Ihr privater MQTT-Broker ist nur wenige Klicks entfernt

Konto anlegen, Broker-Zugangsdaten erhalten und das erste Gerät verbinden — ohne Server, die installiert, gepatcht oder skaliert werden müssen.