Skip to content

Commit 38a6c2c

Browse files
authored
fix single phase wallboxes on evu L2 and L3 (#2934)
1 parent 6b3f975 commit 38a6c2c

9 files changed

Lines changed: 48 additions & 24 deletions

File tree

packages/control/algorithm/bidi_charging.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from control import data
33
from control.algorithm.chargemodes import CONSIDERED_CHARGE_MODES_BIDI_DISCHARGE
44
from control.algorithm.filter_chargepoints import get_chargepoints_by_mode
5+
from helpermodules.phase_handling import voltages_mean
56

67
log = logging.getLogger(__name__)
78

@@ -39,7 +40,7 @@ def set_bidi(self):
3940
for index in range(0, 3):
4041
missing_currents[index] = cp.check_min_max_current(missing_currents[index],
4142
cp.data.get.phases_in_use)
42-
grid_counter.update_surplus_values_left(missing_currents, cp.data.get.voltages)
43+
grid_counter.update_surplus_values_left(missing_currents, voltages_mean(cp.data.get.voltages))
4344
cp.data.set.current = missing_currents[0]
4445
log.info(f"LP{cp.num}: Stromstärke {missing_currents}A")
4546
preferenced_cps.pop(0)

packages/control/algorithm/common.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from control.algorithm.utils import get_medium_charging_current
77
from control.chargepoint.chargepoint import Chargepoint
88
from control.counter import Counter
9+
from helpermodules.phase_handling import voltages_mean
910
from helpermodules.timecheck import check_timestamp
1011
from modules.common.component_type import ComponentType
1112

@@ -74,9 +75,13 @@ def set_current_counterdiff(diff_current: float,
7475
counters = data.data.counter_all_data.get_counters_to_check(chargepoint.num)
7576
for counter in counters:
7677
if surplus:
77-
data.data.counter_data[counter].update_surplus_values_left(diffs, chargepoint.data.get.voltages)
78+
data.data.counter_data[counter].update_surplus_values_left(
79+
diffs,
80+
voltages_mean(chargepoint.data.get.voltages))
7881
else:
79-
data.data.counter_data[counter].update_values_left(diffs, chargepoint.data.get.voltages)
82+
data.data.counter_data[counter].update_values_left(
83+
diffs,
84+
voltages_mean(chargepoint.data.get.voltages))
8085
data.data.io_actions.dimming_set_import_power_left({"type": "cp", "id": chargepoint.num}, sum(diffs)*230)
8186

8287
chargepoint.data.set.current = current
@@ -146,9 +151,11 @@ def update_raw_data(preferenced_chargepoints: List[Chargepoint],
146151
counters = data.data.counter_all_data.get_counters_to_check(chargepoint.num)
147152
for counter in counters:
148153
if surplus:
149-
data.data.counter_data[counter].update_surplus_values_left(diffs, chargepoint.data.get.voltages)
154+
data.data.counter_data[counter].update_surplus_values_left(
155+
diffs,
156+
voltages_mean(chargepoint.data.get.voltages))
150157
else:
151-
data.data.counter_data[counter].update_values_left(diffs, chargepoint.data.get.voltages)
158+
data.data.counter_data[counter].update_values_left(diffs, voltages_mean(chargepoint.data.get.voltages))
152159
data.data.io_actions.dimming_set_import_power_left({"type": "cp", "id": chargepoint.num}, sum(diffs)*230)
153160

154161

packages/control/algorithm/surplus_controlled.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from control.counter import ControlRangeState, Counter
1616
from control.limiting_value import LoadmanagementLimit
1717
from control.loadmanagement import LimitingValue, Loadmanagement
18+
from helpermodules.phase_handling import voltages_mean
1819

1920

2021
log = logging.getLogger(__name__)
@@ -53,11 +54,13 @@ def _set(self,
5354
while len(chargepoints):
5455
cp = chargepoints[0]
5556
missing_currents, counts = common.get_missing_currents_left(chargepoints)
56-
available_currents, limit = Loadmanagement().get_available_currents_surplus(missing_currents,
57-
cp.data.get.voltages,
58-
counter,
59-
cp,
60-
feed_in=feed_in_yield)
57+
available_currents, limit = Loadmanagement().get_available_currents_surplus(
58+
missing_currents,
59+
voltages_mean(cp.data.get.voltages),
60+
counter,
61+
cp,
62+
feed_in=feed_in_yield
63+
)
6164
cp.data.control_parameter.limit = limit
6265
available_for_cp = common.available_current_for_cp(cp, counts, available_currents, missing_currents)
6366
if counter.get_control_range_state(feed_in_yield) == ControlRangeState.MIDDLE:

packages/control/chargepoint/chargepoint.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
from control import phase_switch
3737
from control.chargepoint.chargepoint_state import CHARGING_STATES, ChargepointState
3838
from control.text import BidiState
39-
from helpermodules.phase_mapping import convert_single_evu_phase_to_cp_phase
39+
from helpermodules.phase_handling import convert_single_evu_phase_to_cp_phase
4040
from helpermodules.pub import Pub
4141
from helpermodules import timecheck
4242
from helpermodules.utils import thread_handler

packages/control/counter.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from dataclass_utils.factories import currents_list_factory, voltages_list_factory
1818
from helpermodules import timecheck
1919
from helpermodules.constants import NO_ERROR
20-
from helpermodules.phase_mapping import convert_cp_currents_to_evu_currents
20+
from helpermodules.phase_handling import convert_cp_currents_to_evu_currents
2121
from modules.common.fault_state import FaultStateLevel
2222
from modules.common.utils.component_parser import get_component_name_by_id
2323

@@ -194,17 +194,19 @@ def _set_power_left(self, loadmanagement_available: bool) -> None:
194194
else:
195195
self.data.set.raw_power_left = None
196196

197-
def update_values_left(self, diffs, cp_voltages: List[float]) -> None:
197+
def update_values_left(self, diffs, cp_voltage: float) -> None:
198+
# Mittelwert der Spannungen verwenden, um Phasenverdrehung zu kompensieren
199+
# (Probleme bei einphasig angeschlossenen Wallboxen)
198200
self.data.set.raw_currents_left = list(map(operator.sub, self.data.set.raw_currents_left, diffs))
199201
if self.data.set.raw_power_left:
200-
self.data.set.raw_power_left -= sum([c * v for c, v in zip(diffs, cp_voltages)])
202+
self.data.set.raw_power_left -= sum([c * cp_voltage for c in diffs])
201203
log.debug(f'Zähler {self.num}: {self.data.set.raw_currents_left}A verbleibende Ströme, '
202204
f'{self.data.set.raw_power_left}W verbleibende Leistung')
203205

204-
def update_surplus_values_left(self, diffs, cp_voltages: List[float]) -> None:
206+
def update_surplus_values_left(self, diffs, cp_voltage: float) -> None:
205207
self.data.set.raw_currents_left = list(map(operator.sub, self.data.set.raw_currents_left, diffs))
206208
if self.data.set.surplus_power_left:
207-
self.data.set.surplus_power_left -= sum([c * v for c, v in zip(diffs, cp_voltages)])
209+
self.data.set.surplus_power_left -= sum([c * cp_voltage for c in diffs])
208210
log.debug(f'Zähler {self.num}: {self.data.set.raw_currents_left}A verbleibende Ströme, '
209211
f'{self.data.set.surplus_power_left}W verbleibender Überschuss')
210212

packages/control/loadmanagement.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from control.chargepoint.chargepoint import Chargepoint
77
from control.counter import Counter
88
from control.limiting_value import LimitingValue, LoadmanagementLimit
9+
from helpermodules.phase_handling import voltages_mean
910
from modules.common.utils.component_parser import get_component_name_by_id
1011

1112

@@ -35,7 +36,7 @@ def get_available_currents(self,
3536
limit = new_limit if new_limit.limiting_value is not None else limit
3637

3738
available_currents, new_limit = self._limit_by_power(
38-
counter, available_currents, cp.data.get.voltages, counter.data.set.raw_power_left, feed_in)
39+
counter, available_currents, voltages_mean(cp.data.get.voltages), counter.data.set.raw_power_left, feed_in)
3940
limit = new_limit if new_limit.limiting_value is not None else limit
4041

4142
if f"counter{counter.num}" == data.data.counter_all_data.get_evu_counter_str():
@@ -47,7 +48,7 @@ def get_available_currents(self,
4748

4849
def get_available_currents_surplus(self,
4950
missing_currents: List[float],
50-
cp_voltages: List[float],
51+
cp_voltage: float,
5152
counter: Counter,
5253
cp: Chargepoint,
5354
feed_in: int = 0) -> Tuple[List[float], LoadmanagementLimit]:
@@ -61,7 +62,7 @@ def get_available_currents_surplus(self,
6162
limit = new_limit if new_limit.limiting_value is not None else limit
6263

6364
available_currents, new_limit = self._limit_by_power(
64-
counter, available_currents, cp_voltages, counter.data.set.surplus_power_left, feed_in)
65+
counter, available_currents, cp_voltage, counter.data.set.surplus_power_left, feed_in)
6566
limit = new_limit if new_limit.limiting_value is not None else limit
6667

6768
if f"counter{counter.num}" == data.data.counter_all_data.get_evu_counter_str():
@@ -94,20 +95,22 @@ def _limit_by_unbalanced_load(self,
9495
def _limit_by_power(self,
9596
counter: Counter,
9697
available_currents: List[float],
97-
cp_voltages: List[float],
98+
cp_voltage: float,
9899
raw_power_left: Optional[float],
99100
feed_in: Optional[float]) -> Tuple[List[float], LoadmanagementLimit]:
101+
# Mittelwert der Spannungen verwenden, um Phasenverdrehung zu kompensieren
102+
# (Probleme bei einphasig angeschlossenen Wallboxen)
100103
currents = available_currents.copy()
101104
limit = LoadmanagementLimit(None, None)
102105
if raw_power_left:
103106
if feed_in:
104107
raw_power_left = raw_power_left - feed_in
105108
log.debug(f"Verbleibende Leistung unter Berücksichtigung der Einspeisegrenze: {raw_power_left}W")
106-
if sum([c * v for c, v in zip(available_currents, cp_voltages)]) > raw_power_left:
109+
if sum([c * cp_voltage for c in available_currents]) > raw_power_left:
107110
for i in range(0, 3):
108111
try:
109112
# Am meisten belastete Phase trägt am meisten zur Leistungsreduktion bei.
110-
currents[i] = available_currents[i] / sum(available_currents) * raw_power_left / cp_voltages[i]
113+
currents[i] = available_currents[i] / sum(available_currents) * raw_power_left / cp_voltage
111114
except ZeroDivisionError:
112115
# bei einphasig angeschlossenen Wallboxen ist die Spannung der anderen Phasen 0V
113116
currents[i] = 0.0

packages/control/loadmanagement_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def test_limit_by_power(available_currents: List[float],
3030
counter_name_mock = Mock(return_value=COUNTER_NAME)
3131
monkeypatch.setattr(loadmanagement, "get_component_name_by_id", counter_name_mock)
3232
# evaluation
33-
currents = Loadmanagement()._limit_by_power(Counter(0), available_currents, [230]*3, raw_power_left, None)
33+
currents = Loadmanagement()._limit_by_power(Counter(0), available_currents, 230, raw_power_left, None)
3434

3535
# assertion
3636
assert currents == expected_currents
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,11 @@ def convert_single_cp_phase_to_evu_phase(phase_1: int, cp_phase: int) -> int:
2424

2525
def convert_single_evu_phase_to_cp_phase(phase_1: int, evu_phase: int) -> int:
2626
return EVU_TO_CP_PHASE_MAPPING[phase_1][evu_phase]
27+
28+
29+
def voltages_mean(voltages: List[float]) -> float:
30+
# Zoes erzeugen bei einphasiger Ladung 140V auf Phase 2
31+
filtered_voltages = [v for v in voltages if v > 200]
32+
if not filtered_voltages:
33+
return 0.0
34+
return sum(filtered_voltages) / len(filtered_voltages)

packages/modules/common/store/_counter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from control import data
66
from helpermodules import compatibility
7-
from helpermodules.phase_mapping import convert_cp_currents_to_evu_currents
7+
from helpermodules.phase_handling import convert_cp_currents_to_evu_currents
88
from modules.common.component_state import CounterState
99
from modules.common.component_type import ComponentType
1010
from modules.common.fault_state import FaultState

0 commit comments

Comments
 (0)