Daten einer Wetterstation mit Linux verarbeiten

Aus LinuxUser 06/2024

Daten einer Wetterstation mit Linux verarbeiten

© 9dreamstudio / 123RF.com

Wetteraussichten

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.

Abbildung 1: Der wetterfeste Sensor von Bresser.

Abbildung 1: Der wetterfeste Sensor von Bresser.

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.

Abbildung 2: Ein erster Testlauf fördert die IDs überraschend vieler Geräte in der Umgebung zutage.

Abbildung 2: Ein erster Testlauf fördert die IDs überraschend vieler Geräte in der Umgebung zutage.

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.

Abbildung 3: Beispielhafte Darstellung der Messwerte in Grafana.

Abbildung 3: Beispielhafte Darstellung der Messwerte in Grafana.

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

  1. Grafana: https://grafana.com

  2. Sensor für die Wetterstation: https://www.bresser.de/Wetter-Zeit/Zubehoer-bresser-1/BRESSER-5-in-1-Aussensensor-fuer-7002520-Profi-Wetterstation.html

  3. DVB-T-Stick von RIWPKFHTV: https://www.amazon.de/dp/B0B1B3V96B

  4. Funktionsweise von Cron: https://wiki.ubuntuusers.de/Cron/

  5. Grafana: Martin Mohr, “Summ, summ”, RPG 07/2023, S. 12, https://www.raspi-geek.de/49084

  6. ioBroker: https://www.iobroker.net/

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 06/2024 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben