PyPlumIO 0.6.4__tar.gz → 0.6.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. {pyplumio-0.6.4 → pyplumio-0.6.5}/PKG-INFO +4 -4
  2. {pyplumio-0.6.4 → pyplumio-0.6.5}/PyPlumIO.egg-info/PKG-INFO +4 -4
  3. {pyplumio-0.6.4 → pyplumio-0.6.5}/PyPlumIO.egg-info/requires.txt +3 -3
  4. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/_version.py +3 -3
  5. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/protocol.py +17 -13
  6. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyproject.toml +3 -3
  7. {pyplumio-0.6.4 → pyplumio-0.6.5}/requirements_test.txt +3 -3
  8. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_protocol.py +1 -0
  9. {pyplumio-0.6.4 → pyplumio-0.6.5}/.gitattributes +0 -0
  10. {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/CODE_OF_CONDUCT.md +0 -0
  11. {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  12. {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  13. {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/dependabot.yml +0 -0
  14. {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/workflows/ci.yml +0 -0
  15. {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/workflows/codeql.yml +0 -0
  16. {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/workflows/deploy.yml +0 -0
  17. {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/workflows/documentation.yml +0 -0
  18. {pyplumio-0.6.4 → pyplumio-0.6.5}/.gitignore +0 -0
  19. {pyplumio-0.6.4 → pyplumio-0.6.5}/.pre-commit-config.yaml +0 -0
  20. {pyplumio-0.6.4 → pyplumio-0.6.5}/.qlty/qlty.toml +0 -0
  21. {pyplumio-0.6.4 → pyplumio-0.6.5}/.vscode/settings.json +0 -0
  22. {pyplumio-0.6.4 → pyplumio-0.6.5}/LICENSE +0 -0
  23. {pyplumio-0.6.4 → pyplumio-0.6.5}/MANIFEST.in +0 -0
  24. {pyplumio-0.6.4 → pyplumio-0.6.5}/PyPlumIO.egg-info/SOURCES.txt +0 -0
  25. {pyplumio-0.6.4 → pyplumio-0.6.5}/PyPlumIO.egg-info/dependency_links.txt +0 -0
  26. {pyplumio-0.6.4 → pyplumio-0.6.5}/PyPlumIO.egg-info/top_level.txt +0 -0
  27. {pyplumio-0.6.4 → pyplumio-0.6.5}/README.md +0 -0
  28. {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/Makefile +0 -0
  29. {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/make.bat +0 -0
  30. {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/callbacks.rst +0 -0
  31. {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/conf.py +0 -0
  32. {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/connecting.rst +0 -0
  33. {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/frames.rst +0 -0
  34. {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/index.rst +0 -0
  35. {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/mixers_thermostats.rst +0 -0
  36. {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/protocol.rst +0 -0
  37. {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/reading.rst +0 -0
  38. {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/schedules.rst +0 -0
  39. {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/writing.rst +0 -0
  40. {pyplumio-0.6.4 → pyplumio-0.6.5}/images/ecomax.png +0 -0
  41. {pyplumio-0.6.4 → pyplumio-0.6.5}/images/rs485.png +0 -0
  42. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/__init__.py +0 -0
  43. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/__main__.py +0 -0
  44. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/connection.py +0 -0
  45. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/const.py +0 -0
  46. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/data_types.py +0 -0
  47. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/devices/__init__.py +0 -0
  48. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/devices/ecomax.py +0 -0
  49. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/devices/ecoster.py +0 -0
  50. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/devices/mixer.py +0 -0
  51. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/devices/thermostat.py +0 -0
  52. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/exceptions.py +0 -0
  53. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/filters.py +0 -0
  54. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/frames/__init__.py +0 -0
  55. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/frames/messages.py +0 -0
  56. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/frames/requests.py +0 -0
  57. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/frames/responses.py +0 -0
  58. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/helpers/__init__.py +0 -0
  59. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/helpers/async_cache.py +0 -0
  60. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/helpers/event_manager.py +0 -0
  61. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/helpers/factory.py +0 -0
  62. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/helpers/task_manager.py +0 -0
  63. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/parameters/__init__.py +0 -0
  64. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/parameters/custom/__init__.py +0 -0
  65. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/parameters/custom/ecomax_860d3_hb.py +0 -0
  66. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/parameters/ecomax.py +0 -0
  67. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/parameters/mixer.py +0 -0
  68. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/parameters/thermostat.py +0 -0
  69. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/py.typed +0 -0
  70. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/stream.py +0 -0
  71. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/__init__.py +0 -0
  72. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/alerts.py +0 -0
  73. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/ecomax_parameters.py +0 -0
  74. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/frame_versions.py +0 -0
  75. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/mixer_parameters.py +0 -0
  76. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/network_info.py +0 -0
  77. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/product_info.py +0 -0
  78. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/program_version.py +0 -0
  79. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/regulator_data.py +0 -0
  80. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/regulator_data_schema.py +0 -0
  81. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/schedules.py +0 -0
  82. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/sensor_data.py +0 -0
  83. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/thermostat_parameters.py +0 -0
  84. {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/utils.py +0 -0
  85. {pyplumio-0.6.4 → pyplumio-0.6.5}/requirements.txt +0 -0
  86. {pyplumio-0.6.4 → pyplumio-0.6.5}/requirements_docs.txt +0 -0
  87. {pyplumio-0.6.4 → pyplumio-0.6.5}/setup.cfg +0 -0
  88. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/__init__.py +0 -0
  89. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/conftest.py +0 -0
  90. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/devices/__init__.py +0 -0
  91. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/devices/test_ecomax.py +0 -0
  92. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/devices/test_ecoster.py +0 -0
  93. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/devices/test_init.py +0 -0
  94. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/devices/test_mixer.py +0 -0
  95. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/devices/test_thermostat.py +0 -0
  96. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/frames/test_init.py +0 -0
  97. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/frames/test_messages.py +0 -0
  98. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/frames/test_requests.py +0 -0
  99. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/frames/test_responses.py +0 -0
  100. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/helpers/__init__.py +0 -0
  101. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/helpers/test_async_cache.py +0 -0
  102. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/helpers/test_event_manager.py +0 -0
  103. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/helpers/test_factory.py +0 -0
  104. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/helpers/test_task_manager.py +0 -0
  105. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/helpers/test_uid.py +0 -0
  106. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/__init__.py +0 -0
  107. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/custom/__init__.py +0 -0
  108. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/custom/test_ecomax_860d3_hb.py +0 -0
  109. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/custom/test_init.py +0 -0
  110. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/test_ecomax.py +0 -0
  111. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/test_init.py +0 -0
  112. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/test_mixers.py +0 -0
  113. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/test_thermostats.py +0 -0
  114. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/ruff.toml +0 -0
  115. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/__init__.py +0 -0
  116. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/test_alerts.py +0 -0
  117. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/test_ecomax_parameters.py +0 -0
  118. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/test_frame_versions.py +0 -0
  119. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/test_mixer_parameters.py +0 -0
  120. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/test_product_info.py +0 -0
  121. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/test_schedules.py +0 -0
  122. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_connection.py +0 -0
  123. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_data_types.py +0 -0
  124. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_filters.py +0 -0
  125. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_init.py +0 -0
  126. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_main.py +0 -0
  127. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_stream.py +0 -0
  128. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_utils.py +0 -0
  129. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/messages/regulator_data.json +0 -0
  130. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/messages/sensor_data.json +0 -0
  131. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/parameters/ecomax_860d3_hb.json +0 -0
  132. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/alerts.json +0 -0
  133. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/ecomax_control.json +0 -0
  134. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/ecomax_parameters.json +0 -0
  135. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/mixer_parameters.json +0 -0
  136. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/set_ecomax_parameter.json +0 -0
  137. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/set_mixer_parameter.json +0 -0
  138. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/set_schedule.json +0 -0
  139. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/set_thermostat_parameter.json +0 -0
  140. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/thermostat_parameters.json +0 -0
  141. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/alerts.json +0 -0
  142. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/device_available.json +0 -0
  143. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/ecomax_parameters.json +0 -0
  144. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/mixer_parameters.json +0 -0
  145. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/password.json +0 -0
  146. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/program_version.json +0 -0
  147. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/regulator_data_schema.json +0 -0
  148. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/schedules.json +0 -0
  149. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/thermostat_parameters.json +0 -0
  150. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/uid.json +0 -0
  151. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/unknown/unknown_ecomax_parameter.json +0 -0
  152. {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/unknown/unknown_mixer_parameter.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyPlumIO
3
- Version: 0.6.4
3
+ Version: 0.6.5
4
4
  Summary: PyPlumIO is a native ecoNET library for Plum ecoMAX controllers.
5
5
  Author-email: Denis Paavilainen <denpa@denpa.pro>
6
6
  License: MIT License
@@ -25,14 +25,14 @@ License-File: LICENSE
25
25
  Requires-Dist: pyserial-asyncio==0.6
26
26
  Provides-Extra: test
27
27
  Requires-Dist: codespell==2.4.1; extra == "test"
28
- Requires-Dist: coverage==7.11.0; extra == "test"
28
+ Requires-Dist: coverage==7.11.3; extra == "test"
29
29
  Requires-Dist: freezegun==1.5.5; extra == "test"
30
30
  Requires-Dist: mypy==1.18.2; extra == "test"
31
31
  Requires-Dist: numpy<3.0.0,>=2.0.0; extra == "test"
32
32
  Requires-Dist: pyserial-asyncio-fast==0.16; extra == "test"
33
33
  Requires-Dist: pytest==8.4.2; extra == "test"
34
34
  Requires-Dist: pytest-asyncio==1.2.0; extra == "test"
35
- Requires-Dist: ruff==0.14.3; extra == "test"
35
+ Requires-Dist: ruff==0.14.4; extra == "test"
36
36
  Requires-Dist: tox==4.32.0; extra == "test"
37
37
  Requires-Dist: types-pyserial==3.5.0.20251001; extra == "test"
38
38
  Provides-Extra: docs
@@ -41,7 +41,7 @@ Requires-Dist: sphinx_rtd_theme==3.0.2; extra == "docs"
41
41
  Requires-Dist: readthedocs-sphinx-search==0.3.2; extra == "docs"
42
42
  Provides-Extra: dev
43
43
  Requires-Dist: pyplumio[docs,test]; extra == "dev"
44
- Requires-Dist: pre-commit==4.3.0; extra == "dev"
44
+ Requires-Dist: pre-commit==4.4.0; extra == "dev"
45
45
  Requires-Dist: tomli==2.3.0; extra == "dev"
46
46
  Dynamic: license-file
47
47
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyPlumIO
3
- Version: 0.6.4
3
+ Version: 0.6.5
4
4
  Summary: PyPlumIO is a native ecoNET library for Plum ecoMAX controllers.
5
5
  Author-email: Denis Paavilainen <denpa@denpa.pro>
6
6
  License: MIT License
@@ -25,14 +25,14 @@ License-File: LICENSE
25
25
  Requires-Dist: pyserial-asyncio==0.6
26
26
  Provides-Extra: test
27
27
  Requires-Dist: codespell==2.4.1; extra == "test"
28
- Requires-Dist: coverage==7.11.0; extra == "test"
28
+ Requires-Dist: coverage==7.11.3; extra == "test"
29
29
  Requires-Dist: freezegun==1.5.5; extra == "test"
30
30
  Requires-Dist: mypy==1.18.2; extra == "test"
31
31
  Requires-Dist: numpy<3.0.0,>=2.0.0; extra == "test"
32
32
  Requires-Dist: pyserial-asyncio-fast==0.16; extra == "test"
33
33
  Requires-Dist: pytest==8.4.2; extra == "test"
34
34
  Requires-Dist: pytest-asyncio==1.2.0; extra == "test"
35
- Requires-Dist: ruff==0.14.3; extra == "test"
35
+ Requires-Dist: ruff==0.14.4; extra == "test"
36
36
  Requires-Dist: tox==4.32.0; extra == "test"
37
37
  Requires-Dist: types-pyserial==3.5.0.20251001; extra == "test"
38
38
  Provides-Extra: docs
@@ -41,7 +41,7 @@ Requires-Dist: sphinx_rtd_theme==3.0.2; extra == "docs"
41
41
  Requires-Dist: readthedocs-sphinx-search==0.3.2; extra == "docs"
42
42
  Provides-Extra: dev
43
43
  Requires-Dist: pyplumio[docs,test]; extra == "dev"
44
- Requires-Dist: pre-commit==4.3.0; extra == "dev"
44
+ Requires-Dist: pre-commit==4.4.0; extra == "dev"
45
45
  Requires-Dist: tomli==2.3.0; extra == "dev"
46
46
  Dynamic: license-file
47
47
 
@@ -2,7 +2,7 @@ pyserial-asyncio==0.6
2
2
 
3
3
  [dev]
4
4
  pyplumio[docs,test]
5
- pre-commit==4.3.0
5
+ pre-commit==4.4.0
6
6
  tomli==2.3.0
7
7
 
8
8
  [docs]
@@ -12,13 +12,13 @@ readthedocs-sphinx-search==0.3.2
12
12
 
13
13
  [test]
14
14
  codespell==2.4.1
15
- coverage==7.11.0
15
+ coverage==7.11.3
16
16
  freezegun==1.5.5
17
17
  mypy==1.18.2
18
18
  numpy<3.0.0,>=2.0.0
19
19
  pyserial-asyncio-fast==0.16
20
20
  pytest==8.4.2
21
21
  pytest-asyncio==1.2.0
22
- ruff==0.14.3
22
+ ruff==0.14.4
23
23
  tox==4.32.0
24
24
  types-pyserial==3.5.0.20251001
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.6.4'
32
- __version_tuple__ = version_tuple = (0, 6, 4)
31
+ __version__ = version = '0.6.5'
32
+ __version_tuple__ = version_tuple = (0, 6, 5)
33
33
 
34
- __commit_id__ = commit_id = 'gc17c7ed5e'
34
+ __commit_id__ = commit_id = 'g0a7324eaa'
@@ -231,16 +231,21 @@ class AsyncProtocol(Protocol, EventManager[PhysicalDevice]):
231
231
  self.frame_handler(reader=self.reader, writer=self.writer),
232
232
  name="frame_handler_task",
233
233
  )
234
- for device in self.data.values():
235
- device.dispatch_nowait(ATTR_CONNECTED, True)
234
+ self._mark_connected()
235
+ self.statistics.reset_transfer_statistics()
236
236
 
237
+ def _mark_connected(self) -> None:
238
+ """Mark connection as connected."""
237
239
  self.connected.set()
238
- self.statistics.reset_transfer_statistics()
240
+ self.network_info.server_status = True
239
241
  self.statistics.connected_since = datetime.now()
242
+ for device in self.data.values():
243
+ device.dispatch_nowait(ATTR_CONNECTED, True)
240
244
 
241
- async def _mark_disconnected(self) -> None:
242
- """Mark as protocol as disconnected."""
245
+ def _mark_disconnected(self) -> None:
246
+ """Mark connection as disconnected."""
243
247
  self.connected.clear()
248
+ self.network_info.server_status = False
244
249
  for device in self.data.values():
245
250
  device.dispatch_nowait(ATTR_CONNECTED, False)
246
251
 
@@ -254,20 +259,19 @@ class AsyncProtocol(Protocol, EventManager[PhysicalDevice]):
254
259
  async def connection_lost(self) -> None:
255
260
  """Close the connection and call connection lost callbacks."""
256
261
  if self.connected.is_set():
257
- await self._mark_disconnected()
258
- await asyncio.gather(*(callback() for callback in self.on_connection_lost))
262
+ self._mark_disconnected()
259
263
  await self._close_writer()
264
+ await asyncio.gather(*(callback() for callback in self.on_connection_lost))
260
265
 
261
266
  async def shutdown(self) -> None:
262
267
  """Shutdown the protocol and close the connection."""
263
- if self.connected.is_set():
264
- await self._mark_disconnected()
265
- await asyncio.gather(*(device.shutdown() for device in self.data.values()))
266
- await self._close_writer()
267
-
268
- self._clear_write_queue()
269
268
  self.cancel_tasks()
269
+ self._clear_write_queue()
270
270
  await self.wait_until_done()
271
+ if self.connected.is_set():
272
+ self._mark_disconnected()
273
+ await self._close_writer()
274
+ await asyncio.gather(*(device.shutdown() for device in self.data.values()))
271
275
 
272
276
  async def frame_handler(self, reader: FrameReader, writer: FrameWriter) -> None:
273
277
  """Handle frame reads and writes."""
@@ -35,14 +35,14 @@ dynamic = ["version"]
35
35
  [project.optional-dependencies]
36
36
  test = [
37
37
  "codespell==2.4.1",
38
- "coverage==7.11.0",
38
+ "coverage==7.11.3",
39
39
  "freezegun==1.5.5",
40
40
  "mypy==1.18.2",
41
41
  "numpy<3.0.0,>=2.0.0",
42
42
  "pyserial-asyncio-fast==0.16",
43
43
  "pytest==8.4.2",
44
44
  "pytest-asyncio==1.2.0",
45
- "ruff==0.14.3",
45
+ "ruff==0.14.4",
46
46
  "tox==4.32.0",
47
47
  "types-pyserial==3.5.0.20251001"
48
48
  ]
@@ -53,7 +53,7 @@ docs = [
53
53
  ]
54
54
  dev = [
55
55
  "pyplumio[test,docs]",
56
- "pre-commit==4.3.0",
56
+ "pre-commit==4.4.0",
57
57
  "tomli==2.3.0"
58
58
  ]
59
59
 
@@ -1,13 +1,13 @@
1
1
  codespell==2.4.1
2
- coverage==7.11.0
2
+ coverage==7.11.3
3
3
  freezegun==1.5.5
4
4
  mypy==1.18.2
5
5
  numpy<3.0.0,>=2.0.0
6
- pre-commit==4.3.0
6
+ pre-commit==4.4.0
7
7
  pyserial-asyncio-fast==0.16
8
8
  pytest-asyncio==1.2.0
9
9
  pytest==8.4.2
10
- ruff==0.14.3
10
+ ruff==0.14.4
11
11
  tomli==2.3.0
12
12
  tox==4.32.0
13
13
  types-pyserial==3.5.0.20251001
@@ -103,6 +103,7 @@ class TestAsyncProtocol:
103
103
  assert protocol.statistics.connected_since == NEVER
104
104
  protocol.connection_established(reader=mock_reader, writer=mock_writer)
105
105
  assert protocol.connected.is_set()
106
+ assert protocol.network_info.server_status is True
106
107
 
107
108
  # Test frame handler task was created.
108
109
  mock_frame_handler.assert_called_once_with(
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes