Zum Inhalt springen

Was ist Ingest?

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)

Wallbox und Wärmepumpe zieht Ingest nur ab, solange sie nicht über INFLUX_EXCLUDE_FROM_HOUSE_POWER aus dem Hausverbrauch herausgerechnet sind. Steht ein Verbraucher dort, bleibt er in der Formel außen vor und sein Anteil steckt weiterhin im berechneten Hausverbrauch. Das Dashboard zieht ihn dann erst bei der Anzeige ab. Für die Wärmepumpe ist das der Regelfall. 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.

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:

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
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.

Ingest ist in Ruby implementiert, der Quelltext ist auf GitHub verfügbar:
github.com/solectrus/ingest