# Korrektur von Messwerten in InfluxDB

> Fehlerhafte Messwerte per Flux-Query finden, als CSV exportieren, korrigieren und zurück in InfluxDB importieren.

Ein Kollektor kann fehlerhafte Messwerte liefern, etwa der [MQTT-Collector](/docs/referenz/mqtt-collector/). Sie landen dann in InfluxDB.

Solche Werte lassen sich vorab abfangen, beispielsweise mit den [Min/Max-Optionen des MQTT-Collectors](/docs/referenz/mqtt-collector/topics/#mapping_x_min). Eingerichtet werden sie in der Praxis aber erst, wenn ungewöhnliche Werte auffallen. Zu diesem Zeitpunkt liegen die fehlerhaften Daten schon in InfluxDB und verfälschen die historischen Statistiken.

InfluxDB kann Messwerte nicht löschen, wohl aber überschreiben. Das Vorgehen:

## 1. Vorbereitung

Vor der Korrektur eine [Sicherung der Datenbank](/docs/anleitungen/datensicherung/) erstellen.

## 2. Fehlerhafte Daten selektieren

Die [Web-Oberfläche von InfluxDB](/docs/referenz/influxdb/direktzugriff/) selektiert die Daten im _Data Explorer_ auf unterschiedliche Weise. Am besten eignet sich der Script-Editor mit einer Flux-Query. [Flux](https://docs.influxdata.com/influxdb/v2/query-data/get-started/) ist die Abfragesprache von InfluxDB. Damit lassen sich Daten filtern und aggregieren.

InfluxDB speichert Messwerte in folgender Hierarchie: `Bucket` > `Measurement` > `Field` > `Value`. Ein `Bucket` ist ein Container für Daten (= Datenbank), ein `Measurement` ist eine Art Tabelle, ein `Field` ist eine Spalte in dieser Tabelle und ein `Value` ist ein Eintrag in dieser Spalte.

Wie genau Bucket, Measurement und Field heißen, hängt von der eigenen Konfiguration ab. Die Beispiele hier verwenden `battery` und `soc`, die Vorgabe für den Ladestand des Hausakkus. Beim SENEC-Collector heißen sie stattdessen `SENEC` und `bat_fuel_charge`. Nachschlagen lässt sich die Zuordnung in HELIOS unter _Konfiguration → Sensoren_.

Hier ein Beispiel, um alle Daten zum Ladestand des Hausakkus abzurufen, die einen Wert größer 100 oder kleiner 0 aufweisen (also offensichtlich fehlerhaft sind):

```
from(bucket: "solectrus")
|> range(start: 0) // Keine zeitliche Einschränkung
|> filter(fn: (r) => r._measurement == "battery")
|> filter(fn: (r) => r._field == "soc")
|> filter(fn: (r) => r._value > 100 or r._value < 0)
```

![Flux-Query im Data Explorer von InfluxDB](@assets/datenkorrektur/influx-query.jpeg)

Für einen bestimmten Zeitraum sieht die Abfrage so aus (hier am Beispiel für Januar 2024):

```
from(bucket: "solectrus")
|> range(start: 2024-01-01T00:00:00Z, stop: 2024-02-01T00:00:00Z) // Januar 2024
|> filter(fn: (r) => r._measurement == "battery")
|> filter(fn: (r) => r._field == "soc")
|> filter(fn: (r) => r._value > 100 or r._value < 0)
```

## 3. Messwerte als CSV exportieren

Die selektierten Messwerte lassen sich als CSV-Datei exportieren. Der zugehörige Knopf _CSV_ erscheint allerdings nur bei einer sicheren HTTPS-Verbindung. Läuft InfluxDB auf einem lokalen Server, ist die Verbindung in der Regel unverschlüsselt und der Knopf fehlt.

Zumindest in Chromium-basierten Browsern (Chrome, Opera, Edge, ...) lässt sich das vorübergehend umgehen: Über die URL `chrome://flags/#unsafely-treat-insecure-origin-as-secure` die Option _Insecure origins treated as secure_ aktivieren und dort die URL der InfluxDB-Web-Oberfläche eintragen (z.B. `http://192.168.2.50:8086`). Der Browser behandelt die Verbindung dann als sicher.

![Chrome-Flags mit der Option „Insecure origins treated as secure"](@assets/datenkorrektur/chrome.jpeg)

## 4. CSV bearbeiten

Die heruntergeladene CSV-Datei enthält Daten in folgender Struktur:

```csv
#group,false,false,true,true,false,false,true,true
#datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,double,string,string
#default,\_result,,,,,,,
,result,table,\_start,\_stop,\_time,\_value,\_field,\_measurement
,,0,1970-01-01T00:00:00Z,2024-12-08T09:02:04.372836299Z,2024-09-09T06:39:56Z,140,soc,battery
,,0,1970-01-01T00:00:00Z,2024-12-08T09:02:04.372836299Z,2024-09-09T06:40:06Z,140,soc,battery
,,0,1970-01-01T00:00:00Z,2024-12-08T09:02:04.372836299Z,2024-09-09T06:40:15Z,140,soc,battery
```

Bearbeiten lässt sie sich mit einem Texteditor oder mit Excel. Zu korrigieren sind in diesem Beispiel die Werte von 140, die für einen SOC des Akkus keinen Sinn ergeben. Die Werte werden dabei **korrigiert** und **nicht gelöscht**: Sämtliche Zeilen und Spalten bleiben erhalten, denn InfluxDB kann auf diesem Weg keine Daten löschen.

> **Achtung**
>
>
> Beim Speichern der Datei darf sich die Struktur nicht ändern. Insbesondere muss das Trennzeichen ein `,` (Komma) bleiben und darf nicht durch `;` (Semikolon) ersetzt werden, was bei der Nutzung von Excel automatisch passieren kann. Ein Texteditor ist daher die sicherere Wahl als Excel.
>

## 5. Korrigierte CSV-Datei re-importieren

Im Menü der Web-Oberfläche lässt sich über `Load Data` > `Sources` > `Upload a CSV` die korrigierte Datei per Drag-and-Drop in den Bucket von SOLECTRUS laden. InfluxDB überschreibt dabei die vorhandenen Daten.

![CSV-Import in der Web-Oberfläche von InfluxDB](@assets/datenkorrektur/influx-import.jpeg)

## 6. Abschluss

Nach dem Import zeigt der _Data Explorer_ die korrigierten Werte.

Zwei Dinge fehlen dann noch, denn SOLECTRUS kennt die alten Werte weiterhin:

1. Den [Redis-Cache leeren](/docs/referenz/redis/#cache-leeren). In HELIOS gibt es dafür beim Dienst _Redis_ den Knopf **Cache leeren**.
2. Die Tageszusammenfassungen zurücksetzen. Das geht in SOLECTRUS selbst, auf der Seite _Einstellungen_ im Abschnitt _Tageszusammenfassungen_ über den Link _Zurücksetzen_.
