Hausautomatisierung Raspberry Pi

Lauschangriff auf die Funksensoren der Nachbarn

RTL SDR hero image

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.

Defekter Luftfeuchtigkeitssensor (blau)
Defekter Luftfeuchtigkeitssensor (blau)

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)
Erkannte MQTT Funksensoren

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.

Erkannter MQTT Sensor

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

MQTT Sensor im Home Assistant
MQTT Sensor Historie im Home Assistant

Autor

Seit Kindheitstagen ist der Computer sein Begleiter. Was mit Linux anfing, wurde 2005 ein/e Beruf/ung, die weit über den Arbeitsplatz hinausgeht. Durch stetige Weiterentwicklung fasste er auch im *BSD Segment Fuß und bietet mittlerweile professionelle Lösungen im Bereich Hosting, Networking und Infrastruktur an. Als Ausgleich beschäftigt er sich neben Computerspielen mit der Fotografie.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.