From 5425e82fb40b4895fc562644501b33145df2c238 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 31 Mar 2026 18:55:47 +0200 Subject: [PATCH] Migrate nuheat to use runtime_data (#166937) Co-authored-by: Claude Opus 4.6 (1M context) --- homeassistant/components/nuheat/__init__.py | 20 ++++++------------- homeassistant/components/nuheat/climate.py | 10 +++++----- .../components/nuheat/coordinator.py | 7 +++++-- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/homeassistant/components/nuheat/__init__.py b/homeassistant/components/nuheat/__init__.py index 21c7ca79a1f..ca72d4906ae 100644 --- a/homeassistant/components/nuheat/__init__.py +++ b/homeassistant/components/nuheat/__init__.py @@ -6,13 +6,12 @@ import logging import nuheat import requests -from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_PASSWORD, CONF_USERNAME from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady -from .const import CONF_SERIAL_NUMBER, DOMAIN, PLATFORMS -from .coordinator import NuHeatCoordinator +from .const import CONF_SERIAL_NUMBER, PLATFORMS +from .coordinator import NuHeatConfigEntry, NuHeatCoordinator _LOGGER = logging.getLogger(__name__) @@ -23,7 +22,7 @@ def _get_thermostat(api: nuheat.NuHeat, serial_number: str) -> nuheat.NuHeatTher return api.get_thermostat(serial_number) -async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: +async def async_setup_entry(hass: HomeAssistant, entry: NuHeatConfigEntry) -> bool: """Set up NuHeat from a config entry.""" conf = entry.data @@ -52,20 +51,13 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: _LOGGER.error("Failed to login to nuheat: %s", ex) return False - coordinator = NuHeatCoordinator(hass, entry, thermostat) - - hass.data.setdefault(DOMAIN, {}) - hass.data[DOMAIN][entry.entry_id] = (thermostat, coordinator) + entry.runtime_data = NuHeatCoordinator(hass, entry, thermostat) await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) return True -async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: +async def async_unload_entry(hass: HomeAssistant, entry: NuHeatConfigEntry) -> bool: """Unload a config entry.""" - unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) - if unload_ok: - hass.data[DOMAIN].pop(entry.entry_id) - - return unload_ok + return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) diff --git a/homeassistant/components/nuheat/climate.py b/homeassistant/components/nuheat/climate.py index e666e4be0cd..4625614e773 100644 --- a/homeassistant/components/nuheat/climate.py +++ b/homeassistant/components/nuheat/climate.py @@ -18,7 +18,6 @@ from homeassistant.components.climate import ( HVACAction, HVACMode, ) -from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature from homeassistant.core import HomeAssistant, callback from homeassistant.helpers import event as event_helper @@ -27,7 +26,7 @@ from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.update_coordinator import CoordinatorEntity from .const import DOMAIN, MANUFACTURER, NUHEAT_API_STATE_SHIFT_DELAY -from .coordinator import NuHeatCoordinator +from .coordinator import NuHeatConfigEntry, NuHeatCoordinator _LOGGER = logging.getLogger(__name__) @@ -55,14 +54,15 @@ SCHEDULE_MODE_TO_PRESET_MODE_MAP = { async def async_setup_entry( hass: HomeAssistant, - config_entry: ConfigEntry, + config_entry: NuHeatConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, ) -> None: """Set up the NuHeat thermostat(s).""" - thermostat, coordinator = hass.data[DOMAIN][config_entry.entry_id] + coordinator = config_entry.runtime_data temperature_unit = hass.config.units.temperature_unit - entity = NuHeatThermostat(coordinator, thermostat, temperature_unit) + + entity = NuHeatThermostat(coordinator, coordinator.thermostat, temperature_unit) # No longer need a service as set_hvac_mode to auto does this # since climate 1.0 has been implemented diff --git a/homeassistant/components/nuheat/coordinator.py b/homeassistant/components/nuheat/coordinator.py index 6555f7376ed..e1c61bbf1cc 100644 --- a/homeassistant/components/nuheat/coordinator.py +++ b/homeassistant/components/nuheat/coordinator.py @@ -16,15 +16,18 @@ _LOGGER = logging.getLogger(__name__) SCAN_INTERVAL = timedelta(minutes=5) +type NuHeatConfigEntry = ConfigEntry[NuHeatCoordinator] + + class NuHeatCoordinator(DataUpdateCoordinator[None]): """Coordinator for NuHeat thermostat data.""" - config_entry: ConfigEntry + config_entry: NuHeatConfigEntry def __init__( self, hass: HomeAssistant, - entry: ConfigEntry, + entry: NuHeatConfigEntry, thermostat: nuheat.NuHeatThermostat, ) -> None: """Initialize the coordinator."""