zeroinput v2.2 – Funktionsübersicht
zeroinput ist eine PV-Nulleinspeisungssteuerung für den Raspberry Pi (Linux). Sie regelt batteriegespeiste Netzwechselrichter so, dass der Bezug aus dem Netz möglichst auf null gehalten wird, ohne ungewollt einzuspeisen. Die Regelung liest den Stromzähler über eine vzlogger-FIFO und stellt im Sekundentakt die Wechselrichterleistung nach.
Robustheit und Architektur
- Drahtgebundene Verbindungen statt Funk: Zähler, Wechselrichter und Laderegler sind über serielle Leitungen und lokale Schnittstellen angebunden. Auf Funkstrecken (WLAN, Bluetooth, Funksteckdosen) wird im Regelpfad bewusst verzichtet, da sie Latenz, Aussetzer und Störquellen einbringen.
- Schlanker Stack ohne überflüssige Protokollschichten: Die Sekundenregelung kommt ohne MQTT, HTTP-Broker, Message-Bus oder ähnliche Zwischenschichten aus. Werte werden direkt über serielle Protokolle und eine lokale FIFO ausgetauscht. Das hält den Regelkreis kurz, vorhersehbar und unabhängig von zusätzlichen Diensten, die ausfallen oder verzögern könnten.
- Wenige Abhängigkeiten: Lokale Ausführung auf einem Raspberry Pi unter Linux, ohne Cloud-Anbindung im Regelpfad. Der Lastprediktor arbeitet rein lokal aus dem beobachteten Lastverlauf, ohne externe Datenquelle. Externe Zugriffe gibt es nur in den optionalen Tools, die die Entladezeiten planen — dirt_shift (liest den Volkszähler-Verlauf) und tib_zero_tas (liest den Volkszähler-Verlauf und die dynamischen Strompreise aus einer lokalen Datei, schaltet optional Tasmota-Steckdosen). Diese Tools laufen getrennt von der Regelung und sind nicht regelkritisch.
Kernregelung
- Nulleinspeisungsregelung im ~1-Sekunden-Takt: Der gemessene Netzbezug wird über einen n-2-Integrator in einen Leistungssollwert (
power_demand) umgesetzt, der an die Wechselrichter verteilt wird. - Nullverschiebung (Zero-shift) verschiebt den angestrebten Nullpunkt des Zählers wahlweise leicht in Richtung Bezug oder Einspeisung, oder regelt ihn automatisch.
- Sägezahnverhinderung: Erkennt aufschwingende Oszillation und glättet den Sollwert.
- Rampenverhalten: Reagiert auf große Laständerungen mit kontrolliertem Hochlauf, ohne kurze Lastspitzen sofort voll auszuregeln.
- Lastprediktor (
predictor.py): Erkennt zyklische Verbraucher und speist eine Vorhersage in die Regelung ein.
Wechselrichtersteuerung
- Mehrstufiges Staging: Mehrere Wechselrichter werden in zwei Stufen betrieben. Stufe 1 deckt den Grundbereich (besserer Wirkungsgrad), Stufe 2 schaltet bei höherem Bedarf zu. Der Übergang ist über eine Schwelle (
single_inverter_threshold) geregelt und durch ein Cross-Fade geglättet. - Lastverteilung auf parallele Einheiten mit Sättigungslogik (jede Einheit nur bis zu ihrer konfigurierten
max_power). - Unterstützte Wechselrichter: Soyosource (GTN-Serie) und Victron MultiPlus (VE.Bus). PV-String-, Mikro- und Insel-Wechselrichter ohne aktiven 1-Sekunden-Sollwert werden bewusst nicht unterstützt.
Batterieverwaltung
- Spannungsabhängige Entladebegrenzung: Nahe dem leeren Zustand wird die Entladeleistung über eine Spannungskurve heruntergeregelt, mit Abschaltung an der unteren Schwelle.
- Einstellbare Zellzahl (
cell_count): Alle Batteriespannungs-Schwellen skalieren mit der Zahl der LiFePO4-Zellen in Serie. Standard ist 16S (51,2 V); auch 15S (48 V), 8S (24/28 V) und andere sind möglich. - Freie Einspeisung (optional): Oberhalb einer Spannungsschwelle wird bewusst etwas Leistung ins Netz gegeben, um den Nullpunkt „nach unten zu ziehen", wenn die Batterie voll ist.
- Robuste Spannungsmessung: Unplausible Messwerte einzelner Laderegler werden bei der Mittelung verworfen. Liefert kein Regler eine Messung — etwa nachts, wenn die MPPTs mangels PV in den Ruhezustand gehen —, wird der zuletzt gültige Spannungswert gehalten, sodass keine fehlende Messung als leere Batterie missdeutet wird.
Hitzeschutz
- Leistungsdeckel nach Temperatur: Ein auswählbarer Temperatursensor begrenzt
power_demandlinear. Unterhalb einer unteren Schwelle (heat_temp_low) volle Leistung, ab einer oberen Schwelle (heat_temp_high) wird der Wechselrichter abgeschaltet (null), dazwischen linear. - Funktioniert mit jedem temperaturführenden Geber (eigener Temperatursensor, eSmart3, Modbus-Laderegler, Aggregator-Subsensor). Genau ein Sensor ist als Auslöser wählbar; ohne Auswahl ist der Schutz aus. Fällt der Sensor aus, greift sicherheitshalber ein fester Anteil der Maximalleistung.
PV-Durchleitung
- pvpt: Direkt verfügbare PV-Leistung wird unabhängig von der Batterielogik durchgereicht.
MPPT-Laderegler
- Auslesen und teilweise Steuern verschiedener Laderegler zur Erfassung von PV-Leistung, Batteriespannung und Temperaturen: eSmart3, Victron (einzeln und als Aggregator über mehrere Seriennummern an einem Port), sowie Modbus-Regler (EPEver, Renogy, Morningstar).
- Temperaturalarme je Gerät mit frei definierbarem Shell-Befehl bei Über-/Unterschreitung.
Entladetimer
- Zeitgesteuerte Entladevorgaben über eine
timer.txt(täglich wiederkehrendes Schema, sekundengenaue Auflösung): begrenzt oder gibt Entladung und Durchleitung zu frei definierbaren Zeitpunkten frei. Schnittstelle für externe Tools.
Externe Tools (nutzen die timer.txt)
- dirt_shift: Verschiebt die Batterieentladung gezielt in die Netzstunden mit hoher CO₂-Intensität (Abend, Nacht, früher Morgen), abgeleitet allein aus dem berechneten Sonnenstand plus festen Last-Schranken, ohne externe Netzdaten. Alternative zum preisgesteuerten Ansatz.
- tib_zero_tas.py: Preisgesteuerte Variante (dynamischer Tarif). Legt die Entladezeiten in die teuersten Stunden und kann zusätzlich Tasmota-Steckdosen in günstige Stunden schalten. Schreibt dieselbe
timer.txt– nicht gleichzeitig mit dirt_shift betreiben. Dieser Code wird derzeit nicht gepflegt.
MultiPlus / VE.Bus (vebus.py)
- ESS-Sollwertsteuerung für Victron MultiPlus über VE.Bus, mit automatischer Ermittlung der Sollwert-RAM-Adresse (robust über verschiedene Modelle).
Weboberfläche (webconfig.py)
- Konfiguration im Browser: strukturierte Editoren für Laderegler, Wechselrichter, Temperaturalarme, vz-Kanäle, Timer und allgemeine Einstellungen (inklusive Zellzahl und Hitzeschutz-Schwellen).
- Dienst-Neustart per Knopf für zeroinput und vzlogger.
- Live-Statusseite (optional).
Betrieb
- Hot-Reload: Geänderte Einstellungen werden im laufenden Betrieb übernommen; nur strukturelle Änderungen (Laderegler, Wechselrichter) erfordern einen Neustart.
- Datenprotokollierung der Messwerte für Volkszähler.
- Ausgabemodi mit unterschiedlich ausführlicher Konsolenausgabe zur Diagnose.
