Skip to content

Commit f976112

Browse files
authored
refactor charging ev (#2901)
* refactor charging ev * fix * fix * fixes * fixes
1 parent c698a32 commit f976112

18 files changed

Lines changed: 76 additions & 150 deletions

packages/control/algorithm/algorithm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def _check_auto_phase_switch_delay(self) -> None:
5757
"""
5858
for cp in data.data.cp_data.values():
5959
try:
60-
if cp.data.set.charging_ev != -1:
60+
if cp.data.control_parameter.required_current != 0:
6161
charging_ev = cp.data.set.charging_ev_data
6262
control_parameter = cp.data.control_parameter
6363
if cp.cp_state_hw_support_phase_switch() and control_parameter.template_phases == 0:

packages/control/algorithm/filter_chargepoints.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def get_chargepoints_by_mode(mode_tuple: Tuple[Optional[str], str, bool]) -> Lis
2525
# enthält alle LP, auf die das Tupel zutrifft
2626
valid_chargepoints = []
2727
for cp in data.data.cp_data.values():
28-
if cp.data.set.charging_ev != -1:
28+
if cp.data.control_parameter.required_current != 0:
2929
if ((cp.data.control_parameter.prio == prio) and
3030
(cp.data.control_parameter.chargemode == mode or
3131
mode is None) and

packages/control/algorithm/filter_chargepoints_test.py

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -96,42 +96,41 @@ def mock_cp(cp: Chargepoint, num: int):
9696

9797

9898
@pytest.mark.parametrize(
99-
"set_mode_tuple, charging_ev_1, mode_tuple_1, charging_ev_2, mode_tuple_2, expected_valid_chargepoints",
99+
"set_mode_tuple, required_current_1, mode_tuple_1, mode_tuple_2, expected_valid_chargepoints",
100100
[
101101
pytest.param((Chargemode.SCHEDULED_CHARGING, Chargemode.INSTANT_CHARGING, False),
102-
1, (Chargemode.SCHEDULED_CHARGING,
102+
6, (Chargemode.SCHEDULED_CHARGING,
103103
Chargemode.INSTANT_CHARGING, False),
104-
1, (Chargemode.SCHEDULED_CHARGING,
104+
(Chargemode.SCHEDULED_CHARGING,
105105
Chargemode.INSTANT_CHARGING, False),
106106
[mock_cp1, mock_cp2], id="fits mode"),
107107
pytest.param((Chargemode.SCHEDULED_CHARGING, Chargemode.INSTANT_CHARGING, False),
108-
-1, (Chargemode.SCHEDULED_CHARGING,
109-
Chargemode.INSTANT_CHARGING, False),
110-
1, (Chargemode.SCHEDULED_CHARGING,
108+
0, (Chargemode.SCHEDULED_CHARGING,
111109
Chargemode.INSTANT_CHARGING, False),
112-
[mock_cp2], id="cp1 has no charging car"),
110+
(Chargemode.SCHEDULED_CHARGING,
111+
Chargemode.INSTANT_CHARGING, False),
112+
[mock_cp2], id="cp1 should not charge"),
113113
pytest.param((Chargemode.SCHEDULED_CHARGING, Chargemode.INSTANT_CHARGING, False),
114-
1, (Chargemode.SCHEDULED_CHARGING,
114+
6, (Chargemode.SCHEDULED_CHARGING,
115115
Chargemode.INSTANT_CHARGING, False),
116-
1, (Chargemode.SCHEDULED_CHARGING,
116+
(Chargemode.SCHEDULED_CHARGING,
117117
Chargemode.INSTANT_CHARGING, True),
118118
[mock_cp1], id="cp2 is prioritized")
119119
])
120120
def test_get_chargepoints_by_mode(set_mode_tuple: Tuple[Optional[str], str, bool],
121-
charging_ev_1: int,
121+
required_current_1: int,
122122
mode_tuple_1: Tuple[str, str, bool],
123-
charging_ev_2: int,
124123
mode_tuple_2: Tuple[str, str, bool],
125124
expected_valid_chargepoints):
126125
# setup
127-
def setup_cp(cp: Chargepoint, charging_ev: int, mode_tuple: Tuple[str, str, bool]) -> Chargepoint:
128-
cp.data.set.charging_ev = charging_ev
126+
def setup_cp(cp: Chargepoint, required_current: float, mode_tuple: Tuple[str, str, bool]) -> Chargepoint:
127+
cp.data.control_parameter.required_current = required_current
129128
cp.data.control_parameter.prio = mode_tuple[2]
130129
cp.data.control_parameter.chargemode = mode_tuple[0]
131130
cp.data.control_parameter.submode = mode_tuple[1]
132131
return cp
133-
data.data.cp_data = {"cp1": setup_cp(mock_cp1, charging_ev_1, mode_tuple_1),
134-
"cp2": setup_cp(mock_cp2, charging_ev_2, mode_tuple_2)}
132+
data.data.cp_data = {"cp1": setup_cp(mock_cp1, required_current_1, mode_tuple_1),
133+
"cp2": setup_cp(mock_cp2, 6, mode_tuple_2)}
135134

136135
# evaluation
137136
valid_chargepoints = filter_chargepoints.get_chargepoints_by_mode(set_mode_tuple)

packages/control/algorithm/integration_test/conftest.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ def data_() -> None:
2727
for i in range(3, 6):
2828
data.data.cp_data[f"cp{i}"].template = CpTemplate()
2929
data.data.cp_data[f"cp{i}"].data.config.phase_1 = i-2
30-
data.data.cp_data[f"cp{i}"].data.set.charging_ev = i
3130
data.data.cp_data[f"cp{i}"].data.set.charging_ev_data = Ev(i)
3231
data.data.cp_data[f"cp{i}"].data.set.charging_ev_data.ev_template.data.max_current_single_phase = 32
3332
data.data.cp_data[f"cp{i}"].data.get.plug_state = True

packages/control/algorithm/surplus_controlled_test.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,10 @@ def test_get_chargepoints_submode_pv_charging(submode_1: Chargemode,
140140
expected_chargepoints: List[Chargepoint]):
141141
# setup
142142
def setup_cp(cp: Chargepoint, submode: str) -> Chargepoint:
143-
cp.data.set.charging_ev = Ev(0)
143+
cp.data.set.charging_ev_data = Ev(0)
144144
cp.data.control_parameter.chargemode = Chargemode.PV_CHARGING
145145
cp.data.control_parameter.submode = submode
146+
cp.data.control_parameter.required_current = 6
146147
return cp
147148
data.data.cp_data = {"cp1": setup_cp(mock_cp1, submode_1),
148149
"cp2": setup_cp(mock_cp2, submode_2)}

packages/control/chargelog/chargelog.py

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -125,16 +125,14 @@ def save_interim_data(chargepoint, charging_ev, immediately: bool = True):
125125
try:
126126
log_data = chargepoint.data.set.log
127127
# Es wurde noch nie ein Auto zugeordnet
128-
if charging_ev == -1:
129-
return
130128
if log_data.imported_since_mode_switch == 0:
131129
# Die Daten wurden schon erfasst.
132130
return
133131
if not immediately:
134132
if chargepoint.data.get.power != 0:
135133
# Das Fahrzeug hat die Ladung noch nicht beendet. Der Logeintrag wird später erstellt.
136134
return
137-
save_data(chargepoint, charging_ev, immediately)
135+
save_data(chargepoint, charging_ev)
138136
chargepoint.reset_log_data_chargemode_switch()
139137
except Exception:
140138
log.exception("Fehler im Ladelog-Modul")
@@ -154,16 +152,13 @@ def save_and_reset_data(chargepoint, charging_ev, immediately: bool = True):
154152
Soll sofort ein Eintrag erstellt werden oder gewartet werden, bis die Ladung beendet ist.
155153
"""
156154
try:
157-
if charging_ev == -1:
158-
# Es wurde noch nie ein Auto zugeordnet.
159-
return
160155
if not immediately:
161156
if chargepoint.data.get.power != 0:
162157
# Das Fahrzeug hat die Ladung noch nicht beendet. Der Logeintrag wird später erstellt.
163158
return
164159
if chargepoint.data.set.log.imported_since_mode_switch > 0:
165160
# Die Daten wurden noch nicht erfasst.
166-
save_data(chargepoint, charging_ev, immediately)
161+
save_data(chargepoint, charging_ev)
167162
chargepoint.reset_log_data()
168163
except Exception:
169164
log.exception("Fehler im Ladelog-Modul")
@@ -187,7 +182,7 @@ def _get_range_charged(log_data, charging_ev) -> float:
187182
charging_ev.ev_template.data.average_consump), 2))
188183

