aioWiserHeatAPI 1.5.10__tar.gz → 1.5.11__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 (52) hide show
  1. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/PKG-INFO +7 -2
  2. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/README.md +6 -1
  3. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/__init__.py +1 -1
  4. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/const.py +1 -0
  5. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/rest_controller.py +8 -6
  6. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/wiserhub.py +119 -90
  7. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI.egg-info/PKG-INFO +7 -2
  8. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/LICENSE +0 -0
  9. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/cli.py +0 -0
  10. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/devices.py +0 -0
  11. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/discovery.py +0 -0
  12. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/exceptions.py +0 -0
  13. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/heating.py +0 -0
  14. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/heating_actuator.py +0 -0
  15. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/__init__.py +0 -0
  16. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/automations.py +0 -0
  17. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/battery.py +0 -0
  18. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/capabilities.py +0 -0
  19. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/cloud.py +0 -0
  20. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/device.py +0 -0
  21. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/equipment.py +0 -0
  22. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/extra_config.py +0 -0
  23. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/firmware.py +0 -0
  24. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/gps.py +0 -0
  25. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/misc.py +0 -0
  26. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/network.py +0 -0
  27. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/opentherm.py +0 -0
  28. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/signal.py +0 -0
  29. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/special_times.py +0 -0
  30. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/status.py +0 -0
  31. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/temp.py +0 -0
  32. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/helpers/zigbee.py +0 -0
  33. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/hot_water.py +0 -0
  34. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/light.py +0 -0
  35. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/moments.py +0 -0
  36. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/pte.py +0 -0
  37. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/room.py +0 -0
  38. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/roomstat.py +0 -0
  39. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/schedule.py +0 -0
  40. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/shutter.py +0 -0
  41. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/smartplug.py +0 -0
  42. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/smartvalve.py +0 -0
  43. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/smokealarm.py +0 -0
  44. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/system.py +0 -0
  45. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI/ufh.py +0 -0
  46. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI.egg-info/SOURCES.txt +0 -0
  47. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI.egg-info/dependency_links.txt +0 -0
  48. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI.egg-info/entry_points.txt +0 -0
  49. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI.egg-info/requires.txt +0 -0
  50. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/aioWiserHeatAPI.egg-info/top_level.txt +0 -0
  51. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/setup.cfg +0 -0
  52. {aioWiserHeatAPI-1.5.10 → aioWiserHeatAPI-1.5.11}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: aioWiserHeatAPI
3
- Version: 1.5.10
3
+ Version: 1.5.11
4
4
  Summary: An AsyncIO API for controlling the Drayton Wiser Heating system
5
5
  Home-page: https://github.com/msp1974/aioWiserHeatAPI
6
6
  Author: Mark Parker
@@ -18,7 +18,7 @@ Requires-Dist: aiohttp>=3.9.3
18
18
  Requires-Dist: aiofiles>=23.2.1
19
19
  Requires-Dist: pyyaml>=6.0.1
20
20
 
21
- # Drayton Wiser Hub API Async v1.5.10
21
+ # Drayton Wiser Hub API Async v1.5.11
22
22
 
23
23
  This repository contains a simple API which queries the Drayton Wiser Heating sysystem used in the UK.
24
24
 
