Skip to content

PeakFilter: moderate Vorwärtssprünge glätten statt sprunghaft übernehmen - #4235

Open
seaspotter wants to merge 2 commits into
openWB:masterfrom
seaspotter:peak-filter-gradual-catchup
Open

seaspotter wants to merge 2 commits into
openWB:masterfrom
seaspotter:peak-filter-gradual-catchup

Conversation

@seaspotter

Copy link
Copy Markdown
Collaborator

#4231: ~0.5 kWh/Tag "Phantom"-PV-Ertrag nachts (Kostal Plenticore G3M, Hybrid-WR). Anhand des Logs (07:10 Uhr) lässt sich der Mechanismus exakt nachvollziehen:

07:10:11 - PeakFilter: Zählerwert 11195707.0Wh, Differenz 0.0Wh (ok)
07:10:21 - PeakFilter: Unplausibler Zählerwert, Differenz 100.0Wh, erlaubte Differenz 55.56Wh -> verworfen
07:10:31 - PeakFilter: Zählerwert 11195807.0Wh, Differenz 0.0Wh (ok) -> voll übernommen

Der Register-Stand des WR springt real um 100Wh (das Gerät aktualisiert seinen Ertragszähler nicht kontinuierlich, sondern in groben Schritten), auch wenn aktuell nachts 0W erzeugt werden. PeakFilter.check_total_energy() verwirft diesen Sprung genau einen Zyklus lang, merkt sich aber den rohen (abgelehnten) Wert als neue Vergleichsbasis - im nächsten Zyklus ist die Differenz zu dieser Basis dann 0, der volle Sprung wird also sofort und ungebremst übernommen. Das erzeugt einen sichtbaren Peak im Tages-/Langzeit-Ertrag genau in diesem einen 10s-Intervall, obwohl real keine Leistung geflossen ist.

Das ist eng verwandt mit, aber unabhängig von #3767 (Hybrid-WR liefert PV- statt WR-Leistung) - die dortige Korrektur greift hier korrekt, das Problem liegt in der Plausibilitätsprüfung selbst.

Fix:

check_total_energy()s Vorwärtssprung-Zweig begrenzt den Wert jetzt auf vorheriger Wert + allowed_deviation statt ihn einen Zyklus lang komplett zu verwerfen, und merkt sich diesen begrenzten Wert als neue Basis. Dadurch wird ein grober, aber realer Registersprung über mehrere Zyklen gleichmäßig nachgezogen statt in einem Schritt sichtbar zu werden - und zwar für alle PeakFilter-Nutzer (Zähler, Wechselrichter, Speicher, Verbraucher), nicht nur für Hybrid-Wechselrichter.

Wo das zum Problem werden könnte - und wie das begrenzt ist:

PeakFilter kann aus den Werten allein nicht unterscheiden, ob ein Sprung ein grober Zähler-/Register-Takt ist (soll geglättet werden) oder eine längere Verbindungsunterbrechung mit echtem, großem Nachholbedarf (z. B. Gerät 10+ Minuten nicht erreichbar, danach Sprung um mehrere hundert Wh) - vorher wurde so ein Sprung nach einer Bestätigung im nächsten Zyklus sofort korrekt übernommen. Würde man jede Art von Sprung glätten, würde die Anzeige nach einer solchen Unterbrechung unnötig lange zu niedrig bleiben, proportional zur Länge der Unterbrechung.

Deshalb wird nur geglättet, wenn der Sprung höchstens das 10-fache der erlaubten Differenz beträgt (MAX_SMOOTHABLE_JUMP_FACTOR). Das deckt einen groben Zähler-Takt mit Puffer ab; deutlich größere Sprünge (typisch für eine längere Unterbrechung) werden weiterhin wie bisher einmal verworfen und bei Bestätigung sofort in voller Höhe übernommen.

@seaspotter
seaspotter requested a review from ndrsnhs October 31, 2026 19:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant