Skip to content

Temperatur Feuchte Sender mit tfrec und MQTT

Christian edited this page May 1, 2020 · 7 revisions

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.

Hardware-Voraussetzungen

  • 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€)

Eingesetzte Software

Zusammenfassung

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:.{.*}

Einrichtung

Hardware

  1. Anschluss des DVB-T-Sticks an den Rechner
  2. Einlegen der Batterien in den Temperatur/Feuchte-Sender

Home-Verzeichnis

Erstellung eines Home-Verzeichnisses:

$ sudo mkdir -p /opt/tfrec

Mosquitto

Installation

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.

Test

  1. Starten des Empfängers im Hintergrund
  2. Senden einer Nachricht
  3. Die Nachricht erscheint als Ausgabe auf der Konsole.
  4. Beenden des Empfängers
$ mosquitto_sub -t examples/test-topic &
$ mosquitto_pub -t examples/test-topic -m Test-Nachricht
Test-Nachricht
$ kill %%

Versand-Skript

  1. 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"
    
  2. Test

    1. Starten des Empfängers im Hintergrund
    2. Senden einer Nachricht mit Eingabedaten
    3. Auf der Konsole erscheint ein JSON-Objekt mit den Eingabedaten
    4. 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 %%
    

tfrec

Herunterladen

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

Bauen

Das Vorgehen ist unter Installation beschrieben. Kurzform:

  1. Abhängigkeiten installieren: sudo apt-get install librtlsdr-dev libusb-1.0-0-dev
  2. Build starten
    • auf der x86-Plattform (z.B. PC): make
    • auf der ARM-Plattform (z.B. Raspberry Pi): make -f Makefile.arm

Ergebnis ist die ausführbare Datei tfrec.

Installation

Kopieren von tfrec ins Home-Verzeichnis:

sudo cp tfrec /opt/tfrec/

Überprüfung

  • 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.

Finetuning

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

Start-Skript für tfrec

  1. 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"
    
  2. Test

    1. Starten des Empfängers im Hintergrund
    2. Aufruf des Start-Skriptes
    3. Zu jeder Nachricht des Senders wird eine JSON-Nachricht auf der Konsole ausgegeben
    4. Beenden des Senders durch CTRL-C
    5. 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 %%
    

Einrichtung als systemd-Service

  1. 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
    
  2. Aktivieren und Starten des Service

    $ sudo systemctl enable tfrec
    $ sudo systemctl start tfrec
    
  3. Test

    1. Starten des Empfängers
    2. Zu jeder Nachricht des Senders wird eine JSON-Nachricht auf der Konsole ausgegeben
    3. 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 }
    

FHEM

MQTT-Broker

  • Einmalig wird ein Gerät angelegt, das eine Verbindung zum MQTT-Broker herstellt:
define mosquitto MQTT localhost:1883

MQTT-Geräte

  • 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
    

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:.{.*}

Bekannte Probleme

Variationen

Verteiltes System

  • 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 Paket mosquitto-clients installiert. Die MQTT-Angaben werden aus der Datei /etc/systemd/system/tfrec.service entfernt. Alle Mosquitto-Aufrufe (mosquitto_pub und mosquitto_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"

Links