Skip to content

Commit cbb5fe4

Browse files
committed
feat(reply-delay): Add getter to read reply delay
Also added valid tests Signed-off-by: Bobo Bäck Engström <bobo@id8-engineering.io>
1 parent 82a6dd7 commit cbb5fe4

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
@@ -33,6 +33,8 @@ class Em511:
3333
PARITY_MAX_VALUE = 2
3434
STOP_BIT_MIN_VALUE = 1
3535
STOP_BIT_MAX_VALUE = 2
36+
REPLY_DELAY_MIN_VALUE = 0
37+
REPLY_DELAY_MAX_VALUE = 1000
3638

3739
EM511_REGISTER_V = 0x0
3840
EM511_REGISTER_A = 0x2
@@ -48,6 +50,7 @@ class Em511:
4850
EM511_REGISTER_BAUD_RATE = 0x2001
4951
EM511_REGISTER_PARITY = 0x2002
5052
EM511_REGISTER_STOP_BIT = 0x2003
53+
EM511_REGISTER_REPLY_DELAY = 0x2004
5154

5255
SCALE_10 = 10
5356
SCALE_100 = 100
@@ -379,6 +382,27 @@ def stop_bit(self) -> int:
379382
raise ValueError(msg)
380383
return value
381384

385+
@property
386+
def reply_delay(self) -> int:
387+
"""Reply delay.
388+
389+
Range: 0-1000 ms (default=0)
390+
391+
Returns:
392+
int: Current reply delay value.
393+
394+
Raises:
395+
ValueError: If input is at max value or above.
396+
ValueError: If reply delay is out of range.
397+
ModbusException: If failed to read input register.
398+
"""
399+
regs = self._read_input_registers(self.EM511_REGISTER_REPLY_DELAY, self.INT16_REG_COUNT)
400+
value = self._unpack(regs, self.EM511_REGISTER_REPLY_DELAY)
401+
if not (self.REPLY_DELAY_MIN_VALUE <= value <= self.REPLY_DELAY_MAX_VALUE):
402+
msg = f"Invalid reply delay value: {value}. Must be between 0 and 1000."
403+
raise ValueError(msg)
404+
return value
405+
382406
@password.setter
383407
def password(self, value: int) -> None:
384408
"""Password.

src/em511/test_em511.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,44 @@ def test_get_stop_bit() -> None:
476476
_ = meter.stop_bit
477477

478478

479+
def test_get_reply_delay() -> None:
480+
"""Test Get reply delay."""
481+
client = MagicMock()
482+
mock_result = MagicMock()
483+
mock_result.isError.return_value = False
484+
meter = Em511(1, client)
485+
486+
"""Test 1: should pass"""
487+
mock_result.registers = [0x3E8]
488+
client.read_input_registers.return_value = mock_result
489+
value = meter.reply_delay
490+
assert value == 1000
491+
492+
"""Test 2: Should pass."""
493+
mock_result.registers = [0x0]
494+
client.read_input_registers.return_value = mock_result
495+
value = meter.reply_delay
496+
assert value == 0
497+
498+
"""Test 3: Should raise exception due to value not in range"""
499+
mock_result.registers = [0x3E9]
500+
client.read_input_registers.return_value = mock_result
501+
with pytest.raises(ValueError, match="Invalid reply delay value:"):
502+
_ = meter.reply_delay
503+
504+
"""Test 4: Should raise exception due to more registers in use than allowed."""
505+
mock_result.registers = [0x1860, 0x0023, 0x5743]
506+
client.read_input_registers.return_value = mock_result
507+
with pytest.raises(ValueError, match="Unexpected register count:"):
508+
_ = meter.reply_delay
509+
510+
"""Test 5: Should raise exception if input value exceeds maximum value, display shows 'EEE', 16-bit register."""
511+
mock_result.registers = [0x7FFF]
512+
client.read_input_registers.return_value = mock_result
513+
with pytest.raises(ValueError, match="Input overflow EEE for 16-bit register: "):
514+
_ = meter.reply_delay
515+
516+
479517
def test_set_password() -> None:
480518
"""Test Set Password."""
481519
client = MagicMock()

0 commit comments

Comments
 (0)