IoT Otomasyon

rtl_433 MQTT Rehberi: 433 MHz Hava Durumu Sensörlerini ve Kapı Kontaklarını Yakalayın

Ucuz bir SDR dongle'ı rtl_433 ile 433 MHz alıcıya dönüştürün, hava istasyonlarını ve kapı kontaklarını MQTT üzerinden yayınlayın ve yalnızca kendi sensörlerinizi TLS üzerinden özel bir broker'a aktarın.

Kablosuz sensör sinyallerini alıp rtl_433 mqtt mesajları olarak ileten USB SDR dongle
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

rtl_433 MQTT çıkışı sayesinde düşük maliyetli bir USB SDR dongle, yüzlerce kablosuz cihaz için bir alıcıya dönüşür: hava istasyonları, havuz termometreleri, kapı kontakları, lastik basınç sensörleri ve daha fazlası. Bu rehberde rtl_433'ü kuracak, çözümlenen okumaları doğrudan herkese açık bir test broker'ına yayınlayacak, ardından yalnızca kendi sensörlerinizi TLS üzerinden özel bir broker'a ileten küçük bir aktarıcı (relay) oluşturacaksınız.

rtl_433 Nasıl Çalışır?

Pek çok ucuz sensör, 433,92 MHz'te (Avrupa'nın bazı bölgelerinde 868 MHz, Amerika kıtasında 915 MHz) kısa ve şifrelenmemiş sinyal patlamaları gönderir. Hiçbir şeyle eşleşmezler; yalnızca her 30 ila 60 saniyede bir yayın yapar ve bir alıcının dinlediğini umarlar. rtl_433, RTL2832U tabanlı bir SDR dongle üzerinden dinleyen, bu sinyalleri demodüle eden ve 200'den fazla yerleşik protokol çözücüsüyle çözümleyen açık kaynaklı bir programdır.

Çözümlenen her mesaj yapılandırılmış bir kayda dönüşür, örneğin:

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

Bundan sonrası için MQTT, veriyi dağıtmanın doğal yoludur. Ev otomasyonu, dashboard'lar ve veritabanları, her biri kendi radyosuna ihtiyaç duymak yerine broker'a abone olur. Bu modeli hatırlamak isterseniz bir MQTT broker'ın ne yaptığına göz atın.

Donanım ve Kurulum

İhtiyacınız olanlar:

  • Bir RTL2832U SDR dongle. TCXO (sıcaklık kompanzasyonlu osilatör) içeren modeller ısındıkça frekansta daha iyi kalır.
  • Birlikte gelen anten veya basit bir çeyrek dalga tel: 433 MHz için yaklaşık 17 cm.
  • Bir Raspberry Pi veya herhangi bir Linux makine.

Debian veya Raspberry Pi OS'ta paket standart depolarda bulunur:

sudo apt update
sudo apt install rtl-433

Çekirdeğin DVB-T sürücüsü dongle'ı önce sahiplenebilir. rtl_433 cihazın meşgul olduğunu bildirirse sürücüyü kara listeye alın:

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

rtl_433 komutunu argümansız çalıştırın. 433,92 MHz'i dinler ve çözümlenen her mesajı yazdırır. Birkaç dakika çalışır halde bırakın ve sahip olduğunuz sensörlerin model ve id değerlerini not edin; büyük olasılıkla komşunuzun cihazlarını da göreceksiniz.

868 MHz sensörler için rtl_433 -f 868M -s 1024k kullanın.

Adım 1: rtl_433 Verilerini Herkese Açık Bir Broker'da MQTT'ye Gönderin

rtl_433'ün yerleşik bir MQTT çıkışı vardır. Denemek için broker.connectmq.com adresindeki ücretsiz herkese açık MQTT broker'ını rastgele bir topic prefix'iyle kullanın. Oradaki her şeyi herkes okuyabilir; bu, test amaçlı hava durumu verisi için kabul edilebilir ama paylaşmaktan çekineceğiniz hiçbir şey için uygun değildir.

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

