PyPlumIO 0.5.44__tar.gz → 0.5.45__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.5.44 → pyplumio-0.5.45}/PKG-INFO +1 -1
  2. {pyplumio-0.5.44 → pyplumio-0.5.45}/PyPlumIO.egg-info/PKG-INFO +1 -1
  3. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/_version.py +2 -2
  4. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/devices/__init__.py +1 -1
  5. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/devices/ecomax.py +9 -0
  6. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/test_devices.py +22 -0
  7. {pyplumio-0.5.44 → pyplumio-0.5.45}/.gitattributes +0 -0
  8. {pyplumio-0.5.44 → pyplumio-0.5.45}/.github/CODE_OF_CONDUCT.md +0 -0
  9. {pyplumio-0.5.44 → pyplumio-0.5.45}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  10. {pyplumio-0.5.44 → pyplumio-0.5.45}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  11. {pyplumio-0.5.44 → pyplumio-0.5.45}/.github/dependabot.yml +0 -0
  12. {pyplumio-0.5.44 → pyplumio-0.5.45}/.github/workflows/ci.yml +0 -0
  13. {pyplumio-0.5.44 → pyplumio-0.5.45}/.github/workflows/codeql.yml +0 -0
  14. {pyplumio-0.5.44 → pyplumio-0.5.45}/.github/workflows/deploy.yml +0 -0
  15. {pyplumio-0.5.44 → pyplumio-0.5.45}/.github/workflows/documentation.yml +0 -0
  16. {pyplumio-0.5.44 → pyplumio-0.5.45}/.gitignore +0 -0
  17. {pyplumio-0.5.44 → pyplumio-0.5.45}/.pre-commit-config.yaml +0 -0
  18. {pyplumio-0.5.44 → pyplumio-0.5.45}/.qlty/qlty.toml +0 -0
  19. {pyplumio-0.5.44 → pyplumio-0.5.45}/.vscode/settings.json +0 -0
  20. {pyplumio-0.5.44 → pyplumio-0.5.45}/LICENSE +0 -0
  21. {pyplumio-0.5.44 → pyplumio-0.5.45}/MANIFEST.in +0 -0
  22. {pyplumio-0.5.44 → pyplumio-0.5.45}/PyPlumIO.egg-info/SOURCES.txt +0 -0
  23. {pyplumio-0.5.44 → pyplumio-0.5.45}/PyPlumIO.egg-info/dependency_links.txt +0 -0
  24. {pyplumio-0.5.44 → pyplumio-0.5.45}/PyPlumIO.egg-info/requires.txt +0 -0
  25. {pyplumio-0.5.44 → pyplumio-0.5.45}/PyPlumIO.egg-info/top_level.txt +0 -0
  26. {pyplumio-0.5.44 → pyplumio-0.5.45}/README.md +0 -0
  27. {pyplumio-0.5.44 → pyplumio-0.5.45}/docs/Makefile +0 -0
  28. {pyplumio-0.5.44 → pyplumio-0.5.45}/docs/make.bat +0 -0
  29. {pyplumio-0.5.44 → pyplumio-0.5.45}/docs/source/callbacks.rst +0 -0
  30. {pyplumio-0.5.44 → pyplumio-0.5.45}/docs/source/conf.py +0 -0
  31. {pyplumio-0.5.44 → pyplumio-0.5.45}/docs/source/connecting.rst +0 -0
  32. {pyplumio-0.5.44 → pyplumio-0.5.45}/docs/source/frames.rst +0 -0
  33. {pyplumio-0.5.44 → pyplumio-0.5.45}/docs/source/index.rst +0 -0
  34. {pyplumio-0.5.44 → pyplumio-0.5.45}/docs/source/mixers_thermostats.rst +0 -0
  35. {pyplumio-0.5.44 → pyplumio-0.5.45}/docs/source/protocol.rst +0 -0
  36. {pyplumio-0.5.44 → pyplumio-0.5.45}/docs/source/reading.rst +0 -0
  37. {pyplumio-0.5.44 → pyplumio-0.5.45}/docs/source/schedules.rst +0 -0
  38. {pyplumio-0.5.44 → pyplumio-0.5.45}/docs/source/writing.rst +0 -0
  39. {pyplumio-0.5.44 → pyplumio-0.5.45}/images/ecomax.png +0 -0
  40. {pyplumio-0.5.44 → pyplumio-0.5.45}/images/rs485.png +0 -0
  41. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/__init__.py +0 -0
  42. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/__main__.py +0 -0
  43. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/connection.py +0 -0
  44. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/const.py +0 -0
  45. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/data_types.py +0 -0
  46. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/devices/ecoster.py +0 -0
  47. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/devices/mixer.py +0 -0
  48. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/devices/thermostat.py +0 -0
  49. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/exceptions.py +0 -0
  50. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/filters.py +0 -0
  51. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/frames/__init__.py +0 -0
  52. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/frames/messages.py +0 -0
  53. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/frames/requests.py +0 -0
  54. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/frames/responses.py +0 -0
  55. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/helpers/__init__.py +0 -0
  56. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/helpers/async_cache.py +0 -0
  57. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/helpers/event_manager.py +0 -0
  58. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/helpers/factory.py +0 -0
  59. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/helpers/schedule.py +0 -0
  60. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/helpers/task_manager.py +0 -0
  61. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/helpers/timeout.py +0 -0
  62. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/helpers/uid.py +0 -0
  63. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/parameters/__init__.py +0 -0
  64. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/parameters/ecomax.py +0 -0
  65. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/parameters/mixer.py +0 -0
  66. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/parameters/thermostat.py +0 -0
  67. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/protocol.py +0 -0
  68. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/py.typed +0 -0
  69. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/stream.py +0 -0
  70. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/__init__.py +0 -0
  71. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/alerts.py +0 -0
  72. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/boiler_load.py +0 -0
  73. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/boiler_power.py +0 -0
  74. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/ecomax_parameters.py +0 -0
  75. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/fan_power.py +0 -0
  76. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/frame_versions.py +0 -0
  77. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/fuel_consumption.py +0 -0
  78. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/fuel_level.py +0 -0
  79. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/lambda_sensor.py +0 -0
  80. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/mixer_parameters.py +0 -0
  81. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/mixer_sensors.py +0 -0
  82. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/modules.py +0 -0
  83. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/network_info.py +0 -0
  84. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/output_flags.py +0 -0
  85. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/outputs.py +0 -0
  86. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/pending_alerts.py +0 -0
  87. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/product_info.py +0 -0
  88. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/program_version.py +0 -0
  89. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/regulator_data.py +0 -0
  90. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/regulator_data_schema.py +0 -0
  91. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/schedules.py +0 -0
  92. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/statuses.py +0 -0
  93. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/temperatures.py +0 -0
  94. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/thermostat_parameters.py +0 -0
  95. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/structures/thermostat_sensors.py +0 -0
  96. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyplumio/utils.py +0 -0
  97. {pyplumio-0.5.44 → pyplumio-0.5.45}/pyproject.toml +0 -0
  98. {pyplumio-0.5.44 → pyplumio-0.5.45}/requirements.txt +0 -0
  99. {pyplumio-0.5.44 → pyplumio-0.5.45}/requirements_docs.txt +0 -0
  100. {pyplumio-0.5.44 → pyplumio-0.5.45}/requirements_test.txt +0 -0
  101. {pyplumio-0.5.44 → pyplumio-0.5.45}/setup.cfg +0 -0
  102. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/__init__.py +0 -0
  103. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/conftest.py +0 -0
  104. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/frames/test_init.py +0 -0
  105. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/frames/test_messages.py +0 -0
  106. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/frames/test_requests.py +0 -0
  107. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/frames/test_responses.py +0 -0
  108. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/helpers/__init__.py +0 -0
  109. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/helpers/test_async_cache.py +0 -0
  110. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/helpers/test_event_manager.py +0 -0
  111. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/helpers/test_factory.py +0 -0
  112. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/helpers/test_schedule.py +0 -0
  113. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/helpers/test_task_manager.py +0 -0
  114. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/helpers/test_timeout.py +0 -0
  115. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/helpers/test_uid.py +0 -0
  116. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/parameters/__init__.py +0 -0
  117. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/parameters/test_ecomax.py +0 -0
  118. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/parameters/test_init.py +0 -0
  119. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/parameters/test_mixers.py +0 -0
  120. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/parameters/test_thermostats.py +0 -0
  121. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/ruff.toml +0 -0
  122. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/test_connection.py +0 -0
  123. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/test_data_types.py +0 -0
  124. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/test_filters.py +0 -0
  125. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/test_init.py +0 -0
  126. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/test_main.py +0 -0
  127. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/test_protocol.py +0 -0
  128. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/test_stream.py +0 -0
  129. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/test_utils.py +0 -0
  130. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/messages/regulator_data.json +0 -0
  131. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/messages/sensor_data.json +0 -0
  132. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/requests/alerts.json +0 -0
  133. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/requests/ecomax_control.json +0 -0
  134. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/requests/ecomax_parameters.json +0 -0
  135. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/requests/mixer_parameters.json +0 -0
  136. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/requests/set_ecomax_parameter.json +0 -0
  137. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/requests/set_mixer_parameter.json +0 -0
  138. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/requests/set_schedule.json +0 -0
  139. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/requests/set_thermostat_parameter.json +0 -0
  140. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/requests/thermostat_parameters.json +0 -0
  141. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/responses/alerts.json +0 -0
  142. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/responses/device_available.json +0 -0
  143. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/responses/ecomax_parameters.json +0 -0
  144. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/responses/mixer_parameters.json +0 -0
  145. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/responses/password.json +0 -0
  146. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/responses/program_version.json +0 -0
  147. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/responses/regulator_data_schema.json +0 -0
  148. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/responses/schedules.json +0 -0
  149. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/responses/thermostat_parameters.json +0 -0
  150. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/responses/uid.json +0 -0
  151. {pyplumio-0.5.44 → pyplumio-0.5.45}/tests/testdata/unknown/unknown_ecomax_parameter.json +0 -0
  152. {pyplumio-0.5.44 → pyplumio-0.5.45}/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.5.44
