Skip to content

Commit 7824f56

Browse files
committed
feat(baud-rate): Add getter to read baud rate
Also added valid tests Signed-off-by: Bobo Bäck Engström <bobo@id8-engineering.io>
1 parent dd85392 commit 7824f56

2 files changed

Lines changed: 62 additions & 0 deletions

File tree

src/em511/em511.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class Em511:
2929
DEVICE_ADDRESS_MIN_VALUE = 1
3030
BAUD_RATE_MIN_VALUE = 1
3131
BAUD_RATE_MAX_VALUE = 5
32+
PARITY_MIN_VALUE = 1
33+
PARITY_MAX_VALUE = 2
3234

3335
EM511_REGISTER_V = 0x0
3436
EM511_REGISTER_A = 0x2
@@ -42,6 +44,7 @@ class Em511:
4244
EM511_REGISTER_HOUR_COUNTER = 0x2C
4345
EM511_REGISTER_DEVICE_ID = 0x2000
4446
EM511_REGISTER_BAUD_RATE = 0x2001
47+
EM511_REGISTER_PARITY = 0x2002
4548

4649
SCALE_10 = 10
4750
SCALE_100 = 100
@@ -331,6 +334,27 @@ def baud_rate(self) -> int:
331334
raise ValueError(msg)
332335
return value
333336

337+
@property
338+
def parity(self) -> int:
339+
"""Parity.
340+
341+
1=None, 2=Even (default=1)
342+
343+
Returns:
344+
Int: Current parity.
345+
346+
Raises:
347+
ValueError: If input is at max value or above.
348+
ValueError: If parity is out of range.
349+
ModbusException: If failed to read input register.
350+
"""
351+
regs = self._read_input_registers(self.EM511_REGISTER_PARITY, self.INT16_REG_COUNT)
352+
value = self._unpack(regs, self.EM511_REGISTER_PARITY)
353+
if not (self.PARITY_MIN_VALUE <= value <= self.PARITY_MAX_VALUE):
354+
msg = f"Invalid parity value: {value}. Must be between 1 and 2."
355+
raise ValueError(msg)
356+
return value
357+
334358
@password.setter
335359
def password(self, value: int) -> None:
336360
"""Password.

src/em511/test_em511.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,44 @@ def test_get_baud_rate() -> None:
400400
_ = meter.baud_rate
401401

402402

403+
def test_get_parity() -> None:
404+
"""Test Get parity."""
405+
client = MagicMock()
406+
mock_result = MagicMock()
407+
mock_result.isError.return_value = False
408+
meter = Em511(1, client)
409+
410+
"""Test 1: should pass"""
411+
mock_result.registers = [0x2]
412+
client.read_input_registers.return_value = mock_result
413+
value = meter.parity
414+
assert value == 2
415+
416+
"""Test 2: Should pass."""
417+
mock_result.registers = [0x1]
418+
client.read_input_registers.return_value = mock_result
419+
value = meter.parity
420+
assert value == 1
421+
422+
"""Test 3: Should raise exception due to value not in range"""
423+
mock_result.registers = [0x3]
424+
client.read_input_registers.return_value = mock_result
425+
with pytest.raises(ValueError, match="Invalid parity value:"):
426+
_ = meter.parity
427+
428+
"""Test 4: Should raise exception due to more registers in use than allowed."""
429+
mock_result.registers = [0x1860, 0x0023, 0x5743]
430+
client.read_input_registers.return_value = mock_result
431+
with pytest.raises(ValueError, match="Unexpected register count:"):
432+
_ = meter.parity
433+
434+
"""Test 5: Should raise exception if input value exceeds maximum value, display shows 'EEE', 16-bit register."""
435+
mock_result.registers = [0x7FFF]
436+
client.read_input_registers.return_value = mock_result
437+
with pytest.raises(ValueError, match="Input overflow EEE for 16-bit register: "):
438+
_ = meter.parity
439+
440+
403441
def test_set_password() -> None:
404442
"""Test Set Password."""
405443
client = MagicMock()

0 commit comments

Comments
 (0)