189184

190-
def save_data(chargepoint, charging_ev, immediately: bool = True):
185+
def save_data(chargepoint, charging_ev):
191186
""" json-Objekt für den Log-Eintrag erstellen, an die Datei anhängen und die Daten, die sich auf den Ladevorgang
192187
beziehen, löschen.
193188
@@ -198,17 +193,13 @@ def save_data(chargepoint, charging_ev, immediately: bool = True):
198193
charging_ev: class
199194
EV, das an diesem Ladepunkt lädt. (Wird extra übergeben, da es u.U. noch nicht zugewiesen ist und nur die
200195
Nummer aus dem Broker in der LP-Klasse hinterlegt ist.)
201-
reset: bool
202-
Wenn die Daten komplett zurückgesetzt werden, wird nicht der Zwischenzählerstand für
203-
imported_at_mode_switch notiert. Sonst schon, damit zwischen save_data und dem nächsten collect_data keine
204-
Daten verloren gehen.
205196
"""
206197
if chargepoint.data.set.log.imported_since_mode_switch != 0:
207-
new_entry = _create_entry(chargepoint, charging_ev, immediately)
198+
new_entry = _create_entry(chargepoint, charging_ev)
208199
write_new_entry(new_entry)
209200

210201

211-
def _create_entry(chargepoint, charging_ev, immediately: bool = True):
202+
def _create_entry(chargepoint, charging_ev):
212203
log_data = chargepoint.data.set.log
213204
# Daten vor dem Speichern nochmal aktualisieren, auch wenn nicht mehr geladen wird.
214205
log_data.imported_since_plugged = get_value_or_default(lambda: round(

packages/control/chargepoint/chargepoint.py

Lines changed: 27 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,3 @@
1-
"""Ladepunkt-Logik
2-
3-
charging_ev: EV, das aktuell laden darf
4-
charging_ev_prev: EV, das vorher geladen hat. Dies wird benötigt, da wenn das EV nicht mehr laden darf, z.B. weil
5-
Autolock aktiv ist, gewartet werden muss, bis die Ladeleistung 0 ist und dann erst der Eintrag im Protokoll erstellt
6-
werden kann.
7-
charging_ev = -1 zeigt an, dass der LP im Algorithmus nicht berücksichtigt werden soll. Ist das Ev abgesteckt, wird
8-
auch charging_ev_prev -1 und im nächsten Zyklus kann ein neues Profil geladen werden.
9-
10-
ID-Tag/Code-Eingabe:
11-
Mit einem ID-Tag/Code kann optional der Ladepunkt freigeschaltet werden, es wird gleichzeitig immer ein EV damit
12-
zugeordnet, mit dem nach der Freischaltung geladen werden soll. Wenn max 5 Min nach dem Scannen kein Auto
13-
angesteckt wird, wird der Tag verworfen. Ebenso wenn kein EV gefunden wird.
14-
Tag-Liste: Tags, mit denen der Ladepunkt freigeschaltet werden kann. Ist diese leer, kann mit jedem Tag der Ladepunkt
15-
freigeschaltet werden.
16-
"""
171
from dataclasses import asdict
182
import dataclasses
193
import logging
@@ -215,41 +199,28 @@ def _process_charge_stop(self) -> None:
215199
self.data.set.ocpp_transaction_id,
216200
self.data.set.rfid)
217201
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/ocpp_transaction_id", None)
218-
if self.data.set.charging_ev_prev != -1:
219-
# Daten zurücksetzen, wenn nicht geladen werden soll.
220-
self.reset_control_parameter_at_charge_stop()
221-
data.data.counter_all_data.get_evu_counter().reset_switch_on_off(
222-
self, data.data.ev_data["ev"+str(self.data.set.charging_ev_prev)])
223-
# Abstecken
224-
if not self.data.get.plug_state:
225-
self.data.control_parameter = control_parameter_factory()
226-
# Standardprofil nach Abstecken laden
227-
if self.data.set.charge_template.data.load_default:
228-
self.data.config.ev = 0
229-
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/config/ev", 0)
230-
# Ladepunkt nach Abstecken sperren
231-
if self.template.data.disable_after_unplug:
232-
self.data.set.manual_lock = True
233-
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/manual_lock", True)
234-
log.debug("/set/manual_lock True")
235-
# Ev wurde noch nicht aktualisiert.
236-
# Ladeprofil aus den Einstellungen laden.
237-
if data.data.general_data.data.temporary_charge_templates_active:
238-
self.update_charge_template(
239-
data.data.ev_data["ev"+str(self.data.set.charging_ev_prev)].charge_template)
240-
chargelog.save_and_reset_data(self, data.data.ev_data["ev"+str(self.data.set.charging_ev_prev)])
241-
self.data.set.charging_ev_prev = -1
242-
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/charging_ev_prev",
243-
self.data.set.charging_ev_prev)
244-
self.data.set.rfid = None
245-
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/rfid", None)
246-
self.data.set.plug_time = None
247-
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/plug_time", None)
248-
self.data.set.phases_to_use = self.data.get.phases_in_use
249-
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/phases_to_use",
250-
self.data.set.phases_to_use)
251-
self.data.set.charging_ev = -1
252-
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/charging_ev", -1)
202+
self.reset_control_parameter_at_charge_stop()
203+
data.data.counter_all_data.get_evu_counter().reset_switch_on_off(self)
204+
if self.data.get.plug_state is False:
205+
self.data.control_parameter = control_parameter_factory()
206+
if self.data.set.charge_template.data.load_default:
207+
self.data.config.ev = 0
208+
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/config/ev", 0)
209+
if self.template.data.disable_after_unplug:
210+
self.data.set.manual_lock = True
211+
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/manual_lock", True)
212+
log.debug("/set/manual_lock True")
213+
if data.data.general_data.data.temporary_charge_templates_active:
214+
self.update_charge_template(
215+
data.data.ev_data["ev"+str(self.data.config.ev)].charge_template)
216+
chargelog.save_and_reset_data(self, data.data.ev_data["ev"+str(self.data.config.ev)])
217+
self.data.set.rfid = None
218+
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/rfid", None)
219+
self.data.set.plug_time = None
220+
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/plug_time", None)
221+
self.data.set.phases_to_use = self.data.get.phases_in_use
222+
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/phases_to_use",
223+
self.data.set.phases_to_use)
253224
self.data.set.current = 0
254225
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/current", 0)
255226
self.data.set.energy_to_charge = 0
@@ -710,8 +681,7 @@ def update(self, ev_list: Dict[str, Ev]) -> None:
710681
self.check_phase_switch_completed()
711682

