Skip to content

Control-Pilot-Unterbrechung: state_prev statt state prüfen - #4014

Merged
LKuemmel merged 5 commits into
openWB:masterfrom
seaspotter:fix-cp-interruption-wait-for-phases
Oct 16, 2026
Merged

LKuemmel merged 5 commits into
openWB:masterfrom
seaspotter:fix-cp-interruption-wait-for-phases

Conversation

@seaspotter

Copy link
Copy Markdown
Collaborator

Control-Pilot-Unterbrechung wird bei PV-Ladestart oft nicht mehr ausgelöst

initiate_control_pilot_interruption() schließt eine CP-Unterbrechung beim Ladestart aus, sobald control_parameter.state == WAIT_FOR_USING_PHASES ist:

started_now = (self.data.set.current_prev == 0 and self.data.set.current != 0 and
               self.data.control_parameter.state != ChargepointState.WAIT_FOR_USING_PHASES)

Das wurde in #3328 eingeführt, um nach einer echten Phasenumschaltung keine zusätzliche CP-Unterbrechung mehr auszulösen - die Umschaltung selbst schaltet CP ja bereits um. Das Problem: WAIT_FOR_USING_PHASES wird unabhängig davon auch direkt nach Ablauf der Einschaltverzögerung erreicht (Counter.switch_on_timer_expired()), lange bevor überhaupt feststeht, ob eine Phasenumschaltung nötig ist - dieses Verhalten existiert schon seit #847, deutlich länger als #3328.
Bei Ladepunkten ohne Phasenumschalt-Hardware (auto_phase_switch_hw=False) landet man bei jedem PV-Ladestart in diesem Zustand, ohne dass je eine Phasenumschaltung stattfindet - die CP-Unterbrechung war damit dauerhaft deaktiviert.

Bestätigt anhand des Logs aus Discussion #3908 (comment) (lackylacky, EV "Soul", max_phases=1, control_pilot_interruption=True, auto_phase_switch_hw=False):

11:38:44 LP2: set current 6.0 A, state WAIT_FOR_USING_PHASES
11:39:34 LP2: set current 6 A, state CHARGING_ALLOWED

Keine einzige "Control-Pilot-Unterbrechung"-Meldung im gesamten Log.

Fix

Neues Feld state_prev (analog zu current_prev/charge_state_prev/plug_state_prev), einmal pro Zyklus in remember_previous_values() gesetzt. Die Prüfung fragt jetzt "war der vorherige Zyklus tatsächlich noch PERFORMING_PHASE_SWITCH" statt "ist der aktuelle Zustand WAIT_FOR_USING_PHASES" - das unterscheidet die beiden Fälle korrekt, da sie unterschiedliche vorherige Zustände haben, obwohl beide im selben aktuellen Zustand landen.

initiate_control_pilot_interruption() schloss eine CP-Unterbrechung beim
Ladestart aus, sobald control_parameter.state == WAIT_FOR_USING_PHASES
war (openWB#3328) - gedacht, um nach einer echten Phasenumschaltung keine
doppelte CP-Umschaltung auszulösen, da die Umschaltung selbst bereits CP
umschaltet. WAIT_FOR_USING_PHASES wird aber unconditional auch direkt
nach Ablauf der Einschaltverzögerung erreicht (counter.py,
switch_on_timer_expired(), unabhängig von einer Phasenumschaltung) - bei
Ladepunkten ohne Phasenumschalt-Hardware (auto_phase_switch_hw=False)
damit bei jedem PV-Ladestart, siehe Discussion openWB#3908.

Neues state_prev-Feld (analog zu current_prev/charge_state_prev/
plug_state_prev) erlaubt die Unterscheidung: nur wenn der vorherige
Zyklus tatsächlich noch PERFORMING_PHASE_SWITCH war, hat die
Umschaltung selbst gerade erst CP umgeschaltet.
@seaspotter
seaspotter requested a review from LKuemmel September 26, 2026 13:53

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Address the pending phase-switch race, state metadata handling, and production-path test coverage.

2 open findings
What changed in this PR

This PR fixes Control-Pilot interruption detection by tracking the previous chargepoint state.

Changes:

  • Adds per-cycle state_prev tracking.
  • Uses it to distinguish phase-switch completions from normal charging starts.
  • Adds regression tests for startup scenarios.
File Summary
packages/​control/​chargepoint/​chargepoint.py Updates interruption logic using the previous state; pending phase switches still require handling to avoid concurrent operations.
packages/​control/​chargepoint/​chargepoint_test.py Adds interruption tests, but they do not fully exercise production state tracking or phase-switch ordering.
packages/​control/​chargepoint/​chargepoint_data.py Adds state_prev; its published metadata topic lacks corresponding topic handling.

🧠 Review effort: Lite


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +293 to +294
started_now = (self.data.set.current_prev == 0 and self.data.set.current != 0 and
self.data.control_parameter.state != ChargepointState.WAIT_FOR_USING_PHASES)
self.data.set.state_prev != ChargepointState.PERFORMING_PHASE_SWITCH)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kannst Du hier bitte nachschauen?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ist erledigt

Comment on lines +94 to +97
cp.data.control_parameter.state = ChargepointState.WAIT_FOR_USING_PHASES
cp.data.set.state_prev = state_prev
cp.data.set.current_prev = 0
cp.data.set.current = 6
@LKuemmel
LKuemmel merged commit 857e344 into openWB:master Oct 16, 2026
1 check passed
@seaspotter
seaspotter deleted the fix-cp-interruption-wait-for-phases branch October 20, 2026 19:00
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.

3 participants