Ingest

Ingest ist ein Ingestion-Proxy, der Messwerte aus verschiedenen Quellen (den Kollektoren) entgegen nehmen kann, einen korrigierten Hausverbrauch berechnet und dann an InfluxDB weiterleitet.

Der momentan einzige Einsatzzweck ist die Unterstützung von Balkonkraftwerken für SOLECTRUS. Wer ein solches nicht hat, für den bringt Ingest keinen Mehrwert. Der Einsatz wird dann nicht empfohlen.

Hintergrund ist, dass bei Verwendung von Balkonkraftwerken der vom Wechselrichter bzw. Stromspeicher gemeldete Hausverbrauch nicht korrekt ist, da eine direkte Einspeisung ins Hausnetz erfolgt. Der Hausverbrauch wird dadurch reduziert, entspricht also nicht dem tatsächlichen Verbrauch.

Der Hausverbrauch lässt sich aber rückwärts berechnen, wenn man die anderen Werte der Strombilanz kennt:

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

Und somit ergibt sich dieser Ansatz: Ingest wird zwischen die Kollektoren und InfluxDB geschaltet und erfährt somit alle relevanten Messwerte. Ingest berechnet dann permanent einen korrigierten Hausverbrauch und sendet diesen zusammen mit allen anderen Werten an InfluxDB.

Aufgrund eines Puffers kann Ingest auch dann den korrekten Hausverbrauch berechnen, wenn einzelne Lieferanten vorübergehend ausfallen und verspätet aufgelaufene Messwerte nachliefern. Ingest puffert alle Messwerte Daten 12 Stunden lang in einer SQLite-Datenbank. Anhand der gepufferten Messwerte wird eine Interpolation zu jedem beliebigen Zeitpunkt (der letzten 12 Stunden) möglich.

Das Zusammenspiel der Container ändert sich also wie folgt:

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

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. Daher ist es wichtig, dass Ingest permanent läuft - also genau wie InfluxDB auch.

Quelltext

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


Unterkapitel