Im folgenden Artikel wird erklärt, wie einfach man Wetterdaten aus der weewx Datenbank auslesen und damit weiterverarbeiten kann.
WeeWX speichert alle daten in einer SQLITE3 Datenbank. In der Regel liegt diese unter:
/var/lib/weewx/weewx.sdb
Wenn man daraus Daten benötigt, kann man diese mit dem Tool SQLITE3 auslesen. In Debian basierten Systemen installiert man SQLITE3 wie folgt:
sudo apt install sqlite3
Nun kann man per echo einen Befehlsstring an SQLITE3 absenden und sich die Informationen ausgeben lassen. Es können alle Arten von SQL Kommandos benutzt werden, welche SQLITE3 versteht.
Beispiel:
echo "SELECT * FROM archive WHERE ... ;" | sqlite3 weewx.sdb
Natürlich könnte man so auch – mit entsprechenden SQL Kenntnissen – Änderungen an den Tabellen und Daten durchführen. Wenn sich die weewx.sdb nicht im selben Ordner befindet, kann man natürlich auch den vollständigen Pfad dorthin angeben.
In den weiteren Beispielen wird nur das SQL Kommando genannt, welches sich innerhalb der Anführungszeichen “ “ befindet, angegeben, da der Rest gleich bleibt. Für die Ausgabe der Daten muss man das Kommando noch in die ganze Befehlskette einfügen inkl. echo, Pipe | und dem sqlite Kommando.
Spaltennamen anzeigen lassen
Wenn man sich komplette Datensätze ausgeben lässt, dann ist es gut zu wissen in welcher Spalte welche Informationen stehen. Die Spaltennamen und Datentypen kann man sich mit folgendem Befehl ausgeben lassen:
PRAGMA table_info('archive');
Als Ausgabe erhält man zum Beispiel so eine Liste:
0|dateTime|INTEGER|1||1
1|usUnits|INTEGER|1||0
2|interval|INTEGER|1||0
3|altimeter|REAL|0||0
4|appTemp|REAL|0||0
5|appTemp1|REAL|0||0
6|barometer|REAL|0||0
7|batteryStatus1|REAL|0||0
8|batteryStatus2|REAL|0||0
9|batteryStatus3|REAL|0||0
10|batteryStatus4|REAL|0||0
11|batteryStatus5|REAL|0||0
12|batteryStatus6|REAL|0||0
13|batteryStatus7|REAL|0||0
14|batteryStatus8|REAL|0||0
15|cloudbase|REAL|0||0
16|co|REAL|0||0
17|co2|REAL|0||0
18|consBatteryVoltage|REAL|0||0
19|dewpoint|REAL|0||0
20|dewpoint1|REAL|0||0
21|ET|REAL|0||0
22|extraHumid1|REAL|0||0
23|extraHumid2|REAL|0||0
24|extraHumid3|REAL|0||0
...
Am Anfang ist die Spaltennummer, danach kommt der Spaltenname bzw. Feldname mit der Bezeichnung des Inhalts. Möchte man gezielt nach Daten aus den Feldern suchen oder sortieren, muss dieser Spaltenname angegeben werden. Die Spaltennummer kann man beim gezielten extrahieren von Daten gebrauchen. Zu berücksichtigen ist aber die Zählweise die hier bei 0 beginnt. Wenn man bspw. mit AWK einzelne Felder extrahiert, ist zur Spaltennummer noch 1 zu addieren
Die wichtigsten Tabellenspalten:
barometer | Relativer Luftdruck | inHG |
dewpoint | Taupunkt außen | °F |
inDewpoint | Taupunkt innen | °F |
inHumidity | Luftfeuchtigkeit innen | % |
inTemp | Temperatur innen | °F |
outHumidity | Luftfeuchtigkeit außen | % |
outTemp | Temperatur außen | °F |
pressure | Absoluter Luftdruck | inHG |
windDir | Windrichtung | ° |
windGust | Böengeschwindigkeit | mph |
windSpeed | Windgeschwindigkeit | mph |
Anzeigen des letzten Datensatzes
Um sich die aktuellen Wetterinformationen anzeigen zu lassen, muss man einfach den aktuellsten Datensatz auslesen. Diese Informationen kann man dann parsen und weiterverarbeiten.
SELECT * FROM archive ORDER BY dateTime DESC LIMIT 1
Dieser Befehl zeigt den ersten Datensatz der Tabelle sortiert nach Zeitstempel in absteigender Reihenfolge an, quasi den aktuellsten. Dort stehen die aktuellsten Wetterdaten der Datenbank drin.
Man erhält eine lange Zeile Informationen. Die Spalten des Datensatzes werden mit einer Pipe | getrennt. Wenn mehrere Pipes hintereinander zu sehen sind, ist ein entsprechendes Feld leer.
1736091600|1|5|29.5286863666214|29.192819398659||29.581496731282|||||||||1152.54517307103||||32.4503355320488||3.63023216093915e-05|60.0|63.0|89.0||||||70.5|68.7|32.5||||||||||32.7||||32.7||55.9775515690883|59.2857142857143|70.9||||||||||||0.0|||||99.0|32.7||||||28.3725714285714|0.0|0.0||0.0|||||||||||||||||||||||||||0.0|||32.7||0.0||0.0|0.0
Der vorige Absatz stammt von einer DNT WeatherScreen Pro Wetterstation. In der ersten Spalte ist der Zeitstempel in Unix-Zeit zu sehen. Diesen muss man noch umrechnen wenn man ihn braucht. Die Maßeinheiten werden standardmäßig in US-Amerikanischen Einheiten abgespeichert. Die Temperaturen werden in °Fahrenheit angezeigt. Druckangaben sind in der Maßeinheit inHG (Inch Quecksilbersäule), Windgeschwindigkeiten in Meilen pro Stunde (mph) und Regen in Zoll (inch) gespeichert.
Beim Umrechnen der Werte sind folgende Formeln zu benutzen:
Messwert | Maßeinheit Datenbank | Umrechnung | Maßeinheit Deutschland |
Temperatur | ° Fahrenheit | -32 / 1,8 | ° Celsius |
Druck | inHG | *33,8639 | Millibar |
Wind | mph | * 1,6092 | km/h |
Regen | Zoll / Inch | * 25,4 | Millimeter/Liter |
Verschiedene SQL Abfragen mit Filtern (Beispiele)
Filter nach Windgeschwindigkeit
Zeige alle Einträge mit einer Windgeschwindigkeit größer 100 mph
SELECT * FROM archive WHERE (windSpeed > 100);
Filter nach Temperatur
Zeige alle Einträge mit Außentemperaturen größer 35°C (=95°F)
SELECT * FROM archive WHERE (outTemp > 95);
Filter nach Zeitraum
Zeige alle Einträge zwischen zwei Zeitpunkten
SELECT * from archive where dateTime >=1670693700 and dateTime <=1670722200;
Datensätze löschen
Löscht Einträge vor einem Datum
DELETE FROM archive where dateTime <1526124000;
Löscht Einträge zwischen zwei Daten
DELETE FROM archive where dateTime >=1670693700 and dateTime <=1670722200;
Parsen der Wetterdaten
AWK ist das ideale Tool unter Linux um den Output aus der Datenbank zu parsen. AWK wird der Spaltenbegrenzer (Delimiter) mit einem Parameter bekanntgegeben, wodurch man jede Spalte einzeln adressieren kann.
awk -F'|' '{print $1}'
Dies gibt den Wert der ersten Spalte aus. „$1“ entspricht hier Spalte Nr. 1. Möchte man den Wert aus Spalte 55 tippt man:
awk -F'|' '{print $55}'
Man kann auch mehrere Werte gleichzeitig ausgeben:
awk -F'|' '{print $1 $27 $55}'
Dies würde die Werte aus Spalte 1, 27 und 55 direkt hintereinander ausgeben. Man kann natürlich auch Text in Anführungszeichen hinzufügen:
awk -F'|' '{print "Wert 1: "$1 " Wert 2: "$27 " Wert 3: "$55 "Noch ein Text"}'
Output:
Wert 1: 29 Wert 2: 57 Wert 3: 99 Noch ein Text
Zeilenumbrüche sind auch möglich:
awk -F’|‘ ‚{print „Wert 1: „$1 „\nWert 2: „$27 „\nWert 3: „$55 „\nNoch ein Text“}‘
Output:
Wert 1: 29
Wert 2: 57
Wert 3: 99
Noch ein Text
Angenommen ich möchte mir eine Reihe von Werten ausgeben und formatieren, wäre das ein Beispiel:
echo "SELECT * FROM archive ORDER BY dateTime DESC LIMIT 1" | sqlite3 /var/lib/weewx/weewx.sdb | awk -F'|' '{printf "Temperatur : %.1f", ($69-32)/1.8}{print "°C"}'
echo "SELECT * FROM archive ORDER BY dateTime DESC LIMIT 1" | sqlite3 /var/lib/weewx/weewx.sdb | awk -F'|' '{printf "Luftfeuchte : %.0f", $68}{print "%"}'
echo "SELECT * FROM archive ORDER BY dateTime DESC LIMIT 1" | sqlite3 /var/lib/weewx/weewx.sdb | awk -F'|' '{printf "R.Luftdruck : %.0f", $7*33.8639}{print " mbar"}'
echo "SELECT * FROM archive ORDER BY dateTime DESC LIMIT 1" | sqlite3 /var/lib/weewx/weewx.sdb | awk -F'|' '{printf "Taupunkt : %.1f", ($20-32)/1.8}{print "°C"}'
echo "SELECT * FROM archive ORDER BY dateTime DESC LIMIT 1" | sqlite3 /var/lib/weewx/weewx.sdb | awk -F'|' '{printf "Regen : %.0f", $77*25.4}{print "mm" }'
echo "SELECT * FROM archive ORDER BY dateTime DESC LIMIT 1" | sqlite3 /var/lib/weewx/weewx.sdb | awk -F'|' '{printf "Wind : %.0f", $114*1.6092}{print " km/h"}'
echo "SELECT * FROM archive ORDER BY dateTime DESC LIMIT 1" | sqlite3 /var/lib/weewx/weewx.sdb | awk -F'|' '{printf "Windböen : %.0f", $111*1.6092}{print " km/h"}'
echo "SELECT * FROM archive ORDER BY dateTime DESC LIMIT 1" | sqlite3 /var/lib/weewx/weewx.sdb | awk -F'|' '{printf "Windrichtung: %.0f", $109}{print "°"}'
Dies würde folgenden Output generieren:
Temperatur : 3.6°C
Luftfeuchte : 76%
R.Luftdruck : 1005 mbar
Taupunkt : -0.3°C
Regen : 0mm
Wind : 2 km/h
Windböen : 7 km/h
Windrichtung: 38°
Der Output von AWK ist hier teilweise formatiert. Mit dem Befehl printf kann man den Output formatieren. Hier wird es genutzt um Werte auf 1 Nachkommastelle mit %.1f zu formatieren. Man kann natürlich auch 0 oder mehr Nachkommastellen angeben.
Man kann innerhalb AWK auch Rechnungen durchführen zum Umrechnen der Messwerte.
{printf "Temperatur : %.1f", ($69-32)/1.8}
Dies gibt die Temperatur mit einer Nachkommastelle aus. Außerdem wird der originale Meßwert von °Fahrenheit in °Celsius umgerechnet mit (Temperatur-32) / 1,8.
Damit im Output noch die Meßeinheit hinter den Werten angegeben wird, wird noch ein zusätzlicher {print Einheit} mit angehängt.
Fazit
Dies zeigt, wie man relativ einfach Meßdaten aus der WEEWX Datenbank heruasbekommt und diese Verarbeiten kann. Man könnte diese Informationen z.B. in eine Webseite einbinden, zu MQTT schicken, an einen Sprachsynthesizer übergeben der einem den Text mit den Wetterdaten vorliest usw. Der Fantasie sind keine Grenzen gesetzt. Zu beachten ist nur die Reihenfolge der Meßwerte in der Datenbank, was vermutlich auch von der verwendeten Wetterstation und. ggf. von der WeeWX Version abhängig ist. Also nicht vergessen volger die Spaltenbezeichnungen auszulesen und zu interpretieren.
Letztes Update: 07.01.2025