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.
Der Puffer
Abschnitt betitelt „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)
Abschnitt betitelt „Bisher (ohne Ingest)“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
Abschnitt betitelt „Mit Ingest“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
Abschnitt betitelt „Quelltext“Ingest ist in Ruby implementiert, der Quelltext ist auf GitHub verfügbar:
github.com/solectrus/ingest