Aus Raspberry Pi Geek 07/2024

Daten einer Wetterstation mit Linux verarbeiten (Seite 2)

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.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben