Skip to content

Commit 437d9d5

Browse files
authored
fix phase switch at charge start (#2616)
1 parent 90b77c7 commit 437d9d5

2 files changed

Lines changed: 95 additions & 1 deletion

File tree

packages/control/chargepoint/chargepoint.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,8 @@ def check_deviating_contactor_states(self, phase_a: int, phase_b: int) -> bool:
337337

338338
def _is_phase_switch_required(self) -> bool:
339339
phase_switch_required = False
340-
if self.data.control_parameter.state == ChargepointState.WAIT_FOR_USING_PHASES:
340+
if (self.data.control_parameter.state == ChargepointState.WAIT_FOR_USING_PHASES and
341+
(self.data.set.current != 0 and self.data.set.current_prev != 0)):
341342
phase_switch_required = False
342343
# Manche EVs brauchen nach der Umschaltung mehrere Zyklen, bis sie mit den drei Phasen laden. Dann darf
343344
# nicht zwischendurch eine neue Umschaltung getriggert werden.

packages/control/chargepoint/chargepoint_test.py

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
from dataclasses import dataclass
12
from typing import List
23
from unittest.mock import Mock
34
import pytest
45

6+
from control import data
57
from control.chargepoint.chargepoint import Chargepoint
8+
from control.chargepoint.chargepoint_state import ChargepointState
69
from control.chargepoint.chargepoint_template import CpTemplate
710
from control.ev.ev import Ev
811

@@ -49,3 +52,93 @@ def test_check_min_max_current(required_current, phases, expected_required_curre
4952

5053
# assertion
5154
assert ret == expected_required_current
55+
56+
57+
@dataclass
58+
class Params:
59+
name: str
60+
state: ChargepointState = ChargepointState.CHARGING_ALLOWED
61+
set_current: float = 0
62+
set_current_prev: float = 0
63+
phases_to_use: int = 1
64+
phases_in_use: int = 1
65+
control_parameter_phases: int = 1
66+
charge_state: bool = True
67+
failed_phase_switches: int = 0
68+
retry_failed_phase_switches: bool = False
69+
phase_switch_required: bool = False
70+
71+
72+
params = [
73+
# PV-Laden
74+
Params(
75+
name="Wartezeit",
76+
state=ChargepointState.SWITCH_ON_DELAY,
77+
charge_state=False,
78+
phase_switch_required=False
79+
),
80+
Params(
81+
name="Einschalten nach Wartzeit, Umschaltung erforderlich",
82+
state=ChargepointState.WAIT_FOR_USING_PHASES,
83+
phases_to_use=3,
84+
phases_in_use=3,
85+
control_parameter_phases=1,
86+
set_current=6,
87+
charge_state=False,
88+
phase_switch_required=True
89+
),
90+
Params(
91+
name="Einschalten nach Wartzeit, keine Umschaltung erforderlich",
92+
state=ChargepointState.WAIT_FOR_USING_PHASES,
93+
phases_to_use=3,
94+
phases_in_use=3,
95+
control_parameter_phases=3,
96+
set_current=6,
97+
charge_state=False,
98+
phase_switch_required=False
99+
),
100+
Params(
101+
name="keine Umschaltung während Warten auf Phasennutzung",
102+
state=ChargepointState.WAIT_FOR_USING_PHASES,
103+
phases_to_use=1,
104+
phases_in_use=3,
105+
control_parameter_phases=1,
106+
set_current=6,
107+
set_current_prev=6,
108+
charge_state=True,
109+
phase_switch_required=False
110+
),
111+
Params(
112+
name="Umschaltung, wenn sich während der Ladung die Phasenvorgabe ändert",
113+
state=ChargepointState.CHARGING_ALLOWED,
114+
phases_to_use=3,
115+
phases_in_use=3,
116+
control_parameter_phases=1,
117+
set_current=6,
118+
set_current_prev=6,
119+
charge_state=True,
120+
phase_switch_required=True
121+
),
122+
]
123+
124+
125+
@pytest.mark.parametrize("params", params, ids=[p.name for p in params])
126+
def test_is_phase_switch_required(params: Params):
127+
# setup
128+
cp = Chargepoint(0, None)
129+
cp.data.control_parameter.state = params.state
130+
cp.data.set.current = params.set_current
131+
cp.data.set.current_prev = params.set_current_prev
132+
cp.data.set.phases_to_use = params.phases_to_use
133+
cp.data.get.phases_in_use = params.phases_in_use
134+
cp.data.control_parameter.phases = params.control_parameter_phases
135+
cp.data.get.charge_state = params.charge_state
136+
cp.data.control_parameter.failed_phase_switches = params.failed_phase_switches
137+
data.data_init(Mock())
138+
data.data.general_data.data.chargemode_config.retry_failed_phase_switches = params.retry_failed_phase_switches
139+
140+
# evaluation
141+
ret = cp._is_phase_switch_required()
142+
143+
# assertion
144+
assert ret == params.phase_switch_required

0 commit comments

Comments
 (0)