# Was ist Ingest?

> Der Proxy, der bei Balkonkraftwerken den Hausverbrauch neu berechnet, bevor die Messwerte in die InfluxDB gehen.

**Ingest** ist ein Proxy, der die Messwerte der Kollektoren entgegennimmt, daraus einen korrigierten Hausverbrauch berechnet und alles an die InfluxDB weiterleitet.

Der momentan **einzige Einsatzzweck** ist die Unterstützung von **Balkonkraftwerken**. Ohne Balkonkraftwerk hat Ingest keine Funktion.

Ein Balkonkraftwerk speist direkt ins Hausnetz ein. Der Wechselrichter bzw. Stromspeicher meldet deshalb einen zu niedrigen Hausverbrauch.

Der Hausverbrauch lässt sich aber rückwärts berechnen, sobald die anderen Werte der Strombilanz bekannt sind:

```
Hausverbrauch = Erzeugung vom Dach
              + Erzeugung des Balkonkraftwerks
              + Netzbezug
              + Batterieentladung (falls Batterie vorhanden)
              - Batterieladung (falls Batterie vorhanden)
              - Netzeinspeisung
              - Wallbox (falls vorhanden)
              - Wärmepumpe (falls vorhanden)
```

Steht die Wallbox oder die Wärmepumpe in `INFLUX_EXCLUDE_FROM_HOUSE_POWER`, entfällt ihre Zeile in der Formel. Ihr Anteil steckt dann weiterhin im berechneten Hausverbrauch, und erst das Dashboard zieht ihn bei der Anzeige ab. Für die Wärmepumpe ist das der Regelfall. Die [Variable muss bei Ingest und Dashboard gleich gesetzt sein](/docs/referenz/ingest/konfiguration/#influx_exclude_from_house_power). Ein negatives Ergebnis setzt Ingest auf 0.

Gibt es einen Sensor für die **Gesamterzeugung** (`INFLUX_SENSOR_INVERTER_POWER`), rechnet Ingest allein mit diesem Wert. Die Einzelwerte der Wechselrichter bleiben dann außen vor, statt aufaddiert zu werden.

## Der Puffer

Kollektoren liefern nicht im Gleichtakt, und einzelne fallen vorübergehend aus. Ingest puffert deshalb alle Messwerte 12 Stunden lang in einer SQLite-Datenbank und interpoliert daraus die Werte zwischen zwei Messpunkten. Trägt ein Kollektor seine Werte verspätet nach, holt Ingest die Berechnung nach.

Gerechnet wird nur für Zeitpunkte, zu denen **jeder** beteiligte Sensor einen Wert hat. Fehlt einer, entsteht an dieser Stelle eine Lücke im Hausverbrauch. Ein Sensor, der noch keinen neueren Messpunkt geliefert hat, zählt dabei höchstens 15 Minuten lang mit seinem letzten Wert.

Das Zusammenspiel der Container ändert sich also wie folgt:

## Bisher (ohne Ingest)

```mermaid
graph LR
  CollectorA[SENEC-Collector]
  CollectorB[Shelly-Collector]
  CollectorC[MQTT-Collector]
  Influx[InfluxDB]
  Dashboard[Dashboard]

  CollectorA -->|push| Influx
  CollectorB -->|push| Influx
  CollectorC -->|push| Influx
  Influx -->|pull| Dashboard
```

## Mit Ingest

```mermaid
graph LR
  CollectorA[SENEC-Collector]
  CollectorB[Shelly-Collector]
  CollectorC[MQTT-Collector]
  Influx[InfluxDB]
  Ingest[Ingest]
  Dashboard[Dashboard]

  CollectorA -->|push| Ingest
  CollectorB -->|push| Ingest
  CollectorC -->|push| Ingest
  Ingest -->|push| Influx
  Influx -->|pull| Dashboard
```

Damit wird Ingest zu einer kritischen Komponente, die im Fehlerfall den gesamten Datenfluss unterbricht. Ingest muss deshalb permanent laufen – wie die InfluxDB auch.

## Quelltext

Ingest ist in Ruby implementiert, der Quelltext ist auf GitHub verfügbar: \
[github.com/solectrus/ingest](https://github.com/solectrus/ingest)
