Skip to content

Commit ca7bbeb

Browse files
committed
datastore: change remote_datastore to be async
1 parent bafee10 commit ca7bbeb

File tree

2 files changed

+38
-58
lines changed

2 files changed

+38
-58
lines changed

pymodbus/datastore/remote.py

Lines changed: 31 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"""Remote datastore."""
2+
23
from pymodbus.datastore import ModbusBaseSlaveContext
34
from pymodbus.exceptions import NotImplementedException
45
from pymodbus.logging import Log
@@ -38,25 +39,37 @@ def validate(self, _fc_as_hex, _address, _count):
3839
"""
3940
return True
4041

41-
def getValues(self, fc_as_hex, _address, _count=1):
42+
async def async_getValues(self, fc_as_hex, address, count=1):
4243
"""Get values from real call in validate."""
4344
if fc_as_hex in self._write_fc:
4445
return [0]
4546
group_fx = self.decode(fc_as_hex)
4647
func_fc = self.__get_callbacks[group_fx]
47-
self.result = func_fc(_address, _count)
48+
kwargs = {}
49+
if self.slave:
50+
kwargs["slave"] = self.slave
51+
self.result = await getattr(self._client, func_fc)(address, count, **kwargs)
4852
return self.__extract_result(self.decode(fc_as_hex), self.result)
4953

50-
def setValues(self, fc_as_hex, address, values):
54+
async def async_setValues(self, fc_as_hex, address, values):
5155
"""Set the datastore with the supplied values."""
5256
group_fx = self.decode(fc_as_hex)
5357
if fc_as_hex not in self._write_fc:
54-
raise ValueError(f"setValues() called with an non-write function code {fc_as_hex}")
58+
raise ValueError(
59+
f"setValues() called with an non-write function code {fc_as_hex}"
60+
)
5561
func_fc = self.__set_callbacks[f"{group_fx}{fc_as_hex}"]
62+
kwargs = {}
63+
if self.slave:
64+
kwargs["slave"] = self.slave
5665
if fc_as_hex in {0x0F, 0x10}: # Write Multiple Coils, Write Multiple Registers
57-
self.result = func_fc(address, values)
66+
self.result = await getattr(self._client, func_fc)(
67+
address, values, **kwargs
68+
)
5869
else:
59-
self.result = func_fc(address, values[0])
70+
self.result = await getattr(self._client, func_fc)(
71+
address, values[0], **kwargs
72+
)
6073
if self.result.isError():
6174
return self.result
6275
return None
@@ -74,44 +87,20 @@ def __build_mapping(self):
7487
if self.slave:
7588
kwargs["slave"] = self.slave
7689
self.__get_callbacks = {
77-
"d": lambda a, c: self._client.read_discrete_inputs(
78-
a, c, **kwargs
79-
),
80-
"c": lambda a, c: self._client.read_coils(
81-
a, c, **kwargs
82-
),
83-
"h": lambda a, c: self._client.read_holding_registers(
84-
a, c, **kwargs
85-
),
86-
"i": lambda a, c: self._client.read_input_registers(
87-
a, c, **kwargs
88-
),
90+
"d": "read_discrete_inputs",
91+
"c": "read_coils",
92+
"h": "read_holding_registers",
93+
"i": "read_input_registers",
8994
}
9095
self.__set_callbacks = {
91-
"d5": lambda a, v: self._client.write_coil(
92-
a, v, **kwargs
93-
),
94-
"d15": lambda a, v: self._client.write_coils(
95-
a, v, **kwargs
96-
),
97-
"c5": lambda a, v: self._client.write_coil(
98-
a, v, **kwargs
99-
),
100-
"c15": lambda a, v: self._client.write_coils(
101-
a, v, **kwargs
102-
),
103-
"h6": lambda a, v: self._client.write_register(
104-
a, v, **kwargs
105-
),
106-
"h16": lambda a, v: self._client.write_registers(
107-
a, v, **kwargs
108-
),
109-
"i6": lambda a, v: self._client.write_register(
110-
a, v, **kwargs
111-
),
112-
"i16": lambda a, v: self._client.write_registers(
113-
a, v, **kwargs
114-
),
96+
"d5": "write_coil",
97+
"d15": "write_coils",
98+
"c5": "write_coil",
99+
"c15": "write_coils",
100+
"h6": "write_register",
101+
"h16": "write_registers",
102+
"i6": "write_register",
103+
"i16": "write_registers",
115104
}
116105
self._write_fc = (0x05, 0x06, 0x0F, 0x10)
117106

test/test_remote_datastore.py

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ def test_remote_slave_context(self):
2424

2525
async def test_remote_slave_set_values(self):
2626
"""Test setting values against a remote slave context."""
27-
client = mock.MagicMock()
28-
client.write_coils = mock.MagicMock(return_value=WriteMultipleCoilsResponse())
29-
client.write_registers = mock.MagicMock(
27+
client = mock.AsyncMock()
28+
client.write_coils = mock.AsyncMock(return_value=WriteMultipleCoilsResponse())
29+
client.write_registers = mock.AsyncMock(
3030
return_value=ExceptionResponse(0x10, 0x02)
3131
)
3232

@@ -36,39 +36,30 @@ async def test_remote_slave_set_values(self):
3636
result = await context.async_setValues(0x10, 1, [1])
3737
assert result.exception_code == 0x02
3838
assert result.function_code == 0x90
39-
result = context.setValues(0x10, 1, [1])
40-
assert result.exception_code == 0x02
41-
assert result.function_code == 0x90
4239

4340
async def test_remote_slave_get_values(self):
4441
"""Test getting values from a remote slave context."""
45-
client = mock.MagicMock()
46-
client.read_coils = mock.MagicMock(return_value=ReadCoilsResponse([1] * 10))
47-
client.read_input_registers = mock.MagicMock(
42+
client = mock.AsyncMock()
43+
client.read_coils = mock.AsyncMock(return_value=ReadCoilsResponse([1] * 10))
44+
client.read_input_registers = mock.AsyncMock(
4845
return_value=ReadInputRegistersResponse([10] * 10)
4946
)
50-
client.read_holding_registers = mock.MagicMock(
47+
client.read_holding_registers = mock.AsyncMock(
5148
return_value=ExceptionResponse(0x15)
5249
)
5350

5451
context = RemoteSlaveContext(client)
5552
context.validate(1, 0, 10)
5653
result = await context.async_getValues(1, 0, 10)
5754
assert result == [1] * 10
58-
result = context.getValues(1, 0, 10)
59-
assert result == [1] * 10
6055

6156
context.validate(4, 0, 10)
6257
result = await context.async_getValues(4, 0, 10)
6358
assert result == [10] * 10
64-
result = context.getValues(4, 0, 10)
65-
assert result == [10] * 10
6659

6760
context.validate(3, 0, 10)
6861
result = await context.async_getValues(3, 0, 10)
6962
assert result != [10] * 10
70-
result = context.getValues(3, 0, 10)
71-
assert result != [10] * 10
7263

7364
def test_remote_slave_validate_values(self):
7465
"""Test validating against a remote slave context."""

0 commit comments

Comments
 (0)