Skip to content

Temperatur Feuchte Sender mit tfrec und MQTT

Christian edited this page Aug 3, 2017 · 7 revisions

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.

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

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