3
+ Version: 0.5.45
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyPlumIO
3
- Version: 0.5.44
3
+ Version: 0.5.45
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
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.5.44'
21
- __version_tuple__ = version_tuple = (0, 5, 44)
20
+ __version__ = version = '0.5.45'
21
+ __version_tuple__ = version_tuple = (0, 5, 45)
@@ -141,7 +141,7 @@ class PhysicalDevice(Device, ABC):
141
141
  @event_listener(filter=on_change)
142
142
  async def on_event_frame_versions(self, versions: dict[int, int]) -> None:
143
143
  """Check frame versions and update outdated frames."""
144
- _LOGGER.info("Received version table")
144
+ _LOGGER.info("Received frame version table")
145
145
  for frame_type, version in versions.items():
146
146
  if (
147
147
  is_known_frame_type(frame_type)
@@ -192,7 +192,16 @@ class EcoMAX(PhysicalDevice):
192
192
  self, frame_type: FrameType | int, version: int
193
193
  ) -> None:
194
194
  """Request frame version from the device."""
195
+ request_frame = False
195
196
  if frame_type not in REQUIRED_TYPES:
197
+ # Frame not in required, so we'll request it right away.
198
+ request_frame = True
199
+
200
+ if frame_type in self._frame_versions:
201
+ # Frame in required and has been requested once by setup.
202
+ request_frame = True
203
+
204
+ if request_frame:
196
205
  await super()._request_frame_version(frame_type, version)
