diff --git a/homeassistant/components/sensibo/__init__.py b/homeassistant/components/sensibo/__init__.py index b14d06c5811..5a7e09f539e 100644 --- a/homeassistant/components/sensibo/__init__.py +++ b/homeassistant/components/sensibo/__init__.py @@ -15,13 +15,15 @@ from .const import DOMAIN, LOGGER, PLATFORMS from .coordinator import SensiboDataUpdateCoordinator from .util import NoDevicesError, NoUsernameError, async_validate_api +SensiboConfigEntry = ConfigEntry["SensiboDataUpdateCoordinator"] -async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: + +async def async_setup_entry(hass: HomeAssistant, entry: SensiboConfigEntry) -> bool: """Set up Sensibo from a config entry.""" - coordinator = SensiboDataUpdateCoordinator(hass, entry) + coordinator = SensiboDataUpdateCoordinator(hass) await coordinator.async_config_entry_first_refresh() - hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator + entry.runtime_data = coordinator await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) @@ -30,11 +32,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Unload Sensibo config entry.""" - if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS): - del hass.data[DOMAIN][entry.entry_id] - if not hass.data[DOMAIN]: - del hass.data[DOMAIN] - return unload_ok + return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: diff --git a/homeassistant/components/sensibo/binary_sensor.py b/homeassistant/components/sensibo/binary_sensor.py index a34c7884ac7..6d1acd99166 100644 --- a/homeassistant/components/sensibo/binary_sensor.py +++ b/homeassistant/components/sensibo/binary_sensor.py @@ -13,12 +13,11 @@ from homeassistant.components.binary_sensor import ( BinarySensorEntity, BinarySensorEntityDescription, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import EntityCategory from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .const import DOMAIN +from . import SensiboConfigEntry from .coordinator import SensiboDataUpdateCoordinator from .entity import SensiboDeviceBaseEntity, SensiboMotionBaseEntity @@ -115,11 +114,13 @@ DESCRIPTION_BY_MODELS = {"pure": PURE_SENSOR_TYPES} async def async_setup_entry( - hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback + hass: HomeAssistant, + entry: SensiboConfigEntry, + async_add_entities: AddEntitiesCallback, ) -> None: """Set up Sensibo binary sensor platform.""" - coordinator: SensiboDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] + coordinator = entry.runtime_data entities: list[SensiboMotionSensor | SensiboDeviceSensor] = [] diff --git a/homeassistant/components/sensibo/button.py b/homeassistant/components/sensibo/button.py index fbfabaa97fb..9ac504537fa 100644 --- a/homeassistant/components/sensibo/button.py +++ b/homeassistant/components/sensibo/button.py @@ -6,12 +6,11 @@ from dataclasses import dataclass from typing import Any from homeassistant.components.button import ButtonEntity, ButtonEntityDescription -from homeassistant.config_entries import ConfigEntry from homeassistant.const import EntityCategory from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .const import DOMAIN +from . import SensiboConfigEntry from .coordinator import SensiboDataUpdateCoordinator from .entity import SensiboDeviceBaseEntity, async_handle_api_call @@ -34,11 +33,13 @@ DEVICE_BUTTON_TYPES = SensiboButtonEntityDescription( async def async_setup_entry( - hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback + hass: HomeAssistant, + entry: SensiboConfigEntry, + async_add_entities: AddEntitiesCallback, ) -> None: """Set up Sensibo binary sensor platform.""" - coordinator: SensiboDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] + coordinator = entry.runtime_data async_add_entities( SensiboDeviceButton(coordinator, device_id, DEVICE_BUTTON_TYPES) diff --git a/homeassistant/components/sensibo/climate.py b/homeassistant/components/sensibo/climate.py index f7661a3ee80..390ebc080b8 100644 --- a/homeassistant/components/sensibo/climate.py +++ b/homeassistant/components/sensibo/climate.py @@ -14,7 +14,6 @@ from homeassistant.components.climate import ( ClimateEntityFeature, HVACMode, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( ATTR_MODE, ATTR_STATE, @@ -28,6 +27,7 @@ from homeassistant.helpers import config_validation as cv, entity_platform from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.util.unit_conversion import TemperatureConverter +from . import SensiboConfigEntry from .const import DOMAIN from .coordinator import SensiboDataUpdateCoordinator from .entity import SensiboDeviceBaseEntity, async_handle_api_call @@ -117,11 +117,13 @@ def _find_valid_target_temp(target: int, valid_targets: list[int]) -> int: async def async_setup_entry( - hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback + hass: HomeAssistant, + entry: SensiboConfigEntry, + async_add_entities: AddEntitiesCallback, ) -> None: """Set up the Sensibo climate entry.""" - coordinator: SensiboDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] + coordinator = entry.runtime_data entities = [ SensiboClimate(coordinator, device_id) diff --git a/homeassistant/components/sensibo/coordinator.py b/homeassistant/components/sensibo/coordinator.py index 4f4f76aba10..d654a7cb072 100644 --- a/homeassistant/components/sensibo/coordinator.py +++ b/homeassistant/components/sensibo/coordinator.py @@ -3,12 +3,12 @@ from __future__ import annotations from datetime import timedelta +from typing import TYPE_CHECKING from pysensibo import SensiboClient from pysensibo.exceptions import AuthenticationError, SensiboError from pysensibo.model import SensiboData -from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_API_KEY from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryAuthFailed @@ -18,19 +18,19 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, Upda from .const import DEFAULT_SCAN_INTERVAL, DOMAIN, LOGGER, TIMEOUT +if TYPE_CHECKING: + from . import SensiboConfigEntry + REQUEST_REFRESH_DELAY = 0.35 class SensiboDataUpdateCoordinator(DataUpdateCoordinator[SensiboData]): """A Sensibo Data Update Coordinator.""" - def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None: + config_entry: SensiboConfigEntry + + def __init__(self, hass: HomeAssistant) -> None: """Initialize the Sensibo coordinator.""" - self.client = SensiboClient( - entry.data[CONF_API_KEY], - session=async_get_clientsession(hass), - timeout=TIMEOUT, - ) super().__init__( hass, LOGGER, @@ -42,10 +42,14 @@ class SensiboDataUpdateCoordinator(DataUpdateCoordinator[SensiboData]): hass, LOGGER, cooldown=REQUEST_REFRESH_DELAY, immediate=False ), ) + self.client = SensiboClient( + self.config_entry.data[CONF_API_KEY], + session=async_get_clientsession(hass), + timeout=TIMEOUT, + ) async def _async_update_data(self) -> SensiboData: """Fetch data from Sensibo.""" - try: data = await self.client.async_get_devices_data() except AuthenticationError as error: diff --git a/homeassistant/components/sensibo/diagnostics.py b/homeassistant/components/sensibo/diagnostics.py index d00da7e1223..e08ad9f8b53 100644 --- a/homeassistant/components/sensibo/diagnostics.py +++ b/homeassistant/components/sensibo/diagnostics.py @@ -5,11 +5,9 @@ from __future__ import annotations from typing import Any from homeassistant.components.diagnostics.util import async_redact_data -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant -from .const import DOMAIN -from .coordinator import SensiboDataUpdateCoordinator +from . import SensiboConfigEntry TO_REDACT = { "location", @@ -31,10 +29,10 @@ TO_REDACT = { async def async_get_config_entry_diagnostics( - hass: HomeAssistant, entry: ConfigEntry + hass: HomeAssistant, entry: SensiboConfigEntry ) -> dict[str, Any]: """Return diagnostics for Sensibo config entry.""" - coordinator: SensiboDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] + coordinator = entry.runtime_data diag_data = {} diag_data["raw"] = async_redact_data(coordinator.data.raw, TO_REDACT) for device, device_data in coordinator.data.parsed.items(): diff --git a/homeassistant/components/sensibo/number.py b/homeassistant/components/sensibo/number.py index 9c7b97ff79f..baa056f0eea 100644 --- a/homeassistant/components/sensibo/number.py +++ b/homeassistant/components/sensibo/number.py @@ -13,12 +13,11 @@ from homeassistant.components.number import ( NumberEntity, NumberEntityDescription, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import PERCENTAGE, EntityCategory, UnitOfTemperature from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .const import DOMAIN +from . import SensiboConfigEntry from .coordinator import SensiboDataUpdateCoordinator from .entity import SensiboDeviceBaseEntity, async_handle_api_call @@ -64,11 +63,13 @@ DEVICE_NUMBER_TYPES = ( async def async_setup_entry( - hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback + hass: HomeAssistant, + entry: SensiboConfigEntry, + async_add_entities: AddEntitiesCallback, ) -> None: """Set up Sensibo number platform.""" - coordinator: SensiboDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] + coordinator = entry.runtime_data async_add_entities( SensiboNumber(coordinator, device_id, description) diff --git a/homeassistant/components/sensibo/select.py b/homeassistant/components/sensibo/select.py index 798d4735b16..cd0499aabc0 100644 --- a/homeassistant/components/sensibo/select.py +++ b/homeassistant/components/sensibo/select.py @@ -9,11 +9,11 @@ from typing import TYPE_CHECKING, Any from pysensibo.model import SensiboDevice from homeassistant.components.select import SelectEntity, SelectEntityDescription -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.entity_platform import AddEntitiesCallback +from . import SensiboConfigEntry from .const import DOMAIN from .coordinator import SensiboDataUpdateCoordinator from .entity import SensiboDeviceBaseEntity, async_handle_api_call @@ -52,11 +52,13 @@ DEVICE_SELECT_TYPES = ( async def async_setup_entry( - hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback + hass: HomeAssistant, + entry: SensiboConfigEntry, + async_add_entities: AddEntitiesCallback, ) -> None: """Set up Sensibo number platform.""" - coordinator: SensiboDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] + coordinator = entry.runtime_data async_add_entities( SensiboSelect(coordinator, device_id, description) diff --git a/homeassistant/components/sensibo/sensor.py b/homeassistant/components/sensibo/sensor.py index 81ab3a06067..16adfd5afe3 100644 --- a/homeassistant/components/sensibo/sensor.py +++ b/homeassistant/components/sensibo/sensor.py @@ -15,7 +15,6 @@ from homeassistant.components.sensor import ( SensorEntityDescription, SensorStateClass, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, CONCENTRATION_PARTS_PER_BILLION, @@ -30,7 +29,7 @@ from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import StateType -from .const import DOMAIN +from . import SensiboConfigEntry from .coordinator import SensiboDataUpdateCoordinator from .entity import SensiboDeviceBaseEntity, SensiboMotionBaseEntity @@ -231,11 +230,13 @@ DESCRIPTION_BY_MODELS = { async def async_setup_entry( - hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback + hass: HomeAssistant, + entry: SensiboConfigEntry, + async_add_entities: AddEntitiesCallback, ) -> None: """Set up Sensibo sensor platform.""" - coordinator: SensiboDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] + coordinator = entry.runtime_data entities: list[SensiboMotionSensor | SensiboDeviceSensor] = [] diff --git a/homeassistant/components/sensibo/switch.py b/homeassistant/components/sensibo/switch.py index a8ebd63fa43..46906ac1871 100644 --- a/homeassistant/components/sensibo/switch.py +++ b/homeassistant/components/sensibo/switch.py @@ -13,11 +13,11 @@ from homeassistant.components.switch import ( SwitchEntity, SwitchEntityDescription, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.entity_platform import AddEntitiesCallback +from . import SensiboConfigEntry from .const import DOMAIN from .coordinator import SensiboDataUpdateCoordinator from .entity import SensiboDeviceBaseEntity, async_handle_api_call @@ -76,11 +76,13 @@ DESCRIPTION_BY_MODELS = {"pure": PURE_SWITCH_TYPES} async def async_setup_entry( - hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback + hass: HomeAssistant, + entry: SensiboConfigEntry, + async_add_entities: AddEntitiesCallback, ) -> None: """Set up Sensibo Switch platform.""" - coordinator: SensiboDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] + coordinator = entry.runtime_data async_add_entities( SensiboDeviceSwitch(coordinator, device_id, description) diff --git a/homeassistant/components/sensibo/update.py b/homeassistant/components/sensibo/update.py index 9376cd1eb38..d52565564a6 100644 --- a/homeassistant/components/sensibo/update.py +++ b/homeassistant/components/sensibo/update.py @@ -12,12 +12,11 @@ from homeassistant.components.update import ( UpdateEntity, UpdateEntityDescription, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import EntityCategory from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback -from .const import DOMAIN +from . import SensiboConfigEntry from .coordinator import SensiboDataUpdateCoordinator from .entity import SensiboDeviceBaseEntity @@ -44,11 +43,13 @@ DEVICE_SENSOR_TYPES: tuple[SensiboDeviceUpdateEntityDescription, ...] = ( async def async_setup_entry( - hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback + hass: HomeAssistant, + entry: SensiboConfigEntry, + async_add_entities: AddEntitiesCallback, ) -> None: """Set up Sensibo Update platform.""" - coordinator: SensiboDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] + coordinator = entry.runtime_data async_add_entities( SensiboDeviceUpdate(coordinator, device_id, description)