diff --git a/homeassistant/components/hunterdouglas_powerview/__init__.py b/homeassistant/components/hunterdouglas_powerview/__init__.py index 35b28e312bc..d1ac0950c58 100644 --- a/homeassistant/components/hunterdouglas_powerview/__init__.py +++ b/homeassistant/components/hunterdouglas_powerview/__init__.py @@ -1,6 +1,4 @@ """The Hunter Douglas PowerView integration.""" - -import asyncio import logging from aiopvapi.helpers.aiorequest import AioRequest @@ -52,11 +50,11 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: hub_address, loop=hass.loop, websession=websession, api_version=api_version ) + # default 15 second timeout for each call in upstream try: - async with asyncio.timeout(10): - hub = Hub(pv_request) - await hub.query_firmware() - device_info = await async_get_device_info(hub) + hub = Hub(pv_request) + await hub.query_firmware() + device_info = await async_get_device_info(hub) except HUB_EXCEPTIONS as err: raise ConfigEntryNotReady( f"Connection error to PowerView hub {hub_address}: {err}" @@ -75,15 +73,14 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return False try: - async with asyncio.timeout(10): - rooms = Rooms(pv_request) - room_data: PowerviewData = await rooms.get_rooms() - async with asyncio.timeout(10): - scenes = Scenes(pv_request) - scene_data: PowerviewData = await scenes.get_scenes() - async with asyncio.timeout(10): - shades = Shades(pv_request) - shade_data: PowerviewData = await shades.get_shades() + rooms = Rooms(pv_request) + room_data: PowerviewData = await rooms.get_rooms() + + scenes = Scenes(pv_request) + scene_data: PowerviewData = await scenes.get_scenes() + + shades = Shades(pv_request) + shade_data: PowerviewData = await shades.get_shades() except HUB_EXCEPTIONS as err: raise ConfigEntryNotReady( f"Connection error to PowerView hub {hub_address}: {err}" diff --git a/homeassistant/components/hunterdouglas_powerview/config_flow.py b/homeassistant/components/hunterdouglas_powerview/config_flow.py index 2b511144380..7753f4ba94b 100644 --- a/homeassistant/components/hunterdouglas_powerview/config_flow.py +++ b/homeassistant/components/hunterdouglas_powerview/config_flow.py @@ -2,7 +2,6 @@ from __future__ import annotations -import asyncio import logging from typing import TYPE_CHECKING, Any @@ -38,10 +37,9 @@ async def validate_input(hass: HomeAssistant, hub_address: str) -> dict[str, str pv_request = AioRequest(hub_address, loop=hass.loop, websession=websession) try: - async with asyncio.timeout(10): - hub = Hub(pv_request) - await hub.query_firmware() - device_info = await async_get_device_info(hub) + hub = Hub(pv_request) + await hub.query_firmware() + device_info = await async_get_device_info(hub) except HUB_EXCEPTIONS as err: raise CannotConnect from err diff --git a/homeassistant/components/hunterdouglas_powerview/coordinator.py b/homeassistant/components/hunterdouglas_powerview/coordinator.py index 2ffb463dc92..1ea47ca9d1f 100644 --- a/homeassistant/components/hunterdouglas_powerview/coordinator.py +++ b/homeassistant/components/hunterdouglas_powerview/coordinator.py @@ -2,7 +2,6 @@ from __future__ import annotations -import asyncio from datetime import timedelta import logging @@ -36,16 +35,15 @@ class PowerviewShadeUpdateCoordinator(DataUpdateCoordinator[PowerviewShadeData]) async def _async_update_data(self) -> PowerviewShadeData: """Fetch data from shade endpoint.""" - async with asyncio.timeout(10): - try: - shade_entries = await self.shades.get_shades() - except PvApiMaintenance as error: - # hub is undergoing maintenance, pause polling - raise UpdateFailed(error) from error - except HUB_EXCEPTIONS as error: - raise UpdateFailed( - f"Powerview Hub {self.hub.hub_address} did not return any data: {error}" - ) from error + try: + shade_entries = await self.shades.get_shades() + except PvApiMaintenance as error: + # hub is undergoing maintenance, pause polling + raise UpdateFailed(error) from error + except HUB_EXCEPTIONS as error: + raise UpdateFailed( + f"Powerview Hub {self.hub.hub_address} did not return any data: {error}" + ) from error if not shade_entries: raise UpdateFailed("No new shade data was returned") diff --git a/homeassistant/components/hunterdouglas_powerview/cover.py b/homeassistant/components/hunterdouglas_powerview/cover.py index ebf636c3ff6..7ff2fd55958 100644 --- a/homeassistant/components/hunterdouglas_powerview/cover.py +++ b/homeassistant/components/hunterdouglas_powerview/cover.py @@ -2,9 +2,7 @@ from __future__ import annotations -import asyncio from collections.abc import Callable, Iterable -from contextlib import suppress from dataclasses import replace from datetime import datetime, timedelta import logging @@ -68,11 +66,8 @@ async def async_setup_entry( """ for shade in pv_entry.shade_data.values(): - with suppress(TimeoutError): - # hold off to avoid spamming the hub - async with asyncio.timeout(10): - _LOGGER.debug("Initial refresh of shade: %s", shade.name) - await shade.refresh() + _LOGGER.debug("Initial refresh of shade: %s", shade.name) + await shade.refresh(suppress_timeout=True) # default 15 second timeout entities: list[ShadeEntity] = [] for shade in pv_entry.shade_data.values(): @@ -324,9 +319,7 @@ class PowerViewShadeBase(ShadeEntity, CoverEntity): # error if are already have one in flight return # suppress timeouts caused by hub nightly reboot - with suppress(TimeoutError): - async with asyncio.timeout(10): - await self._shade.refresh() + await self._shade.refresh(suppress_timeout=True) # default 15 second timeout _LOGGER.debug("Process update %s: %s", self.name, self._shade.current_position) self._async_update_shade_data(self._shade.current_position) diff --git a/homeassistant/components/hunterdouglas_powerview/manifest.json b/homeassistant/components/hunterdouglas_powerview/manifest.json index 276b10f5e8d..4120c55a7a7 100644 --- a/homeassistant/components/hunterdouglas_powerview/manifest.json +++ b/homeassistant/components/hunterdouglas_powerview/manifest.json @@ -18,6 +18,6 @@ }, "iot_class": "local_polling", "loggers": ["aiopvapi"], - "requirements": ["aiopvapi==3.0.2"], + "requirements": ["aiopvapi==3.1.1"], "zeroconf": ["_powerview._tcp.local.", "_powerview-g3._tcp.local."] } diff --git a/homeassistant/components/hunterdouglas_powerview/sensor.py b/homeassistant/components/hunterdouglas_powerview/sensor.py index c1371a1e848..bca87189e56 100644 --- a/homeassistant/components/hunterdouglas_powerview/sensor.py +++ b/homeassistant/components/hunterdouglas_powerview/sensor.py @@ -62,7 +62,7 @@ SENSORS: Final = [ native_unit_fn=lambda shade: PERCENTAGE, native_value_fn=lambda shade: shade.get_battery_strength(), create_entity_fn=lambda shade: shade.is_battery_powered(), - update_fn=lambda shade: shade.refresh_battery(), + update_fn=lambda shade: shade.refresh_battery(suppress_timeout=True), ), PowerviewSensorDescription( key="signal", @@ -72,7 +72,7 @@ SENSORS: Final = [ native_unit_fn=get_signal_native_unit, native_value_fn=lambda shade: shade.get_signal_strength(), create_entity_fn=lambda shade: shade.has_signal_strength(), - update_fn=lambda shade: shade.refresh(), + update_fn=lambda shade: shade.refresh(suppress_timeout=True), entity_registry_enabled_default=False, ), ] diff --git a/requirements_all.txt b/requirements_all.txt index 4efa0033902..8a555443f3d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -333,7 +333,7 @@ aiopulse==0.4.4 aiopurpleair==2022.12.1 # homeassistant.components.hunterdouglas_powerview -aiopvapi==3.0.2 +aiopvapi==3.1.1 # homeassistant.components.pvpc_hourly_pricing aiopvpc==4.2.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 4ccd8ed4983..8d4df18f8aa 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -306,7 +306,7 @@ aiopulse==0.4.4 aiopurpleair==2022.12.1 # homeassistant.components.hunterdouglas_powerview -aiopvapi==3.0.2 +aiopvapi==3.1.1 # homeassistant.components.pvpc_hourly_pricing aiopvpc==4.2.2 diff --git a/tests/components/hunterdouglas_powerview/fixtures/gen2/shades.json b/tests/components/hunterdouglas_powerview/fixtures/gen2/shades.json index 6852c37d883..4ed5e3fc313 100644 --- a/tests/components/hunterdouglas_powerview/fixtures/gen2/shades.json +++ b/tests/components/hunterdouglas_powerview/fixtures/gen2/shades.json @@ -67,7 +67,7 @@ "posKind1": 1, "position1": 0, "posKind2": 3, - "position3": 0 + "position2": 0 }, "name_unicode": "Family Centre", "shade_api_class": "ShadeBottomUpTiltOnClosed180" @@ -102,7 +102,7 @@ "posKind1": 1, "position1": 0, "posKind2": 3, - "position3": 0 + "position2": 0 }, "name_unicode": "Family Right", "shade_api_class": "ShadeBottomUpTiltOnClosed90" @@ -137,7 +137,7 @@ "posKind1": 1, "position1": 0, "posKind2": 3, - "position3": 0 + "position2": 0 }, "name_unicode": "Bed 2", "shade_api_class": "ShadeBottomUpTiltAnywhere" diff --git a/tests/components/hunterdouglas_powerview/fixtures/gen3/home/shades.json b/tests/components/hunterdouglas_powerview/fixtures/gen3/home/shades.json index ef9fdbd5c61..85ad99c1a0f 100644 --- a/tests/components/hunterdouglas_powerview/fixtures/gen3/home/shades.json +++ b/tests/components/hunterdouglas_powerview/fixtures/gen3/home/shades.json @@ -310,5 +310,31 @@ "bleName": "R23:E63C", "shadeGroupIds": [], "shade_api_class": "ShadeDualOverlappedTilt180" + }, + { + "batteryStatus": null, + "bleName": "AUR:881C", + "capabilities": 11, + "firmware": { + "build": 400, + "revision": 3, + "subRevision": 0 + }, + "id": 109, + "motion": null, + "name": "Q2VudGVy", + "positions": { + "light": null, + "primary": null, + "secondary": null, + "tilt": null, + "velocity": null + }, + "powerType": 12, + "ptName": "Center", + "roomId": 9, + "shadeGroupIds": [], + "type": 95, + "shade_api_class": "None" } ]