Skip to content

Commit 140ec03

Browse files
committed
feat(A-dmd-peak): add getter to read current demand peak ampere value
also added valid tests Signed-off-by: Milad Makdesi <milad@id8-engineering.io>
1 parent dbd2e5c commit 140ec03

2 files changed

Lines changed: 48 additions & 0 deletions

File tree

src/em511/em511.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class Em511:
3939
EM511_REGISTER_V = 0x0
4040
EM511_REGISTER_A = 0x2
4141
EM511_REGISTER_A_DMD = 0x3A
42+
EM511_REGISTER_A_DMD_PEAK = 0x3C
4243
EM511_REGISTER_W = 0x4
4344
EM511_REGISTER_W_DMD = 0xA
4445
EM511_REGISTER_W_DMD_PEAK = 0xC
@@ -191,6 +192,21 @@ def A_dmd(self) -> Decimal:
191192
value = Decimal(self._unpack(regs, self.EM511_REGISTER_A_DMD)) / self.SCALE_1000
192193
return round(value, 3)
193194

195+
@property
196+
def A_dmd_peak(self) -> Decimal:
197+
"""Current demand peak (A).
198+
199+
Returns:
200+
Decimal: Current demand peak, ampere value.
201+
202+
Raises:
203+
ValueError: If input is at max value or above.
204+
ModbusException: If failed to read input register.
205+
"""
206+
regs = self._read_input_registers(self.EM511_REGISTER_A_DMD_PEAK, self.INT32_REG_COUNT)
207+
value = Decimal(self._unpack(regs, self.EM511_REGISTER_A_DMD_PEAK)) / self.SCALE_1000
208+
return round(value, 3)
209+
194210
@property
195211
def W(self) -> Decimal:
196212
"""Power (W).

src/em511/test_em511.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,38 @@ def test_get_A_dmd() -> None:
107107
_ = meter.A_dmd
108108

109109

110+
def test_get_A_dmd_peak() -> None:
111+
"""Test Get a_dmd_peak."""
112+
client = MagicMock()
113+
mock_result = MagicMock()
114+
mock_result.isError.return_value = False
115+
meter = Em511(1, client)
116+
117+
"""Test 1: should pass"""
118+
mock_result.registers = [0x2904, 0x0000]
119+
client.read_input_registers.return_value = mock_result
120+
value = meter.A_dmd_peak
121+
assert value == Decimal("10.5")
122+
123+
"""Test 2: Should pass."""
124+
mock_result.registers = [0x1860, 0x0023]
125+
client.read_input_registers.return_value = mock_result
126+
value = meter.A_dmd_peak
127+
assert value == Decimal("2300.0")
128+
129+
"""Test 3: Should raise exception due to more registers in use than allowed."""
130+
mock_result.registers = [0x1860, 0x0023, 0x4244]
131+
client.read_input_registers.return_value = mock_result
132+
with pytest.raises(ValueError, match="Unexpected register count:"):
133+
_ = meter.A_dmd_peak
134+
135+
"""Test 4: Should raise exception if input value exceeds maximum value, display shows 'EEE', 32-bit register."""
136+
mock_result.registers = [0xFFFF, 0x7FFF]
137+
client.read_input_registers.return_value = mock_result
138+
with pytest.raises(ValueError, match="Input overflow EEE for 32-bit register: "):
139+
_ = meter.A_dmd_peak
140+
141+
110142
def test_get_W() -> None:
111143
"""Test Get w."""
112144
client = MagicMock()

0 commit comments

Comments
 (0)