# Ausführung des CSV-Importers

> Historische Messwerte als CSV oder ZIP nach InfluxDB übertragen. Erkannt werden die Exporte von SENEC, Sungrow und SolarEdge an ihrer Kopfzeile.

Der CSV-Importer läuft nur **einmalig**, er ist kein dauerhafter Dienst.

## Import starten

In [HELIOS](/docs/referenz/helios/) steht er unter _Konfiguration → Datenquellen → Historische Daten importieren_.

Dort werden die exportierten Dateien hochgeladen, einzeln als CSV oder gebündelt als ZIP-Archiv (empfohlen, maximal 100 MB). HELIOS entpackt sie und startet den Container. Um welches Format es sich handelt, erkennt der Importer selbst: Er liest die Kopfzeile jeder Datei und sucht darin die Spalten, die er kennt.

Identische Datenpunkte werden überschrieben statt doppelt angelegt. Ein zweiter Import derselben Datei erzeugt also keine Dubletten.

## Unterstützte Formate

Erwartet werden die Dateien so, wie der jeweilige Anbieter sie exportiert. Erkannt wird das Format an der Kopfzeile:

| Quelle                  | Zeitspalte | Erkennungsmerkmal in der Kopfzeile |
| :---------------------- | :--------- | :--------------------------------- |
| SENEC (`mein-senec.de`) | `Uhrzeit`  | `Netzbezug [kW]` bzw. `[kWh]`      |
| Sungrow (iSolarCloud)   | `Zeit`     | –                                  |
| SolarEdge (Monitoring)  | `Time`     | –                                  |

Beim SENEC-Export trennt ein Semikolon die Spalten, die Werte stehen in Kilowatt mit Komma als Dezimaltrennzeichen. Der Importer rechnet sie in Watt um. Die Spalte mit dem Ladestand des Speichers (`Akku Füllstand [%]`) darf fehlen.

```csv title="Beispiel (SENEC)"
Uhrzeit;Stromerzeugung [kW];Netzbezug [kW];Netzeinspeisung [kW];Akku Füllstand [%]
01.03.2024 00:00:00;0,00;0,42;0,00;53,20
01.03.2024 00:05:00;0,00;0,39;0,00;52,80
```

Die Zeitstempel liest der Importer in der Zeitzone, die `TZ` angibt.

## Nach dem Import

Durch den Import kommen Messwerte aus der Vergangenheit dazu. Deshalb leert HELIOS anschließend den Redis-Cache und setzt die Tageszusammenfassungen zurück. Beides passiert automatisch.

## Umgebungsvariablen

Diese Variablen wertet der CSV-Importer aus.

Die sieben `INFLUX_SENSOR_*`-Variablen ordnen jeden Messwert einem Ziel in InfluxDB zu, in der Form `Measurement:Field`. Jede hat einen Standardwert, der zum SENEC-Speicher passt. Bei einem Tippfehler im Variablennamen greift dieser Standardwert. Der Import bricht dann nicht ab, sondern schreibt still auf das SENEC-Measurement.

### `INFLUX_HOST`<span class="badge required"></span>

Hostname des InfluxDB-Servers, in den der Importer die Messwerte schreibt. Läuft InfluxDB im selben Docker-Netzwerk, ist das der Name des Docker-Services, also `influxdb`. Es kann aber auch ein externer Server sein, etwa `influxdb.example.com`.

Hier gehört nur der Host hin, **kein** `http://` oder `https://` und keine Portnummer. Ohne die Variable bricht der Importer beim Start ab, denn die URL, die er aus Schema, Host und Port zusammensetzt, ist dann ungültig.

```properties title="Beispiel"
INFLUX_HOST=influxdb
```

> **HELIOS**
>
>
> HELIOS setzt den Hostnamen automatisch auf den Namen des InfluxDB-Containers, also `influxdb`. Anders als die Collectoren schreibt der Importer auch bei aktivem [Ingest-Dienst](/docs/referenz/ingest/) direkt in InfluxDB. Nur bei einer externen InfluxDB fragt HELIOS den Hostnamen unter _Konfiguration → Grundeinstellungen → InfluxDB_ ab.
>

### `INFLUX_SCHEMA`<span class="badge optional"></span>

Schema für die Verbindung zu InfluxDB, `http` oder `https`. Standardwert ist `http`. Bei einer externen InfluxDB mit TLS gehört hier `https` hin.

Ein anderer Wert lässt den Importer beim Start abbrechen.

```properties title="Beispiel"
INFLUX_SCHEMA=https
```

> **HELIOS**
>
>
> HELIOS setzt `http`, denn innerhalb des Docker-Netzwerks wird nicht verschlüsselt. Nur bei einer externen InfluxDB fragt HELIOS das Protokoll ab.
>

### `INFLUX_PORT`<span class="badge optional"></span>

Port für die Verbindung zu InfluxDB, eine Ganzzahl. Standardwert ist `8086`. Bei einer externen, per TLS abgesicherten InfluxDB ist es oft `443`.

