Skip to content

Commit 46bcb7a

Browse files
committed
Merge branch 'dev'
2 parents a8e74f8 + aba7c92 commit 46bcb7a

File tree

15 files changed

+125
-39
lines changed

15 files changed

+125
-39
lines changed

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ repos:
1111
- id: check-yaml
1212
- id: check-added-large-files
1313
# run ruff with --fix before black
14-
- repo: https://github.com/charliermarsh/ruff-pre-commit
15-
rev: 'v0.0.277'
14+
- repo: https://github.com/astral-sh/ruff-pre-commit
15+
rev: 'v0.0.287'
1616
hooks:
1717
- id: ruff
1818
args: [--fix, --exit-non-zero-on-fix]

API_changes.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@
22
PyModbus - API changes.
33
=======================
44

5+
-------------
6+
Version 3.6.0 (future)
7+
-------------
8+
9+
10+
-------------
11+
Version 3.5.1
12+
-------------
13+
No changes.
14+
515
-------------
616
Version 3.5.0
717
-------------

CHANGELOG.rst

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
All these version were not possible without volunteers!
22
`AUTHORS` contains a complete list for each major version.
33

4+
version 3.5.1
5+
----------------------------------------------------------
6+
- Always close socket on error (reset_sock). (#1767)
7+
- Revert reset_socket change.
8+
- add close_comm_on_error to example.
9+
- Test long term (HomeAsistant problem). (#1765)
10+
- Update ruff to 0.0.287 (#1764)
11+
- Remove references to ModbusSerialServer.start (#1759) (#1762)
12+
- Readd test to get 100% coverage.
13+
- transport: Don't raise a RunTimeError in ModbusProtocol.error_received() (#1758)
14+
415
version 3.5.0
516
----------------------------------------------------------
617
- Async retry (#1752)

MAKE_RELEASE.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ Prepare/make release on dev.
1212
* Update pymodbus/__init__.py with version number (__version__ X.Y.Zpre)
1313
* Update README.rst "Supported versions"
1414
* Update CHANGELOG.rst
15-
* Add commits from last release, but selectively !
16-
git log --oneline v3.3.0..HEAD > commit.log
17-
git log --pretty="%an" v3.0.0..HEAD | sort -uf >> AUTHORS
15+
* Add commits from last release, but kselectively !
16+
git log --oneline v3.5.1..HEAD > commit.log
17+
git log --pretty="%an" v3.5.1..HEAD | sort -uf >> AUTHORS
1818
update AUTHORS
1919
* Commit, push and merge.
2020
* Checkout master locally

examples/contrib/solar.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#!/usr/bin/env python3
2+
"""Pymodbus Synchronous Client Example.
3+
4+
Modified to test long term connection.
5+
6+
"""
7+
import logging
8+
from time import sleep
9+
10+
from pymodbus import pymodbus_apply_logging_config
11+
12+
# --------------------------------------------------------------------------- #
13+
# import the various client implementations
14+
# --------------------------------------------------------------------------- #
15+
from pymodbus.client import ModbusTcpClient
16+
from pymodbus.exceptions import ModbusException
17+
from pymodbus.transaction import ModbusSocketFramer
18+
19+
20+
logging.basicConfig()
21+
_logger = logging.getLogger(__file__)
22+
_logger.setLevel(logging.DEBUG)
23+
24+
25+
def main():
26+
"""Run client setup."""
27+
pymodbus_apply_logging_config(logging.DEBUG)
28+
_logger.info("### Client starting")
29+
client = ModbusTcpClient(
30+
"modbusServer.lan",
31+
port=502,
32+
# Common optional paramers:
33+
framer=ModbusSocketFramer,
34+
timeout=1,
35+
retry_on_empty=True,
36+
close_comm_on_error=True,
37+
)
38+
client.connect()
39+
_logger.info("### Client connected")
40+
sleep(5)
41+
_logger.info("### Client starting")
42+
sleep_time = 2
43+
for count in range(int(60 / sleep_time) * 60 * 3): # 3 hours
44+
_logger.info(f"Running loop {count}")
45+
solar_calls(client)
46+
sleep(sleep_time) # scan_interval
47+
client.close()
48+
_logger.info("### End of Program")
49+
50+
51+
def solar_calls(client):
52+
"""Test connection works."""
53+
for addr, count in (
54+
(32008, 1),
55+
(32009, 1),
56+
(32010, 1),
57+
(32016, 1),
58+
(32017, 1),
59+
(32018, 1),
60+
(32019, 1),
61+
(32064, 2),
62+
(32078, 2),
63+
(32080, 2),
64+
(32114, 2),
65+
(37113, 2),
66+
(32078, 2),
67+
(32078, 2),
68+
):
69+
lazy_error_count = 15
70+
while lazy_error_count > 0:
71+
try:
72+
rr = client.read_coils(addr, count, slave=1)
73+
except ModbusException as exc:
74+
_logger.debug(f"TEST: exception lazy({lazy_error_count}) {exc}")
75+
lazy_error_count -= 1
76+
continue
77+
if not hasattr(rr, "registers"):
78+
_logger.debug(f"TEST: no registers lazy({lazy_error_count})")
79+
lazy_error_count -= 1
80+
continue
81+
break
82+
if not lazy_error_count:
83+
raise RuntimeError("HARD ERROR, more than 15 retries!")
84+
85+
86+
if __name__ == "__main__":
87+
main() # pragma: no cover

pymodbus/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@
1212
from pymodbus.logging import pymodbus_apply_logging_config
1313

1414

15-
__version__ = "3.5.0"
15+
__version__ = "3.5.1"
1616
__version_full__ = f"[pymodbus, version {__version__}]"

pymodbus/mei_message.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ def decode(self, data):
203203
while count < len(data):
204204
object_id, object_length = struct.unpack(">BB", data[count : count + 2])
205205
count += object_length + 2
206-
if object_id not in self.information.keys():
206+
if object_id not in self.information:
207207
self.information[object_id] = data[count - object_length : count]
208208
elif isinstance(self.information[object_id], list):
209209
self.information[object_id].append(data[count - object_length : count])

pymodbus/repl/client/helper.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,7 @@ def get_meta(self, cmd):
147147
def __str__(self):
148148
"""Return string representation."""
149149
if self.doc:
150-
return "Command {:>50}{:<20}".format( # pylint: disable=consider-using-f-string
151-
self.name, self.doc
152-
)
150+
return f"Command {self.name:>50}{self.doc:<20}"
153151
return f"Command {self.name}"
154152

155153

pymodbus/repl/client/main.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -191,9 +191,9 @@ def _print_command_help(self, commands):
191191
if cmd != "help":
192192
print_formatted_text(
193193
HTML(
194-
"<skyblue>{:45s}</skyblue>" # pylint: disable=consider-using-f-string
195-
"<seagreen>{:100s}"
196-
"</seagreen>".format(cmd, obj.help_text)
194+
f"<skyblue>{cmd:45s}</skyblue>"
195+
f"<seagreen>{obj.help_text:100s}"
196+
"</seagreen>"
197197
)
198198
)
199199

@@ -263,11 +263,6 @@ def run(self):
263263
"--retry-on-error", is_flag=True, default=False, help="Retry on error response"
264264
)
265265
@click.option("--retries", default=3, help="Retry count")
266-
@click.option(
267-
"--reset-socket/--no-reset-socket",
268-
default=True,
269-
help="Reset client socket on error",
270-
)
271266
@click.pass_context
272267
def main(
273268
ctx,
@@ -276,7 +271,6 @@ def main(
276271
retry_on_empty,
277272
retry_on_error,
278273
retries,
279-
reset_socket,
280274
):
281275
"""Run Main."""
282276
if verbose:
@@ -291,7 +285,6 @@ def main(
291285
"retry_on_empty": retry_on_empty,
292286
"retry_on_invalid": retry_on_error,
293287
"retries": retries,
294-
"reset_socket": reset_socket,
295288
}
296289

297290

pymodbus/server/reactive/main.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -237,18 +237,10 @@ async def start_modbus_server(self, app):
237237
"""
238238
try:
239239
if hasattr(asyncio, "create_task"):
240-
if isinstance(self._modbus_server, ModbusSerialServer):
241-
app["modbus_serial_server"] = asyncio.create_task(
242-
self._modbus_server.start()
243-
)
244240
app["modbus_server"] = asyncio.create_task(
245241
self._modbus_server.serve_forever()
246242
)
247243
else:
248-
if isinstance(self._modbus_server, ModbusSerialServer):
249-
app["modbus_serial_server"] = asyncio.ensure_future(
250-
self._modbus_server.start()
251-
)
252244
app["modbus_server"] = asyncio.ensure_future(
253245
self._modbus_server.serve_forever()
254246
)

0 commit comments

Comments
 (0)