Seçeneklerin anlamı:

Seçenek Anlamı
-C si Birimleri metrik sisteme dönüştürür
-M time:iso ISO 8601 zaman damgaları
mqtt://host:port MQTT çıkışı; mqtts:// 8883 üzerinde TLS'yi etkinleştirir
retain=0 Mesajları retain etmez
events=... Her okuma için, [/model] ve [/id] ile genişletilen bir topic üzerinde tek bir JSON mesajı

Sonucu izleyin:

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

events ve devices formatları

rtl_433 üç MQTT formatı sunar. events, JSON kaydının tamamını tek bir mesaj olarak gönderir. devices, her alanı .../temperature_C gibi kendi topic'ine böler; bu basit tüketiciler için pratiktir ancak mesaj sayısını katlar. states ise periyodik durum özetleri yayınlar. Herkese açık broker'da events tercih edin: Sizi istemci başına saniyede 10 mesaj sınırının rahatça altında tutar ve topic derinliği sekiz seviye içinde kalır.

rtl_433 varsayılan olarak, temel topic'i altında retained online değerine ve offline Last Will mesajına sahip bir availability topic'i de yayınlar.

Adım 2: Üretimde Neden Bir Aktarıcı Gerekir?

Yerleşik çıkış test için harikadır, ancak özel bir broker için iki sınırı vardır:

  1. Client ID. rtl_433 kendi client ID'sini (rtl_433- ve ardından bir hash) üretir ve bunu ayarlamak için bir seçenek sunmaz. ConnectMQ, pek çok barındırılan broker gibi, kullanıcı adınıza ve parolanıza bağlı bir client ID verir; bu yüzden yerleşik çıkış bu ID'yi sunamaz.
  2. Filtreleme. rtl_433 duyduğu her şeyi, komşularınızın cihazları dahil, yayınlar. Genellikle bir izin listesi istersiniz.

Çözüm, rtl_433'ün JSON satırlarını standart çıktıya yazmasına izin vermek ve bunları kendi kimlik bilgileriniz, client ID'niz, topic düzeniniz ve filtrenizle yayın yapan küçük bir aktarıcıya pipe ile aktarmaktır.

Adım 3: rtl_433 MQTT Aktarıcısını Oluşturun

Bunu /opt/rtl/rtl_relay.py olarak kaydedin. paho-mqtt 2.x kullanır:

#!/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")

# Yalnızca sahip olduğunuz sensörleri iletin: "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()

Bir pipe içinde çalıştırın:

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

Okumalar retained olarak yayınlanır; böylece sonradan açılan bir dashboard son sıcaklığı hemen gösterir. status topic'i, tüketicilere alıcının kendisinin çalışıp çalışmadığını bildirir. Satırların tek tek değil de toplu halde geldiğini görürseniz, satır tamponlamayı zorlamak için rtl_433'ün önüne stdbuf -oL ekleyin.

Topic düzenini seçmek

Aktarıcı her sensörü home/rtl433/<model>/<id> altında yayınlar; bu, topic'leri kararlı tutar ve home/rtl433/+/+ gibi joker karakterlerle abone olmayı kolaylaştırır. Daha anlaşılır adlar tercih ederseniz, izin listesi kümesini model:id değerlerini garden veya freezer gibi adlara eşleyen bir sözlükle değiştirin ve bunun yerine home/rtl433/garden topic'ine yayın yapın. Anlaşılır adlar bozulan bir sensörü değiştirmeyi de zahmetsiz hale getirir: Sözlükteki tek bir girdiyi güncellersiniz ve tüm dashboard'lar çalışmaya devam eder.

Adım 4: Servis Olarak Çalıştırın

/etc/systemd/system/rtl433-mqtt.service dosyasını oluşturun:

[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

sudo systemctl enable --now rtl433-mqtt ile etkinleştirin ve logları journalctl -u rtl433-mqtt -f ile takip edin. Unit dosyasının izinlerini kısıtlayın veya gizli bilgileri yalnızca root'un okuyabildiği bir EnvironmentFile dosyasına taşıyın.

Pratik Tuzaklar

  • Pil değişiminden sonra ID'ler değişir. Pek çok ucuz sensör açılışta rastgele bir ID seçer. Güncellemesi hızlı olsun diye izin listesini bir yapılandırma dosyasında tutun.
  • Kapı kontakları güvenlik cihazı değildir. 433 MHz sensörler şifresizdir ve tekrar oynatma (replay) ya da karıştırma (jamming) saldırılarına açıktır. Bunları alarmlar için değil, konfor otomasyonları için kullanın.
  • Anten yerleşimi yazılımdan önemlidir. Eksik okumalar neredeyse her zaman bir alım sorunudur; dongle'ı kısa bir uzatma kablosuyla USB 3 portlarından ve gürültülü güç kaynaklarından uzaklaştırın.
  • Tekrarlar normaldir. Çoğu sensör her sinyal patlamasını birkaç kez tekrarlar. Olayları sayıyorsanız tüketicinizde tekrarları ayıklayın.

Veriler Bundan Sonra Nereye Gider?

Okumalar broker'a ulaştığında herhangi bir MQTT istemcisi bunları kullanabilir. Telegraf ile bir zaman serisi veritabanına aktarın, Grafana'da gösterin veya kendin yap hava istasyonu rehberindeki bir ESP32 istasyonuyla birleştirin. Zigbee ve Z-Wave ağları aynı broker'ı paylaşabilir; Z-Wave JS UI MQTT rehberine ve IoT otomasyon genel bakışına göz atın. rtl_433 projesinin, çözücülerin tam listesini de içeren kendi dokümantasyonu GitHub üzerindedir.

ConnectMQ gibi bir barındırılan MQTT broker burada iyi bir seçimdir: Aktarıcı tek bir giden TLS bağlantısı tutar, retained mesajlar her sensörün en son okumasını saklar ve portalın eşik tabanlı uyarı kuralları fazla ısınan bir dondurucu sensörünü işaretleyebilir.

433 MHz Sensörlerinizi ConnectMQ'ya Taşıyın

app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun, üretilen kullanıcı adını, parolayı ve client ID'yi aktarıcının ortam değişkenlerine kopyalayın ve sensörlerinizin canlı topic gezgininde belirmesini izleyin.

Sık Sorulan Sorular

rtl_433 MQTT'yi yerel olarak destekliyor mu?

Evet. -F mqtt://host:port,... çıkışı event'leri, alan başına cihaz topic'lerini veya durumları yayınlar; mqtts:// ise TLS'yi etkinleştirir. Client ID'yi ayarlamanıza izin vermez; client ID'leri kimlik bilgilerine bağlayan broker'lar için aktarıcının faydalı olmasının nedeni budur.

rtl_433 ile hangi SDR dongle çalışır?

RTL2832U tabanlı herhangi bir dongle çalışır. Sıcaklık kompanzasyonlu osilatöre sahip modeller zaman içinde frekansta daha iyi kalır.

rtl_433'ün komşularımın sensörlerini yayınlamasını nasıl engellerim?

model ve id değerlerine göre filtreleyin. Bu rehberdeki aktarıcı yalnızca sahip olduğunuz sensörlerden oluşan bir izin listesini iletir.

rtl_433 868 MHz sensörleri alabilir mi?

Evet. Dongle'ınız ve anteniniz bu bandı kapsıyorsa -f 868M -s 1024k ile başlatın.

İlgili yazılar

Zigbee2MQTT Kurulum Rehberi: Koordinatörden Panoya

Zigbee2MQTT'yi Docker ile kurun, koordinatörü ve MQTT bağlantısını yapılandırın, cihazları eşleştirip yeniden adlandırın, onları MQTT üzerinden kontrol edin ve durumlarını bir panoda görüntüleyin; önce ücretsiz herkese açık bir broker'da test edin.

7 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.