PyPlumIO 0.5.53__py3-none-any.whl → 0.5.55__py3-none-any.whl

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/_version.py CHANGED
@@ -1,7 +1,14 @@
1
1
  # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
3
 
4
- __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
5
12
 
6
13
  TYPE_CHECKING = False
7
14
  if TYPE_CHECKING:
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
9
16
  from typing import Union
10
17
 
11
18
  VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
12
20
  else:
13
21
  VERSION_TUPLE = object
22
+ COMMIT_ID = object
14
23
 
15
24
  version: str
16
25
  __version__: str
17
26
  __version_tuple__: VERSION_TUPLE
18
27
  version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
19
30
 
20
- __version__ = version = '0.5.53'
21
- __version_tuple__ = version_tuple = (0, 5, 53)
31
+ __version__ = version = '0.5.55'
32
+ __version_tuple__ = version_tuple = (0, 5, 55)
33
+
34
+ __commit_id__ = commit_id = None
@@ -195,6 +195,7 @@ class PhysicalDevice(Device, ABC):
195
195
  """
196
196
  _LOGGER.info("Requesting '%s' with %s", name, repr(frame_type))
197
197
  request = await Request.create(frame_type, recipient=self.address)
198
+ initial_retries = retries
198
199
  while retries > 0:
199
200
  try:
200
201
  self.queue.put_nowait(request)
@@ -204,7 +205,7 @@ class PhysicalDevice(Device, ABC):
204
205
 
205
206
  raise RequestError(
206
207
  f"Failed to request '{name}' with frame type '{frame_type}' after "
207
- f"{retries} retries.",
208
+ f"{initial_retries} retries.",
208
209
  frame_type=frame_type,
209
210
  )
210
211
 
@@ -139,6 +139,8 @@ REQUIRED: tuple[DataFrameDescription, ...] = (
139
139
 
140
140
  REQUIRED_TYPES = [description.frame_type for description in REQUIRED]
141
141
 
142
+ SETUP_TIMEOUT: Final = 60.0
143
+
142
144
 
143
145
  class EcoMAX(PhysicalDevice):
144
146
  """Represents an ecoMAX controller."""
@@ -233,10 +235,19 @@ class EcoMAX(PhysicalDevice):
233
235
  await super().shutdown()
234
236
 
235
237
  @event_listener
236
- async def on_event_setup(self, setup: bool) -> None:
238
+ async def on_event_setup(self, setup: bool) -> bool:
237
239
  """Request frames required to set up an ecoMAX entry."""
238
240
  _LOGGER.debug("Setting up device entry")
239
- await self.wait_for(ATTR_SENSORS)
241
+
242
+ try:
243
+ await self.wait_for(ATTR_SENSORS, timeout=SETUP_TIMEOUT)
244
+ except asyncio.TimeoutError:
245
+ _LOGGER.error(
246
+ "Could not setup device entry; no response from device for %u seconds",
247
+ SETUP_TIMEOUT,
248
+ )
249
+ return False
250
+
240
251
  results = await asyncio.gather(
241
252
  *(
242
253
  self.request(description.provides, description.frame_type)
@@ -253,6 +264,7 @@ class EcoMAX(PhysicalDevice):
253
264
  self.dispatch_nowait(ATTR_FRAME_ERRORS, errors)
254
265
 
255
266
  _LOGGER.debug("Device entry setup done")
267
+ return True
256
268
 
257
269
  @event_listener
258
270
  async def on_event_ecomax_parameters(
pyplumio/filters.py CHANGED
@@ -186,9 +186,10 @@ class _Aggregate(Filter):
186
186
  self._values.append(new_value)
187
187
  time_since_call = current_time - self._last_call_time
188
188
  if time_since_call >= self._timeout or len(self._values) >= self._sample_size:
189
- result = await self._callback(
189
+ sum_of_values = (
190
190
  np.sum(self._values) if numpy_installed else sum(self._values)
191
191
  )
192
+ result = await self._callback(float(sum_of_values))
192
193
  self._last_call_time = current_time
193
194
  self._values = []
194
195
  return result
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyPlumIO
3
- Version: 0.5.53
3
+ Version: 0.5.55
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
@@ -28,23 +28,23 @@ Requires-Dist: pyserial-asyncio==0.6
28
28
  Requires-Dist: typing-extensions<5.0,>=4.14.0
29
29
  Provides-Extra: test
30
30
  Requires-Dist: codespell==2.4.1; extra == "test"
31
- Requires-Dist: coverage==7.9.1; extra == "test"
32
- Requires-Dist: freezegun==1.5.2; extra == "test"
33
- Requires-Dist: mypy==1.16.1; extra == "test"
31
+ Requires-Dist: coverage==7.10.5; extra == "test"
32
+ Requires-Dist: freezegun==1.5.5; extra == "test"
33
+ Requires-Dist: mypy==1.17.1; extra == "test"
34
34
  Requires-Dist: numpy<3.0.0,>=2.0.0; extra == "test"
35
35
  Requires-Dist: pyserial-asyncio-fast==0.16; extra == "test"
36
36
  Requires-Dist: pytest==8.4.1; extra == "test"
37
- Requires-Dist: pytest-asyncio==1.0.0; extra == "test"
38
- Requires-Dist: ruff==0.12.1; extra == "test"
39
- Requires-Dist: tox==4.27.0; extra == "test"
40
- Requires-Dist: types-pyserial==3.5.0.20250326; extra == "test"
37
+ Requires-Dist: pytest-asyncio==1.1.0; extra == "test"
38
+ Requires-Dist: ruff==0.12.10; extra == "test"
39
+ Requires-Dist: tox==4.28.4; extra == "test"
40
+ Requires-Dist: types-pyserial==3.5.0.20250822; extra == "test"
41
41
  Provides-Extra: docs
42
42
  Requires-Dist: sphinx==8.1.3; extra == "docs"
43
43
  Requires-Dist: sphinx_rtd_theme==3.0.2; extra == "docs"
44
44
  Requires-Dist: readthedocs-sphinx-search==0.3.2; extra == "docs"
45
45
  Provides-Extra: dev
46
46
  Requires-Dist: pyplumio[docs,test]; extra == "dev"
47
- Requires-Dist: pre-commit==4.2.0; extra == "dev"
47
+ Requires-Dist: pre-commit==4.3.0; extra == "dev"
48
48
  Requires-Dist: tomli==2.2.1; extra == "dev"
49
49
  Dynamic: license-file
50
50
 
@@ -1,17 +1,17 @@
1
1
  pyplumio/__init__.py,sha256=3H5SO4WFw5mBTFeEyD4w0H8-MsNo93NyOH3RyMN7IS0,3337
2
2
  pyplumio/__main__.py,sha256=3IwHHSq-iay5FaeMc95klobe-xv82yydSKcBE7BFZ6M,500
3
- pyplumio/_version.py,sha256=XU3GvfwHGD0uhY3L2CgqZXptcJXNuiDPHBlo4yPL1hY,513
3
+ pyplumio/_version.py,sha256=G1TzBNDMFivoxxcx0zhCWDpZU92nh3Fwl-CwzCVn15g,706
4
4
  pyplumio/connection.py,sha256=u-iOzEUqoEEL4YLpLtzBWi5Qy8_RABgKD8DyXf-er-4,5892
5
5
  pyplumio/const.py,sha256=eoq-WNJ8TO3YlP7dC7KkVQRKGjt9FbRZ6M__s29vb1U,5659
6
6
  pyplumio/data_types.py,sha256=BTDxwErRo_odvFT5DNfIniNh8ZfyjRKEDaJmoEJqdEg,9426
7
7
  pyplumio/exceptions.py,sha256=_B_0EgxDxd2XyYv3WpZM733q0cML5m6J-f55QOvYRpI,996
8
- pyplumio/filters.py,sha256=gW3XadVYIMunpHmVQRLc_dAqTldKZl8yvGjTTIWNKXc,15607
8
+ pyplumio/filters.py,sha256=QEtOptXym2Fb82cdPpS1dajkTpvYi3VuQaYoLl4CSQ4,15658
9
9
  pyplumio/protocol.py,sha256=DWM-yJnm2EQPLvGzXNlkQ0IpKQn44e-WkNB_DqZAag8,8313
10
10
  pyplumio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  pyplumio/stream.py,sha256=zFMKZ_GxsSGcaBTJigVM1CK3uGjlEJXgcvKqus8MDzk,7740
12
12
  pyplumio/utils.py,sha256=ktV8_Th2DiwQ0W6afOCau9kBJ8pOrqR-SM2Y2GRy-xE,1869
13
- pyplumio/devices/__init__.py,sha256=OLPY_Kk5E2SiJ4FLN2g6zmKQdQfutePV5jRH9kRHAMA,8260
14
- pyplumio/devices/ecomax.py,sha256=3_Hk6RaQ2e9WqIJ2NdPhofgVFjLbWIyR3TsRmMG35WY,16043
13
+ pyplumio/devices/__init__.py,sha256=d0E5hTV7UPa8flq8TNlKf_jt4cOSbRigSE9jjDHrmDI,8302
14
+ pyplumio/devices/ecomax.py,sha256=1QasnLFgNCplSoDXXe5wUr8JQjr6ChSEGijamXtJZVM,16356
15
15
  pyplumio/devices/ecoster.py,sha256=X46ky5XT8jHMFq9sBW0ve8ZI_tjItQDMt4moXsW-ogY,307
16
16
  pyplumio/devices/mixer.py,sha256=7WdUVgwO4VXmaPNzh3ZWpKr2ooRXWemz2KFHAw35_Rk,2731
17
17
  pyplumio/devices/thermostat.py,sha256=MHMKe45fQ7jKlhBVObJ7McbYQKuF6-LOKSHy-9VNsCU,2253
@@ -56,8 +56,8 @@ pyplumio/structures/statuses.py,sha256=1h-EUw1UtuS44E19cNOSavUgZeAxsLgX3iS0eVC8p
56
56
  pyplumio/structures/temperatures.py,sha256=2VD3P_vwp9PEBkOn2-WhifOR8w-UYNq35aAxle0z2Vg,2831
57
57
  pyplumio/structures/thermostat_parameters.py,sha256=st3x3HkjQm3hqBrn_fpvPDQu8fuc-Sx33ONB19ViQak,3007
58
58
  pyplumio/structures/thermostat_sensors.py,sha256=rO9jTZWGQpThtJqVdbbv8sYMYHxJi4MfwZQza69L2zw,3399
59
- pyplumio-0.5.53.dist-info/licenses/LICENSE,sha256=m-UuZFjXJ22uPTGm9kSHS8bqjsf5T8k2wL9bJn1Y04o,1088
60
- pyplumio-0.5.53.dist-info/METADATA,sha256=GxKUdJNkna132kU5kPYV8_piH9cqw34mVUnflq1L1Rc,5615
61
- pyplumio-0.5.53.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
62
- pyplumio-0.5.53.dist-info/top_level.txt,sha256=kNBz9UPPkPD9teDn3U_sEy5LjzwLm9KfADCXtBlbw8A,9
63
- pyplumio-0.5.53.dist-info/RECORD,,
59
+ pyplumio-0.5.55.dist-info/licenses/LICENSE,sha256=m-UuZFjXJ22uPTGm9kSHS8bqjsf5T8k2wL9bJn1Y04o,1088
60
+ pyplumio-0.5.55.dist-info/METADATA,sha256=85fX-7JuFsPkNo-zO8RJrM-m82-c_V3eJHr6pMNblOk,5617
61
+ pyplumio-0.5.55.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
62
+ pyplumio-0.5.55.dist-info/top_level.txt,sha256=kNBz9UPPkPD9teDn3U_sEy5LjzwLm9KfADCXtBlbw8A,9
63
+ pyplumio-0.5.55.dist-info/RECORD,,