Heimautomatisierung 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 installCode-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 : CRCCode-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:utcCode-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.targetCode-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_CCode-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_433Code-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.