Skip to content

Commit 04117df

Browse files
authored
Remove self.params from async client (#1640)
1 parent 270cdb5 commit 04117df

File tree

16 files changed

+359
-348
lines changed

16 files changed

+359
-348
lines changed

pymodbus/client/base.py

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,13 @@ class ModbusBaseClient(ModbusClientMixin, ModbusProtocol):
5252
class _params:
5353
"""Parameter class."""
5454

55-
host: str = None
56-
port: str | int = None
57-
timeout: float = None
5855
retries: int = None
5956
retry_on_empty: bool = None
6057
close_comm_on_error: bool = None
6158
strict: bool = None
6259
broadcast_enable: bool = None
6360
reconnect_delay: int = None
6461

65-
baudrate: int = None
66-
bytesize: int = None
67-
parity: str = None
68-
stopbits: int = None
69-
handle_local_echo: bool = None
70-
7162
source_address: tuple[str, int] = None
7263

7364
server_hostname: str = None
@@ -89,28 +80,32 @@ def __init__( # pylint: disable=too-many-arguments
8980
"""Initialize a client instance."""
9081
ModbusClientMixin.__init__(self)
9182
self.use_sync = kwargs.get("use_sync", False)
83+
setup_params = CommParams(
84+
comm_type=kwargs.get("CommType"),
85+
comm_name="comm",
86+
source_address=kwargs.get("source_address", ("127.0.0.1", 0)),
87+
reconnect_delay=reconnect_delay,
88+
reconnect_delay_max=reconnect_delay_max,
89+
timeout_connect=timeout,
90+
host=kwargs.get("host", None),
91+
port=kwargs.get("port", None),
92+
sslctx=kwargs.get("sslctx", None),
93+
baudrate=kwargs.get("baudrate", None),
94+
bytesize=kwargs.get("bytesize", None),
95+
parity=kwargs.get("parity", None),
96+
stopbits=kwargs.get("stopbits", None),
97+
handle_local_echo=kwargs.get("handle_local_echo", False),
98+
)
9299
if not self.use_sync:
93100
ModbusProtocol.__init__(
94101
self,
95-
CommParams(
96-
comm_type=kwargs.get("CommType"),
97-
comm_name="comm",
98-
reconnect_delay=reconnect_delay,
99-
reconnect_delay_max=reconnect_delay_max,
100-
timeout_connect=timeout,
101-
host=kwargs.get("host", None),
102-
port=kwargs.get("port", None),
103-
sslctx=kwargs.get("sslctx", None),
104-
baudrate=kwargs.get("baudrate", None),
105-
bytesize=kwargs.get("bytesize", None),
106-
parity=kwargs.get("parity", None),
107-
stopbits=kwargs.get("stopbits", None),
108-
),
102+
setup_params,
109103
False,
110104
)
105+
else:
106+
self.comm_params = setup_params
111107
self.framer = framer
112108
self.params = self._params()
113-
self.params.timeout = float(timeout)
114109
self.params.retries = int(retries)
115110
self.params.retry_on_empty = bool(retry_on_empty)
116111
self.params.close_comm_on_error = bool(close_comm_on_error)
@@ -199,7 +194,9 @@ async def async_execute(self, request=None):
199194
resp = b"Broadcast write sent - no response expected"
200195
else:
201196
try:
202-
resp = await asyncio.wait_for(req, timeout=self.params.timeout)
197+
resp = await asyncio.wait_for(
198+
req, timeout=self.comm_params.timeout_connect
199+
)
203200
except asyncio.exceptions.TimeoutError:
204201
self.close(reconnect=True)
205202
raise
@@ -315,4 +312,6 @@ def __str__(self):
315312
316313
:returns: The string representation
317314
"""
318-
return f"{self.__class__.__name__} {self.params.host}:{self.params.port}"
315+
return (
316+
f"{self.__class__.__name__} {self.comm_params.host}:{self.comm_params.port}"
317+
)

pymodbus/client/serial.py

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ def __init__(
5252
bytesize: int = 8,
5353
parity: str = "N",
5454
stopbits: int = 1,
55-
handle_local_echo: bool = False,
5655
**kwargs: Any,
5756
) -> None:
5857
"""Initialize Asyncio Modbus Serial Client."""
@@ -68,12 +67,6 @@ def __init__(
6867
stopbits=stopbits,
6968
**kwargs,
7069
)
71-
self.params.port = port
72-
self.params.baudrate = baudrate
73-
self.params.bytesize = bytesize
74-
self.params.parity = parity
75-
self.params.stopbits = stopbits
76-
self.params.handle_local_echo = handle_local_echo
7770

7871
@property
7972
def connected(self):
@@ -132,24 +125,27 @@ def __init__(
132125
bytesize: int = 8,
133126
parity: str = "N",
134127
stopbits: int = 1,
135-
handle_local_echo: bool = False,
136128
**kwargs: Any,
137129
) -> None:
138130
"""Initialize Modbus Serial Client."""
139131
self.transport = None
140132
kwargs["use_sync"] = True
141-
super().__init__(framer=framer, **kwargs)
142-
self.params.port = port
143-
self.params.baudrate = baudrate
144-
self.params.bytesize = bytesize
145-
self.params.parity = parity
146-
self.params.stopbits = stopbits
147-
self.params.handle_local_echo = handle_local_echo
133+
ModbusBaseClient.__init__(
134+
self,
135+
framer=framer,
136+
CommType=CommType.SERIAL,
137+
host=port,
138+
baudrate=baudrate,
139+
bytesize=bytesize,
140+
parity=parity,
141+
stopbits=stopbits,
142+
**kwargs,
143+
)
148144
self.socket = None
149145

150146
self.last_frame_end = None
151147

152-
self._t0 = float(1 + 8 + 2) / self.params.baudrate
148+
self._t0 = float(1 + 8 + 2) / self.comm_params.baudrate
153149

154150
"""
155151
The minimum delay is 0.01s and the maximum can be set to 0.05s.
@@ -161,7 +157,7 @@ def __init__(
161157
else 0.05
162158
)
163159

164-
if self.params.baudrate > 19200:
160+
if self.comm_params.baudrate > 19200:
165161
self.silent_interval = 1.75 / 1000 # ms
166162
else:
167163
self.inter_char_timeout = 1.5 * self._t0
@@ -179,12 +175,12 @@ def connect(self): # pylint: disable=invalid-overridden-method
179175
return True
180176
try:
181177
self.socket = serial.serial_for_url(
182-
self.params.port,
183-
timeout=self.params.timeout,
184-
bytesize=self.params.bytesize,
185-
stopbits=self.params.stopbits,
186-
baudrate=self.params.baudrate,
187-
parity=self.params.parity,
178+
self.comm_params.host,
179+
timeout=self.comm_params.timeout_connect,
180+
bytesize=self.comm_params.bytesize,
181+
stopbits=self.comm_params.stopbits,
182+
baudrate=self.comm_params.baudrate,
183+
parity=self.comm_params.parity,
188184
)
189185
if isinstance(self.framer, ModbusRtuFramer):
190186
if self.params.strict:
@@ -244,10 +240,13 @@ def _wait_for_data(self):
244240
"""Wait for data."""
245241
size = 0
246242
more_data = False
247-
if self.params.timeout is not None and self.params.timeout:
243+
if (
244+
self.comm_params.timeout_connect is not None
245+
and self.comm_params.timeout_connect
246+
):
248247
condition = partial(
249248
lambda start, timeout: (time.time() - start) <= timeout,
250-
timeout=self.params.timeout,
249+
timeout=self.comm_params.timeout_connect,
251250
)
252251
else:
253252
condition = partial(lambda dummy1, dummy2: True, dummy2=None)
@@ -286,11 +285,11 @@ def is_socket_open(self):
286285

287286
def __str__(self):
288287
"""Build a string representation of the connection."""
289-
return f"ModbusSerialClient({self.framer} baud[{self.params.baudrate}])"
288+
return f"ModbusSerialClient({self.framer} baud[{self.comm_params.baudrate}])"
290289

291290
def __repr__(self):
292291
"""Return string representation."""
293292
return (
294293
f"<{self.__class__.__name__} at {hex(id(self))} socket={self.socket}, "
295-
f"framer={self.framer}, timeout={self.params.timeout}>"
294+
f"framer={self.framer}, timeout={self.comm_params.timeout_connect}>"
296295
)

pymodbus/client/tcp.py

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ def __init__(
5454
port=port,
5555
**kwargs,
5656
)
57-
self.params.host = host
58-
self.params.port = port
5957
self.params.source_address = source_address
6058

6159
async def connect(self) -> bool:
@@ -111,11 +109,11 @@ def __init__(
111109
**kwargs: Any,
112110
) -> None:
113111
"""Initialize Modbus TCP Client."""
112+
if "CommType" not in kwargs:
113+
kwargs["CommType"] = CommType.TCP
114114
kwargs["use_sync"] = True
115115
self.transport = None
116116
super().__init__(framer=framer, host=host, port=port, **kwargs)
117-
self.params.host = host
118-
self.params.port = port
119117
self.params.source_address = source_address
120118
self.socket = None
121119

@@ -130,8 +128,8 @@ def connect(self): # pylint: disable=invalid-overridden-method
130128
return True
131129
try:
132130
self.socket = socket.create_connection(
133-
(self.params.host, self.params.port),
134-
timeout=self.params.timeout,
131+
(self.comm_params.host, self.comm_params.port),
132+
timeout=self.comm_params.timeout_connect,
135133
source_address=self.params.source_address,
136134
)
137135
Log.debug(
@@ -141,8 +139,8 @@ def connect(self): # pylint: disable=invalid-overridden-method
141139
except OSError as msg:
142140
Log.error(
143141
"Connection to ({}, {}) failed: {}",
144-
self.params.host,
145-
self.params.port,
142+
self.comm_params.host,
143+
self.comm_params.port,
146144
msg,
147145
)
148146
self.close()
@@ -157,7 +155,7 @@ def close(self): # pylint: disable=arguments-differ
157155
def _check_read_buffer(self):
158156
"""Check read buffer."""
159157
time_ = time.time()
160-
end = time_ + self.params.timeout
158+
end = time_ + self.comm_params.timeout_connect
161159
data = None
162160
ready = select.select([self.socket], [], [], end - time_)
163161
if ready[0]:
@@ -193,7 +191,7 @@ def recv(self, size):
193191
# less than the expected size.
194192
self.socket.setblocking(0)
195193

196-
timeout = self.params.timeout
194+
timeout = self.comm_params.timeout_connect
197195

198196
# If size isn't specified read up to 4096 bytes at a time.
199197
if size is None:
@@ -270,11 +268,11 @@ def __str__(self):
270268
271269
:returns: The string representation
272270
"""
273-
return f"ModbusTcpClient({self.params.host}:{self.params.port})"
271+
return f"ModbusTcpClient({self.comm_params.host}:{self.comm_params.port})"
274272

275273
def __repr__(self):
276274
"""Return string representation."""
277275
return (
278276
f"<{self.__class__.__name__} at {hex(id(self))} socket={self.socket}, "
279-
f"ipaddr={self.params.host}, port={self.params.port}, timeout={self.params.timeout}>"
277+
f"ipaddr={self.comm_params.host}, port={self.comm_params.port}, timeout={self.comm_params.timeout_connect}>"
280278
)

pymodbus/client/tls.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,9 @@ def __init__(
127127
):
128128
"""Initialize Modbus TLS Client."""
129129
self.transport = None
130-
super().__init__(host, port=port, framer=framer, **kwargs)
130+
super().__init__(
131+
host, CommType=CommType.TLS, port=port, framer=framer, **kwargs
132+
)
131133
self.sslctx = CommParams.generate_ssl(
132134
False, certfile, keyfile, password, sslctx=sslctx
133135
)
@@ -147,28 +149,28 @@ def connect(self):
147149
if self.params.source_address:
148150
sock.bind(self.params.source_address)
149151
self.socket = self.sslctx.wrap_socket(
150-
sock, server_side=False, server_hostname=self.params.host
152+
sock, server_side=False, server_hostname=self.comm_params.host
151153
)
152-
self.socket.settimeout(self.params.timeout)
153-
self.socket.connect((self.params.host, self.params.port))
154+
self.socket.settimeout(self.comm_params.timeout_connect)
155+
self.socket.connect((self.comm_params.host, self.comm_params.port))
154156
except OSError as msg:
155157
Log.error(
156158
"Connection to ({}, {}) failed: {}",
157-
self.params.host,
158-
self.params.port,
159+
self.comm_params.host,
160+
self.comm_params.port,
159161
msg,
160162
)
161163
self.close()
162164
return self.socket is not None
163165

164166
def __str__(self):
165167
"""Build a string representation of the connection."""
166-
return f"ModbusTlsClient({self.params.host}:{self.params.port})"
168+
return f"ModbusTlsClient({self.comm_params.host}:{self.comm_params.port})"
167169

168170
def __repr__(self):
169171
"""Return string representation."""
170172
return (
171173
f"<{self.__class__.__name__} at {hex(id(self))} socket={self.socket}, "
172-
f"ipaddr={self.params.host}, port={self.params.port}, sslctx={self.sslctx}, "
173-
f"timeout={self.params.timeout}>"
174+
f"ipaddr={self.comm_params.host}, port={self.comm_params.port}, sslctx={self.sslctx}, "
175+
f"timeout={self.comm_params.timeout_connect}>"
174176
)

pymodbus/client/udp.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ def __init__(
5454
ModbusBaseClient.__init__(
5555
self, framer=framer, CommType=CommType.UDP, host=host, port=port, **kwargs
5656
)
57-
self.params.port = port
5857
self.params.source_address = source_address
5958

6059
@property
@@ -117,9 +116,9 @@ def __init__(
117116
"""Initialize Modbus UDP Client."""
118117
kwargs["use_sync"] = True
119118
self.transport = None
120-
super().__init__(framer=framer, **kwargs)
121-
self.params.host = host
122-
self.params.port = port
119+
super().__init__(
120+
framer=framer, port=port, host=host, CommType=CommType.UDP, **kwargs
121+
)
123122
self.params.source_address = source_address
124123

125124
self.socket = None
@@ -137,9 +136,9 @@ def connect(self): # pylint: disable=invalid-overridden-method
137136
if self.socket:
138137
return True
139138
try:
140-
family = ModbusUdpClient._get_address_family(self.params.host)
139+
family = ModbusUdpClient._get_address_family(self.comm_params.host)
141140
self.socket = socket.socket(family, socket.SOCK_DGRAM)
142-
self.socket.settimeout(self.params.timeout)
141+
self.socket.settimeout(self.comm_params.timeout_connect)
143142
except OSError as exc:
144143
Log.error("Unable to create udp socket {}", exc)
145144
self.close()
@@ -161,7 +160,9 @@ def send(self, request):
161160
if not self.socket:
162161
raise ConnectionException(str(self))
163162
if request:
164-
return self.socket.sendto(request, (self.params.host, self.params.port))
163+
return self.socket.sendto(
164+
request, (self.comm_params.host, self.comm_params.port)
165+
)
165166
return 0
166167

167168
def recv(self, size):
@@ -183,11 +184,11 @@ def is_socket_open(self):
183184

184185
def __str__(self):
185186
"""Build a string representation of the connection."""
186-
return f"ModbusUdpClient({self.params.host}:{self.params.port})"
187+
return f"ModbusUdpClient({self.comm_params.host}:{self.comm_params.port})"
187188

188189
def __repr__(self):
189190
"""Return string representation."""
190191
return (
191192
f"<{self.__class__.__name__} at {hex(id(self))} socket={self.socket}, "
192-
f"ipaddr={self.params.host}, port={self.params.port}, timeout={self.params.timeout}>"
193+
f"ipaddr={self.comm_params.host}, port={self.comm_params.port}, timeout={self.comm_params.timeout_connect}>"
193194
)

0 commit comments

Comments
 (0)