Automação IoT

Guia rtl_433 MQTT: Capture Estações Meteorológicas e Sensores de Porta de 433 MHz

Transforme um dongle SDR barato em um receptor de 433 MHz com o rtl_433, publique estações meteorológicas e sensores de porta via MQTT e repasse apenas os seus sensores a um broker privado com TLS.

Dongle SDR USB recebendo sinais de sensores sem fio e encaminhando-os como mensagens rtl_433 mqtt
Rode isso no seu próprio broker MQTTTenha um broker MQTT privado e gerenciado no plano Free e comece com exemplos de código prontos.
Teste grátis Exemplos de código Sem cartão de crédito

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:

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

Artigos relacionados

Guia de Configuração do Zigbee2MQTT: do Coordenador ao Painel

Instale o Zigbee2MQTT com Docker, configure o coordenador e a conexão MQTT, pareie e renomeie dispositivos, controle-os via MQTT e veja seus estados em um painel, testando primeiro no servidor MQTT público (gratuito).

8 min de leitura

Todos os artigos →

Seu broker MQTT privado está a poucos cliques de distância

Crie uma conta, receba as credenciais do seu broker e conecte seu primeiro dispositivo — sem servidores para instalar, atualizar ou escalar.