Skip to content

Commit

Permalink
hotfix for one and two phase openWB (#1260)
Browse files Browse the repository at this point in the history
* fix for one and two phase openWB

* remove comment

* fix test
  • Loading branch information
LKuemmel authored Nov 17, 2023
1 parent fc070c0 commit 1fa3f3b
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 5 deletions.
15 changes: 11 additions & 4 deletions packages/modules/internal_chargepoint_handler/clients.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def find_meter_client(meters: List[meter_config], client: Union[ModbusSerialClie
METER_PROBLEM = ("Der Zähler konnte nicht ausgelesen werden. "
f"Vermutlich ist der Zähler falsch konfiguriert oder defekt. {OPEN_TICKET}")
METER_BROKEN = ("Die Spannungen des Zählers konnten nicht korrekt ausgelesen werden. "
f"Vermutlich ist der Zähler falsch konfiguriert oder defekt. {OPEN_TICKET}")
f"Der Zähler ist defekt. {OPEN_TICKET}")
EVSE_BROKEN = ("Auslesen der EVSE nicht möglich. "
f"Vermutlich ist die EVSE defekt oder hat eine unbekannte Modbus-ID. {OPEN_TICKET}")

Expand All @@ -90,15 +90,22 @@ def check_hardware(self):
raise Exception(self.USB_ADAPTER_BROKEN)
if meter_check_passed is False:
raise Exception(meter_error_msg)
if meter_error_msg == self.METER_BROKEN:
log.error(self.METER_BROKEN)
if evse_check_passed is False:
raise Exception(self.EVSE_BROKEN)

def check_meter(self):
def valid_voltage(voltage) -> bool:
return 200 < voltage < 250
try:
if any([v < 200 for v in self.meter_client.get_voltages()]):
return False, self.METER_BROKEN
else:
voltages = self.meter_client.get_voltages()
if ((valid_voltage(voltages[0]) and voltages[1] == 0 and voltages[2] == 0) or
(valid_voltage(voltages[0]) and valid_voltage(voltages[1]) and voltages[2] == 0) or
(valid_voltage(voltages[0]) and valid_voltage(voltages[1]) and valid_voltage((voltages[2])))):
return True, None
else:
return True, self.METER_BROKEN
except Exception:
return False, self.METER_PROBLEM

Expand Down
30 changes: 29 additions & 1 deletion packages/modules/internal_chargepoint_handler/clients_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
"evse_side_effect, evse_return_value, meter_side_effect, meter_return_value, expected_error_msg",
[pytest.param(Exception("Modbus"), None, None, [230]*3, ClientHandler.EVSE_BROKEN, id="EVSE defekt"),
pytest.param(None, 18, Exception("Modbus"), None, ClientHandler.METER_PROBLEM, id="Zähler verkonfiguriert"),
pytest.param(None, 18, None, [230, 0, 230], ClientHandler.METER_BROKEN, id="Zähler defekt"),
pytest.param(Exception("Modbus"), None, Exception("Modbus"), None, ClientHandler.USB_ADAPTER_BROKEN,
id="USB-Adapter defekt")
]
Expand Down Expand Up @@ -50,3 +49,32 @@ def test_hardware_check_succeeds(monkeypatch):
# execution and evaluation
# keine Exception
ClientHandler(0, Mock(), [1])


@pytest.mark.parametrize(
"voltages, expected_msg",
[pytest.param([230, 0, 0], None, id="einphasig oder zweiphasig L2 defekt (nicht erkennbar)"),
pytest.param([0, 0, 0], ClientHandler.METER_BROKEN, id="einphasig, L1 defekt"),
pytest.param([230, 230, 0], None, id="zweiphasig"),
pytest.param([0, 230, 0], ClientHandler.METER_BROKEN, id="zweiphasig, L1 defekt"),
pytest.param([230, 230, 230], None, id="dreiphasig"),
pytest.param([0, 230, 230], ClientHandler.METER_BROKEN, id="dreiphasig, L1 defekt"),
pytest.param([230, 0, 230], ClientHandler.METER_BROKEN, id="dreiphasig, L2 defekt"),
pytest.param([230, 230, 0], ClientHandler.METER_BROKEN, id="dreiphasig, L3 defekt"),
]
)
def check_meter(voltages, expected_msg, monkeypatch):
# setup
mock_evse_client = Mock(spec=Evse, get_firmware_version=Mock(return_value=18))
mock_evse_facotry = Mock(spec=Evse, return_value=mock_evse_client)
monkeypatch.setattr(ClientHandler, "_evse_factory", mock_evse_facotry)

mock_meter_client = Mock(spec=sdm.Sdm630, get_voltages=Mock(side_effect=[[230]*3, voltages]))
mock_find_meter_client = Mock(spec=sdm.Sdm630, return_value=mock_meter_client)
monkeypatch.setattr(ClientHandler, "find_meter_client", mock_find_meter_client)

# execution
msg = ClientHandler(0, Mock(), [1]).check_meter()

# assert
assert msg == expected_msg

0 comments on commit 1fa3f3b

Please sign in to comment.