diff --git a/packages/modules/common/hardware_check.py b/packages/modules/common/hardware_check.py index c482d90210..420c1f2958 100644 --- a/packages/modules/common/hardware_check.py +++ b/packages/modules/common/hardware_check.py @@ -17,6 +17,9 @@ "Bitte den openWB series2 satellit stromlos machen.") METER_PROBLEM = "Der Zähler konnte nicht ausgelesen werden. Vermutlich ist der Zähler falsch konfiguriert oder defekt." METER_BROKEN_VOLTAGES = "Die Spannungen des Zählers konnten nicht korrekt ausgelesen werden: {}V Der Zähler ist defekt." +METER_VOLTAGE = "Die Spannung des Zählers ist zu {}. Bitte prüfen Sie die Spannungsversorgung. Spannung: {}V." +METER_VOLTAGE_TOO_HIGH = METER_VOLTAGE.format("hoch", "{}") +METER_VOLTAGE_TOO_LOW = METER_VOLTAGE.format("niedrig", "{}") METER_NO_SERIAL_NUMBER = ("Die Seriennummer des Zählers für das Ladelog kann nicht ausgelesen werden. Wenn Sie die " "Seriennummer für Abrechnungszwecke benötigen, wenden Sie sich bitte an unseren Support. Die " "Funktionalität wird dadurch nicht beeinträchtigt!") @@ -33,9 +36,18 @@ def check_meter_values(counter_state: CounterState, fault_state: Optional[FaultS def _check_meter_values(counter_state: CounterState) -> Optional[str]: + VOLTAGE_HIGH_THRESHOLD = 260 + VOLTAGE_LOW_THRESHOLD = 200 + VOLTAGE_DETECTED_THRESHOLD = 50 # Phasenaufall detektieren + def valid_voltage(voltage) -> bool: - return 200 < voltage < 260 + return VOLTAGE_LOW_THRESHOLD < voltage < VOLTAGE_HIGH_THRESHOLD voltages = counter_state.voltages + # wenn ein Wert in voltages großer VOLTAGE_HIGH_THRESHOLD ist, gebe eine Fehlermeldung zurück + if any(v > VOLTAGE_HIGH_THRESHOLD and v > VOLTAGE_DETECTED_THRESHOLD for v in voltages): + return METER_VOLTAGE_TOO_HIGH.format(voltages) + elif any(v < VOLTAGE_LOW_THRESHOLD and v > VOLTAGE_DETECTED_THRESHOLD for v in voltages): + return METER_VOLTAGE_TOO_LOW.format(voltages) if not ((valid_voltage(voltages[0]) and voltages[1] == 0 and voltages[2] == 0) or # Zoe lädt einphasig an einphasiger Wallbox und erzeugt Spannung auf L2 (ca 126V) (valid_voltage(voltages[0]) and 115 < voltages[1] < 135 and voltages[2] == 0) or diff --git a/packages/modules/common/hardware_check_test.py b/packages/modules/common/hardware_check_test.py index 9a26b20af5..cde1b270dc 100644 --- a/packages/modules/common/hardware_check_test.py +++ b/packages/modules/common/hardware_check_test.py @@ -9,7 +9,8 @@ from modules.common.evse import Evse from modules.common.hardware_check import ( EVSE_BROKEN, LAN_ADAPTER_BROKEN, METER_BROKEN_VOLTAGES, METER_IMPLAUSIBLE_VALUE, METER_NO_SERIAL_NUMBER, - METER_PROBLEM, OPEN_TICKET, USB_ADAPTER_BROKEN, SeriesHardwareCheckMixin, _check_meter_values) + METER_PROBLEM, METER_VOLTAGE_TOO_HIGH, METER_VOLTAGE_TOO_LOW, OPEN_TICKET, USB_ADAPTER_BROKEN, + SeriesHardwareCheckMixin, _check_meter_values) from modules.common.modbus import NO_CONNECTION, ModbusSerialClient_, ModbusTcpClient_ from modules.conftest import SAMPLE_IP, SAMPLE_PORT from modules.internal_chargepoint_handler.clients import ClientHandler @@ -97,6 +98,8 @@ def test_hardware_check_succeeds(monkeypatch): pytest.param([0, 230, 230], 0, METER_BROKEN_VOLTAGES.format([0, 230, 230]), id="dreiphasig, L1 defekt"), pytest.param([230, 0, 230], 0, METER_BROKEN_VOLTAGES.format([230, 0, 230]), id="dreiphasig, L2 defekt"), pytest.param([230]*3, 100, METER_PROBLEM, id="Phantom-Leistung"), + pytest.param([261, 230, 230], 0, METER_VOLTAGE_TOO_HIGH.format([261, 230, 230]), id="Spannung zu hoch"), + pytest.param([230, 230, 199], 0, METER_VOLTAGE_TOO_LOW.format([230, 230, 199]), id="Spannung zu niedrig"), ] ) def test_check_meter_values_voltages(voltages, power, expected_msg, monkeypatch):