-
Notifications
You must be signed in to change notification settings - Fork 0
Temperatur Feuchte Sender mit tfrec und MQTT
Update (Mai 2020)
Mit tfrec-mqtt steht ein Docker-Image zur Verfügung, das die Software-Installation deutlich vereinfacht.
Dieser Artikel beschreibt den Empfang von Temperatur/Feuchte-Sendern in FHEM. Dabei liegt der Fokus auf dem einfachsten Fall: Hard- und Software laufen gemeinsam auf einem Debian-basierten System. Der verteilte Betrieb ist ebenso möglich und unter Variationen beschrieben.
- 1 DVB-T-USB-Stick mit RTL2832-Chip (erhältlich für ca. 12€)
- 1 oder mehr Temperatur/Feuchte-Sender (z.B. TFA 30.3180.IT mit Display, erhältlich für ca. 15€)
- tfrec - A SDR tool for receiving wireless sensor data
- Mosquitto - An Open Source MQTT v3.1/v3.1.1 Broker
- Aktuelle FHEM-Installation inkl. den Modulen MQTT, MQTT_DEVICE und expandJSON
Für Ungeduldige hier vorab eine Zusammenfassung der einzelnen Schritte:
$ sudo su
$ apt-get install mosquitto mosquitto-clients librtlsdr-dev libusb-1.0-0-dev
$ mkdir -p /opt/tfrec
$ git clone https://github.com/git-developer/tfrec/ && cd tfrec && make && cp tfrec /opt/tfrec/
- Erstellung der ausführbaren Datei
/opt/tfrec/publish-tfrec-to-mqtt.sh
- Erstellung der ausführbaren Datei
/opt/tfrec/run-tfrec.sh
- Erstellung der Datei
/etc/systemd/system/tfrec.service
$ systemctl enable tfrec
$ systemctl start tfrec
- Erweiterung der FHEM-Konfiguration, z.B.
define mosquitto MQTT localhost:1883
define mqtt_klima_wohnzimmer MQTT_DEVICE
attr mqtt_klima_wohnzimmer subscribeReading_json devices/tfa/30.3180.it/1a2b/json
attr mqtt_klima_wohnzimmer stateFormat T: temperature H: humidity
define expandjson_mqtt_klima expandJSON mqtt_klima_.+.json:.{.*}
- Anschluss des DVB-T-Sticks an den Rechner
- Einlegen der Batterien in den Temperatur/Feuchte-Sender
Erstellung eines Home-Verzeichnisses:
$ sudo mkdir -p /opt/tfrec
Installation von MQTT-Broker (Empfang) und MQTT-Client (Versand):
$ sudo apt-get install mosquitto mosquitto-clients
Durch die Installation wird Mosquitto automatisch als System-Dienst registriert und gestartet.
- Starten des Empfängers im Hintergrund
- Senden einer Nachricht
- Die Nachricht erscheint als Ausgabe auf der Konsole.
- Beenden des Empfängers
$ mosquitto_sub -t examples/test-topic &
$ mosquitto_pub -t examples/test-topic -m Test-Nachricht
Test-Nachricht
$ kill %%
-
Erstellung einer ausführbaren Datei für den Versand unter
/opt/tfrec/publish-tfrec-to-mqtt.sh
mit folgendem Inhalt:#!/bin/bash # # Publish tfrec datagram as MQTT message # # Arguments: tfrec datagram, e.g. # id temp hum seq lowbat rssi flags time # 5158 +23.8 59 10 0 79 0 1496588364 # MQTT_TOPIC_PREFIX="devices/tfa/30.3180.it" MQTT_BROKER_HOSTNAME=localhost # read arguments into variables read sensor_id temperature humidity seq lowbat rssi flags timestamp <<< "$*" # convert values to JSON types temperature="${temperature/#+/}" # conversion of 'lowbat' is only possible as soon as expandJSON supports the JSON 'boolean' type; see https://github.com/ddtlabs/expandJSON/issues/1 for details #[ "$lowbat" = "0" ] && lowbat="false" || lowbat="true" # build message string message="{ \"sensor_id\":\"$sensor_id\", \"temperature\":$temperature, \"humidity\":$humidity, \"lowbat\":$lowbat, \"rssi\":$rssi }" mosquitto_pub -h "$MQTT_BROKER_HOSTNAME" -t "$MQTT_TOPIC_PREFIX/$sensor_id/json" -m "$message"
-
Test
- Starten des Empfängers im Hintergrund
- Senden einer Nachricht mit Eingabedaten
- Auf der Konsole erscheint ein JSON-Objekt mit den Eingabedaten
- Beenden des Empfängers
$ mosquitto_sub -t devices/tfa/30.3180.it/+/json & $ /opt/tfrec/publish-tfrec-to-mqtt.sh 1a2b +23.8 59 10 0 79 0 1496588364 { "sensor_id":"1a2b", "temperature":23.8, "humidity":59, "lowbat":0, "rssi":79 } $ kill %%
Der aktuelle Stand befindet sich auf Github in baycom/tfrec.
- Mit git:
git clone https://github.com/baycom/tfrec/
- Ohne git: Download und Entpacken des aktuellen ZIP-Archivs
Das Vorgehen ist unter Installation beschrieben. Kurzform:
- Abhängigkeiten installieren:
sudo apt-get install librtlsdr-dev libusb-1.0-0-dev
- Build starten
- auf der x86-Plattform (z.B. PC):
make
- auf der ARM-Plattform (z.B. Raspberry Pi):
make -f Makefile.arm
- auf der x86-Plattform (z.B. PC):
Ergebnis ist die ausführbare Datei tfrec
.
Kopieren von tfrec
ins Home-Verzeichnis:
sudo cp tfrec /opt/tfrec/
-
Bei eingeschaltetem Temperatur/Feuchte-Sender und eingestecktem DVB-T-Stick bewirkt der Aufruf von
/opt/tfrec/tfrec -D
einige Ausgaben der Form#000 1485215350 2d d4 65 b0 86 20 23 60 e0 56 97 ID 65b0 +22.0 35% seq e lowbat 0 RSSI 81
-
Falls nicht: siehe Troubleshooting.
-
Eine detaillierte Beschreibung befindet sich unter Usage.
Mit etwas Glück liefern die Default-Parameter bereits gute Ergebnisse. Je nach DVB-T-Empfänger, Bauform und Ausrichtung der Antenne sowie Position der Sensoren können aber Anpassungen notwendig sein.
-
-T
gibt an, welche Art von Sensor ausgewertet werden soll. Durch diesen Parameter kann die CPU-Last deutlich verringert werden.- Default: alle Sensoren
- TFA 30.3180.IT:
-T 1
-
-g
gibt die Verstärkung des Signals an.- Default: Auto Gain
- Erfahrungswert:
-g 13
-
-t
gibt den sog. RF trigger threshold zur Erkennung gültiger Signale an.- Default: Auto
- Erfahrungswert:
-t 1000
-
Anlegen des Start-Skriptes unter
/opt/tfrec/run-tfrec.sh
mit den zuvor ermittelten Parametern. Beispiel:#!/bin/bash TFREC_HOME=/opt/tfrec exec "$TFREC_HOME/tfrec" -T 1 -g 13 -t 1000 -q -e "$TFREC_HOME/publish-tfrec-to-mqtt.sh"
-
Test
- Starten des Empfängers im Hintergrund
- Aufruf des Start-Skriptes
- Zu jeder Nachricht des Senders wird eine JSON-Nachricht auf der Konsole ausgegeben
- Beenden des Senders durch
CTRL-C
- Beenden des Empfängers
$ mosquitto_sub -t devices/tfa/30.3180.it/+/json & $ /opt/tfrec/run-tfrec.sh { "sensor_id":"1a2b", "temperature":23.8, "humidity":59, "lowbat":0, "rssi":79 } { "sensor_id":"1a2b", "temperature":23.9, "humidity":59, "lowbat":0, "rssi":81 } { "sensor_id":"1a2b", "temperature":23.8, "humidity":59, "lowbat":0, "rssi":80 } $ kill %%
-
Anlegen der folgenden Datei unter
/etc/systemd/system/tfrec.service
[Unit] Description=tfrec Requires=mosquitto.service After=mosquitto.service [Service] Type=simple ExecStart=/opt/tfrec/run-tfrec.sh Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
-
Aktivieren und Starten des Service
$ sudo systemctl enable tfrec $ sudo systemctl start tfrec
-
Test
- Starten des Empfängers
- Zu jeder Nachricht des Senders wird eine JSON-Nachricht auf der Konsole ausgegeben
- Beenden des Empfängers durch CTRL-C
$ mosquitto_sub -t devices/tfa/30.3180.it/+/json { "sensor_id":"1a2b", "temperature":23.8, "humidity":59, "lowbat":0, "rssi":79 } { "sensor_id":"1a2b", "temperature":23.9, "humidity":59, "lowbat":0, "rssi":81 } { "sensor_id":"1a2b", "temperature":23.8, "humidity":59, "lowbat":0, "rssi":80 }
- Einmalig wird ein Gerät angelegt, das eine Verbindung zum MQTT-Broker herstellt:
define mosquitto MQTT localhost:1883
- Je Sensor wird ein Gerät vom Typ
MQTT_DEVICE
angelegt. - Alle diese Geräte sollten einer Namenskonvention folgen, z.B. mit
mqtt_klima_
beginnen. - Das Attribut
subscribeReading_json
wird mit dem MQTT-Topic des jeweiligen Senders belegt. - Beispiel für einen Sensor mit ID
1a2b
im Wohnzimmer:define mqtt_klima_wohnzimmer MQTT_DEVICE attr mqtt_klima_wohnzimmer stateFormat T: temperature H: humidity attr mqtt_klima_wohnzimmer subscribeReading_json devices/tfa/30.3180.it/1a2b/json
- Einmalig wird ein Gerät vom Typ
expandJSON
angelegt, das die Werte aus dem JSON-String der MQTT-Geräte ausliest und in FHEM-Readings umwandelt. Hier wird die Namenskonvention der MQTT-Geräte ausgenutzt.
define expandjson_mqtt_klima expandJSON mqtt_klima_.+.json:.{.*}
-
Der Mosquitto-Broker läuft auf dem Host broker. Auf broker muss nur das Paket
mosquitto
installiert werden. -
FHEM läuft auf einem anderen Host. Hier muss kein Paket installiert werden. Der MQTT-Broker wird in der FHEM-Konfiguration angegeben:
define mosquitto MQTT broker:1883
-
Auf einem dritten Host ist der DVB-T-Stick angeschlossen. Hier liegt das Home-Verzeichnis
/opt/tfrec
, außerdem ist das Paketmosquitto-clients
installiert. Die MQTT-Angaben werden aus der Datei/etc/systemd/system/tfrec.service
entfernt. Alle Mosquitto-Aufrufe (mosquitto_pub
undmosquitto_sub
) werden um den Parameter-h
zur Angabe des MQTT-Brokers erweitert. Beispiel:mosquitto_pub
-h broker
-t "$MQTT_TOPIC_PREFIX/$sensor_id/json" -m "$message"