Skip to content

Heizstab in Stufen: Ausfälle, Neustart, PV-Flattern und Phasenstrom (Review D2, D1, D6, D11, D7, B19) - #85

Merged
SolarPower2024 merged 10 commits into
load-peak-featuresfrom
review/heizstab-stufen
Oct 12, 2026
Merged

SolarPower2024 merged 10 commits into
load-peak-featuresfrom
review/heizstab-stufen

Conversation

@SolarPower2024

Copy link
Copy Markdown
Owner

Behebt D1, D2 (hoch), D6, D7, D11 und B19 aus dem Architektur-Review (Paket P7). Je Fund ein Commit, dazu zwei Commits aus dem Code-Review.

  • D2: Ein fehlgeschlagenes Einschalten wird nicht später eigenmächtig nachgeholt (vorher schaltete catchUp nach der Rückkehr von HA alle Stufen ein, auch im Modus Aus); Wiederholungen nur nach der Verzögerung, Log einmal je Ursache.
  • D1: Eine nicht lesbare Stufe (Shelly offline) legt den Heizstab nicht mehr lahm: Zustand und Abschalten laufen über die lesbaren Stufen, eine unbekannte Stufe zählt für die Stromkreise als eingeschaltet, an sie wird nicht blind geschrieben.
  • D6: Nach einer Teilschaltung meldet der Charger den tatsächlichen Strom, der Ladepunkt übernimmt keinen nicht umgesetzten Wert.
  • D11: Ein laufender Heizstab bleibt beim Neustart von evcc auf seinen Stufen.
  • D7: Im PV-Betrieb geht der Heizstab erst nach der Abschaltverzögerung des Ladepunkts eine Stufe herunter (vorher Flattern an der Stufengrenze, bis zu 119 Schaltvorgänge je Stunde). Zwei // custom:-Hooks in core/loadpoint.go (pvMaxCurrent: holdStage, holdRunningStages), Touch-Point-Tabelle, forkHooks, Vertragstests.
  • B19: Die Stromkreise rechnen mit dem vollen Strom einer Stufe auf ihrer Phase statt gleichmäßig verteilt. Abweichung von der Review-Korrektur: Currents() meldet den Strom einer Stufe auf jeder Phase, sobald eine Stufe läuft – sonst leitete evcc aus einer einzelnen Stufe "1 Phase" ab und rechnete die Leistung falsch um (TestStagesPhaseCurrentKeepsPhases).
  • Review-Fixes: ein fehlgeschlagenes Herunterschalten wurde vom Catch-up nach der Verzögerung wieder hochgeschaltet (Schwere hoch); bei Überschuss unter einer Stufe ging der Heizstab sofort auf eine Stufe statt nach der Abschaltverzögerung (mittel). Beide behoben.

Tests: TestSwitchStagesUnreadableStage, Tests zu Fehlschlag, Neustart, pendelndem Überschuss und Phasenstrom; wsltest.sh ./charger/ ./core/ grün vor und nach den Review-Fixes.

Code-Review (Opus, mittel): zwei Funde (hoch, mittel) behoben; die beiden Fixes werden zusätzlich von Opus nachgeprüft, das Ergebnis folgt als Kommentar. Offen (niedrig): stageTimer wird außerhalb von holdStage nie zurückgesetzt.

Für das Add-on (CHANGELOG): Heizstab in Stufen: schaltet bei einem nicht erreichbaren Shelly weiter ab, holt fehlgeschlagenes Einschalten nicht eigenmächtig nach, flattert im PV-Betrieb nicht mehr an einer Stufengrenze und bleibt beim Neustart auf seinen Stufen; Stromkreise rechnen mit dem echten Strom je Phase.

Überschneidung mit P2 in core/loadpoint_lm.go (andere Funktion). Merge-Reihenfolge: … → P6 → P7 → P7a.

🤖 Generated with Claude Code

SolarPower2024 and others added 10 commits October 11, 2026 23:05
…t, Wiederholungen nur nach der Verzögerung (D2)

catchUp holt nur noch bei laufendem Heizstab einen zurückgehaltenen Schritt nach.
Ein fehlgeschlagenes Enable setzt die Einstellung zurück. Nach einem Fehler beginnt
die Verzögerung neu, ein wiederholter Fehlertext wird nur einmal als ERROR geloggt.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…mehr lahm (D1)

Der Zustand je Stufe kennt "unbekannt". Status, Enabled und das Schalten gehen von den
lesbaren Stufen aus, nichts wird blind an eine unlesbare Stufe geschrieben, ihre Leistung
zählt als eingeschaltet. Ein Fehler kommt nur, wenn keine Stufe lesbar ist; der Ausfall
einer Stufe wird einmal als WARN geloggt.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…rom gemeldet (D6)

Bricht das Schalten ab, wird die Anforderung nicht übernommen: der Charger meldet den alten
Strom, der Ladepunkt setzt den neuen erneut. Nach einer Teilschaltung zählt die Stufenzahl
den tatsächlichen Stand.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…einen Stufen (D11)

Beim ersten Aufruf übernimmt der Charger die laufenden Stufen samt ihrem Strom, statt sie
auf die Anforderung des Ladepunkts (Mindeststrom) zurückzuschalten. Der Ladepunkt liest
den Strom zurück und schreibt später auch eine kleinere Anforderung.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…verzögerung (D7)

