Com a saída rtl_433 MQTT, um dongle SDR USB de baixo custo vira um receptor para centenas de dispositivos sem fio: estações meteorológicas, termômetros de piscina, sensores de porta, sensores de pressão de pneu e muito mais. Neste guia você vai instalar o rtl_433, publicar as leituras decodificadas diretamente no servidor MQTT público, feito para testes, e depois montar um pequeno relay que encaminha apenas os seus sensores para um broker privado com TLS.
Como o rtl_433 funciona
Muitos sensores baratos transmitem rajadas curtas e não criptografadas em 433,92 MHz (ou 868 MHz em partes da Europa e 915 MHz nas Américas). Eles não fazem pareamento com nada; simplesmente transmitem a cada 30 a 60 segundos na esperança de que algum receptor esteja ouvindo. O rtl_433 é um programa open source que escuta por meio de um dongle SDR baseado no RTL2832U, demodula essas rajadas e as decodifica com mais de 200 decodificadores de protocolo embutidos.
Cada mensagem decodificada vira um registro estruturado, por exemplo:
{"time":"2026-10-16T09:41:07","model":"Acurite-Tower","id":11524,"channel":"A","battery_ok":1,"temperature_C":18.4,"humidity":61}
A partir daí, o MQTT é a forma natural de distribuí-lo. Automação residencial, dashboards e bancos de dados assinam o broker em vez de cada um precisar de um rádio próprio. Se quiser relembrar esse modelo, veja o que um broker MQTT faz.
Hardware e instalação
Você vai precisar de:
- Um dongle SDR RTL2832U. Modelos com TCXO (oscilador com compensação de temperatura) se mantêm melhor na frequência à medida que esquentam.
- A antena que veio com ele, ou um simples fio de quarto de onda: cerca de 17 cm para 433 MHz.
- Um Raspberry Pi ou qualquer máquina Linux.
No Debian ou no Raspberry Pi OS, o pacote está nos repositórios padrão:
sudo apt update
sudo apt install rtl-433
O driver DVB-T do kernel pode tomar o dongle primeiro. Se o rtl_433 informar que o dispositivo está ocupado, coloque o driver na blacklist:
echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/blacklist-rtl.conf
sudo modprobe -r dvb_usb_rtl28xxu
Execute rtl_433 sem argumentos. Ele escuta em 433,92 MHz e imprime cada mensagem decodificada. Deixe-o rodando por alguns minutos e anote o model e o id dos sensores que são seus; é quase certo que você também verá dispositivos dos vizinhos.
Para sensores de 868 MHz, use rtl_433 -f 868M -s 1024k.
Passo 1: enviar dados do rtl_433 para MQTT no servidor MQTT público
O rtl_433 tem uma saída MQTT embutida. Para experimentá-la, use o servidor MQTT público (gratuito) em broker.connectmq.com com um prefixo de topic aleatório. Tudo ali pode ser lido por qualquer pessoa, o que é aceitável para dados meteorológicos em um teste, mas não para algo que você não queira compartilhar.
rtl_433 -C si -M time:iso \
-F "mqtt://broker.connectmq.com:1883,retain=0,events=connectmq/demo/r5n2xc/rtl[/model][/id]"
O que cada opção faz:
| Opção | Significado |
|---|---|
-C si |
Converte as unidades para o sistema métrico |
-M time:iso |
Timestamps ISO 8601 |
mqtt://host:port |
Saída MQTT; mqtts:// ativa TLS na porta 8883 |
retain=0 |
Não retém as mensagens |
events=... |
Uma mensagem JSON por leitura, em um topic expandido com [/model] e [/id] |
Acompanhe o resultado:
mosquitto_sub -h broker.connectmq.com -p 1883 -i watch-r5n2xc \
-t 'connectmq/demo/r5n2xc/#' -v
Formato events vs devices
O rtl_433 oferece três formatos MQTT. O events envia o registro JSON inteiro como uma única mensagem. O devices divide cada campo em um topic próprio, como .../temperature_C, o que é prático para consumidores simples, mas multiplica o número de mensagens. O states publica resumos periódicos de estado. No servidor MQTT público, prefira events: ele mantém você bem abaixo do limite de 10 mensagens por segundo por cliente, e a profundidade do topic fica dentro de oito níveis.
Por padrão, o rtl_433 também publica um topic availability com um online retido e um Last Will offline, sob o seu topic base.
Passo 2: por que a produção precisa de um relay
A saída embutida é ótima para testes, mas tem dois limites para um broker privado:
- Client ID. O rtl_433 gera o próprio client ID (
rtl_433-seguido de um hash) e não oferece opção para defini-lo. A ConnectMQ, como muitos brokers hospedados, emite um client ID vinculado ao seu usuário e senha, então a saída embutida não consegue apresentá-lo. - Filtragem. O rtl_433 publica tudo o que ouve, incluindo os dispositivos dos vizinhos. Normalmente você quer uma lista de permissões.
A solução é deixar o rtl_433 escrever linhas JSON na saída padrão e encaminhá-las por pipe a um pequeno relay que publica com as suas próprias credenciais, client ID, estrutura de topics e filtro.
Passo 3: montar o relay rtl_433 MQTT
Salve isto como /opt/rtl/rtl_relay.py. Ele usa 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")
# Encaminha apenas os sensores que são seus: "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()
Execute-o em um 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
As leituras são retidas, então um dashboard aberto mais tarde já mostra a última temperatura imediatamente. O topic status informa aos consumidores se o próprio receptor está ativo. Se as linhas chegarem em rajadas em vez de uma a uma, coloque stdbuf -oL antes de rtl_433 para forçar o buffer por linha.
Escolhendo a estrutura de topics
O relay publica cada sensor em home/rtl433/<model>/<id>, o que mantém os topics estáveis e fáceis de assinar com curingas como home/rtl433/+/+. Se preferir nomes mais amigáveis, troque o conjunto da lista de permissões por um dicionário que mapeie model:id para um nome como garden ou freezer e publique em home/rtl433/garden. Nomes amigáveis também facilitam a troca de um sensor que parou de funcionar: basta atualizar uma entrada do dicionário e todos os dashboards continuam funcionando.
Passo 4: rodar como serviço
Crie /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
Ative-o com sudo systemctl enable --now rtl433-mqtt e acompanhe os logs com journalctl -u rtl433-mqtt -f. Restrinja as permissões do arquivo da unit ou mova os segredos para um EnvironmentFile legível apenas pelo root.
Armadilhas práticas
- Os IDs mudam depois da troca de bateria. Muitos sensores baratos escolhem um ID aleatório ao ligar. Mantenha a lista de permissões em um arquivo de configuração para que atualizá-la seja rápido.
- Sensores de porta não são dispositivos de segurança. Sensores de 433 MHz não são criptografados e são fáceis de reproduzir ou bloquear. Use-os para automações de conveniência, não para alarmes.
- O posicionamento da antena vale mais que o software. Leituras perdidas quase sempre são problema de recepção; afaste o dongle de portas USB 3 e de fontes ruidosas usando um cabo extensor curto.
- Duplicatas são normais. A maioria dos sensores repete cada rajada várias vezes. Elimine duplicatas no consumidor se você conta eventos.
Para onde os dados vão depois
Assim que as leituras estão no broker, qualquer cliente MQTT pode usá-las. Envie-as para um banco de dados de séries temporais com o Telegraf, exiba-as no Grafana ou combine-as com uma estação ESP32 do guia de estação meteorológica DIY. Redes Zigbee e Z-Wave podem compartilhar o mesmo broker; veja o guia de Z-Wave JS UI com MQTT e a visão geral de automação IoT. A documentação do próprio projeto rtl_433, incluindo a lista completa de decodificadores, está no GitHub.
Um broker MQTT gerenciado como a ConnectMQ se encaixa bem aqui: o relay mantém uma única conexão TLS de saída, as mensagens retidas guardam a leitura mais recente de cada sensor e as regras de alerta por limite do portal podem sinalizar um sensor de freezer que esquenta demais.
Coloque seus sensores de 433 MHz na ConnectMQ
Crie um broker Serverless gratuito em app.connectmq.com sem cartão de crédito, copie o usuário, a senha e o client ID gerados para o ambiente do relay e veja seus sensores aparecerem no explorador de topics em tempo real.
Perguntas frequentes
O rtl_433 tem suporte nativo a MQTT?
Sim. A saída -F mqtt://host:port,... publica events, topics de dispositivo por campo ou states, e mqtts:// ativa TLS. Ela não permite definir o client ID, e é por isso que um relay é útil para brokers que vinculam client IDs às credenciais.
Qual dongle SDR funciona com o rtl_433?
Qualquer dongle baseado no RTL2832U funciona. Modelos com oscilador com compensação de temperatura se mantêm melhor na frequência ao longo do tempo.
Como impeço o rtl_433 de publicar os sensores dos meus vizinhos?
Filtre por model e id. O relay deste guia encaminha apenas uma lista de permissões com os sensores que são seus.
O rtl_433 consegue receber sensores de 868 MHz?
Sim. Inicie-o com -f 868M -s 1024k, desde que o seu dongle e a sua antena cubram essa faixa.



