-
Notifications
You must be signed in to change notification settings - Fork 0
Temperatur Feuchte Sender mit tfrec und MQTT
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 grundsätzlich auf Github in baycom/tfrec. Der beim Verfassen dieses Artikels aktuelle Stand (Commit c68b748 vom 25.03.2017) enthält aber einen Fehler, durch den nach einigen Stunden keine Daten mehr empfangen werden (Details). Der Fehler ist im Github-Repository git-developer/tfrec behoben.
- Mit git:
-
git clone https://github.com/baycom/tfrec/
bzw. git clone https://github.com/git-developer/tfrec/
-
- Ohne git: Download und Entpacken des aktuellen ZIP-Archivs
- aus dem Original-Repository bzw.
- inkl. Fehlerkorrektur
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"