Skip to content

Commit f95e6e0

Browse files
authored
fix phase switch (#3195)
* fix phase switch * clean up
1 parent b2e7355 commit f95e6e0

12 files changed

Lines changed: 61 additions & 50 deletions

packages/control/algorithm/bidi_charging.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logging
22
from control import data
33
from control.algorithm.chargemodes import CONSIDERED_CHARGE_MODES_BIDI_DISCHARGE
4-
from control.algorithm.filter_chargepoints import get_chargepoints_by_mode
4+
from control.algorithm.filter_chargepoints import get_chargepoints_with_required_current_by_chargemode
55
from helpermodules.phase_handling import voltages_mean
66

77
log = logging.getLogger(__name__)
@@ -16,7 +16,7 @@ def set_bidi(self):
1616
log.debug(f"Nullpunktanpassung {grid_counter.data.set.surplus_power_left}W")
1717
zero_point_adjustment = grid_counter
1818
for mode_tuple in CONSIDERED_CHARGE_MODES_BIDI_DISCHARGE:
19-
preferenced_cps = get_chargepoints_by_mode(mode_tuple)
19+
preferenced_cps = get_chargepoints_with_required_current_by_chargemode(mode_tuple)
2020
if preferenced_cps:
2121
log.info(
2222
f"Mode-Tuple {mode_tuple[0]} - {mode_tuple[1]} - {mode_tuple[2]}, Zähler {grid_counter.num}")

packages/control/algorithm/common.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from typing import Iterable, List, Optional, Tuple
33

44
from control import data
5-
from control.algorithm.filter_chargepoints import get_chargepoints_by_mode
5+
from control.algorithm.filter_chargepoints import get_chargepoints_with_required_current_by_chargemode
66
from control.algorithm.utils import get_medium_charging_current
77
from control.chargepoint.chargepoint import Chargepoint
88
from control.counter import Counter
@@ -27,10 +27,9 @@ def reset_current():
2727
log.exception(f"Fehler im Algorithmus-Modul für Ladepunkt{cp.num}")
2828

2929

30-
def reset_current_by_chargemode(mode_tuple: Tuple[Optional[str], str, bool]) -> None:
31-
for mode in mode_tuple:
32-
for cp in get_chargepoints_by_mode(mode):
33-
cp.data.set.current = None
30+
def reset_current_by_chargemode(modes: List[Tuple[Optional[str], str, bool]]) -> None:
31+
for cp in get_chargepoints_with_required_current_by_chargemode(modes):
32+
cp.data.set.current = None
3433

3534

3635
def mode_and_counter_generator(chargemodes: List) -> Iterable[Tuple[Tuple[Optional[str], str, bool], Counter]]:

packages/control/algorithm/filter_chargepoints.py

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# tested
22
import logging
3-
from typing import List, Optional, Tuple
3+
from typing import List, Optional, Tuple, Union
44

55
from control import data
66
from control.chargepoint.chargepoint import Chargepoint
@@ -12,28 +12,39 @@ def get_chargepoints_by_mode_and_counter(mode_tuple: Tuple[Optional[str], str, b
1212
counter: str) -> List[Chargepoint]:
1313
cps_to_counter = data.data.counter_all_data.get_chargepoints_of_counter(counter)
1414
cps_to_counter_ids = [int(cp[2:]) for cp in cps_to_counter]
15-
cps_by_mode = get_chargepoints_by_mode(mode_tuple)
15+
cps_by_mode = get_chargepoints_with_required_current_by_chargemode(mode_tuple)
1616
return list(filter(lambda cp: cp.num in cps_to_counter_ids, cps_by_mode))
1717

1818
# tested
1919

2020

21-
def get_chargepoints_by_mode(mode_tuple: Tuple[Optional[str], str, bool]) -> List[Chargepoint]:
22-
mode = mode_tuple[0]
23-
submode = mode_tuple[1]
24-
prio = mode_tuple[2]
25-
# enthält alle LP, auf die das Tupel zutrifft
26-
valid_chargepoints = []
27-
for cp in data.data.cp_data.values():
28-
if cp.data.control_parameter.required_current != 0:
21+
def get_chargepoints_by_chargemode(
22+
modes: Union[Tuple[Optional[str], str, bool],
23+
Tuple[Tuple[Optional[str], str, bool]]]) -> List[Chargepoint]:
24+
modes = modes if isinstance(modes[0], Tuple) else (modes,)
25+
valid_chargepoints: List[Chargepoint] = []
26+
27+
for mode_tuple in modes:
28+
mode = mode_tuple[0]
29+
submode = mode_tuple[1]
30+
prio = mode_tuple[2]
31+
32+
for cp in data.data.cp_data.values():
2933
if ((cp.data.control_parameter.prio == prio) and
30-
(cp.data.control_parameter.chargemode == mode or
31-
mode is None) and
32-
(cp.data.control_parameter.submode == submode)):
34+
(cp.data.control_parameter.chargemode == mode or mode is None) and
35+
(cp.data.control_parameter.submode == submode) and
36+
cp not in valid_chargepoints):
3337
valid_chargepoints.append(cp)
3438
return valid_chargepoints
3539

3640

41+
def get_chargepoints_with_required_current_by_chargemode(
42+
modes: Union[Tuple[Optional[str], str, bool],
43+
Tuple[Tuple[Optional[str], str, bool]]]) -> List[Chargepoint]:
44+
cps_by_mode = get_chargepoints_by_chargemode(modes)
45+
return list(filter(lambda cp: cp.data.control_parameter.required_current != 0, cps_by_mode))
46+
47+
3748
def get_preferenced_chargepoint_charging(
3849
chargepoints: List[Chargepoint]) -> Tuple[List[Chargepoint], List[Chargepoint]]:
3950
preferenced_chargepoints = _get_preferenced_chargepoint(chargepoints)
@@ -104,10 +115,3 @@ def _get_preferenced_chargepoint(valid_chargepoints: List[Chargepoint]) -> List:
104115
except Exception:
105116
log.exception("Fehler im Algorithmus-Modul")
106117
return preferenced_chargepoints
107-
108-
109-
def get_chargepoints_by_chargemodes(modes) -> List[Chargepoint]:
110-
chargepoints: List[Chargepoint] = []
111-
for mode in modes:
112-
chargepoints.extend(get_chargepoints_by_mode(mode))
113-
return chargepoints

packages/control/algorithm/filter_chargepoints_test.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ def setup_cp(cp: Chargepoint, required_current: float, mode_tuple: Tuple[str, st
133133
"cp2": setup_cp(mock_cp2, 6, mode_tuple_2)}
134134

135135
# evaluation
136-
valid_chargepoints = filter_chargepoints.get_chargepoints_by_mode(set_mode_tuple)
136+
valid_chargepoints = filter_chargepoints.get_chargepoints_with_required_current_by_chargemode(set_mode_tuple)
137137

138138
# assertion
139139
assert valid_chargepoints == expected_valid_chargepoints
@@ -154,8 +154,8 @@ def test_get_chargepoints_by_mode_and_counter(chargepoints_of_counter: List[str]
154154
# setup
155155
get_chargepoints_of_counter_mock = Mock(return_value=chargepoints_of_counter)
156156
monkeypatch.setattr(CounterAll, "get_chargepoints_of_counter", get_chargepoints_of_counter_mock)
157-
get_chargepoints_by_mode_mock = Mock(return_value=chargepoints_by_mode)
158-
monkeypatch.setattr(filter_chargepoints, "get_chargepoints_by_mode", get_chargepoints_by_mode_mock)
157+
get_chargepoints_by_chargemode_mock = Mock(return_value=chargepoints_by_mode)
158+
monkeypatch.setattr(filter_chargepoints, "get_chargepoints_by_chargemode", get_chargepoints_by_chargemode_mock)
159159
data.data.counter_all_data = CounterAll()
160160

161161
# evaluation

packages/control/algorithm/no_current.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
from control import data
33

44
from control.algorithm.chargemodes import CONSIDERED_CHARGE_MODES_NO_CURRENT
5-
from control.algorithm.filter_chargepoints import get_chargepoints_by_chargemodes
5+
from control.algorithm.filter_chargepoints import get_chargepoints_by_chargemode
6+
from control.chargepoint.chargepoint_state import ChargepointState
67

78
log = logging.getLogger(__name__)
89

@@ -12,9 +13,10 @@ def __init__(self) -> None:
1213
pass
1314

1415
def set_no_current(self) -> None:
15-
chargepoints = get_chargepoints_by_chargemodes(CONSIDERED_CHARGE_MODES_NO_CURRENT)
16+
chargepoints = get_chargepoints_by_chargemode(CONSIDERED_CHARGE_MODES_NO_CURRENT)
1617
for cp in chargepoints:
1718
cp.data.set.current = 0
19+
cp.data.control_parameter.state = ChargepointState.NO_CHARGING_ALLOWED
1820

1921
def set_none_current(self) -> None:
2022
for cp in data.data.cp_data.values():

packages/control/algorithm/surplus_controlled.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from control.algorithm import common
66
from control.algorithm.chargemodes import (CONSIDERED_CHARGE_MODES_BIDI_DISCHARGE, CONSIDERED_CHARGE_MODES_PV_ONLY,
77
CONSIDERED_CHARGE_MODES_SURPLUS)
8-
from control.algorithm.filter_chargepoints import (get_chargepoints_by_chargemodes,
8+
from control.algorithm.filter_chargepoints import (get_chargepoints_with_required_current_by_chargemode,
99
get_chargepoints_by_mode_and_counter,
1010
get_preferenced_chargepoint_charging)
1111
from control.algorithm.utils import get_medium_charging_current
@@ -40,7 +40,7 @@ def set_surplus_current(self) -> None:
4040
if preferenced_cps_without_set_current:
4141
for cp in preferenced_cps_without_set_current:
4242
cp.data.set.current = cp.data.set.target_current
43-
for cp in get_chargepoints_by_chargemodes(CONSIDERED_CHARGE_MODES_SURPLUS):
43+
for cp in get_chargepoints_with_required_current_by_chargemode(CONSIDERED_CHARGE_MODES_SURPLUS):
4444
if cp.data.control_parameter.state in CHARGING_STATES:
4545
self._fix_deviating_evse_current(cp)
4646

@@ -127,7 +127,7 @@ def _fix_deviating_evse_current(self, chargepoint: Chargepoint) -> float:
127127
def check_submode_pv_charging(self) -> None:
128128
evu_counter = data.data.counter_all_data.get_evu_counter()
129129

130-
for cp in get_chargepoints_by_chargemodes(CONSIDERED_CHARGE_MODES_PV_ONLY):
130+
for cp in get_chargepoints_with_required_current_by_chargemode(CONSIDERED_CHARGE_MODES_PV_ONLY):
131131
try:
132132
def phase_switch_necessary() -> bool:
133133
return (cp.cp_state_hw_support_phase_switch() and
@@ -159,8 +159,8 @@ def phase_switch_necessary() -> bool:
159159
log.exception(f"Fehler in der PV-gesteuerten Ladung bei {cp.num}")
160160

161161
def set_required_current_to_max(self) -> None:
162-
for cp in get_chargepoints_by_chargemodes(CONSIDERED_CHARGE_MODES_SURPLUS +
163-
CONSIDERED_CHARGE_MODES_BIDI_DISCHARGE):
162+
for cp in get_chargepoints_with_required_current_by_chargemode(CONSIDERED_CHARGE_MODES_SURPLUS +
163+
CONSIDERED_CHARGE_MODES_BIDI_DISCHARGE):
164164
try:
165165
charging_ev_data = cp.data.set.charging_ev_data
166166
required_currents = cp.data.control_parameter.required_currents

packages/control/algorithm/surplus_controlled_test.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from control import data
66
from control.algorithm import surplus_controlled
7-
from control.algorithm.filter_chargepoints import get_chargepoints_by_chargemodes
7+
from control.algorithm.filter_chargepoints import get_chargepoints_with_required_current_by_chargemode
88
from control.algorithm.surplus_controlled import (CONSIDERED_CHARGE_MODES_PV_ONLY, SurplusControlled,
99
limit_adjust_current)
1010
from control.chargemode import Chargemode
@@ -89,7 +89,7 @@ def test_set_required_current_to_max(phases: int,
8989
required_currents=required_currents))
9090
mock_cp1.template = CpTemplate()
9191
mock_get_chargepoints_surplus_controlled = Mock(return_value=[mock_cp1])
92-
monkeypatch.setattr(surplus_controlled, "get_chargepoints_by_chargemodes",
92+
monkeypatch.setattr(surplus_controlled, "get_chargepoints_with_required_current_by_chargemode",
9393
mock_get_chargepoints_surplus_controlled)
9494

9595
# execution
@@ -149,7 +149,7 @@ def setup_cp(cp: Chargepoint, submode: str) -> Chargepoint:
149149
"cp2": setup_cp(mock_cp2, submode_2)}
150150

151151
# evaluation
152-
chargepoints = get_chargepoints_by_chargemodes(CONSIDERED_CHARGE_MODES_PV_ONLY)
152+
chargepoints = get_chargepoints_with_required_current_by_chargemode(CONSIDERED_CHARGE_MODES_PV_ONLY)
153153

154154
# assertion
155155
assert chargepoints == expected_chargepoints

packages/control/bat_all.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
from control import data
2626
from control.algorithm.chargemodes import CONSIDERED_CHARGE_MODES_CHARGING
27-
from control.algorithm.filter_chargepoints import get_chargepoints_by_chargemodes
27+
from control.algorithm.filter_chargepoints import get_chargepoints_with_required_current_by_chargemode
2828
from control.pv import Pv
2929
from helpermodules.constants import NO_ERROR
3030
from modules.common.abstract_device import AbstractDevice
@@ -429,7 +429,8 @@ def set_power_limit_controllable(self):
429429
self.data.get.power_limit_controllable = False
430430

431431
def get_charge_mode_vehicle_charge(self):
432-
chargepoint_by_chargemodes = get_chargepoints_by_chargemodes(CONSIDERED_CHARGE_MODES_CHARGING)
432+
chargepoint_by_chargemodes = get_chargepoints_with_required_current_by_chargemode(
433+
CONSIDERED_CHARGE_MODES_CHARGING)
433434
# Fahrzeuge laden
434435
vehicle_charging = (len(chargepoint_by_chargemodes) > 0 and
435436
data.data.cp_all_data.data.get.power > 100)

packages/control/bat_all_test.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,9 @@ def test_active_bat_control(params: BatControlParams, data_, monkeypatch):
259259
data.data.counter_data["counter0"].data.get.power = params.evu_power
260260
data.data.bat_all_data = b_all
261261

262-
get_chargepoints_by_chargemodes_mock = Mock(return_value=params.cps)
263-
monkeypatch.setattr(bat_all, "get_chargepoints_by_chargemodes", get_chargepoints_by_chargemodes_mock)
262+
get_chargepoints_with_required_current_by_chargemode_mock = Mock(return_value=params.cps)
263+
monkeypatch.setattr(bat_all, "get_chargepoints_with_required_current_by_chargemode",
264+
get_chargepoints_with_required_current_by_chargemode_mock)
264265
get_evu_counter_mock = Mock(return_value=data.data.counter_data["counter0"])
265266
monkeypatch.setattr(data.data.counter_all_data, "get_evu_counter", get_evu_counter_mock)
266267
get_controllable_bat_components_mock = Mock(return_value=[MqttBat(MqttBatSetup(id=2), device_id=0)])
@@ -340,8 +341,9 @@ def test_control_price_limit(params: BatControlParams, data_, monkeypatch):
340341
data.data.counter_data["counter0"].data.get.power = params.evu_power
341342
data.data.bat_all_data = b_all
342343

343-
get_chargepoints_by_chargemodes_mock = Mock(return_value=params.cps)
344-
monkeypatch.setattr(bat_all, "get_chargepoints_by_chargemodes", get_chargepoints_by_chargemodes_mock)
344+
get_chargepoints_with_required_current_by_chargemode_mock = Mock(return_value=params.cps)
345+
monkeypatch.setattr(bat_all, "get_chargepoints_with_required_current_by_chargemode",
346+
get_chargepoints_with_required_current_by_chargemode_mock)
345347
get_evu_counter_mock = Mock(return_value=data.data.counter_data["counter0"])
346348
monkeypatch.setattr(data.data.counter_all_data, "get_evu_counter", get_evu_counter_mock)
347349
get_controllable_bat_components_mock = Mock(return_value=[MqttBat(MqttBatSetup(id=2), device_id=0)])

packages/control/chargepoint/chargepoint.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ def _is_phase_switch_required(self) -> bool:
370370
self.set_state_and_log(
371371
"Keine Phasenumschaltung, da wiederholtes Anstoßen der Umschaltung in den übergreifenden "
372372
"Ladeeinstellungen deaktiviert wurde. Die aktuelle "
373-
"Phasenzahl wird bis zum Abstecken beibehalten.")
373+
"Phasenzahl wird bis zum nächsten Lademoduswechsel beibehalten.")
374374
self.data.control_parameter.failed_phase_switches += 1
375375
return phase_switch_required
376376

@@ -463,6 +463,7 @@ def initiate_phase_switch(self):
463463
self.data.control_parameter.phases)
464464
self.data.set.phases_to_use = self.data.control_parameter.phases
465465
self.data.control_parameter.state = ChargepointState.PERFORMING_PHASE_SWITCH
466+
self.data.set.current = 0
466467
else:
467468
log.error("Phasenumschaltung an Ladepunkt" + str(self.num) +
468469
" nicht möglich, da gerade eine Umschaltung im Gange ist.")

0 commit comments

Comments
 (0)