Korrektur eines Datenwerts in der InfluxDB


Die Daten der Homeautomatisierungslösung openHAB werden bei mir mit InfluxDB persistiert (also weggeschrieben).

Der Grund ist, dass InfluxDB sehr gut mit Grafana zusammen arbeitet und so schöne grafische Auswertungen möglich sind.

Nun kann es aber passieren, dass in die DB falsche Werte rein geschrieben wurden. In meinem Fall werden die Impulse das Gaszählers gezählt und in der DB gespeichert. Daraus wird täglich der Wert Gas_Last_Daily_Consumption berechnet und auch gespeichert. Wie gesagt, mit Grafana erhält man so eine grafische Darstellung des Gasverbrauchs.

Leider ist nun durch einen Zählerüberlauf (in diesem Falle ausgelöst durch einen kurzen Spannungsausfall des KNX-Bus) der Impulszähler zurück gesetzt worden. Am folgenden Tag wurde daher der tägl. Gasverbrauch falsch berechnet und gespeichert. Es ergab sich einer hoher negativer Wert und der musste korrigiert werden.

Leider ist das korrigieren eines Wertes in der InfluxDB nicht so einfach wie z.B. bei einer MySQL-DB.

Die Lösung ist, den Datenpunkt mit korrektem Wert nochmal mit exakt gleichen Timestamp wie der vorhandene falsche Datenpunkt in die DB zu schreiben. Dann wird der alte Wert überschrieben. Stimmt der Timestamp nicht, so wird ein neuer Datenpunkt angelegt.

Das Schreiben erfolgt dann, wie in der Dokumentation der InfluxDB ausgeführt, mit einem Befehl von der Kommandozeile aus:

user@homesrv:~> curl -i -XPOST 'http://192.168.1.9:8086/write?db=openhab' --data-binary 'Gas_Last_Daily_Consumption value=395 1487199600040000000' 
HTTP/1.1 204 No Content 
Content-Type: application/json 
Request-Id: 50ef1043-f846-11e6-a31c-000000000000 
X-Influxdb-Version: 1.2.0 
Date: Tue, 21 Feb 2017 19:59:17 GMT

Die Schwierigkeit besteht darin, den Timestamp exakt zu bestimmen und diesen dann als 9-stelligen Wert (Unix Epoch Time) anzugeben.

 

Dazu kann man die DB wie folgt abfragen:

user@homesrv:~> curl -G 'http://192.168.1.9:8086/query?pretty=true' --data-urlencode "db=openhab" --data-urlencode "epoch=ns" --data-urlencode "q=SELECT \"value\" FROM \"Gas_Last_Daily_Consumption\" WHERE \"time\">'2017-02-14T22:59:00.118Z'"

Mit dem Parameter epoch=ns wird die Zeit so ausgegeben, wie man sie beim obigen Befehl zum Aktualisieren angeben muss. So kann man den zu ändernden Datenpunkt exakt ermitteln und die InfluxDB korrigieren.