Neuer custom-Hook in pvMaxCurrent: ein Heizstab in Stufen bleibt auf seinen laufenden Stufen,
solange der Netzbezug unter der Abschaltschwelle des Ladepunkts liegt, und geht erst nach der
Abschaltverzögerung eine Stufe herunter. Pendelt der Überschuss um eine Stufengrenze, schalten
die Relais nicht mehr bei jedem Hin und Her. Grenzen des Stromkreises greifen weiter sofort.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ufe auf ihrer Phase (B19)

Eine Stufe zieht ihren ganzen Strom auf einer Phase, evcc rechnete mit dem
Mittel über die Phasen. Bei einer Stufe je Phase meldet SwitchStages jetzt
api.PhaseCurrents (Strom einer Stufe auf jeder Phase, sobald eine Stufe läuft),
und die Zuschaltprüfung des Stromkreises fragt den Strom einer Stufe ab statt
des gemittelten Stroms. Passt eine Stufe nicht auf ihre Phase, bleibt der
Heizstab aus. README Abschnitt 4 und Template-Hilfetext de/en.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…wieder hochgeschaltet

Nach einem fehlgeschlagenen Herunterschalten (MaxCurrentMillis oder Enable(false))
blieb der alte, hoehere Strom gemeldet, damit evcc den Versuch wiederholt. Der
Catch-up sah dadurch ein Level unter dem alten Ziel und schaltete nach der
Verzoegerung eine Stufe wieder ein, obwohl evcc weniger verlangt hatte.
Jetzt merkt sich der Charger das fehlgeschlagene Herunterschalten und schaltet
nicht hoch, bis ein Schreibzugriff von evcc gelingt. Der gemeldete Strom bleibt
der alte, sonst wuerde evcc den Wiederholversuch nicht mehr machen.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…Abschaltverzoegerung auf seinen Stufen

Faellt der Zielstrom unter den Mindeststrom (eine Stufe), gab pvMaxCurrent im
Abschaltzweig sofort den Mindeststrom zurueck, solange der Abschalttimer lief.
Ein Heizstab mit drei Stufen fiel so bei jeder Wolke ohne Verzoegerung auf eine
Stufe. Neuer // custom:-Hook holdRunningStages am Ende dieses Zweigs: der
Heizstab behaelt seine laufenden Stufen, bis der Abschalttimer ablaeuft und evcc
ihn ausschaltet; Importe unter der Abschaltschwelle werden wie bei holdStage
toleriert. Stromkreis-Grenzen gelten danach weiter sofort.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ung auf eine Stufe, dann entscheidet evcc

Der Hook holdRunningStages hielt alle Stufen bis zum Ablauf des Abschalt-Timers.
Dessen Bezugsprüfung misst aber den Netzbezug mit allen laufenden Stufen: bei
Solaranteil unter 1 oder eigener Abschaltschwelle schaltete der Heizstab ganz aus,
obwohl eine Stufe weitergelaufen wäre (Stufen 3 kW, Überschuss 2 kW, Schwelle
1,5 kW). holdRunningStages und sein Hook entfallen. holdStage steht jetzt vor dem
Abschaltzweig, hinter dem Rücksprung für alwaysCharge und Batterie: die Stufen
gehen nach der Abschaltverzögerung auf eine Stufe zurück, danach entscheidet
evcc mit dem echten Bezug bei einer Stufe, ob der Heizstab ganz ausgeht. Eine
einzelne Stufe hält holdStage nicht (neuer Parameter minCurrent), sonst käme die
Verzögerung doppelt.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…Stufenverzögerung

Nach einem teilweise fehlgeschlagenen Herunterschalten blieb lowering gesetzt, wenn
evcc danach wieder den alten Strom wollte: offeredCurrent war unverändert, evcc
schrieb nichts mehr, und der Catch-up blieb gesperrt. lowering verfällt jetzt, wenn
seit dem letzten fehlgeschlagenen Versuch (changed) mehr als die doppelte
Stufenverzögerung vergangen ist; jeder weitere Fehlversuch startet die Zeit neu.

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

Copy link
Copy Markdown
Owner Author

Opus-Nachprüfung der Review-Fixes (2026-10-12): Der Fix zum Fund hoch (fehlgeschlagenes Herunterschalten wurde vom Catch-up wieder hochgeschaltet) ist sauber. Der Fix zum Fund mittel hatte einen neuen Fehler: der Abschalt-Timer prüfte den Netzbezug mit allen laufenden Stufen, bei Solaranteil unter 1 oder eigener Abschaltschwelle ging der Heizstab ganz aus statt auf einer Stufe weiterzulaufen. Behoben in 133133ee8 (zweiter Hook holdRunningStages wieder entfernt, holdStage vor dem Abschaltzweig; neuer Test mit Solaranteil 0,5). Zusätzlich 890315c5e: der Merker lowering verfällt nach der doppelten Stufenverzögerung. Tests: ./core/ und ./charger/ grün (ein einmaliger Timeout in TestOcpp/TestAutoStart, nicht Heizstab, im Wiederholungslauf grün).\n\n🤖 Generated with Claude Code

@SolarPower2024
SolarPower2024 merged commit 1e4181e into load-peak-features Oct 12, 2026
6 checks passed
@SolarPower2024
SolarPower2024 deleted the review/heizstab-stufen 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