From 9bfac71bd70dcd511b7f2b04a36d37c70f75780f Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 31 Mar 2026 11:10:50 +0200 Subject: [PATCH] Migrate netatmo to use runtime_data (#166925) Co-authored-by: Claude Opus 4.6 (1M context) --- homeassistant/components/netatmo/__init__.py | 50 ++++++++----------- .../components/netatmo/binary_sensor.py | 5 +- homeassistant/components/netatmo/button.py | 5 +- homeassistant/components/netatmo/camera.py | 5 +- homeassistant/components/netatmo/climate.py | 5 +- .../components/netatmo/config_flow.py | 12 ++--- homeassistant/components/netatmo/const.py | 2 - homeassistant/components/netatmo/cover.py | 5 +- .../components/netatmo/data_handler.py | 14 ++++-- .../components/netatmo/diagnostics.py | 10 ++-- homeassistant/components/netatmo/fan.py | 5 +- homeassistant/components/netatmo/light.py | 5 +- homeassistant/components/netatmo/select.py | 5 +- homeassistant/components/netatmo/sensor.py | 15 ++++-- homeassistant/components/netatmo/switch.py | 5 +- 15 files changed, 66 insertions(+), 82 deletions(-) diff --git a/homeassistant/components/netatmo/__init__.py b/homeassistant/components/netatmo/__init__.py index a8e6e52d7d3..62b99eb9b3e 100644 --- a/homeassistant/components/netatmo/__init__.py +++ b/homeassistant/components/netatmo/__init__.py @@ -15,7 +15,6 @@ from homeassistant.components.webhook import ( async_register as webhook_register, async_unregister as webhook_unregister, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_WEBHOOK_ID, EVENT_HOMEASSISTANT_STOP from homeassistant.core import HomeAssistant from homeassistant.exceptions import ( @@ -38,12 +37,10 @@ from homeassistant.helpers.typing import ConfigType from . import api from .const import ( - AUTH, CONF_CLOUDHOOK_URL, DATA_CAMERAS, DATA_DEVICE_IDS, DATA_EVENTS, - DATA_HANDLER, DATA_HOMES, DATA_PERSONS, DATA_SCHEDULES, @@ -52,7 +49,7 @@ from .const import ( WEBHOOK_DEACTIVATION, WEBHOOK_PUSH_TYPE, ) -from .data_handler import NetatmoDataHandler +from .data_handler import NetatmoConfigEntry, NetatmoDataHandler from .webhook import async_handle_webhook _LOGGER = logging.getLogger(__name__) @@ -76,7 +73,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: return True -async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: +async def async_setup_entry(hass: HomeAssistant, entry: NetatmoConfigEntry) -> bool: """Set up Netatmo from a config entry.""" try: implementation = await async_get_config_entry_implementation(hass, entry) @@ -106,14 +103,12 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: ) raise ConfigEntryAuthFailed("Token scope not valid, trigger renewal") - hass.data[DOMAIN][entry.entry_id] = { - AUTH: api.AsyncConfigEntryNetatmoAuth( - aiohttp_client.async_get_clientsession(hass), session - ) - } + auth = api.AsyncConfigEntryNetatmoAuth( + aiohttp_client.async_get_clientsession(hass), session + ) - data_handler = NetatmoDataHandler(hass, entry) - hass.data[DOMAIN][entry.entry_id][DATA_HANDLER] = data_handler + data_handler = NetatmoDataHandler(hass, entry, auth) + entry.runtime_data = data_handler await data_handler.async_setup() async def unregister_webhook( @@ -129,7 +124,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: ) webhook_unregister(hass, entry.data[CONF_WEBHOOK_ID]) try: - await hass.data[DOMAIN][entry.entry_id][AUTH].async_dropwebhook() + await entry.runtime_data.auth.async_dropwebhook() except pyatmo.ApiError: _LOGGER.debug( "No webhook to be dropped for %s", entry.data[CONF_WEBHOOK_ID] @@ -165,7 +160,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: ) try: - await hass.data[DOMAIN][entry.entry_id][AUTH].async_addwebhook(webhook_url) + await entry.runtime_data.auth.async_addwebhook(webhook_url) _LOGGER.debug("Register Netatmo webhook: %s", webhook_url) except pyatmo.ApiError as err: _LOGGER.error("Error during webhook registration - %s", err) @@ -199,7 +194,9 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: return True -async def async_cloudhook_generate_url(hass: HomeAssistant, entry: ConfigEntry) -> str: +async def async_cloudhook_generate_url( + hass: HomeAssistant, entry: NetatmoConfigEntry +) -> str: """Generate the full URL for a webhook_id.""" if CONF_CLOUDHOOK_URL not in entry.data: webhook_url = await cloud.async_create_cloudhook( @@ -211,32 +208,27 @@ async def async_cloudhook_generate_url(hass: HomeAssistant, entry: ConfigEntry) return str(entry.data[CONF_CLOUDHOOK_URL]) -async def async_config_entry_updated(hass: HomeAssistant, entry: ConfigEntry) -> None: +async def async_config_entry_updated( + hass: HomeAssistant, entry: NetatmoConfigEntry +) -> None: """Handle signals of config entry being updated.""" async_dispatcher_send(hass, f"signal-{DOMAIN}-public-update-{entry.entry_id}") -async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: +async def async_unload_entry(hass: HomeAssistant, entry: NetatmoConfigEntry) -> bool: """Unload a config entry.""" - data = hass.data[DOMAIN] - if CONF_WEBHOOK_ID in entry.data: webhook_unregister(hass, entry.data[CONF_WEBHOOK_ID]) try: - await data[entry.entry_id][AUTH].async_dropwebhook() + await entry.runtime_data.auth.async_dropwebhook() except pyatmo.ApiError: _LOGGER.debug("No webhook to be dropped") _LOGGER.debug("Unregister Netatmo webhook") - unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) - - if unload_ok and entry.entry_id in data: - data.pop(entry.entry_id) - - return unload_ok + return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) -async def async_remove_entry(hass: HomeAssistant, entry: ConfigEntry) -> None: +async def async_remove_entry(hass: HomeAssistant, entry: NetatmoConfigEntry) -> None: """Cleanup when entry is removed.""" if CONF_WEBHOOK_ID in entry.data and cloud.async_active_subscription(hass): try: @@ -249,10 +241,10 @@ async def async_remove_entry(hass: HomeAssistant, entry: ConfigEntry) -> None: async def async_remove_config_entry_device( - hass: HomeAssistant, config_entry: ConfigEntry, device_entry: DeviceEntry + hass: HomeAssistant, config_entry: NetatmoConfigEntry, device_entry: DeviceEntry ) -> bool: """Remove a config entry from a device.""" - data = hass.data[DOMAIN][config_entry.entry_id][DATA_HANDLER] + data = config_entry.runtime_data modules = [m for h in data.account.homes.values() for m in h.modules] rooms = [r for h in data.account.homes.values() for r in h.rooms] diff --git a/homeassistant/components/netatmo/binary_sensor.py b/homeassistant/components/netatmo/binary_sensor.py index c550c31c4a6..21fbff3fc72 100644 --- a/homeassistant/components/netatmo/binary_sensor.py +++ b/homeassistant/components/netatmo/binary_sensor.py @@ -13,7 +13,6 @@ from homeassistant.components.binary_sensor import ( BinarySensorEntity, BinarySensorEntityDescription, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback @@ -38,7 +37,7 @@ from .const import ( NETATMO_CREATE_OPENING_BINARY_SENSOR, NETATMO_CREATE_WEATHER_BINARY_SENSOR, ) -from .data_handler import SIGNAL_NAME, NetatmoDevice +from .data_handler import SIGNAL_NAME, NetatmoConfigEntry, NetatmoDevice from .entity import NetatmoModuleEntity, NetatmoWeatherModuleEntity _LOGGER = logging.getLogger(__name__) @@ -180,7 +179,7 @@ DEVICE_CATEGORY_BINARY_PUBLISHERS: Final[list[NetatmoDeviceCategory]] = [ async def async_setup_entry( hass: HomeAssistant, - entry: ConfigEntry, + entry: NetatmoConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up Netatmo weather binary sensors based on a config entry.""" diff --git a/homeassistant/components/netatmo/button.py b/homeassistant/components/netatmo/button.py index e77b5188067..288a7664eb1 100644 --- a/homeassistant/components/netatmo/button.py +++ b/homeassistant/components/netatmo/button.py @@ -7,13 +7,12 @@ import logging from pyatmo import modules as NaModules from homeassistant.components.button import ButtonEntity -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .const import CONF_URL_CONTROL, NETATMO_CREATE_BUTTON -from .data_handler import HOME, SIGNAL_NAME, NetatmoDevice +from .data_handler import HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoDevice from .entity import NetatmoModuleEntity _LOGGER = logging.getLogger(__name__) @@ -21,7 +20,7 @@ _LOGGER = logging.getLogger(__name__) async def async_setup_entry( hass: HomeAssistant, - entry: ConfigEntry, + entry: NetatmoConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up the Netatmo button platform.""" diff --git a/homeassistant/components/netatmo/camera.py b/homeassistant/components/netatmo/camera.py index e0d84784ee8..b181ebb4af2 100644 --- a/homeassistant/components/netatmo/camera.py +++ b/homeassistant/components/netatmo/camera.py @@ -11,7 +11,6 @@ from pyatmo.event import Event as NaEvent import voluptuous as vol from homeassistant.components.camera import Camera, CameraEntityFeature -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import config_validation as cv, entity_platform @@ -41,7 +40,7 @@ from .const import ( SERVICE_SET_PERSONS_HOME, WEBHOOK_PUSH_TYPE, ) -from .data_handler import EVENT, HOME, SIGNAL_NAME, NetatmoDevice +from .data_handler import EVENT, HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoDevice from .entity import NetatmoModuleEntity _LOGGER = logging.getLogger(__name__) @@ -51,7 +50,7 @@ DEFAULT_QUALITY = "high" async def async_setup_entry( hass: HomeAssistant, - entry: ConfigEntry, + entry: NetatmoConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up the Netatmo camera platform.""" diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index a74ed630a4b..3d3eb8d449f 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -20,7 +20,6 @@ from homeassistant.components.climate import ( HVACAction, HVACMode, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( ATTR_TEMPERATURE, PRECISION_HALVES, @@ -54,7 +53,7 @@ from .const import ( SERVICE_SET_TEMPERATURE_WITH_END_DATETIME, SERVICE_SET_TEMPERATURE_WITH_TIME_PERIOD, ) -from .data_handler import HOME, SIGNAL_NAME, NetatmoRoom +from .data_handler import HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoRoom from .entity import NetatmoRoomEntity _LOGGER = logging.getLogger(__name__) @@ -120,7 +119,7 @@ NA_VALVE = DeviceType.NRV async def async_setup_entry( hass: HomeAssistant, - entry: ConfigEntry, + entry: NetatmoConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up the Netatmo energy platform.""" diff --git a/homeassistant/components/netatmo/config_flow.py b/homeassistant/components/netatmo/config_flow.py index b33d4898832..812f8fbb3c0 100644 --- a/homeassistant/components/netatmo/config_flow.py +++ b/homeassistant/components/netatmo/config_flow.py @@ -9,12 +9,7 @@ import uuid import voluptuous as vol -from homeassistant.config_entries import ( - SOURCE_REAUTH, - ConfigEntry, - ConfigFlowResult, - OptionsFlow, -) +from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_SHOW_ON_MAP, CONF_UUID from homeassistant.core import callback from homeassistant.helpers import config_entry_oauth2_flow, config_validation as cv @@ -31,6 +26,7 @@ from .const import ( CONF_WEATHER_AREAS, DOMAIN, ) +from .data_handler import NetatmoConfigEntry _LOGGER = logging.getLogger(__name__) @@ -45,7 +41,7 @@ class NetatmoFlowHandler( @staticmethod @callback def async_get_options_flow( - config_entry: ConfigEntry, + config_entry: NetatmoConfigEntry, ) -> OptionsFlow: """Get the options flow for this handler.""" return NetatmoOptionsFlowHandler(config_entry) @@ -99,7 +95,7 @@ class NetatmoFlowHandler( class NetatmoOptionsFlowHandler(OptionsFlow): """Handle Netatmo options.""" - def __init__(self, config_entry: ConfigEntry) -> None: + def __init__(self, config_entry: NetatmoConfigEntry) -> None: """Initialize Netatmo options flow.""" self.options = dict(config_entry.options) self.options.setdefault(CONF_WEATHER_AREAS, {}) diff --git a/homeassistant/components/netatmo/const.py b/homeassistant/components/netatmo/const.py index 9a95cd36fed..35ef790684a 100644 --- a/homeassistant/components/netatmo/const.py +++ b/homeassistant/components/netatmo/const.py @@ -27,11 +27,9 @@ CONF_URL_WEATHER = "https://my.netatmo.com/app/weather" CONF_URL_CONTROL = "https://home.netatmo.com/control" CONF_URL_PUBLIC_WEATHER = "https://weathermap.netatmo.com/" -AUTH = "netatmo_auth" CONF_PUBLIC = "public_sensor_config" CAMERA_DATA = "netatmo_camera" HOME_DATA = "netatmo_home_data" -DATA_HANDLER = "netatmo_data_handler" SIGNAL_NAME = "signal_name" API_SCOPES_EXCLUDED_FROM_CLOUD = [ diff --git a/homeassistant/components/netatmo/cover.py b/homeassistant/components/netatmo/cover.py index a599aacd719..eafc573829d 100644 --- a/homeassistant/components/netatmo/cover.py +++ b/homeassistant/components/netatmo/cover.py @@ -13,13 +13,12 @@ from homeassistant.components.cover import ( CoverEntity, CoverEntityFeature, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .const import CONF_URL_CONTROL, NETATMO_CREATE_COVER -from .data_handler import HOME, SIGNAL_NAME, NetatmoDevice +from .data_handler import HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoDevice from .entity import NetatmoModuleEntity _LOGGER = logging.getLogger(__name__) @@ -27,7 +26,7 @@ _LOGGER = logging.getLogger(__name__) async def async_setup_entry( hass: HomeAssistant, - entry: ConfigEntry, + entry: NetatmoConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up the Netatmo cover platform.""" diff --git a/homeassistant/components/netatmo/data_handler.py b/homeassistant/components/netatmo/data_handler.py index 31845e1c0c7..767582249e1 100644 --- a/homeassistant/components/netatmo/data_handler.py +++ b/homeassistant/components/netatmo/data_handler.py @@ -27,7 +27,6 @@ from homeassistant.helpers.dispatcher import ( from homeassistant.helpers.event import async_track_time_interval from .const import ( - AUTH, CAMERA_CONNECTION_WEBHOOKS, DATA_PERSONS, DATA_SCHEDULES, @@ -89,6 +88,8 @@ DEFAULT_INTERVALS = { } SCAN_INTERVAL = 60 +type NetatmoConfigEntry = ConfigEntry[NetatmoDataHandler] + @dataclass class NetatmoDevice: @@ -138,11 +139,16 @@ class NetatmoDataHandler: account: pyatmo.AsyncAccount _interval_factor: int - def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry) -> None: + def __init__( + self, + hass: HomeAssistant, + config_entry: NetatmoConfigEntry, + auth: pyatmo.AbstractAsyncAuth, + ) -> None: """Initialize self.""" self.hass = hass self.config_entry = config_entry - self._auth = hass.data[DOMAIN][config_entry.entry_id][AUTH] + self.auth = auth self.publisher: dict[str, NetatmoPublisher] = {} self._queue: deque = deque() self._webhook: bool = False @@ -171,7 +177,7 @@ class NetatmoDataHandler: ) ) - self.account = pyatmo.AsyncAccount(self._auth) + self.account = pyatmo.AsyncAccount(self.auth) await self.subscribe(ACCOUNT, ACCOUNT, None) diff --git a/homeassistant/components/netatmo/diagnostics.py b/homeassistant/components/netatmo/diagnostics.py index 8cb07d1f9d8..50f58ab1891 100644 --- a/homeassistant/components/netatmo/diagnostics.py +++ b/homeassistant/components/netatmo/diagnostics.py @@ -5,11 +5,9 @@ from __future__ import annotations from typing import Any from homeassistant.components.diagnostics import async_redact_data -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant -from .const import DATA_HANDLER, DOMAIN -from .data_handler import ACCOUNT, NetatmoDataHandler +from .data_handler import ACCOUNT, NetatmoConfigEntry TO_REDACT = { "access_token", @@ -32,12 +30,10 @@ TO_REDACT = { async def async_get_config_entry_diagnostics( - hass: HomeAssistant, config_entry: ConfigEntry + hass: HomeAssistant, config_entry: NetatmoConfigEntry ) -> dict[str, Any]: """Return diagnostics for a config entry.""" - data_handler: NetatmoDataHandler = hass.data[DOMAIN][config_entry.entry_id][ - DATA_HANDLER - ] + data_handler = config_entry.runtime_data return { "info": async_redact_data( diff --git a/homeassistant/components/netatmo/fan.py b/homeassistant/components/netatmo/fan.py index b0dc74c2b58..aefb47a995b 100644 --- a/homeassistant/components/netatmo/fan.py +++ b/homeassistant/components/netatmo/fan.py @@ -8,13 +8,12 @@ from typing import Final from pyatmo import modules as NaModules from homeassistant.components.fan import FanEntity, FanEntityFeature -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .const import CONF_URL_CONTROL, NETATMO_CREATE_FAN -from .data_handler import HOME, SIGNAL_NAME, NetatmoDevice +from .data_handler import HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoDevice from .entity import NetatmoModuleEntity _LOGGER = logging.getLogger(__name__) @@ -27,7 +26,7 @@ PRESETS = {v: k for k, v in PRESET_MAPPING.items()} async def async_setup_entry( hass: HomeAssistant, - entry: ConfigEntry, + entry: NetatmoConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up the Netatmo fan platform.""" diff --git a/homeassistant/components/netatmo/light.py b/homeassistant/components/netatmo/light.py index 4d4c4ba9509..cd7a688db41 100644 --- a/homeassistant/components/netatmo/light.py +++ b/homeassistant/components/netatmo/light.py @@ -8,7 +8,6 @@ from typing import Any from pyatmo import modules as NaModules from homeassistant.components.light import ATTR_BRIGHTNESS, ColorMode, LightEntity -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback @@ -22,7 +21,7 @@ from .const import ( NETATMO_CREATE_CAMERA_LIGHT, NETATMO_CREATE_LIGHT, ) -from .data_handler import HOME, SIGNAL_NAME, NetatmoDevice +from .data_handler import HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoDevice from .entity import NetatmoModuleEntity _LOGGER = logging.getLogger(__name__) @@ -30,7 +29,7 @@ _LOGGER = logging.getLogger(__name__) async def async_setup_entry( hass: HomeAssistant, - entry: ConfigEntry, + entry: NetatmoConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up the Netatmo camera light platform.""" diff --git a/homeassistant/components/netatmo/select.py b/homeassistant/components/netatmo/select.py index cb6675e4129..ec7d801a4dd 100644 --- a/homeassistant/components/netatmo/select.py +++ b/homeassistant/components/netatmo/select.py @@ -5,7 +5,6 @@ from __future__ import annotations import logging from homeassistant.components.select import SelectEntity -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.dispatcher import async_dispatcher_connect @@ -19,7 +18,7 @@ from .const import ( MANUFACTURER, NETATMO_CREATE_SELECT, ) -from .data_handler import HOME, SIGNAL_NAME, NetatmoHome +from .data_handler import HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoHome from .entity import NetatmoBaseEntity _LOGGER = logging.getLogger(__name__) @@ -27,7 +26,7 @@ _LOGGER = logging.getLogger(__name__) async def async_setup_entry( hass: HomeAssistant, - entry: ConfigEntry, + entry: NetatmoConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up the Netatmo energy platform schedule selector.""" diff --git a/homeassistant/components/netatmo/sensor.py b/homeassistant/components/netatmo/sensor.py index 56b8233912f..058d948da62 100644 --- a/homeassistant/components/netatmo/sensor.py +++ b/homeassistant/components/netatmo/sensor.py @@ -16,7 +16,6 @@ from homeassistant.components.sensor import ( SensorEntityDescription, SensorStateClass, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( ATTR_LATITUDE, ATTR_LONGITUDE, @@ -45,7 +44,6 @@ from .const import ( CONF_URL_ENERGY, CONF_URL_PUBLIC_WEATHER, CONF_WEATHER_AREAS, - DATA_HANDLER, DOMAIN, NETATMO_CREATE_BATTERY, NETATMO_CREATE_ROOM_SENSOR, @@ -53,7 +51,14 @@ from .const import ( NETATMO_CREATE_WEATHER_SENSOR, SIGNAL_NAME, ) -from .data_handler import HOME, PUBLIC, NetatmoDataHandler, NetatmoDevice, NetatmoRoom +from .data_handler import ( + HOME, + PUBLIC, + NetatmoConfigEntry, + NetatmoDataHandler, + NetatmoDevice, + NetatmoRoom, +) from .entity import ( NetatmoBaseEntity, NetatmoModuleEntity, @@ -390,7 +395,7 @@ BATTERY_SENSOR_DESCRIPTION = NetatmoSensorEntityDescription( async def async_setup_entry( hass: HomeAssistant, - entry: ConfigEntry, + entry: NetatmoConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up the Netatmo sensor platform.""" @@ -456,7 +461,7 @@ async def async_setup_entry( ) device_registry = dr.async_get(hass) - data_handler = hass.data[DOMAIN][entry.entry_id][DATA_HANDLER] + data_handler = entry.runtime_data async def add_public_entities(update: bool = True) -> None: """Retrieve Netatmo public weather entities.""" diff --git a/homeassistant/components/netatmo/switch.py b/homeassistant/components/netatmo/switch.py index 9ee37c11528..4a37acac425 100644 --- a/homeassistant/components/netatmo/switch.py +++ b/homeassistant/components/netatmo/switch.py @@ -8,13 +8,12 @@ from typing import Any from pyatmo import modules as NaModules from homeassistant.components.switch import SwitchEntity -from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from .const import CONF_URL_CONTROL, NETATMO_CREATE_SWITCH -from .data_handler import HOME, SIGNAL_NAME, NetatmoDevice +from .data_handler import HOME, SIGNAL_NAME, NetatmoConfigEntry, NetatmoDevice from .entity import NetatmoModuleEntity _LOGGER = logging.getLogger(__name__) @@ -22,7 +21,7 @@ _LOGGER = logging.getLogger(__name__) async def async_setup_entry( hass: HomeAssistant, - entry: ConfigEntry, + entry: NetatmoConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up the Netatmo switch platform."""