Fix somfy device recreation on update (#42462)
* Fix somfy device recreation on update If all devices are assumed state, only update every hour to ensure the token is refreshed * pylint
This commit is contained in:
parent
ca0caabce1
commit
3c8c5a814b
3 changed files with 25 additions and 7 deletions
|
@ -1,4 +1,5 @@
|
||||||
"""Support for Somfy hubs."""
|
"""Support for Somfy hubs."""
|
||||||
|
from abc import abstractmethod
|
||||||
import asyncio
|
import asyncio
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import logging
|
import logging
|
||||||
|
@ -9,6 +10,7 @@ import voluptuous as vol
|
||||||
from homeassistant.components.somfy import config_flow
|
from homeassistant.components.somfy import config_flow
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.const import CONF_CLIENT_ID, CONF_CLIENT_SECRET
|
from homeassistant.const import CONF_CLIENT_ID, CONF_CLIENT_SECRET
|
||||||
|
from homeassistant.core import callback
|
||||||
from homeassistant.helpers import (
|
from homeassistant.helpers import (
|
||||||
config_entry_oauth2_flow,
|
config_entry_oauth2_flow,
|
||||||
config_validation as cv,
|
config_validation as cv,
|
||||||
|
@ -27,7 +29,7 @@ from .const import API, CONF_OPTIMISTIC, COORDINATOR, DOMAIN
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
SCAN_INTERVAL = timedelta(minutes=1)
|
SCAN_INTERVAL = timedelta(minutes=1)
|
||||||
|
SCAN_INTERVAL_ALL_ASSUMED_STATE = timedelta(minutes=60)
|
||||||
|
|
||||||
SOMFY_AUTH_CALLBACK_PATH = "/auth/somfy/callback"
|
SOMFY_AUTH_CALLBACK_PATH = "/auth/somfy/callback"
|
||||||
SOMFY_AUTH_START = "/auth/somfy"
|
SOMFY_AUTH_START = "/auth/somfy"
|
||||||
|
@ -103,6 +105,13 @@ async def async_setup_entry(hass: HomeAssistantType, entry: ConfigEntry):
|
||||||
|
|
||||||
await coordinator.async_refresh()
|
await coordinator.async_refresh()
|
||||||
|
|
||||||
|
if all(not bool(device.states) for device in coordinator.data.values()):
|
||||||
|
_LOGGER.debug(
|
||||||
|
"All devices have assumed state. Update interval has been reduced to: %s",
|
||||||
|
SCAN_INTERVAL_ALL_ASSUMED_STATE,
|
||||||
|
)
|
||||||
|
coordinator.update_interval = SCAN_INTERVAL_ALL_ASSUMED_STATE
|
||||||
|
|
||||||
device_registry = await dr.async_get_registry(hass)
|
device_registry = await dr.async_get_registry(hass)
|
||||||
|
|
||||||
hubs = [
|
hubs = [
|
||||||
|
@ -188,3 +197,13 @@ class SomfyEntity(CoordinatorEntity, Entity):
|
||||||
def assumed_state(self):
|
def assumed_state(self):
|
||||||
"""Return if the device has an assumed state."""
|
"""Return if the device has an assumed state."""
|
||||||
return not bool(self.device.states)
|
return not bool(self.device.states)
|
||||||
|
|
||||||
|
@callback
|
||||||
|
def _handle_coordinator_update(self):
|
||||||
|
"""Process an update from the coordinator."""
|
||||||
|
self._create_device()
|
||||||
|
super()._handle_coordinator_update()
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def _create_device(self):
|
||||||
|
"""Update the device with the latest data."""
|
||||||
|
|
|
@ -49,16 +49,16 @@ class SomfyCover(SomfyEntity, RestoreEntity, CoverEntity):
|
||||||
def __init__(self, coordinator, device_id, api, optimistic):
|
def __init__(self, coordinator, device_id, api, optimistic):
|
||||||
"""Initialize the Somfy device."""
|
"""Initialize the Somfy device."""
|
||||||
super().__init__(coordinator, device_id, api)
|
super().__init__(coordinator, device_id, api)
|
||||||
self.cover = Blind(self.device, self.api)
|
|
||||||
self.categories = set(self.device.categories)
|
self.categories = set(self.device.categories)
|
||||||
self.optimistic = optimistic
|
self.optimistic = optimistic
|
||||||
self._closed = None
|
self._closed = None
|
||||||
self._is_opening = None
|
self._is_opening = None
|
||||||
self._is_closing = None
|
self._is_closing = None
|
||||||
|
self.cover = None
|
||||||
|
self._create_device()
|
||||||
|
|
||||||
async def async_update(self):
|
def _create_device(self):
|
||||||
"""Update the device with the latest data."""
|
"""Update the device with the latest data."""
|
||||||
await super().async_update()
|
|
||||||
self.cover = Blind(self.device, self.api)
|
self.cover = Blind(self.device, self.api)
|
||||||
|
|
||||||
async def async_close_cover(self, **kwargs):
|
async def async_close_cover(self, **kwargs):
|
||||||
|
|
|
@ -32,11 +32,10 @@ class SomfyCameraShutter(SomfyEntity, SwitchEntity):
|
||||||
def __init__(self, coordinator, device_id, api):
|
def __init__(self, coordinator, device_id, api):
|
||||||
"""Initialize the Somfy device."""
|
"""Initialize the Somfy device."""
|
||||||
super().__init__(coordinator, device_id, api)
|
super().__init__(coordinator, device_id, api)
|
||||||
self.shutter = CameraProtect(self.device, self.api)
|
self._create_device()
|
||||||
|
|
||||||
async def async_update(self):
|
def _create_device(self):
|
||||||
"""Update the device with the latest data."""
|
"""Update the device with the latest data."""
|
||||||
await super().async_update()
|
|
||||||
self.shutter = CameraProtect(self.device, self.api)
|
self.shutter = CameraProtect(self.device, self.api)
|
||||||
|
|
||||||
def turn_on(self, **kwargs) -> None:
|
def turn_on(self, **kwargs) -> None:
|
||||||
|
|
Loading…
Add table
Reference in a new issue