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.
- {pyplumio-0.6.4 → pyplumio-0.6.5}/PKG-INFO +4 -4
- {pyplumio-0.6.4 → pyplumio-0.6.5}/PyPlumIO.egg-info/PKG-INFO +4 -4
- {pyplumio-0.6.4 → pyplumio-0.6.5}/PyPlumIO.egg-info/requires.txt +3 -3
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/_version.py +3 -3
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/protocol.py +17 -13
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyproject.toml +3 -3
- {pyplumio-0.6.4 → pyplumio-0.6.5}/requirements_test.txt +3 -3
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_protocol.py +1 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/.gitattributes +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/CODE_OF_CONDUCT.md +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/dependabot.yml +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/workflows/ci.yml +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/workflows/codeql.yml +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/workflows/deploy.yml +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/.github/workflows/documentation.yml +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/.gitignore +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/.pre-commit-config.yaml +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/.qlty/qlty.toml +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/.vscode/settings.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/LICENSE +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/MANIFEST.in +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/PyPlumIO.egg-info/SOURCES.txt +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/PyPlumIO.egg-info/dependency_links.txt +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/PyPlumIO.egg-info/top_level.txt +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/README.md +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/Makefile +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/make.bat +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/callbacks.rst +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/conf.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/connecting.rst +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/frames.rst +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/index.rst +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/mixers_thermostats.rst +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/protocol.rst +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/reading.rst +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/schedules.rst +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/docs/source/writing.rst +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/images/ecomax.png +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/images/rs485.png +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/__init__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/__main__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/connection.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/const.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/data_types.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/devices/__init__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/devices/ecomax.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/devices/ecoster.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/devices/mixer.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/devices/thermostat.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/exceptions.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/filters.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/frames/__init__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/frames/messages.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/frames/requests.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/frames/responses.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/helpers/__init__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/helpers/async_cache.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/helpers/event_manager.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/helpers/factory.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/helpers/task_manager.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/parameters/__init__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/parameters/custom/__init__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/parameters/custom/ecomax_860d3_hb.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/parameters/ecomax.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/parameters/mixer.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/parameters/thermostat.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/py.typed +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/stream.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/__init__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/alerts.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/ecomax_parameters.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/frame_versions.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/mixer_parameters.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/network_info.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/product_info.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/program_version.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/regulator_data.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/regulator_data_schema.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/schedules.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/sensor_data.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/structures/thermostat_parameters.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/pyplumio/utils.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/requirements.txt +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/requirements_docs.txt +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/setup.cfg +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/__init__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/conftest.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/devices/__init__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/devices/test_ecomax.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/devices/test_ecoster.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/devices/test_init.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/devices/test_mixer.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/devices/test_thermostat.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/frames/test_init.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/frames/test_messages.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/frames/test_requests.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/frames/test_responses.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/helpers/__init__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/helpers/test_async_cache.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/helpers/test_event_manager.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/helpers/test_factory.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/helpers/test_task_manager.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/helpers/test_uid.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/__init__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/custom/__init__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/custom/test_ecomax_860d3_hb.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/custom/test_init.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/test_ecomax.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/test_init.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/test_mixers.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/parameters/test_thermostats.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/ruff.toml +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/__init__.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/test_alerts.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/test_ecomax_parameters.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/test_frame_versions.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/test_mixer_parameters.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/test_product_info.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/structures/test_schedules.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_connection.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_data_types.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_filters.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_init.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_main.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_stream.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/test_utils.py +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/messages/regulator_data.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/messages/sensor_data.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/parameters/ecomax_860d3_hb.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/alerts.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/ecomax_control.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/ecomax_parameters.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/mixer_parameters.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/set_ecomax_parameter.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/set_mixer_parameter.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/set_schedule.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/set_thermostat_parameter.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/requests/thermostat_parameters.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/alerts.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/device_available.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/ecomax_parameters.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/mixer_parameters.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/password.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/program_version.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/regulator_data_schema.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/schedules.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/thermostat_parameters.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/responses/uid.json +0 -0
- {pyplumio-0.6.4 → pyplumio-0.6.5}/tests/testdata/unknown/unknown_ecomax_parameter.json +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 6,
|
|
31
|
+
__version__ = version = '0.6.5'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 6, 5)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
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
|
-
|
|
235
|
-
|
|
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.
|
|
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
|
-
|
|
242
|
-
"""Mark
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|