Skip to content

Commit d461b39

Browse files
authored
optional reset of the manual SoC (#3211)
* draft * fix * review
1 parent 015ac71 commit d461b39

File tree

5 files changed

+76
-6
lines changed

5 files changed

+76
-6
lines changed

packages/control/chargepoint/chargepoint.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,14 +188,21 @@ def _process_charge_stop(self) -> None:
188188
if self.data.get.plug_state is False and self.data.set.plug_state_prev is True:
189189
chargelog.save_and_reset_data(self, data.data.ev_data["ev"+str(self.data.config.ev)])
190190
self.data.control_parameter = control_parameter_factory()
191+
# VOR Standard nach Abstecken
192+
if (self.data.set.charging_ev_data.soc_module is not None and
193+
self.data.set.charging_ev_data.soc_module.vehicle_config.type == "manual" and
194+
self.data.set.charging_ev_data.soc_module.vehicle_config.configuration.reset_after_unplug):
195+
Pub().pub(f"openWB/set/vehicle/{self.data.config.ev}/soc_module/calculated_soc_state/manual_soc", 0)
191196
if self.data.set.charge_template.data.load_default:
192197
self.data.config.ev = 0
193198
if self.template.data.disable_after_unplug:
194199
self.data.set.manual_lock = True
195200
log.debug("/set/manual_lock True")
201+
# NACH Standard nach Abstecken
196202
if data.data.general_data.data.temporary_charge_templates_active:
197203
self.update_charge_template(
198204
data.data.ev_data["ev"+str(self.data.config.ev)].charge_template)
205+
199206
self.data.set.rfid = None
200207
self.data.set.plug_time = None
201208
self.data.set.phases_to_use = self.data.get.phases_in_use
@@ -624,12 +631,12 @@ def update(self, ev_list: Dict[str, Ev]) -> None:
624631
vehicle, message_ev = self.template.get_ev(self.data.set.rfid or self.data.get.rfid,
625632
self.data.get.vehicle_id,
626633
self.data.config.ev)
634+
charging_ev = self._get_charging_ev(vehicle, ev_list)
627635
if message_ev:
628636
message += message_ev
629637

630638
if charging_possible:
631639
try:
632-
charging_ev = self._get_charging_ev(vehicle, ev_list)
633640
state, message_ev, submode, required_current, template_phases = charging_ev.get_required_current(
634641
self.data.set.charge_template,
635642
self.data.control_parameter,

packages/control/chargepoint/chargepoint_test.py

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
from dataclasses import dataclass
2-
from typing import List
2+
from typing import List, Optional
33
from unittest.mock import Mock
44
import pytest
55

66
from control import data
7+
from control.chargelog import chargelog
78
from control.chargepoint.chargepoint import Chargepoint
89
from control.chargepoint.chargepoint_state import ChargepointState
910
from control.chargepoint.chargepoint_template import CpTemplate
11+
from control.counter import Counter
1012
from control.ev.ev import Ev
13+
from modules.common.configurable_vehicle import ConfigurableVehicle
14+
from modules.vehicles.manual.config import ManualSoc
15+
from modules.vehicles.manual.soc import create_vehicle as create_manual_vehicle
16+
from modules.vehicles.tesla.config import TeslaSoc
17+
from modules.vehicles.tesla.soc import create_vehicle as create_tesla_vehicle
18+
19+
20+
@pytest.fixture()
21+
def mock_data() -> None:
22+
data.data_init(Mock())
1123

1224

1325
@pytest.mark.parametrize("phase_1, phases, expected_required_currents",
@@ -144,3 +156,43 @@ def test_is_phase_switch_required(params: Params):
144156

145157
# assertion
146158
assert ret == params.phase_switch_required
159+
160+
161+
@pytest.mark.parametrize(
162+
"soc_module, reset_after_unplug, expected_calls, expected_pub_call",
163+
[
164+
pytest.param(None, None, 0, None, id="kein SoC-Modul"),
165+
pytest.param(create_manual_vehicle(ManualSoc(), 0), True, 1,
166+
("openWB/set/vehicle/0/soc_module/calculated_soc_state/manual_soc", 0),
167+
id="manuelles SoC-Modul, Reset nach Abstecken"),
168+
pytest.param(create_manual_vehicle(ManualSoc(), 0), False, 0, None,
169+
id="manuelles SoC-Modul, kein Reset nach Abstecken"),
170+
pytest.param(create_tesla_vehicle(TeslaSoc(), 0), None, 0, None, id="Tesla SoC-Modul"),
171+
])
172+
def test_process_charge_stop_reset_manual_soc(soc_module: Optional[ConfigurableVehicle],
173+
reset_after_unplug: Optional[bool],
174+
expected_calls: int,
175+
expected_pub_call: Optional[tuple],
176+
mock_pub: Mock, mock_data, monkeypatch):
177+
# setup
178+
cp = Chargepoint(0, None)
179+
cp.template = CpTemplate()
180+
cp.data.config.ev = 0
181+
cp.data.set.plug_state_prev = True
182+
ev = Ev(0)
183+
ev.soc_module = soc_module
184+
if soc_module and soc_module.vehicle_config.type == "manual":
185+
ev.soc_module.vehicle_config.configuration.reset_after_unplug = reset_after_unplug
186+
cp.data.set.charging_ev_data = ev
187+
data.data.ev_data["ev0"] = ev
188+
monkeypatch.setattr(chargelog, "save_and_reset_data", Mock())
189+
monkeypatch.setattr(data.data.counter_all_data, "get_evu_counter", Mock(
190+
return_value=Mock(spec=Counter, reset_switch_on_off=Mock())))
191+
192+
# execution
193+
cp._process_charge_stop()
194+
195+
# evaluation
196+
assert len(mock_pub.method_calls) - 1 == expected_calls
197+
if expected_calls > 0:
198+
assert mock_pub.method_calls[1].args == expected_pub_call

packages/control/ocpp_test.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ def mock_data() -> None:
1919

2020
def test_start_transaction(mock_data, monkeypatch):
2121
cp = Chargepoint(1, None)
22+
cp.data.config.ev = 0
2223
cp.data.config.ocpp_chargebox_id = "cp1"
2324
cp.data.get.plug_state = True
2425
cp.template = CpTemplate()
@@ -29,7 +30,7 @@ def test_start_transaction(mock_data, monkeypatch):
2930
_pub_configured_ev_mock = Mock()
3031
monkeypatch.setattr(cp, "_pub_configured_ev", _pub_configured_ev_mock)
3132

32-
cp.update([])
33+
cp.update({"ev0": Ev(0)})
3334

3435
assert start_transaction_mock.call_args == (("cp1", cp.chargepoint_module.fault_state, 1, None, 0),)
3536

packages/helpermodules/update_config.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757

5858
class UpdateConfig:
5959

60-
DATASTORE_VERSION = 115
60+
DATASTORE_VERSION = 116
6161

6262
valid_topic = [
6363
"^openWB/bat/config/bat_control_permitted$",
@@ -2994,3 +2994,13 @@ def upgrade(topic: str, payload) -> Optional[dict]:
29942994

29952995
self._loop_all_received_topics(upgrade)
29962996
self._append_datastore_version(115)
2997+
2998+
def upgrade_datastore_116(self) -> None:
2999+
def upgrade(topic: str, payload) -> Optional[dict]:
3000+
if re.search("openWB/vehicle/[0-9]+/soc_module/config", topic) is not None:
3001+
payload = decode_payload(payload)
3002+
if payload.get("type") == "manual" and payload["configuration"].get("reset_after_unplug") is None:
3003+
payload["configuration"]["reset_after_unplug"] = False
3004+
return {topic: payload}
3005+
self._loop_all_received_topics(upgrade)
3006+
self._append_datastore_version(116)

packages/modules/vehicles/manual/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
class ManualSocConfiguration:
2-
def __init__(self) -> None:
3-
pass
2+
def __init__(self, reset_after_unplug: bool = False) -> None:
3+
self.reset_after_unplug = reset_after_unplug
44

55

66
class ManualSoc:

0 commit comments

Comments
 (0)