Dynamic ESS verstehen und steuern
Wie Victrons DESS wirklich entscheidet — und wie der Hausakku für das Autoladen stillgelegt wird · Stand 23.10.2026
DESS schreibt keine Watt, sondern einen Fahrplan
Dynamic ESS legt 48 Zeitpläne im Ekrano ab, je eine Viertelstunde, zusammen also zwölf
Stunden. Jeder Plan steht unter com.victronenergy.settings im Pfad
/Settings/DynamicEss/Schedule/<0…47>/ und hat acht Felder.
| Feld | Typ | Bedeutung |
|---|---|---|
TargetSoc | Gleitkomma 0,0–100,0 | Der gültige Zielwert. |
Soc | ganzzahlig 0–100 | Abgekündigt. Nur Rückfallebene, wenn TargetSoc = 0 ist. |
Strategy | 0–3 | 0 = Ziel-SoC folgen · 1 = Eigenverbrauch · 2 = pro Akku · 3 = pro Netz |
Restrictions | Bitmuster 0–3 | 1 = kein Export Akku→Netz · 2 = kein Import Netz→Akku · 3 = beides |
Flags | Bitmuster 0–3 | 1 = volle Ladeleistung · 2 = Solar im Fenster abschalten |
Start | Unix-Zeit | wird in Lokalzeit umgerechnet |
Duration | Sekunden | bei uns immer 900 |
AllowGridFeedIn | 0 / 1 | Einspeisung im Fenster erlaubt |
TargetSoc auf 0 und
Soc auf 100, zielt die Anlage auf 100 Prozent. VRM schreibt tatsächlich
Soc = 100 neben einem feinen TargetSoc. Wer selbst schreibt, muss
beide Felder setzen. Die Regel im Quelltext:
self.soc = targetsoc if (targetsoc is not None and targetsoc > 0) else soc #legacy support: fall back to /Soc, when /Targetsoc is 0
Der Hebel für das Autoladen
Mit Strategy = 0 und TargetSoc = aktueller SoC hat der Regler
nichts zu tun: Er soll auf einen Stand fahren, auf dem er schon steht. Der Entscheidungsbaum
landet dann auf IDLE_MAINTAIN_TARGETSOC, und für unsere Geräteklasse tut
idle() genau das Gewünschte:
def idle(self, allow_feedin):
# idling means: Grid needs to deliver consumption - ACPV - DCPV * 0.95
... '/Ess/AcPowerSetpoint', acps
# when idling during 0 external mppt power, we can additionally disable discharge
if (math.ceil(self.external_pvpower or 0)) == 0:
... '/Ess/DisableDischarge', 1
... '/Ess/DisableCharge', 1
Netz-Sollwert gleich dem ganzen Verbrauch, die Wallbox eingeschlossen — und ohne externe PV zusätzlich ein hartes Lade- und Entladeverbot. Nachgezogen wird das bei jedem neuen Messwert, nicht nur alle fünf Sekunden; bei 11 kW schaltender Last ist das wichtig.
Strategy = 1 wäre genau falsch. Dieser Zweig verlässt den
Entscheidungsbaum sofort („we can ommit to walk through the decission tree“), und
auf dem Multi RS werden die Beschränkungen dann gar nicht ausgewertet — die Klasse
nimmt den Parameter entgegen und benutzt ihn nirgends.Gemessen am 10.10.2026
Dreiminütiger Versuch um die Mittagszeit, während der Akku aus der PV lud:
| Zeit | Modus | Reaktive Strategie | Akku | PV |
|---|---|---|---|---|
| 12:06 | 1 | 1 | +1.206 W | 1.826 W |
| 12:07 | 4 | 9 | +137 W | 945 W |
| 12:08 | 4 | 5 | −5 W | 542 W |
| 12:09 | 4 | 5 | −5 W | 572 W |
| 12:10 zurückgestellt | 1 | – | +924 W | 1.630 W |
Modus 4 heißt „Node-RED“ — wir benutzen es aber nicht
Victron nennt /Settings/DynamicEss/Mode = 4 den Node-RED-Modus. Das ist nur ein
Name. Er bedeutet: irgendwer anders als VRM füllt die Zeitpläne. Wer das ist, interessiert
den Ekrano nicht — in neueren Venus-Versionen heißt der Modus deshalb schlicht Local.
Wir schreiben direkt per MQTT vom apps-server an den dbus des Ekrano, dieselbe Technik wie beim Mindest-SoC. Kein Flow, kein Knoten, keine Oberfläche.
Das Werkzeug
~/energie/dess_akku_einfrieren.py, ausgeführt mit ~/.venvs/mqtt/bin/python:
dess_akku_einfrieren.py pruefen nur lesen, nichts schreiben dess_akku_einfrieren.py ein <Minuten> einfrieren, danach selbsttätig zurück dess_akku_einfrieren.py aus sofort zurückstellen
Es setzt den Modus auf 4, beschreibt Slot 0 und zieht das Fenster jede Minute nach. Am Ende — auch bei Abbruch oder Fehler — räumt es Slot 0 und stellt den Modus auf 1 zurück. Die Höchstdauer ist auf sechs Stunden begrenzt.
Drei Regeln, die darin stecken
Wachhund statt Einmaleintrag. Läuft ein Fenster ohne Nachfolger ab, fällt DESS sofort auf Eigenverbrauch zurück — und der Akku versorgt das Auto. Das Fenster muss laufend nachgezogen werden.
Slot 0 belegen. Plätze mit Start = 0 existieren für DESS nicht, und bei
mehreren passenden Fenstern gewinnt der niedrigste Index. Ein einziger gültiger Plan genügt.
Zahlen, keine Zeichenketten. {"value": 0} — ein String wird abgewiesen.
-1 in die vier Lade- und Entladegrenzen schreiben.
Victron-Issue venus#1699, eröffnet am 08.10.2026, betrifft genau unsere
Gerätekombination (Multi RS, Cerbo, Venus 3.80): Ein Node-RED-Flow schrieb -1,
DESS stieg aus, reaktive Strategie 93, nur noch PV-Ladung. Ursache ist eine fehlende Prüfung im
Code, behoben ist nichts. Nur echte Werte schreiben.Wege, die nicht tragen
| Ansatz | warum nicht |
|---|---|
Netz-Sollwert /Settings/CGwacs/AcPowerSetPoint |
DESS schreibt alle fünf Sekunden direkt /Ess/AcPowerSetpoint am Gerät und
überstimmt die Einstellung. Erst nach DESS-Abschaltung ein Hebel. |
| MinSoC auf den aktuellen Stand heben | Funktioniert, ist aber grob — sperrt den Akku ganz. Und DESS hält die Entladung dann auch für die Zukunft für unmöglich und wirft seinen Plan um. Diesen Weg geht EVCC bereits, mit demselben Nachteil. |
| ESS-Zeitplan-Ladung | DESS hat Steuerpriorität 0, die Zeitplan-Ladung 20. DESS verdrängt sie, nicht umgekehrt. |
| ESS-Modus „Keep charged“ | DESS schaltet sich dann mit Fehler 2 ab, und der Akku lädt mit voller Leistung aus dem Netz — mehr als gewollt. |
Der ganze Fahrplan ist lesbar — zwölf Stunden voraus
Gemessen am 23.10.2026, 10:15 Uhr, direkt am Ekrano
Die 48 Zeitpläne liegen im Ekrano selbst, nicht nur in der VRM-Cloud:
com.victronenergy.settings, Pfad
/Settings/DynamicEss/Schedule/0…47. VRM schreibt sie hinein, der Ekrano
speichert und führt aus. Lesen lässt sich die ganze Reihe per MQTT — kein
Cloud-Zugriff nötig, nur ein R/<portal>/keepalive vorweg, weil der Broker
Einstellungen sonst nicht sendet.
Alle 48 Plätze waren gefüllt, von 10:15 bis 22:15 — zwölf Stunden voraus, jede Viertelstunde mit allen acht Feldern.
sensor.dess_slot0_start über zwei Tage: 09:17→Fenster 09:15,
09:49→09:45, 10:20→10:15, 10:52→10:45. Dazwischen steht die Reihe still. Um
10:47 war Slot 0 das Fenster von 10:15, also 32 Minuten alt und längst
abgelaufen; die laufende Viertelstunde lag auf Slot 2. Wer also „das aktuelle
Fenster“ sucht, muss die Reihe nach der Zeit durchsehen und darf nicht Slot 0 nehmen.| Zeitraum | Ziel-SoC | Strategie | Beschränkung |
|---|---|---|---|
| 10:15 → 15:45 | 25,7 → 42,3 % steigend | 1 = Eigenverbrauch | 3 = kein Import, kein Export |
| 16:00 → 22:15 | 42,1 → 29,8 % fallend | 1 = Eigenverbrauch | 1 = kein Export |
An diesem Tag stand jeder der 48 Plätze auf Eigenverbrauch: DESS plante kein Netzbezugsfenster, sondern lud den Akku aus der Sonne auf 42 % und entlud ihn abends ins Haus. Zum Anhängen gab es an diesem Tag also nichts.
Die Freigabe: Modus kurz auf off und zurück
Jürgens Vorschlag vom 12.10.2026: „das einfachste ist es auf off zu setzen und dann wieder on.“ Der Moduswechsel erzwingt bei VRM eine Neuplanung. Gemessen:
22:33:50 Netz 439 W | Akku 74 W | Soll-SoC 76 <- Halt war zurueck 22:34:26 Netz 427 W | Akku 74 W | Soll-SoC 0 <- VRM plant neu 22:34:44 Netz -3 W | Akku 505 W | Soll-SoC 0 <- geloest
Der dynamische Soll-SoC fiel binnen 70 Sekunden von 76 auf 0. Der Modus wird vorher
gelesen und genau so wiederhergestellt — ein manuelles buy/sell/
node_red wird nicht überschrieben, und bei bereits off passiert
nichts. Mit DESS auf off läuft der Multi RS im normalen
ESS-Eigenverbrauch — daher die Redeweise „kurz auf ESS und zurück“.
Zwei Mindest-SoC — und nur einer wirkt
Gemessen am 22.10.2026, während der Hausakku 11,4 kW ins Auto abgab
| Register | Wert | Wirkung |
|---|---|---|
acsystem/0/Ess/ActiveSocLimit | 20 | Das wirksame Limit des Multi RS. Bis hierher gibt der Akku ab. |
acsystem/0/Settings/Ess/MinimumSocLimit | 20 | Die Einstellung dahinter — hierher schreibt die Schutz-Automation. |
settings/0/Settings/CGwacs/BatteryLife/MinimumSocLimit | 73 | Beisst nicht. DESS schreibt hier seinen eigenen Wert hinein. |
number.multi_rs_6000_3p_ess_mindest_soc in Home
Assistant zeigt das BatteryLife-Register. Am 22.10. stand dort 73, während
der Akku von 78 % auf 48 % ins Auto durchlief — weil das Gerät sich an die
20 aus ActiveSocLimit hielt. Der angezeigte Wert war kein Schutz, sondern
DESS' Notiz an sich selbst. Ein Anzeigename ist kein Beleg; hier ist nicht einmal der
Pfad einer.Gemessen 23.10.2026: VRM schreibt auch in Modus 4 weiter
Der offene Punkt dieser Seite seit dem 10.10.2026 — beantwortet
Modus um 10:47:39 auf 4 gesetzt und keinen Slot angefasst, damit DESS
weiter VRMs eigenen Plan abarbeitet; alle zwei Minuten gelesen. Um 10:52:03 sprang
Slot 0 vom Fenster 10:15 auf 10:45 und Slot 47 von 22:00 auf 22:30 —
die ganze Reihe zwei Viertelstunden weiter, mitten in Modus 4.
Die reaktive Strategie blieb dabei unverändert auf scheduled_selfconsume,
die Zahl der Zeitpläne auf 48. Modus 4 stört die Regelung also nicht, er
ändert nur, wer die Pläne füllen darf — und VRM füllt sie weiter.
Um 11:20:41 zurück auf 1, alles unversehrt.
no_window vom 10.10. zwischen 16:00 und 16:15.sensor.dess_slot1_*. Die acht für Slot 0
stehen in keiner YAML — sie kamen per MQTT-Discovery und leben nur im
Entitätsregister. Bis dahin bleibt der Moduskniff der Rückweg.Die Kette, die den Hausakku beim Autoladen schützt
Stand 23.10.2026, 11:20 · der Einfrier-Weg läuft wieder, der Mindest-SoC-Weg bleibt aus
initial_state: false festgeschrieben
worden — auf Jürgens Wort: „wir nutzen nur noch die Lösung über evcc und
DESS.“ Der sachliche Grund war die PV-Drosselung: ein angehobener Mindest-SoC
lässt den Akku keine Sonne mehr annehmen, am 18.10. nachmittags rund 1 kWh.
Die Annahme dahinter — „DESS sperrt den Akku beim Schnellladen ohnehin“ —
ist am 22.10. widerlegt worden: DESS stand auf Eigenverbrauch, und der Hausakku lief von
78 auf 48 % ins Auto.| Wann | Was | Wo | Stand 23.10. |
|---|---|---|---|
| beim Preissignal | Victron-Mindest-SoC auf min(99, Stand+1) — der Akku gibt nichts
mehr ab. Hört auf smart_cost_active, Modus now und den
eigenen Schnell-Merker; ein Wachhund holt den Ruhewert 20 zurück, sobald nicht
mehr geladen wird. |
HA, Hausakku: Schutz auch bei EVCC-Schnellladen |
bleibt aus. Drosselte die PV; schreibt zwar auf das Register, das wirkt — aber grob, es sperrt den Akku ganz. |
| jede Minute, solange geladen wird | DESS Slot 0 einfrieren: Strategy 0 mit
TargetSoc = Ist-SoC führt auf
idle_maintain_targetsoc, Restrictions 3 verbietet Import
und Export. Der Netz-Sollwert deckt dann den ganzen Verbrauch inklusive Wallbox. |
HA, DESS: Hausakku einfrieren (Wachhund) |
läuft seit 23.10., dauerhaft (initial_state entfernt).
Umgebaut: greift nicht ein, wenn DESS den Akku schon selbst still hält;
setzt den Merker input_boolean.dess_eingefroren; sichert Slot 0
nicht mehr. |
| vor der Freigabe | Neu 18.10. Die Fenstersuche sperrt den Akku, bevor sie Tor und
Preisgrenze öffnet — der Wachhund verlangt charging = on und
käme sonst erst, wenn der Strom schon fliesst. Bei 11 kW sind das
0,2 kWh je Minute aus dem Akku. |
~/energie/nachbar_fenster.py, akku_sichern() |
ausgebaut 18.10. — drosselte die PV. Die Funktion steht ungenutzt da;
ihre Prüfung akku_gesichert() ist der Baustein, den die Soll-Kette
unten braucht. |
| wenn der Schutz nicht wirkt | Neu 18.10. Die Notbremse prüft nicht den Plan, sondern die Wirkung: entlädt der Akku stärker als 500 W, während das Auto lädt, werden nach 3 Minuten beide Schutzstücke nachgezogen und nach 8 Minuten der Ladepunkt abgeschaltet. | HA, Hausakku-Notbremse |
bleibt aus, nie im Feld ausgelöst. Ihre Stufe 1 ruft den Mindest-SoC-Weg — darum fällt sie mit ihm. |
Das fünfte Stück, und das einzige, das noch läuft:
DESS: Hausakku freigeben — es hebt eine bestehende Sperre wieder auf und
macht den Moduskniff oben. Seit 23.10. mit der Bedingung
input_boolean.dess_eingefroren = on: sie läuft nur noch, wenn wirklich
eingefroren war, und löscht den Merker als letzte Handlung. Eine Freigabe abzuschalten wäre das Gegenteil des Auftrags
gewesen, darum blieb sie an. Sie läuft bei Moduswechsel weg von now,
Ladeende, zurückgenommener Schnellwahl, abgelaufenem Preisfenster — und als
Notbremse nach sechs Stunden.
Zwei Fallen, beide am 18.10. ins Netz gegangen
skip_condition überspringt die eigene Prüfung.
Die Sperre vor der Freigabe stösst den Wachhund mit automation.trigger und
skip_condition: true an — genau das übergeht dessen Bedingung
charging = on. Weil die Maske wegen eines rechnerischen Rests von 0,6 kWh
jede Viertelstunde eine Preisgrenze setzte und das Kabel steckte, wurde der Akku um 07:00
und 07:15 für eine Ladung gesperrt, die es nicht gab: charging war von
06:00 bis 08:00 durchgehend aus. Der Wachhund überschrieb dabei zweimal Slot 0, während
VRM den Akku günstig auf 50,63 % laden wollte — er blieb bei 45 % stehen.
Behoben: gesperrt wird nur noch, wenn schon Strom fliesst oder das Tor in diesem Lauf
neu geöffnet wird und die Wallbox nicht „Ladung beendet“ meldet.node_red, ist das Laden Teil des Fahrplans. Alarm bleibt es nur, wenn DESS es
nicht vorsieht — oder wenn wir selbst eingefroren haben, denn dann darf der Akku
überhaupt nichts aus dem Netz nehmen.Wie es werden soll
Beschlossen am 23.10.2026 — drei Veränderungen gegen die Kette oben
1. Erst nachsehen, ob DESS den Akku schon selbst hält. Der Wachhund schreibt
heute jede Minute sein eigenes Fenster und stellt den Modus auf 4 — auch dann, wenn DESS
den Netzbezug ohnehin gestellt hätte. Damit nimmt er VRM den Plan ohne Not weg. Die
Prüfung dafür ist gebaut und liegt ungenutzt in
nachbar_fenster.py: akku_gesichert() erkennt drei Lagen —
Strategie idle_maintain_targetsoc (der belastbare Beleg) · Soll-SoC =
Ist-SoC ± 1 · Stand am Mindest-SoC. Der Mindest-SoC allein zählt
ausdrücklich nicht, sein Ruhewert ist 20 und bis dahin darf der Akku abgeben.
2. Keine Sicherung von Slot 0 mehr — Begründung im Abschnitt oben.
input_text.dess_slot0_sicherung und der Zurückschreib-Zweig der Freigabe
können entfallen; der Moduskniff bleibt.
3. Der Wachhund bleibt ein Wachhund. Steigt DESS mitten in der Ladung aus dem Netzbezug aus, muss das System es im Minutentakt bemerken und wieder einfrieren. Das ist der Grund für den Minutentakt und bleibt es: läuft ein Fenster ohne Nachfolger ab, fällt DESS sofort auf Eigenverbrauch zurück.
Was noch offen ist
Erledigt am 23.10.2026: ob VRM im Modus 4 aufhört zu schreiben — nein, es schreibt weiter. Messung im Abschnitt oben.
Warum VRM in Soc nur 0 und 100 schreibt, ist ungeklärt — die VRM-Seite ist
nicht quelloffen.
Wie oft ein DESS-Fenster in die billigen Stunden fällt, ist ungezählt — siehe den Kasten oben. Dazu muss der Fahrplan über einige Tage mitgeschrieben werden.