197
206
 
198
207
  async def _set_ecomax_state(self, state: State) -> bool:
@@ -181,6 +181,28 @@ async def test_frame_versions_update(ecomax: EcoMAX) -> None:
181
181
  ]
182
182
  )
183
183
 
184
+ # Test with frame types in required list (handled by setup).
185
+ mock_put_nowait.reset_mock()
186
+ test_data = load_json_test_data("messages/sensor_data.json")[0]
187
+ with patch("asyncio.Queue.put_nowait") as mock_put_nowait:
188
+ ecomax.handle_frame(SensorDataMessage(message=test_data["message"]))
189
+ await ecomax.wait_until_done()
190
+
191
+ mock_put_nowait.assert_not_called()
192
+
193
+ # Test with frame types in required list after setup done.
194
+ mock_put_nowait.reset_mock()
195
+ test_data = load_json_test_data("messages/sensor_data.json")[0]
196
+ message = SensorDataMessage(message=test_data["message"])
197
+ message.data[ATTR_FRAME_VERSIONS] = {FrameType.REQUEST_REGULATOR_DATA_SCHEMA: 86}
198
+ with patch("asyncio.Queue.put_nowait") as mock_put_nowait:
199
+ ecomax.handle_frame(message)
200
+ await ecomax.wait_until_done()
201
+
202
+ mock_put_nowait.assert_called_once_with(
203
+ RegulatorDataSchemaRequest(recipient=DeviceType.ECOMAX)
204
+ )
205
+
184
206
 
185
207
  async def test_ecomax_data_callbacks(ecomax: EcoMAX) -> None:
186
208
  """Test callbacks dispatched on data frames."""
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