Fehlerhafte Einträge in der weewx Datenbank beheben

Ich betreibe eine kleine Wetterstation, die mittels weewx Webseiten für meine Internetseite erzeugt (siehe https://thesen.eu/wetter; Näheres zum Aufbau hier). Aufgrund eines Garantiefalles musste ich die Basisstation austauschen. Als ich die neue Basisstation angeschlossen habe, sind plötzlich einige sinnlose Einträge in der weewx Datenbank aufgetaucht. Als Resultat waren dann alle Grafiken völlig sinnlos skaliert. Da weewx auch Wochen, Monats und Jahresübersichten erzeugt, ist das ärgerlich. Die fehlerhaften Einträge machen diese Grafiken dauerhaft kaputt:
weewx-error
Im folgenden habe ich zusammengeschrieben, wie man diese Einträge lokalisieren und löschen kann.

weewx nutzt eine SQL Dankenbank, um die Daten in einer Datenbank abzulegen. Die Datenbankdateien haben die Endung sdb und liegen im Unterverzeichnis archive. Dabei ist weewx.sdb die Datenbank der Meßwerte. Die Datei stats.sdb wird daraus erzeugt und enthält die Statistiken.

Um die Datenbankeinträge sehen und manipulieren zu können braucht man ein Tool. Ich habe sqlite3 genommen. Wenn ihr das noch nicht auf dem Pi installiert habt, dann geht das sehr einfach und für wenige hundert kB mittels folgender Kommandos:
sudo apt-get update
sudo apt-get install sqlite3

Danach geht man mit dem Tool auf die weewx Datenbank
sudo sqlite3 ./archive/weewx.sdb
Man kann dann nun auf die Datenbank zugreifen (und sie auch kaputt machen!). Je nach dem ist es sicherer ein Backup der Datenbankdateien weewx.sdb und stats.sdb anzulegen. Ohne „sudo“ kann man auch read-only auf die Datenbank zugreifen und sich so erst einmal umsehen.

Mit dem Kommando .schema kann man sich erst einmal die Struktur der Datenbank ansehen. Bei weewx enthält die Datenbank eine Tabelle namens archive. Die Namen der Spalten sind mit .schema erkennbar. Bei mir erscheint:
sqlite> .schema
CREATE TABLE archive (`dateTime` INTEGER NOT NULL UNIQUE PRIMARY KEY, `usUnits` INTEGER NOT NULL, `interval` INTEGER NOT NULL, `barometer` REAL, `pressure` REAL, `altimeter` REAL, `inTemp` REAL, `outTemp` REAL, `inHumidity` REAL, `outHumidity` REAL, `windSpeed` REAL, `windDir` REAL, `windGust` REAL, `windGustDir` REAL, `rainRate` REAL, `rain` REAL, `dewpoint` REAL, `windchill` REAL, `heatindex` REAL, `ET` REAL, `radiation` REAL, `UV` REAL, `extraTemp1` REAL, `extraTemp2` REAL, `extraTemp3` REAL, `soilTemp1` REAL, `soilTemp2` REAL, `soilTemp3` REAL, `soilTemp4` REAL, `leafTemp1` REAL, `leafTemp2` REAL, `extraHumid1` REAL, `extraHumid2` REAL, `soilMoist1` REAL, `soilMoist2` REAL, `soilMoist3` REAL, `soilMoist4` REAL, `leafWet1` REAL, `leafWet2` REAL, `rxCheckPercent` REAL, `txBatteryStatus` REAL, `consBatteryVoltage` REAL, `hail` REAL, `hailRate` REAL, `heatingTemp` REAL, `heatingVoltage` REAL, `supplyVoltage` REAL, `referenceVoltage` REAL, `windBatteryStatus` REAL, `rainBatteryStatus` REAL, `outTempBatteryStatus` REAL, `inTempBatteryStatus` REAL);

An erster Stelle steht also Zeit/Datum in Unix Konvention. Eintrag 4 in jeder Datenzeile ist z.B. der Druck (in inHg; die Einheiten sind immer amerikanisch/imperial).

Jetzt muss man die defekten Einträge finden. Das kann man z.B. tun, in dem man nach sinnlosen Werten sucht. Hat man beispielsweise sinnlos hohe Windböen, so kann man mit folgendem Kommando nach Böengeschwindigkeiten über 100 Meilen/h suchen:
SELECT * FROM archive WHERE windGust>100;

Kann man die Uhrzeit der fehlerhaften Einträge einschätzen, so kann man die Einträge aus dem Zeitraum anzeigen lassen. Dazu muss man zunächst Datum und Uhrzeit in Unix Epochen umrechnen. Das geht beispielsweise hier: http://www.epochconverter.com/

Danach kann man mit folgendem Kommando die Einträge aus einem entsprechend eingeschränkten Zeitraum anzeigen (man muss natürlich die Zeiten auf die eigenen Werte anpassen):
SELECT * FROM archive WHERE dateTime>1437177600 AND dateTime<1437224400;

Bei mir kam dabei folgendes heraus:
1437209238|1|0||59.7282929710573|61.6972020568766|32.0||0.0|5.0|2.2369362912|877.5|715.819613184|877.5|||-206451.55032121|-2833.24|-2833.24|||||||||||||||||||||||||||||||||
1437209958|1|12||3.78027170702894|4.04987302083283|32.0|32.0||0.0|10.28990693952|1800.0|42.5017895328|1800.0||||23.5809421233387|32.0||||32.0|19.0040000022138||||||||||||||||||||||||||||
1437219877|1|5|30.2070907698466|29.1966922622564|30.257313925167|79.16|88.16|60.0|39.0|4.4738725824|225.0|6.93450250272|225.0|||60.040369125152|88.16|88.16||397.95382|0.0|88.16|88.9300974826728||||||||||||||||||||||||||||
<<...snip...>>

Laut dieser Tabelle hatten wir als 32 Fahrenheit (0 Grad Celsius) am 18.07. in unserer Wohnung. EBenso falsch ist der folgende Eintrag. Diese beiden Einträge können wir folgt gelöscht werden:
DELETE FROM archive WHERE dateTime=1437209238;
DELETE FROM archive WHERE dateTime=1437209958;

Das sqlite3 Tool kann man mit dem Kommando .quit verlassen. Ich habe nun noch das mitgelieferte Script zum check der Datenbank laufen lassen. Vorher habe ich weewx gestoppt:
sudo /etc/init.d/weewx stop
./bin/wee_config_database --string-check --fix ./weewx.conf

Nun muss man noch die stats.sbd löschen; ich habe die Datei umbenannt, um ein Backup zu haben:
cd archive
sudo mv stats.sdb stats.sdb.backup

Danach habe ich die Pi mit weewx neu gestartet.
sudo reboot

Nach dem Neustart erzeugt weewx die stats.sdb neu. Das hat bei mir bei fast 1 Jahr Daten ca. 10 Minuten gedauert. Weitere 5 Minuten später waren Pi und Wetterstation wieder in Sync. Die Tabellen mit den min/max Werten stimmen nun wieder. Die Wochen, Monats und Jahres-Übersichtsbilder werden in den nächsten 24h neu erzeugt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.