```properties title="Beispiel"
INFLUX_PORT=443
```

> **HELIOS**
>
>
> HELIOS setzt den Port automatisch: `8086`. Nur bei einer externen InfluxDB fragt HELIOS ihn ab.
>

### `INFLUX_TOKEN_WRITE`<span class="badge required"></span>

Token, mit dem sich der Importer bei InfluxDB anmeldet. Er muss dort existieren und das Recht haben, in den angegebenen Bucket zu **schreiben**. Mehr braucht der Importer nicht: Er schickt Messwerte hin und liest nie etwas zurück.

Alternativ liest der Importer den Token aus `INFLUX_TOKEN`. Gesetzt sein muss einer der beiden, `INFLUX_TOKEN_WRITE` hat Vorrang. Passt der Token nicht, weist InfluxDB den ersten Schreibzugriff ab und der Import bricht ab.

```properties title="Beispiel"
INFLUX_TOKEN_WRITE=my-super-secret-write-token
```

> **HELIOS**
>
>
> HELIOS gibt dem Importer den Schreib-Token, siehe [`INFLUX_TOKEN_WRITE`](/docs/referenz/helios/konfiguration/#influx_token_write). Einzustellen gibt es nichts.
>

### `INFLUX_ORG`<span class="badge required"></span>

Organisation in InfluxDB, unter der die Messwerte gespeichert werden. In einer SOLECTRUS-Installation heißt sie `solectrus`.

Der Name muss zu der Organisation passen, die in InfluxDB tatsächlich existiert. Sonst lehnt InfluxDB die Schreibzugriffe ab und der Import bricht ab.

```properties title="Beispiel"
INFLUX_ORG=solectrus
```

> **HELIOS**
>
>
> HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen der vorhandenen Organisation ab.
>

### `INFLUX_BUCKET`<span class="badge required"></span>

Bucket in InfluxDB, in den der Importer die Messwerte schreibt. Es muss derselbe sein, aus dem das Dashboard liest, sonst bleiben die importierten Zeiträume dort leer. In einer SOLECTRUS-Installation heißt er `solectrus`.

```properties title="Beispiel"
INFLUX_BUCKET=solectrus
```

> **HELIOS**
>
>
> HELIOS gibt `solectrus` vor, einzustellen gibt es nichts. Nur bei einer externen InfluxDB fragt HELIOS den Namen des vorhandenen Buckets ab.
>

### `INFLUX_SENSOR_INVERTER_POWER`<span class="badge optional"></span>

Ziel für die Wechselrichterleistung. Standardwert ist `SENEC:inverter_power`.

```properties title="Beispiel"
INFLUX_SENSOR_INVERTER_POWER=SENEC:inverter_power
```

> **HELIOS**
>
>
> HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert.
>

### `INFLUX_SENSOR_HOUSE_POWER`<span class="badge optional"></span>

Ziel für den Hausverbrauch. Standardwert ist `SENEC:house_power`.

Bei SolarEdge-Dateien steht der Hausverbrauch nicht im Export. Der Importer rechnet ihn aus Erzeugung, Netzbezug und Einspeisung aus.

```properties title="Beispiel"
INFLUX_SENSOR_HOUSE_POWER=SENEC:house_power
```

> **HELIOS**
>
>
> HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert.
>

### `INFLUX_SENSOR_GRID_IMPORT_POWER`<span class="badge optional"></span>

Ziel für den Netzbezug. Standardwert ist `SENEC:grid_power_plus`.

```properties title="Beispiel"
INFLUX_SENSOR_GRID_IMPORT_POWER=SENEC:grid_power_plus
```

> **HELIOS**
>
>
> HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert.
>

### `INFLUX_SENSOR_GRID_EXPORT_POWER`<span class="badge optional"></span>

Ziel für die Netzeinspeisung. Standardwert ist `SENEC:grid_power_minus`.

```properties title="Beispiel"
INFLUX_SENSOR_GRID_EXPORT_POWER=SENEC:grid_power_minus
```

> **HELIOS**
>
>
> HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert.
>

### `INFLUX_SENSOR_BATTERY_CHARGING_POWER`<span class="badge optional"></span>

Ziel für die Batterieladung. Standardwert ist `SENEC:bat_power_plus`.

```properties title="Beispiel"
INFLUX_SENSOR_BATTERY_CHARGING_POWER=SENEC:bat_power_plus
```

> **HELIOS**
>
>
> HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert.
>

### `INFLUX_SENSOR_BATTERY_DISCHARGING_POWER`<span class="badge optional"></span>

Ziel für die Batterieentladung. Standardwert ist `SENEC:bat_power_minus`.

```properties title="Beispiel"
INFLUX_SENSOR_BATTERY_DISCHARGING_POWER=SENEC:bat_power_minus
```

> **HELIOS**
>
>
> HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert.
>

### `INFLUX_SENSOR_BATTERY_SOC`<span class="badge optional"></span>

Ziel für den Ladestand des Speichers. Standardwert ist `SENEC:bat_fuel_charge`.

Nur SENEC-Dateien enthalten den Ladestand, und auch dort ist die Spalte optional. Fehlt sie, überspringt der Importer den Sensor. Sungrow- und SolarEdge-Dateien liefern ihn gar nicht.

```properties title="Beispiel"
INFLUX_SENSOR_BATTERY_SOC=SENEC:bat_fuel_charge
```

> **HELIOS**
>
>
> HELIOS übernimmt die Zuordnung aus _Konfiguration → Sensoren_. Ist der Sensor dort nicht konfiguriert, gilt der Standardwert.
>

### `INFLUX_OPEN_TIMEOUT`<span class="badge optional"></span>

Zeitlimit für den Verbindungsaufbau zu InfluxDB, in Sekunden. Standardwert ist `30`.

```properties title="Beispiel"
INFLUX_OPEN_TIMEOUT=60
```

> **HELIOS**
>
>
> HELIOS setzt die Variable nicht, es gilt der Standardwert.
>

### `INFLUX_READ_TIMEOUT`<span class="badge optional"></span>

Zeitlimit fürs Lesen von InfluxDB, in Sekunden. Standardwert ist `60`.

```properties title="Beispiel"
INFLUX_READ_TIMEOUT=120
```

> **HELIOS**
>
>
> HELIOS setzt die Variable nicht, es gilt der Standardwert.
>

### `INFLUX_WRITE_TIMEOUT`<span class="badge optional"></span>

Zeitlimit fürs Schreiben nach InfluxDB, in Sekunden. Standardwert ist `30`.

Der Importer schickt die Messwerte in Blöcken zu 500 Datenpunkten. Läuft ein Block in das Zeitlimit, versucht er es dreimal erneut, mit wachsender Wartezeit dazwischen.

```properties title="Beispiel"
INFLUX_WRITE_TIMEOUT=60
```

> **HELIOS**
>
>
> HELIOS setzt die Variable nicht, es gilt der Standardwert.
>

### `IMPORT_FOLDER`<span class="badge optional"></span>

Ordner, in dem der Importer nach CSV-Dateien sucht, samt Unterordnern. Standardwert ist `/data`.

```properties title="Beispiel"
IMPORT_FOLDER=/data
```

> **HELIOS**
>
>
> HELIOS hängt die hochgeladenen Dateien als `/data` in den Container. Der Standardwert passt damit, HELIOS setzt die Variable nicht.
>

### `IMPORT_PAUSE`<span class="badge optional"></span>

Pause nach jeder importierten Datei, in Sekunden. Standardwert ist `0`, der Importer arbeitet die Dateien also ohne Unterbrechung ab.

Ein größerer Wert entlastet eine InfluxDB auf schwacher Hardware, verlängert aber den Import.

```properties title="Beispiel"
IMPORT_PAUSE=5
```

> **HELIOS**
>
>
> HELIOS setzt die Variable nicht, es gilt der Standardwert.
>

### `SENEC_IGNORE`<span class="badge optional"></span>

Messwerte, die der Importer **nicht** nach InfluxDB schreibt. Nötig, wenn einzelne Messwerte (etwa die Netzeinspeisung) aus einer anderen Quelle stammen. Ohne die Variable schreibt der Importer alle Messwerte.

Einzutragen sind die **Field-Namen** aus der Sensor-Zuordnung, also etwa `grid_power_minus`, nicht der Sensorname `GRID_EXPORT_POWER`. Mehrere Felder werden durch Kommas getrennt, ohne Leerzeichen. Die Liste wirkt nur beim SENEC-Format, Sungrow- und SolarEdge-Dateien importiert der Importer vollständig.

```properties title="Beispiel"
SENEC_IGNORE=grid_power_minus,bat_fuel_charge
```

> **HELIOS**
>
>
> HELIOS leitet die Liste aus der Sensor-Konfiguration ab: Ein Feld landet darin, sobald eine andere Datenquelle in dasselbe Measurement und Field schreibt wie der SENEC-Collector. Einzustellen gibt es nichts.
>

### `TZ`<span class="badge optional"></span>

Zeitzone gemäß [Liste](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones). Standardwert ist `Europe/Berlin`.

In dieser Zeitzone liest der Importer die Zeitstempel der CSV-Dateien. Die Portale exportieren sie ohne Zeitzonenangabe, ein falscher Wert verschiebt daher alle importierten Messwerte. Gespeichert werden sie anschließend wie immer in UTC.

```properties title="Beispiel"
TZ=Europe/Rome
```

> **HELIOS**
>
>
> HELIOS fragt die Zeitzone unter _Konfiguration → Grundeinstellungen → PV-Anlage_ ab, vorbelegt mit `Europe/Berlin`, und reicht sie an den Importer weiter.
>
