Ein DVB-T-Stick holt die Daten einer professionellen Wetterstation ab und legt sie zur Verarbeitung in einer Datenbank ab.
Wir beschäftigen uns häufig mit den Wetteraussichten für den Tag, eine eigene Wetterstation wäre also eine feine Sache. Doch solche Stationen sind teuer, und der Hobby-Meteorologe ist dann auf die Anzeige-Panels der jeweiligen Hersteller festgelegt. In der Regel fehlt dort die Möglichkeit, die Messwerte in eigenen Anwendungen zu verwenden.
Dabei ist meist nicht die Sensorik in den Wetterstationen der Kostentreiber, sondern die Anzeigemodule. Die reine Messung könnte eine selbstgebaute Lösung übernehmen. Allerdings muss die Sensorik energiesparend und wetterfest sein. Das ist in einem Eigenbauprojekt nicht einfach umzusetzen und treibt den Aufwand und die Kosten in die Höhe. Die Alternative: Man nutzt die Sensorik einer professionellen Wetterstation und zieht die davon gelieferten Daten für sein Projekt heran. Zur Anzeige der Daten eignet sich Grafana [1].
Hardware
Als Erstes benötigen Sie einen geeigneten Sensor (Abbildung 1) für Ihre Wetterstation. Solche Sensoren gibt es zu relativ moderaten Preisen im Handel. Wir setzen einen 5-in-1-Außensensor des Anbieters Bresser [2] für rund 80 Euro ein. Der Preis und die Ausstattung können variieren, und ähnliche Sensoren mit mehr Funktionen lassen sich durchaus günstiger bekommen. Etwas Recherche lohnt sich also.
Der Bresser-Sensor misst Temperatur, Luftfeuchtigkeit, Windgeschwindigkeit, Windrichtung, Niederschlagsmenge. Er sendet auf einer Frequenz von 868 MHz. Bei der Montage müssen Sie ihn nach Norden ausrichten und lotrecht anbringen. Dabei helfen eine im Gehäuse integrierte kleine Wasserwaage und eine am Sensor aufgebrachte Markierung für die Nordrichtung.
Um den Datenstrom des Sensors zu empfangen, verwenden wir einen handelsüblichen DVB-T-Stick für den Empfang digitaler Hörfunk- und Fernsehsignale über terrestrische Wege. Der Stick benötigt Unterstützung für Software Defined Radio (SDR). Außerdem gilt es darauf zu achten, dass er auf einem RTL2832-Chipsatz basiert. In unserem Projekt kommt der TV-Stick 820T2 Digital USB 2.0 [3] des Anbieters RIWPKFHTV für rund 27 Euro zum Einsatz.
Installation
Die Installation der nötigen Software funktioniert (bis auf eine Ungereimtheit) unter einem aktuellen Ubuntu. Das Kommando sudo apt-get install rtl-433 installiert die Software auf dem System. Bei der Installation auf dem Rechner des Autors wurde das Programm nicht korrekt in den Suchpfad des Systems eingebunden, über den absoluten Pfad ließ sich trotzdem damit arbeiten.
Falls Sie auf ähnliche Probleme stoßen, bleibt als Alternative die Übersetzung der Software aus den Quellen. Die dazu nötigen Kommandos zeigt Listing 1. Die Version aus den Softwarequellen ist aktueller als die via Paketverwaltung installierbare und funktioniert auf dem Ubuntu-Desktop und dem Raspberry Pi ohne Probleme.
Listing 1
Installation aus den Quellen
$ sudo apt-get install git libtool libusb-1.0-0-dev librtlsdr-dev rtl-sdr build-essential cmake pkg-config $ mkdir wetter $ cd wetter $ git clone https://github.com/merbanan/rtl_433.git $ cd rtl_433/ $ cmake . $ make $ sudo make install
Um zu überprüfen, ob alles geklappt hat, starten Sie nach dem Kompilieren mit dem Kommando rtl_433 -f 868M -T 120 einen Testlauf. Falls Sie hier eine Fehlermeldung erhalten, müssen Sie zuerst noch die Berechtigungen für das USB-Gerät setzen. Eine genaue Anleitung dazu findet sich im nächsten Abschnitt. Um die Berechtigungsklippe für einen ersten Test zu umschiffen, können Sie ausnahmsweise einmal mit sudo arbeiten.
In Abbildung 2 sehen Sie, dass sich in der Testumgebung mehrere Geräte tummeln, die Daten senden. Um nicht die Informationen der falschen Wetterstation aufzuzeichnen, ist es wichtig, sich die eindeutige Kennung der eigenen Station zu merken. Falls Sie unsicher sind, welche Daten zu Ihrem Gerät gehören, eignet sich der Windrichtungsmesser gut dazu, definierte Testwerte zu erzeugen und so die korrekte ID zu finden. In unserem Fall lautet die korrekte ID 00314660. Doch Vorsicht: Die ID kann sich bei einem Batteriewechsel ändern. Tatsächlich gestaltet sich der Batteriewechsel bei der im Test verwendeten Station umständlich, da es gilt, die Batterien von unten einzusetzen. Je nachdem, wo Sie die Station montiert haben, kann das etwas hakelig sein.
Udev anpassen
Die rtl_433-Software greift via USB auf den DVB-T-Stick zu. Damit das unter Linux klappt, benötigen Sie eine Datei mit Zugriffsregeln für das konkrete Gerät. Die Steuerung der Zugriffsrechte kann an dieser Stelle sehr fein abgestuft erfolgen. In unserem Fall genügt es schon, die Berechtigung für alle Geräte eines Herstellers zu setzen. Dies geschieht anhand der eindeutigen Herstellerkennung (idVendor). Einen schnellen Weg, diese Kennung zu ermitteln, bietet das Kommando lsusb: Es listet alle USB-Geräte am Bus mit Namen und Kennung auf. Für den hier verwendeten Stick lautet die Ausgabe Bus 003 Device 011: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T. Die Herstellerkennung ist dabei 0bda, die Kennung des Modells 2838.
Um die Berechtigungen zu vergeben, müssen Sie als Root eine passende Datei im Ordner /etc/udev/rules.d/ anlegen. Der Dateiname sollte zur verwendeten Konvention passen und klar aussagen, welche Funktion die Datei hat. In unserem Beispiel wählen wir den Namen 60-DVBT-Stick.rules. Die erste Zeile von Listing 2 zeigt die notwendigen Einträge, damit alle Benutzer auf Geräte dieses Herstellers zugreifen können. Um die Regeln ohne Reboot zu aktivieren, verwenden Sie die Kommandos aus den folgenden Zeilen.
Listing 2
60-DVBT-Stick.rules
$ echo 'SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bda", MODE:="0666"' | sudo tee /etc/udev/rules.d/60-DVBT-Stick.rules
$ sudo udevadm control --reload-rules
$ sudo service udev restart
$ sudo udevadm trigger
Datenbank einrichten
Zum Speichern der Messwerte der Wetterstation verwenden wir MariaDB. Die Installation der Datenbanksoftware erledigen Sie mit dem Kommando aus der ersten Zeile von Listing 3. Die folgenden Befehle legen eine Datenbank (Bresser) samt dazugehörigem Benutzer (dbuser) an. Da der Benutzer nur über localhost auf die Datenbank zugreifen kann, muss das Passwort nicht den höchsten Sicherheitsrichtlinien entsprechen. In der frisch angelegten Datenbank erstellen Sie noch eine Tabelle namens measurements für die Daten.
Listing 3
Datenbank und Nutzer anlegen
$ sudo apt install mariadb-server libmariadb3 libmariadb-dev $ sudo mariadb Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 31 Server version: 10.6.16-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04 [...] MariaDB [(none)]> CREATE DATABASE Bresser; Query OK, 1 row affected (0,000 sec) MariaDB [(none)]> GRANT ALL ON Bresser.* TO 'dbuser'@'localhost' IDENTIFIED BY 'PaSsWoRd!'; Query OK, 0 rows affected (0,001 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0,001 sec) MariaDB [(none)]> CONNECT Bresser; Connection id: 32 Current database: Bresser MariaDB [Bresser]> CREATE TABLE measurements(id INT auto_increment NOT NULL, PiT DATETIME NOT NULL, id_sensor INT NOT NULL, battery_ok INT NOT NULL, temperature_C FLOAT NULL, humidity FLOAT NULL, wind_max_m_s FLOAT NULL, wind_avg_m_s FLOAT NULL, wind_dir_deg FLOAT NULL, rain_mm FLOAT NULL, CONSTRAINT Bresser_PK PRIMARY KEY (id)); Query OK, 0 rows affected, 1 warning (0,006 sec) MariaDB [Bresser]> exit Bye
Daten speichern
Ein Python-Skript übernimmt die Aufgabe, die vom Sensor übertragenen Daten in der Datenbank zu speichern. Um mit Python auf die Datenbank zugreifen zu können, benötigen Sie die passende Bibliothek, die sich nur in einer virtuellen Python-Umgebung installieren lässt. Mit den Kommandos aus Listing 4 bauen Sie die Umgebung inklusive Bibliothek auf.
Innerhalb der Umgebung führen Sie jetzt das Python-Skript aus Listing 5 aus. Es ruft das Kommando rtl_433 auf und speichert die Messwerte in Variablen. Aus den Variablen entsteht ein SQL-Kommando, das die Messwerte in der Datenbank speichert.
Listing 4
Python-Umgebung
$ python -m venv bresser $ source ./bresser/bin/activate $ cd bresser/ $ pip3 install mariadb
Listing 5
Messwerte speichern
import subprocess
import json
import mariadb
id="3229280"
mesurements=subprocess.run(['/usr/local/bin/rtl_433','-f868M','-T30', '-Fjson'], stdout=subprocess.PIPE).stdout.decode('utf8').split('\n')
for line in mesurements:
print(line)
if id in line:
values = json.loads(line)
if "temperature_C" in values:
temperature_C=values["temperature_C"]
if "wind_max_m_s" in values:
wind_max_m_s=values["wind_max_m_s"]
if "wind_avg_m_s" in values:
wind_avg_m_s=values["wind_avg_m_s"]
if "wind_dir_deg" in values:
wind_dir_deg=values["wind_dir_deg"]
if "rain_mm" in values:
rain_mm=values["rain_mm"]
if "battery_ok" in values:
battery_ok=values["battery_ok"]
if "humidity" in values:
humidity=values["humidity"]
try:
con = mariadb.connect(user="dbuser", password="PaSsWoRd!", host="localhost", port=3306, database="Bresser")
cur=con.cursor()
sql="INSERT INTO Bresser.measurements "
sql=sql+"(PiT, id_sensor, battery_ok, temperature_C, humidity, wind_max_m_s, wind_avg_m_s, wind_dir_deg, rain_mm )"
sql=sql+" VALUES(now(), "+str(id)+", "+str(battery_ok)+", "+str(temperature_C)+", "+str(humidity)+","
sql=sql+str(wind_max_m_s)+", "+str(wind_avg_m_s)+", "+str(wind_dir_deg)+", "+str(rain_mm)+");"
cur.execute(sql)
con.commit()
con.close()
except mariadb.Error as e:
print(f"Error connecting to Database: {e}")
sys.exit(1)
Crontab einrichten
Um regelmäßig die aktuellen Messwerte in der Datenbank abzulegen, müssen Sie das Skript zyklisch ausführen. Auf dem Raspberry Pi verwenden Sie dazu den Cron-Daemon. Er führt die in der Crontab definierten Programme automatisch aus. In der Crontab legen Sie fest, zu welchen Zeitpunkten ein Programm starten soll. Für unser Beispielskript verwenden Sie dazu den Eintrag aus Listing 6.
Listing 6
Crontab
*/5 * * * * /home/pi/wetter/bresser/bin/python /home/pi/wetter/bresser/bresser.py
Um die Crontab zu editieren, verwenden Sie das Kommando crontab -e. Eine detaillierte Beschreibung über die Funktionsweise von Cron finden Sie im Wiki von Ubuntu Users [4].
Beim Speichern der Messwerte gilt es zu beachten, dass die Daten mit der Zeit viel Platz auf der SD-Karte belegen. Es ist daher wichtig, sich eine Strategie zu überlegen, wie Sie mit den Daten umgehen möchten. Am einfachsten löschen Sie sie nach einem bestimmten Zeitraum. Alternativ dazu erzeugen Sie täglich einen Datensatz, der eine Zusammenfassung der Wetterdaten enthält.
Visualisierung
Grafana bietet eine geeignte Plattform zum Visualisieren unserer Messwerte. An dieser Stelle sei auf den Artikel “Summ, summ” aus RPG 07/2023 verwiesen, der die Grundlagen zu Grafana anhand der Visualisierung der Messwerte zu Temperatur und Luftfeuchte eines Bienenstocks beschreibt [5]. Einen Eindruck, wie die Datenaufbereitung mit Grafana aussehen könnte, liefert Abbildung 3.
Fazit
Es ist beeindruckend, dass ein handelsüblicher DVB-T-Stick die Messwerte einer Wetterstation empfängt. Mit verhältnismäßig wenig Aufwand lassen sich die Informationen in einer Datenbank abspeichern und verarbeiten. Richtig spannend wird es, wenn Sie die Messwerte für das Steuern einer Heizung oder Jalousie verwenden. Solche Funktionen ermöglichen beispielsweise Tools wie ioBroker [6]. (uba)
Der Autor
Martin Mohr hat die komplette Entwicklung der modernen Computertechnik live miterlebt. Nach dem Studium entwickelte er überwiegend Java-Applikationen. Mit dem Raspberry Pi erwachte seine alte Liebe zur Elektronik wieder.
Infos
-
Grafana: https://grafana.com
-
Sensor für die Wetterstation: https://www.bresser.de/Wetter-Zeit/Zubehoer-bresser-1/BRESSER-5-in-1-Aussensensor-fuer-7002520-Profi-Wetterstation.html
-
DVB-T-Stick von RIWPKFHTV: https://www.amazon.de/dp/B0B1B3V96B
-
Funktionsweise von Cron: https://wiki.ubuntuusers.de/Cron/
-
Grafana: Martin Mohr, “Summ, summ”, RPG 07/2023, S. 12, https://www.raspi-geek.de/49084
-
ioBroker: https://www.iobroker.net/