712683
if self.chargemode_changed or self.submode_changed:
713-
data.data.counter_all_data.get_evu_counter().reset_switch_on_off(
714-
self, charging_ev)
684+
data.data.counter_all_data.get_evu_counter().reset_switch_on_off(self)
715685
charging_ev.reset_phase_switch(self.data.control_parameter)
716686
if self.chargemode_changed:
717687
self.data.control_parameter.failed_phase_switches = 0
@@ -724,14 +694,6 @@ def update(self, ev_list: Dict[str, Ev]) -> None:
724694
# Wenn die Nachrichten gesendet wurden, EV wieder löschen, wenn das EV im Algorithmus nicht
725695
# berücksichtigt werden soll.
726696
if not state:
727-
if self.data.set.charging_ev != -1:
728-
# Altes EV merken
729-
self.data.set.charging_ev_prev = self.data.set.charging_ev
730-
Pub().pub("openWB/set/chargepoint/"+str(self.num) +
731-
"/set/charging_ev_prev", self.data.set.charging_ev_prev)
732-
self.data.set.charging_ev = -1
733-
Pub().pub("openWB/set/chargepoint/" +
734-
str(self.num)+"/set/charging_ev", -1)
735697
log.debug(f'LP {self.num}, EV: {self.data.set.charging_ev_data.data.name}'
736698
f' (EV-Nr.{vehicle}): Lademodus '
737699
f'{self.data.set.charge_template.data.chargemode.selected}, Submodus: '
@@ -816,18 +778,16 @@ def _get_charging_ev(self, vehicle: int, ev_list: Dict[str, Ev]) -> Ev:
816778
" verwendet.")
817779
charging_ev = ev_list["ev0"]
818780
vehicle = 0
819-
if self.data.set.charging_ev_prev != vehicle:
781+
if self.data.config.ev != vehicle:
820782
Pub().pub(f"openWB/set/vehicle/{charging_ev.num}/get/force_soc_update", True)
821783
log.debug("SoC nach EV-Wechsel")
822784
# wenn vorher kein anderes Fahrzeug zugeordnet war, Ladeprofil nicht zurücksetzen
823-
if ((self.data.set.charging_ev_prev != vehicle and self.data.set.charging_ev_prev != -1) or
785+
if (self.data.config.ev != vehicle or
824786
(self.data.set.charge_template.data.id != charging_ev.charge_template.data.id)):
825787
self.update_charge_template(charging_ev.charge_template)
826788
self.data.set.charging_ev_data = charging_ev
827-
self.data.set.charging_ev = vehicle
828-
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/charging_ev", vehicle)
829-
self.data.set.charging_ev_prev = vehicle
830-
Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/charging_ev_prev", vehicle)
789+
self.data.config.ev = vehicle
790+
Pub().pub(f"openWB/set/chargepoint/{self.num}/config", dataclasses.asdict(self.data.config))
831791
return charging_ev
832792

833793
def update_charge_template(self, charge_template: ChargeTemplate) -> None:

packages/control/chargepoint/chargepoint_all.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,12 @@ def no_charge(self):
4747
control_parameter = chargepoint.data.control_parameter
4848
if (not chargepoint.data.get.plug_state or
4949
# Kein EV, das Laden soll
50-
chargepoint.data.set.charging_ev == -1 or
5150
# Kein EV, das auf das Ablaufen der Einschalt- oder Phasenumschaltverzögerung wartet
52-
(chargepoint.data.set.charging_ev != -1 and
53-
control_parameter.state != ChargepointState.PERFORMING_PHASE_SWITCH and
51+
(control_parameter.state != ChargepointState.PERFORMING_PHASE_SWITCH and
5452
control_parameter.state != ChargepointState.PHASE_SWITCH_DELAY and
5553
control_parameter.state != ChargepointState.SWITCH_OFF_DELAY and
56-
control_parameter.state != ChargepointState.SWITCH_ON_DELAY)):
54+
control_parameter.state != ChargepointState.SWITCH_ON_DELAY and
55+
control_parameter.state != ChargepointState.NO_CHARGING_ALLOWED)):
5756
continue
5857
else:
5958
break

packages/control/chargepoint/chargepoint_data.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,6 @@ def log_factory() -> Log:
148148

149149
@dataclass
150150
class Set:
151-
charging_ev: int = -1
152-
charging_ev_prev: int = -1
153151
charge_template: ChargeTemplate = field(default_factory=charge_template_factory)
154152
current: float = 0
155153
energy_to_charge: float = 0

packages/control/chargepoint/chargepoint_template.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ def get_ev(self, rfid: str, vehicle_id: str, assigned_ev: int) -> int:
8787
message: str
8888
Status-Text
8989
"""
90-
num = -1
9190
message = None
9291
try:
9392
if data.data.optional_data.data.rfid.active and (rfid is not None or vehicle_id is not None):
@@ -103,4 +102,4 @@ def get_ev(self, rfid: str, vehicle_id: str, assigned_ev: int) -> int:
103102
except Exception:
104103
log.exception(
105104
"Fehler in der Ladepunkt-Profil Klasse")
106-
return num, "Keine Ladung, da ein interner Fehler aufgetreten ist: " + traceback.format_exc()
105+
return assigned_ev, "Keine Ladung, da ein interner Fehler aufgetreten ist: " + traceback.format_exc()

0 commit comments

Comments
 (0)