@@ -72,6 +72,11 @@ Documentation available in [info.md](https://github.com/msp1974/wiserHeatAPIv2/b
72
72
 
73
73
  ## Changelog
74
74
 
75
+ ### v1.5.11
76
+
77
+ * Improve error management
78
+ * Add additional debug logging
79
+
75
80
  ### v1.5.10
76
81
 
77
82
  * Add retry routine to prevent hub response errors
@@ -1,4 +1,4 @@
1
- # Drayton Wiser Hub API Async v1.5.10
1
+ # Drayton Wiser Hub API Async v1.5.11
2
2
 
3
3
  This repository contains a simple API which queries the Drayton Wiser Heating sysystem used in the UK.
4
4
 
@@ -52,6 +52,11 @@ Documentation available in [info.md](https://github.com/msp1974/wiserHeatAPIv2/b
52
52
 
53
53
  ## Changelog
54
54
 
55
+ ### v1.5.11
56
+
57
+ * Improve error management
58
+ * Add additional debug logging
59
+
55
60
  ### v1.5.10
56
61
 
57
62
  * Add retry routine to prevent hub response errors
@@ -3,6 +3,6 @@ import logging
3
3
  name = "aioWiserHeatAPI"
4
4
  __all__ = ["wiserAPI", "wiserDiscovery"]
5
5
 
6
- __VERSION__ = "1.5.10"
6
+ __VERSION__ = "1.5.11"
7
7
 
8
8
  _LOGGER = logging.getLogger(__name__)
@@ -30,6 +30,7 @@ TRV_BATTERY_LEVEL_MAPPING = {
30
30
 
31
31
 
32
32
  # Other Constants
33
+ REST_RETRY_BACKOFF = [0.5, 1, 2, 3, 5]
33
34
  REST_BACKOFF_FACTOR = 1
34
35
  REST_RETRIES = 3
35
36
  REST_TIMEOUT = 10
@@ -5,12 +5,14 @@ import enum
5
5
  import json
6
6
  import re
7
7
  from dataclasses import dataclass
8
+ from datetime import datetime
8
9
  from typing import Optional
9
10
 
10
11
  import aiohttp
11
12
 
12
13
  from . import _LOGGER
13
14
  from .const import (
15
+ REST_RETRY_BACKOFF,
14
16
  REST_TIMEOUT,
15
17
  WISERHUBDOMAIN,
16
18
  WISERHUBSCHEDULES,
@@ -84,7 +86,6 @@ class _WiserRestController(object):
84
86
  raise_for_endpoint_error: bool = True,
85
87
  ):
86
88
  """Function to retry on response errors due to inconsistant isues reading from the hub."""
87
- backoff = [1, 2, 3, 5, 10]
88
89
  http_version = aiohttp.HttpVersion11
89
90
  for i in range(0, 5):
90
91
  if i > 2:
@@ -101,9 +102,11 @@ class _WiserRestController(object):
101
102
  return response
102
103
  except WiserHubResponseError as ex:
103
104
  # Last 2 attempts try http 1.0
104
- _LOGGER.debug("%s. Retrying in %is", ex, backoff[i])
105
+ _LOGGER.debug(
106
+ "%s. Retrying in %.1fs", ex, REST_RETRY_BACKOFF[i]
107
+ )
105
108
  # Backing off pause
106
- await asyncio.sleep(backoff[i])
109
+ await asyncio.sleep(REST_RETRY_BACKOFF[i])
107
110
 
108
111
  raise WiserHubConnectionError(
109
112
  f"Unable to get a valid response from the Wiser hub. "
@@ -134,7 +137,6 @@ class _WiserRestController(object):
134
137
  kwargs = {}
135
138
  kwargs["headers"] = {
136
139
  "SECRET": self._wiser_connection_info.secret,
137
- "Connection": "close",
138
140
  }
139
141
 
140
142
  # if data is not None:
@@ -232,7 +234,7 @@ class _WiserRestController(object):
232
234
  f"Error code is: {response.status}"
233
235
  )
234
236
 
235
- async def _get_hub_data(
237
+ async def get_hub_data(
236
238
  self, url: str, raise_for_endpoint_error: bool = True
237
239
  ):
238
240
  """Get data from hub"""
@@ -242,7 +244,7 @@ class _WiserRestController(object):
242
244
  raise_for_endpoint_error=raise_for_endpoint_error,
243
245
  )
244
246
 
245
- async def _get_extra_config_data(self):
247
+ async def get_extra_config_data(self):
246
248
  # Load extra config file
247
249
 
248
250
  if self._extra_config_file:
@@ -12,13 +12,10 @@ https://github.com/asantaga/wiserheatingapi
12
12
  This API allows you to get information from and control your wiserhub.
13
13
  """
14
14
 
15
- # TODO: Keep objects and update instead of recreating on hub update
16
- # TODO: Update entity values after commend issued to get current values
17
15
  import pathlib
16
+ from datetime import datetime
18
17
  from typing import Optional
19
18
 
20
- import aiohttp
21
-
22
19
  from . import __VERSION__, _LOGGER
23
20
  from .cli import log_response_to_file
24
21
  from .const import (
@@ -121,6 +118,7 @@ class WiserAPI:
121
118
  )
122
119
 
123
120
  async def read_hub_data(self):
121
+ """Update data objects form the hub."""
124
122
  await self._build_objects()
125
123
 
126
124
  # Run automations
@@ -131,119 +129,150 @@ class WiserAPI:
131
129
  if await automations.run_automations():
132
130
  await self._build_objects()
133
131
 
134
- async def _build_objects(self):
135
- """Read all data from hub and populate objects"""
136
-
137
- # Read data from hub
138
- self._domain_data = await self._wiser_rest_controller._get_hub_data(
139
- WISERHUBDOMAIN
140
- )
141
- self._network_data = await self._wiser_rest_controller._get_hub_data(
142
- WISERHUBNETWORK
143
- )
144
- self._schedule_data = await self._wiser_rest_controller._get_hub_data(
145
- WISERHUBSCHEDULES
146
- )
132
+ async def _get_hub_data(self) -> bool:
147
133
  try:
148
- self._status_data = (
149
- await self._wiser_rest_controller._get_hub_data(WISERHUBSTATUS)
134
+ start_time = datetime.now()
135
+ self._domain_data = await self._wiser_rest_controller.get_hub_data(
136
+ WISERHUBDOMAIN
150
137
  )
151
- except WiserHubRESTError:
152
- self._status_data = {}
153
-
154
- # Set hub name on rest controller
155
- self._wiser_rest_controller._hub_name = (
156
- self._network_data.get("Station", {})
157
- .get("NetworkInterface", {})
158
- .get("HostName", "")
159
- )
160
-
161
- # load extra data
162
- self._wiser_rest_controller._extra_config_file = (
163
- self._extra_config_file
164
- )
165
- await self._wiser_rest_controller._get_extra_config_data()
138
+ self._network_data = (
139
+ await self._wiser_rest_controller.get_hub_data(WISERHUBNETWORK)
140
+ )
141
+ self._schedule_data = (
142
+ await self._wiser_rest_controller.get_hub_data(
143
+ WISERHUBSCHEDULES
144
+ )
145
+ )
146
+ try:
147
+ self._status_data = (
148
+ await self._wiser_rest_controller.get_hub_data(
149
+ WISERHUBSTATUS
150
+ )
151
+ )
152
+ except WiserHubRESTError:
153
+ self._status_data = {}
166
154
 
167
- # Only get opentherm data if connected
168
- if (
169
- self._domain_data.get("System", {}).get(
155
+ # Only get opentherm data if connected
156
+ opentherm = self._domain_data.get("System", {}).get(
170
157
  "OpenThermConnectionStatus", ""
171
158
  )
172
- == "Connected"
173
- ):
174
- self._opentherm_data = (
175
- await self._wiser_rest_controller._get_hub_data(
176
- WISERHUBOPENTHERM, False
159
+ if opentherm and opentherm == "Connected":
160
+ self._opentherm_data = (
161
+ await self._wiser_rest_controller.get_hub_data(
162
+ WISERHUBOPENTHERM, False
163
+ )
177
164
  )
165
+ except (
166
+ WiserHubConnectionError,
167
+ WiserHubAuthenticationError,
168
+ WiserHubRESTError,
169
+ ) as ex:
170
+ _LOGGER.debug("Update from Wiser hub failed. %s", ex)
171
+ raise ex
172
+ else:
173
+ # Set hub name on rest controller
174
+ self._wiser_rest_controller._hub_name = (
175
+ self._network_data.get("Station", {})
176
+ .get("NetworkInterface", {})
177
+ .get("HostName", "")
178
178
  )
179
179
 
180
- if self._domain_data != {} and self._network_data != {}:
181
- # System Object
182
- _device_data = self._domain_data.get("Device", [])
183
- self._system = _WiserSystem(
184
- self._wiser_rest_controller,
185
- self._domain_data,
186
- self._network_data,
187
- _device_data,
188
- self._opentherm_data,
180
+ _LOGGER.debug(
181
+ "Update from %s successful and took %ss",
182
+ self._wiser_rest_controller._hub_name,
183
+ (datetime.now() - start_time).total_seconds(),
189
184
  )
185
+ return True
190
186
 
191
- # Schedules Collection
192
- self._schedules = _WiserScheduleCollection(
193
- self._wiser_rest_controller,
194
- self._schedule_data,
195
- self._system.sunrise_times,
196
- self._system.sunset_times,
197
- )
187
+ async def _build_objects(self):
188
+ """Read all data from hub and populate objects"""
198
189
 
199
- # Devices Collection
200
- self._devices = _WiserDeviceCollection(
201
- self._wiser_rest_controller, self._domain_data, self._schedules
202
- )
190
+ # Read data from hub
191
+ try:
192
+ await self._get_hub_data()
203
193
 
204
- # Rooms Collection
205
- room_data = self._domain_data.get("Room", [])
206
- self._rooms = _WiserRoomCollection(
207
- self._wiser_rest_controller,
208
- room_data,
209
- self._schedules.get_by_type(WiserScheduleTypeEnum.heating),
210
- self._devices,
211
- self._enable_automations,
194
+ # load extra data
195
+ self._wiser_rest_controller._extra_config_file = (
196
+ self._extra_config_file
212
197
  )
198
+ await self._wiser_rest_controller.get_extra_config_data()
213
199
 
214
- # Hot Water
215
- if self._domain_data.get("HotWater"):
216
- schedule = self._schedules.get_by_id(
217
- WiserScheduleTypeEnum.onoff,
218
- self._domain_data.get("HotWater")[0].get("ScheduleId", 0),
200
+ if self._domain_data != {} and self._network_data != {}:
201
+ # System Object
202
+ _device_data = self._domain_data.get("Device", [])
203
+ self._system = _WiserSystem(
204
+ self._wiser_rest_controller,
205
+ self._domain_data,
206
+ self._network_data,
207
+ _device_data,
208
+ self._opentherm_data,
219
209
  )
220
- self._hotwater = _WiserHotwater(
210
+
211
+ # Schedules Collection
212
+ self._schedules = _WiserScheduleCollection(
221
213
  self._wiser_rest_controller,
222
- self._domain_data.get("HotWater", {})[0],
223
- schedule,
214
+ self._schedule_data,
215
+ self._system.sunrise_times,
216
+ self._system.sunset_times,
224
217
  )
225
218
 
226
- # Heating Channels
227
- if self._domain_data.get("HeatingChannel"):
228
- self._heating_channels = _WiserHeatingChannelCollection(
229
- self._domain_data.get("HeatingChannel"), self._rooms
219
+ # Devices Collection
220
+ self._devices = _WiserDeviceCollection(
221
+ self._wiser_rest_controller,
222
+ self._domain_data,
223
+ self._schedules,
230
224
  )
231
225
 
232
- # Moments
233
- if self._domain_data.get("Moment"):
234
- self._moments = _WiserMomentCollection(
226
+ # Rooms Collection
227
+ room_data = self._domain_data.get("Room", [])
228
+ self._rooms = _WiserRoomCollection(
235
229
  self._wiser_rest_controller,
236
- self._domain_data.get("Moment"),
230
+ room_data,
231
+ self._schedules.get_by_type(WiserScheduleTypeEnum.heating),
232
+ self._devices,
233
+ self._enable_automations,
237
234
  )
238
235
 
239
- # If gets here with no exceptions then success and return true
240
- return True
236
+ # Hot Water
237
+ if self._domain_data.get("HotWater"):
238
+ schedule = self._schedules.get_by_id(
239
+ WiserScheduleTypeEnum.onoff,
240
+ self._domain_data.get("HotWater")[0].get(
241
+ "ScheduleId", 0
242
+ ),
243
+ )
244
+ self._hotwater = _WiserHotwater(
245
+ self._wiser_rest_controller,
246
+ self._domain_data.get("HotWater", {})[0],
247
+ schedule,
248
+ )
249
+
250
+ # Heating Channels
251
+ if self._domain_data.get("HeatingChannel"):
252
+ self._heating_channels = _WiserHeatingChannelCollection(
253
+ self._domain_data.get("HeatingChannel"), self._rooms
254
+ )
255
+
256
+ # Moments
257
+ if self._domain_data.get("Moment"):
258
+ self._moments = _WiserMomentCollection(
259
+ self._wiser_rest_controller,
260
+ self._domain_data.get("Moment"),
261
+ )
241
262
 
242
- return False
263
+ # If gets here with no exceptions then success and return true
264
+ return True
265
+ except (
266
+ WiserHubConnectionError,
267
+ WiserHubAuthenticationError,
268
+ WiserHubRESTError,
269
+ ) as ex:
270
+ raise ex
243
271
 
244
272
  # API properties
245
273
  @property
246
274
  def api_parameters(self):
275
+ """Rest control api parameters."""
247
276
  return self._wiser_rest_controller._api_parameters
248
277
 
249
278
  @property
@@ -327,7 +356,7 @@ class WiserAPI:
327
356
 
328
357
  # Get raw json data
329
358
  if endpoint:
330
- data = self._wiser_rest_controller._get_hub_data(endpoint)
359
+ data = self._wiser_rest_controller.get_hub_data(endpoint)
331
360
  try:
332
361
  if data:
333
362
  # Write out to file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: aioWiserHeatAPI
3
- Version: 1.5.10
3
+ Version: 1.5.11
4
4
  Summary: An AsyncIO API for controlling the Drayton Wiser Heating system
5
5
  Home-page: https://github.com/msp1974/aioWiserHeatAPI
6
6
  Author: Mark Parker
@@ -18,7 +18,7 @@ Requires-Dist: aiohttp>=3.9.3
18
18
  Requires-Dist: aiofiles>=23.2.1
19
19
  Requires-Dist: pyyaml>=6.0.1
20
20
 
21
- # Drayton Wiser Hub API Async v1.5.10
21
+ # Drayton Wiser Hub API Async v1.5.11
22
22
 
23
23
  This repository contains a simple API which queries the Drayton Wiser Heating sysystem used in the UK.
24
24
 
@@ -72,6 +72,11 @@ Documentation available in [info.md](https://github.com/msp1974/wiserHeatAPIv2/b
72
72
 
73
73
  ## Changelog
74
74
 
75
+ ### v1.5.11
76
+
77
+ * Improve error management
78
+ * Add additional debug logging
79
+
75
80
  ### v1.5.10
76
81
 
77
82
  * Add retry routine to prevent hub response errors