Skip to content

Commit 0693b67

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

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
@@ -38,6 +38,7 @@ class Em511:
3838

3939
EM511_REGISTER_V = 0x0
4040
EM511_REGISTER_A = 0x2
41+
EM511_REGISTER_A_DMD = 0x3A
4142
EM511_REGISTER_W = 0x4
4243
EM511_REGISTER_W_DMD = 0xA
4344
EM511_REGISTER_W_DMD_PEAK = 0xC
@@ -175,6 +176,21 @@ def A(self) -> Decimal:
175176
value = Decimal(self._unpack(regs, self.EM511_REGISTER_A)) / self.SCALE_1000
176177
return round(value, 3)
177178

179+
@property
180+
def A_dmd(self) -> Decimal:
181+
"""Current (A).
182+
183+
Returns:
184+
Decimal: Current demand ampere value.
185+
186+
Raises:
187+
ValueError: If input is at max value or above.
188+
ModbusException: If failed to read input register.
189+
"""
190+
regs = self._read_input_registers(self.EM511_REGISTER_A_DMD, self.INT32_REG_COUNT)
191+
value = Decimal(self._unpack(regs, self.EM511_REGISTER_A_DMD)) / self.SCALE_1000
192+
return round(value, 3)
193+
178194
@property
179195
def W(self) -> Decimal:
180196
"""Power (W).

src/em511/test_em511.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,38 @@ def test_get_A() -> None:
7575
_ = meter.A
7676

7777

78+
def test_get_A_dmd() -> None:
79+
"""Test Get a_dmd."""
80+
client = MagicMock()
81+
mock_result = MagicMock()
82+
mock_result.isError.return_value = False
83+
meter = Em511(1, client)
84+
85+
"""Test 1: should pass"""
86+
mock_result.registers = [0x2904, 0x0000]
87+
client.read_input_registers.return_value = mock_result
88+
value = meter.A_dmd
89+
assert value == Decimal("10.5")
90+
91+
"""Test 2: Should pass."""
92+
mock_result.registers = [0x1860, 0x0023]
93+
client.read_input_registers.return_value = mock_result
94+
value = meter.A_dmd
95+
assert value == Decimal("2300.0")
96+
97+
"""Test 3: Should raise exception due to more registers in use than allowed."""
98+
mock_result.registers = [0x1860, 0x0023, 0x4244]
99+
client.read_input_registers.return_value = mock_result
100+
with pytest.raises(ValueError, match="Unexpected register count:"):
101+
_ = meter.A_dmd
102+
103+
"""Test 4: Should raise exception if input value exceeds maximum value, display shows 'EEE', 32-bit register."""
104+
mock_result.registers = [0xFFFF, 0x7FFF]
105+
client.read_input_registers.return_value = mock_result
106+
with pytest.raises(ValueError, match="Input overflow EEE for 32-bit register: "):
107+
_ = meter.A_dmd
108+
109+
78110
def test_get_W() -> None:
79111
"""Test Get w."""
80112
client = MagicMock()

0 commit comments

Comments
 (0)