Natürlich gehören zu einem Smart Home auch die Verhältnisse außerhalb des eigenen Heims. Die aktuelle Wetterlage dürfte das meist verbreitete Applet für jede Art von Gerät oder App zu sein und bezieht die Daten üblicherweise aus dem Internet. Da meine schlaue Wohnung aber auch im Falle eines Internetausfalls noch weitgehend funktionieren soll, habe ich schon länger einen ESP32 samt Temperatur- und Luftfeuchtigkeitsmesser auf dem Balkon im Einsatz. Dummerweise übersteht der DHT22 den Einsatz um den Taupunkt herum nicht besonders lange. Nach spätestens 2 Jahren liefert er nur noch extreme Feuchtigkeitswerte.
Aber es muss ja Sensorik geben, die mit normalen Außenbedingungen klar kommt. Diese Funksensoren, die die Discounter regelmäßig im Jahr verkaufen und die jeder 2. Deutsche irgendwo am Küchenfenster stehen hat …
Die bereits (von den Nachbarn) aufgestellten Sensoren nutzen
Das hat mich dann auf die Idee gebracht, mal zu recherchieren, auf welchen Frequenzbändern die so rumfunken. Allzuviele frei nutzbare Bänder gibts da ja gar nicht. Viele scheinen aber offenbar auf 433MHz (manche auch auf 866MHz) zu arbeiten – ebenso wie viele Funksteckdosen. Das müsste sich ja mit einem ‚Software Defined Radio‘ zu empfangen sein.
Die Internetrecherche hat mich auch schnell auf die Spur des Tools rtl_433 gebracht, das genau dieses tut. Es greift den Äther (relativ) breitbandig ab und sucht in Software nach den Funksignalen von Hausautomatisierungssensoren. Die Signale können dekodiert und ausgegeben, in eine Datei geloggt oder via MQTT(S) an das eigene SmartHome-System gesendet werden.
Fedora hat das Programm direkt im Repository.
Name : rtl-433
Version : 21.12
Release : 4.20220401git8228f0d.fc36
Architektur : x86_64
Größe : 376 k
Quelle : rtl-433-21.12-4.20220401git8228f0d.fc36.src.rpm
Paketquelle : updates
Zusammenfass : Generic radio data receiver
URL : https://github.com/merbanan/rtl_433
Lizenz : GPLv2
Beschreibung : rtl_433 (despite the name) is a generic data receiver, mainly
: for the 433.92 MHz, 868 MHz (SRD), 315 MHz, and 915 MHz ISM bands.
:
: For more documentation and related projects see the https://triq.org/ site.
Code-Sprache: JavaScript (javascript)
rtl_433 auf raspbian kompilieren
apt install libtool libusb-1.0-0-dev librtlsdr-dev rtl-sdr build-essential cmake pkg-config
git clone https://github.com/merbanan/rtl_433.git
cd rtl_433/
mkdir build
cd build
cmake ..
make -j4
sudo make install
Code-Sprache: PHP (php)
Jetzt kann das Programm mit rtl_433 starten und bekommt so schon angezeigt, was aus der Luft aufgeschnappt wurde.
/usr/local/bin/rtl_433 -c /etc/rtl_433/rtl_433.conf -F kv
rtl_433 version 21.12-100-gbb1be7f1 branch master at 202204251100 inputs file rtl_tcp RTL-SDR with TLS
Use -h for usage help and see https://triq.org/ for documentation.
Publishing MQTT data to home.commander1024.de port 8883 (TLS)
Publishing device info to MQTT topic "rtl_433/sdr/devices[/type][/model][/subtype][/channel][/id]".
Publishing events info to MQTT topic "rtl_433/sdr/events".
Publishing states info to MQTT topic "rtl_433/sdr/states".
Registered 186 out of 218 device decoding protocols [ 1-4 8 11-12 15-17 19-23 25-26 29-36 38-60 63 67-71 73-100 102-105 108-116 119 121 124-128 130-149 151-161 163-168 170-175 177-197 199 201-215 217-218 ]
Detached kernel driver
Found Rafael Micro R820T tuner
Exact sample rate is: 250000.000414 Hz
[R82XX] PLL not locked!
Sample rate set to 250000 S/s.
Tuner gain set to Auto.
Tuned to 433.920MHz.
Allocating 15 zero-copy buffers
baseband_demod_FM: low pass filter for 250000 Hz at cutoff 25000 Hz, 40.0 us
MQTT Connected...
MQTT Connection established.
{"time" : "2022-11-03 20:47:54", "model" : "Auriol-AHFL", "id" : 106, "channel" : 1, "battery_ok" : 0, "button" : 0, "temperature_C" : 12.000, "humidity" : 79, "mic" : "CHECKSUM"}
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2022-11-03 20:47:54
model : Auriol-AHFL id : 106
Channel : 1 Battery : 0 Button : 0 Temperature: 12.0 C Humidity : 79 %
Integrity : CHECKSUM
{"time" : "2022-11-03 20:48:05", "model" : "Solight-TE44", "id" : 206, "channel" : 1, "temperature_C" : 11.900, "mic" : "CRC"}
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
time : 2022-11-03 20:48:05
model : Solight-TE44 Id : 206
Channel : 1 Temperature: 11.90 C Integrity : CRC
Code-Sprache: JavaScript (javascript)
In der Konfigurationsdatei habe ich eigentlich nur das Gerät mit der Seriennummer 00001024 ausgewählt, da da derzeit 2 SDRs dran angeschlossen sind und die Daten für die MQTT-Verbindung sowie das Ausgabeformat.
/etc/rtl_433/rtl_433.conf
device :00001024
output json
output mqtts://home.commander1024.de:8883,user=<user>,pass=<pass>,retain=0
report_meta time:utc
Code-Sprache: HTML, XML (xml)
SystemD Service erstellen
Zuguterletzt erstelle ich noch ein systemd-servicefile, damit das Programm automatisch gestartet wird und ich es mit service oder systemctl start und stoppen kann.
/etc/systemd/system/rtl_433.service
# based on https://github.com/merbanan/rtl_433/issues/1651
[Unit]
Description=RTL_433 service script
StartLimitIntervalSec=5
Documentation=https://github.com/merbanan/rtl_433/README.md
After=syslog.target network.target
[Service]
Type=exec
ExecStart=/usr/local/bin/rtl_433 -c /etc/rtl_433/rtl_433.conf
# Restart script if stopped
Restart=always
# Wait 30s before restart
RestartSec=30s
# Tag things in the log
# View with: sudo journalctl -f -u rtl_433 -o cat
SyslogIdentifier=rtl_433
StandardOutput=syslog
StandardError=syslog
[Install]
WantedBy=multi-user.target
Code-Sprache: PHP (php)
Funksensoren in Home Assistant einbinden
Jetzt läuft der Dienst auf dem Raspberry Pi und er sendet die Daten an den Mosquitto-Server des Home Assistant, aber davon sieht man noch nicht allzu viel, da sie nicht dort gepublisht werden, wo HomeAssistant nach ihnen sucht.
Hier kommt das Python-Skript rtl_433_mqtt_hass.py im Verzeichnis examples/ ins Spiel. Startet man es mit MQTT Zugangsdaten, sucht er darin die von rtl_433 veröffentliche Werte und gibt Home Assistant einen Hinweis darauf, wie diese zu lesen sind.
mscholz@sdr:~/rtl_433/examples $ python3 rtl_433_mqtt_hass.py --user <user> --pass <pass> -H home.commander1024.de
INFO:root:Discovering all devices
INFO:root:MQTT connected: Connection Accepted.
INFO:root:Subscribing to: rtl_433/+/events
INFO:root:Published Auriol-AHFL/1/106: battery_ok, temperature_C, humidity
INFO:root:Skipped Auriol-AHFL/1/106: button
INFO:root:Published inFactory-TH/1/129: battery_ok, temperature_F, humidity
INFO:root:Published Solight-TE44/1/206: temperature_C
Code-Sprache: HTML, XML (xml)
Jetzt tauchen die Sensoren als neue MQTT-Geräte und Entitäten auf – allerdings nur bis zum nächsten Neustart vom Home Assistant. Das ist allerdings nicht schlimm, da man das Skript ohnehin nicht durchgängig laufen lassen will. Denn der RTL fängt immer mal wieder vorbeifahrende Funksensoren (Reifendruck etc. von Autos und LKWs) ein und müllt so die Geräteliste voll.
Daher wähle ich interessante (und zuverlässige) Senosren aus und schaue mir die MQTT info an, in der man die payload auch als yaml code anzeigen lassen kann.
So aufbereitet können die Code-Schnipsel einfach in die Home Assistant Sensor-Konfiguration überführt werden. Ich habe die MQTT-Sensoren der Übersichtlichkeit in eine separaten YAML-Datei ausgelagert.
# MQTT/RTL_433 (outdoor) sensors
# Reliable sensor with good placement (good values) and good reception
- device_class: battery
name: Auriol-AHFL-1-106-B
unit_of_measurement: '%'
value_template: '{{ float(value) * 99 + 1 }}'
state_class: measurement
entity_category: diagnostic
state_topic: rtl_433/sdr/devices/Auriol-AHFL/1/106/battery_ok
unique_id: Auriol-AHFL-1-106-B
device:
identifiers: Auriol-AHFL-1-106
name: Auriol-AHFL-1-106
model: Auriol-AHFL
manufacturer: rtl_433
- device_class: temperature
name: Auriol-AHFL-1-106-T
unit_of_measurement: °C
value_template: '{{ value|float }}'
state_class: measurement
state_topic: rtl_433/sdr/devices/Auriol-AHFL/1/106/temperature_C
unique_id: Auriol-AHFL-1-106-T
device:
identifiers: Auriol-AHFL-1-106
name: Auriol-AHFL-1-106
model: Auriol-AHFL
manufacturer: rtl_433
- device_class: humidity
name: Auriol-AHFL-1-106-H
unit_of_measurement: '%'
value_template: '{{ value|float }}'
state_class: measurement
state_topic: rtl_433/sdr/devices/Auriol-AHFL/1/106/humidity
unique_id: Auriol-AHFL-1-106-H
device:
identifiers: Auriol-AHFL-1-106
name: Auriol-AHFL-1-106
model: Auriol-AHFL
manufacturer: rtl_433
Code-Sprache: YAML (yaml)
Fazit
So habe ich nun wieder funkionierende Außenwerte (sogar gemittelt über mehrere Sensoren). Ich muss mich nicht mehr mit kaputten Sensoren herumplagen und die Nachbarn kümmern sich sogar um das Wechseln der Batterien. Da wird nämlich ein neuer Satz fällig
Hallo Marcus,
ich habe mit Begeisterung deinen Artikel gelesen, da ich als „altes“ Spielkind immer ein bisschen Hausautomation machte (Fernfunksteckdosen, ohne Integration in ein einheitliches System) und somit viele Insellösungen hatte. Deine Anregung unten erscheint simpel, jedoch erlaube mir eine Frage. Brauche ich irgend eine Hardware noch, die meine Funksteckdosen erkennt? Mittlerweile nutze ich Home Assistant mehr rudimentär, würde aber gerne viele HA fremde Produkte (Auriol Poolsensoren, Funksteckdosen) integrieren. Mir scheint, dein Ansatz würde mit helfen.
Ich freue mich sehr über deine Rückmeldung.
Lieber Gruß aus Kandern, BW.
Michael
Ohai,
die rtl433 Geschichte ist leider ziemlich Einbahnstraße – schon alleine weil so ein RTL-SDR Gerät einfach keinen Sender hat. Mit den Poolsensoren könntest du Glück haben, so diese ein unterstütztes Protokoll nutzen und periodisch Daten Senden.
Zum Schalten der Steckdosen könnte man sich die Home Assistant Integration RFLink mal anschauen. Diese kann über USB (seriell) mit einem Arduino Mega verbunden werden, auf dem ein Sketch für solche Funkprotokolle drauf läuft. Hab ich aber nicht getestet. Ist zwar nicht OpenSource, aber wohl kostenlos in kompilierter Form zu bekommen.