Daten aus WEEWX Datenbank auslesen

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:

barometerRelativer LuftdruckinHG
dewpointTaupunkt außen°F
inDewpointTaupunkt innen°F
inHumidityLuftfeuchtigkeit innen%
inTempTemperatur innen°F
outHumidityLuftfeuchtigkeit außen%
outTempTemperatur außen°F
pressureAbsoluter LuftdruckinHG
windDirWindrichtung°
windGustBöengeschwindigkeitmph
windSpeedWindgeschwindigkeitmph

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:

MesswertMaßeinheit DatenbankUmrechnungMaßeinheit Deutschland
Temperatur° Fahrenheit-32 / 1,8° Celsius
DruckinHG*33,8639Millibar
Wind mph* 1,6092km/h
RegenZoll / Inch* 25,4Millimeter/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