Zeroinput: skalierbare Nulleinspeisung mit Volkszähler-Monitor

…und so sieht das dann aus. Die Verbrauchsspitze ab 18:00 Uhr war nicht bewusst, aber doch günstig. :wink:

Hier nochmal etwas detaillierter. Die Viertelstunden-Taktung ist gewöhnungsbedürftig.

Kann jemand den Hintergrund für diesen Treppeneffekt erklären?

Warum ist die erste Viertelstunde oft günstiger?

Es gab auch einige Updates am Code, insbesondere für die Preisanpassung der Einspeisung.

Ist auf github.

Da sich tibber für mich nicht weiter lohnt, habe ich eine sehr simple timer.txt eingestellt:

# 0000-00-00 for daily repeating, space or tab separated
#                   battery discharge W if > 100, percentage if <= 100
# date     time     |   ac inverter power W if > 100, percentage if <= 100
# |        |        |   |   energy limit in Wh
0000-00-00 00:00:00 000 100 9990
0000-00-00 06:00:00 070 100 9991
0000-00-00 09:00:00 500 100 9992
0000-00-00 11:00:00 000 100 9993
0000-00-00 15:30:00 000 100 9994
0000-00-00 17:00:00 050 100 9995
0000-00-00 19:30:00 070 100 9996
0000-00-00 22:30:00 500 100 9997
0000-00-00 23:30:00 000 100 9998

Damit wird der Gedanke des naturdienlichen Entladens des Akkus weitergeführt, aber eben ohne die tibber-Automatik. Wenn der Akku irgendwann wieder voll geladen wird, dann geht es natürlich wieder in die Vollen.

Wie läuft es bei Euch so? :wink:

Hin und wieder kommt die Frage, wie man den seriellen Port von Victron zuverlässig auf RS485 bekommt. Das geht mittels UART auf RS485 Konverter.
Das sind kleine Platinen, an denen man die Kabel anlötet.
Der Stecker für den Victron MPPT heißt übrigens: JST 2,0 PH

Leider starben einige Konverter ziemlich schnell, einer hat sogar nur 7 Tage gehalten.
Daher mein - rein subjektiver - Tipp für einen Konverter, der hier schon seit über einem halben Jahr reibungslos durchläuft und noch dazu sehr günstig ist:

JZK - TTL auf RS485 Modul, gekauft auf Amazon im 5er Pack für 6,89€

Wer mehr als nur einen RS485 Port braucht, könnte gleich über einen 4-fach USB-Konverter nachdenken: USB-TO-4CH-RS485 von waveshare hat sich da bewährt.

Damit hat sich dann auch gleich die Reihenfolge der USB-Ports und der Gerätenamen erledigt.

Bei seriellen Verbindungen (UART) probeweise immer auch mal RX und TX vertauschen, wenn nichts rauskommt.

Update von zeroinput

Es gibt wieder ein Update von zeroinput, diesmal werden die seriellen Verbindungen gehärtet. Und kleine Fehler gefixt.

Ich würde das Update dringend empfehlen, damit wird das gesamte Script stabiler.

Ausserdem schon mal die Ankündigung für die Integration von:

Damit kann man dann einige Victron Regler an einer einzelnen Leitung betreiben. :wink:

zeroinput v2 ist online. Es gibt zahlreiche Änderungen:

  • Webinterface zu Konfiguration
  • Integration des VEdirect Aggregators
  • Last-Prediktor
  • V2.1: Victron Multiplus Unterstützung

Eine Zusammenfassung der Funktionen.

Die meisten Änderungen und Verbesserungen sind "unter der Haube",
aber der Prediktor mischt sich in die Regelung ein:

  • er deaktiviert den Rampenmodus
  • er deaktiviert den Automatik-Modus von zeroshift - ein fester shift bleibt aber aktiv
  • "Waschmaschinenmodus" hält die Einspeisung auf dem "niedrigen Niveau"
  • "Spitzen-Schneiden", vermeidet wiederkehrende kurze Lastspitzen, die durch Trägheit mehr Verlust durch Einspeisung, als Gewinn durch Abdecken der Last verursacht hätten.

Waschmaschine

So sieht das aus, wenn die Waschmaschine erst schleudert und dann in den üblichen an - aus - an - aus Modus wechselt: der Prediktor setzt ein:

kurze, hohe Peaks

Hier sieht man eine Kochplatte auf kleiner Stufe. Der Peak_override ist schon aktiv, dann kommt ein langer Peak, der den Override beendet. Gefolgt von 2 normal ausgesteuerten Peaks, das ist das Signal für den Predictor: Override wieder aktivieren.

Der Prediktor ist bewusst als eigenständiges Programm-Modul gestaltet, macht ein eigenes Logging und kann ohne Neustarts verändert werden!
Das gilt auch für die meisten Parameter von zeroinput, für die meisten Einstellungen braucht es keinen Neustart mehr.

Update: Hier habe ich ein extra Thema zum Predictor gestartet:

screenshots vom webinterface

Weitere screenshots vom webinterface zur kompletten Konfiguration gibt es auch schon.

Viel Spaß damit!

Mit der aktuellen v2.2 ist das Projekt fertig, keine offenen Punkte mehr. (Fixe kommen natürlich weiterhin.)

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