Skip to content

Netzladen: erst ab gelesenem SoC, alte Einmal-Aufträge enden, Restbudget des Fensters (Review B5, E8, C2, B18) - #84

Merged
SolarPower2024 merged 5 commits into
load-peak-featuresfrom
review/netzladen-start
Oct 12, 2026
Merged

SolarPower2024 merged 5 commits into
load-peak-featuresfrom
review/netzladen-start

Conversation

@SolarPower2024

Copy link
Copy Markdown
Owner

Behebt B5 (hoch), E8, C2 und B18 aus dem Architektur-Review (Paket P6, Entscheidung D11). Je Fund ein Commit, dazu ein Commit aus dem Code-Review.

  • B5: Netzladen nach SoC, Einmal-Laden und die Peak-Reserve entscheiden erst ab dem ersten gelesenen SoC. Vorher startete ein ungelesener SoC 0 nach dem Host-Neustart (HA noch nicht bereit) das Netzladen und hielt es per Hysterese bis zum Stopp-SoC.
  • E8: Ein Einmal-Auftrag, dessen Zielzeit mehr als 2 h vorbei ist, wird beendet (im Restore und im Zyklus, INFO-Zeile).
  • C2: Optimizer-Ziele liegen nie in Schritt 0 (der Optimizer bindet Ziele erst ab Schritt 1); eigenes Flag für "sofort".
  • B18: Geregeltes Netzladen rechnet mit dem Restbudget des 15-min-Fensters (min(Peak-Grenze, Allowed) bei aktuellem Fenster ohne Zählerausfall) statt nur mit der festen Peak-Grenze.
  • Review-Fix: Vertragstest der Optimizer-Regel (Ziel ab Schritt 1) läuft jetzt wirklich und ist dokumentiert.

Tests: neue Tests in core/site_lm_test.go, core/site_lm_once_test.go, core/site_optimizer_lm_test.go, core/site_peakshaving_test.go; wsltest.sh ./core/ grün vor und nach dem Fix.

Code-Review (Opus, mittel): ein Fund mittel (behoben). Offen (niedrig): das Beenden eines abgelaufenen Einmal-Auftrags stößt keine neue Planung an; zwei Funktionskommentare nennen noch die feste Peak-Grenze. Hinweis: E8 wirkt nach Konzept auch im Zyklus – hält das Peak-Gate das Laden länger als 2 h nach der Zielzeit an, endet der Auftrag.

Für das Add-on (CHANGELOG): Netzladen startet erst, wenn der Batterie-SoC gelesen ist; ein Einmal-Laden, dessen Zielzeit über 2 h vorbei ist, endet; geregeltes Netzladen hält das Restbudget des laufenden 15-min-Fensters ein.

Fachlich abhängig von P5 (Merge P5 vor P6); der kombinierte Stand wird vor dem Merge gemeinsam getestet.

🤖 Generated with Claude Code

SolarPower2024 and others added 5 commits October 11, 2026 22:45
…t ab dem ersten gelesenen SoC

Nach dem Start steht der SoC auf 0, solange kein Batteriezaehler gelesen wurde
(HA noch nicht bereit, alle Lesungen scheitern). Daraus startete das Netzladen
nach SoC, das Einmal-Laden plante ab 0 % und Peak Shaving ging fuer einen Zyklus
in die Reserve. Jetzt bleibt der gespeicherte Zustand unveraendert, solange
kein Geraet einen gelesenen SoC hat; der Schalter "aus" wirkt weiter.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Ein Auftrag "80 % bis 06:00" blieb nach der Zielzeit dauerhaft "sofort aktiv"
und lud nach einem Neustart Tage spaeter mit voller Netzladeleistung. Ein
Auftrag, dessen Zeit mehr als 2 h zurueckliegt, wird jetzt beim Wiederherstellen
und im Zyklus mit einer INFO-Zeile beendet (onceExpired). Bis 2 h Verspaetung
laedt er weiter sofort, damit das Peak-Gate das Laden bis dahin anhalten darf.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Der Optimizer bindet s_goal nur ab Schritt 1. Der Fork legte Ziele in Schritt 0,
wenn die Zielzeit des Einmal-Ladens vorbei, der Rest beim Sofort-Laden klein
oder der Stopp des laufenden Netzladens im laufenden Schritt erreichbar war;
Plan, Vorschlaege und Export-Prognose zeigten dann kein Netzladen. Der
Zielschritt ist jetzt mindestens 1 (setGoal und Einmal-Laden), "sofort" ist ein
eigenes Flag statt einer Umdeutung der Dauer. Vertragstest gegen den Optimizer
fuer die Regel "Ziel ab Schritt 1" in den Szenariotests.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Nach einer nicht gedeckten Spitze schob das Netzladen das Fenster ueber die
Grenze, weil Headroom und Pause nur die feste Peak-Grenze kannten. Beide
rechnen jetzt mit min(Grenze, erlaubte Leistung des Fensters), solange das
Fenster aktuell und die Zaehler gelesen sind, sonst wie bisher mit der festen
Grenze. Das Ereignis "Netzladen pausiert" nennt den erlaubten Netzbezug. Die
Szenariotests laufen mit stehender Uhr am Fensteranfang, damit die erlaubte
Leistung der Grenze entspricht.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…t und dokumentiert

Der Vertragstest goal_soc_binds_from_step_1 in TestLmOptimizerScenarios wird ohne
OPTIMIZER_URI uebersprungen, ein gruenes ./core/ belegte ihn also nicht. Lauf gegen
lokale Optimizer-Container in WSL (Image des Add-on-Pins und sein Vorgaenger):
TestLmOptimizerScenarios und der Vertragstest bestehen, die Indexdeutung
soc(0)[1] gegen SGoal[1] stimmt, ein Ziel in Schritt 0 aendert nichts. Die
Freitags-Routine fuehrt TestLmOptimizerScenarios gegen das neue Image bereits aus
und schliesst den Test damit ein. README: Regel nennt den Test, Testabschnitt
nennt den Lauf mit OPTIMIZER_URI und dass ./core/ ohne ihn die Szenarien ueberspringt.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@SolarPower2024

Copy link
Copy Markdown
Owner Author

Hinweis zum Merge: Nach PR 83 (Messausfall) hat setPeakGridEnergy einen zweiten Parameter. Zwei Tests aus diesem PR (core/site_peakshaving_test.go, B18) rufen noch site.setPeakGridEnergy(nil) auf; beim Merge nach 83 auf site.setPeakGridEnergy(nil, true) ändern. Der Branch review/integration-welle1 enthält alle acht PRs in Merge-Reihenfolge mit dieser und zwei weiteren kleinen Konfliktlösungen und ist gemeinsam getestet.\n\n🤖 Generated with Claude Code

@SolarPower2024
SolarPower2024 merged commit 4233d5c into load-peak-features Oct 12, 2026
6 checks passed
@SolarPower2024
SolarPower2024 deleted the review/netzladen-start branch October 12, 2026 16:01
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