Use runtime_data in hive (#144367)

This commit is contained in:
epenet 2025-05-08 23:47:24 +02:00 committed by GitHub
parent fbe63e8d03
commit 1322d54371
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 47 additions and 64 deletions

View File

@ -24,11 +24,11 @@ from .entity import HiveEntity
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
type HiveConfigEntry = ConfigEntry[Hive]
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
async def async_setup_entry(hass: HomeAssistant, entry: HiveConfigEntry) -> bool:
"""Set up Hive from a config entry.""" """Set up Hive from a config entry."""
hass.data.setdefault(DOMAIN, {})
web_session = aiohttp_client.async_get_clientsession(hass) web_session = aiohttp_client.async_get_clientsession(hass)
hive_config = dict(entry.data) hive_config = dict(entry.data)
hive = Hive(web_session) hive = Hive(web_session)
@ -37,7 +37,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
hive_config["options"].update( hive_config["options"].update(
{CONF_SCAN_INTERVAL: dict(entry.options).get(CONF_SCAN_INTERVAL, 120)} {CONF_SCAN_INTERVAL: dict(entry.options).get(CONF_SCAN_INTERVAL, 120)}
) )
hass.data[DOMAIN][entry.entry_id] = hive entry.runtime_data = hive
try: try:
devices = await hive.session.startSession(hive_config) devices = await hive.session.startSession(hive_config)
@ -59,16 +59,12 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
return True return True
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_unload_entry(hass: HomeAssistant, entry: HiveConfigEntry) -> bool:
"""Unload a config entry.""" """Unload a config entry."""
unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS) return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
if unload_ok:
hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok
async def async_remove_entry(hass: HomeAssistant, entry: ConfigEntry) -> None: async def async_remove_entry(hass: HomeAssistant, entry: HiveConfigEntry) -> None:
"""Remove a config entry.""" """Remove a config entry."""
hive = Auth(entry.data["username"], entry.data["password"]) hive = Auth(entry.data["username"], entry.data["password"])
await hive.forget_device( await hive.forget_device(
@ -78,7 +74,7 @@ async def async_remove_entry(hass: HomeAssistant, entry: ConfigEntry) -> None:
async def async_remove_config_entry_device( async def async_remove_config_entry_device(
hass: HomeAssistant, config_entry: ConfigEntry, device_entry: DeviceEntry hass: HomeAssistant, config_entry: HiveConfigEntry, device_entry: DeviceEntry
) -> bool: ) -> bool:
"""Remove a config entry from a device.""" """Remove a config entry from a device."""
return True return True

View File

@ -9,11 +9,10 @@ from homeassistant.components.alarm_control_panel import (
AlarmControlPanelEntityFeature, AlarmControlPanelEntityFeature,
AlarmControlPanelState, AlarmControlPanelState,
) )
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .const import DOMAIN from . import HiveConfigEntry
from .entity import HiveEntity from .entity import HiveEntity
PARALLEL_UPDATES = 0 PARALLEL_UPDATES = 0
@ -28,12 +27,12 @@ HIVETOHA = {
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: HiveConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up Hive thermostat based on a config entry.""" """Set up Hive thermostat based on a config entry."""
hive = hass.data[DOMAIN][entry.entry_id] hive = entry.runtime_data
if devices := hive.session.deviceList.get("alarm_control_panel"): if devices := hive.session.deviceList.get("alarm_control_panel"):
async_add_entities( async_add_entities(
[HiveAlarmControlPanelEntity(hive, dev) for dev in devices], True [HiveAlarmControlPanelEntity(hive, dev) for dev in devices], True

View File

@ -10,11 +10,10 @@ from homeassistant.components.binary_sensor import (
BinarySensorEntity, BinarySensorEntity,
BinarySensorEntityDescription, BinarySensorEntityDescription,
) )
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from .const import DOMAIN from . import HiveConfigEntry
from .entity import HiveEntity from .entity import HiveEntity
PARALLEL_UPDATES = 0 PARALLEL_UPDATES = 0
@ -69,12 +68,12 @@ SENSOR_TYPES: tuple[BinarySensorEntityDescription, ...] = (
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: HiveConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up Hive thermostat based on a config entry.""" """Set up Hive thermostat based on a config entry."""
hive = hass.data[DOMAIN][entry.entry_id] hive = entry.runtime_data
sensors: list[BinarySensorEntity] = [] sensors: list[BinarySensorEntity] = []

View File

@ -15,19 +15,13 @@ from homeassistant.components.climate import (
HVACAction, HVACAction,
HVACMode, HVACMode,
) )
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import config_validation as cv, entity_platform from homeassistant.helpers import config_validation as cv, entity_platform
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import refresh_system from . import HiveConfigEntry, refresh_system
from .const import ( from .const import ATTR_TIME_PERIOD, SERVICE_BOOST_HEATING_OFF, SERVICE_BOOST_HEATING_ON
ATTR_TIME_PERIOD,
DOMAIN,
SERVICE_BOOST_HEATING_OFF,
SERVICE_BOOST_HEATING_ON,
)
from .entity import HiveEntity from .entity import HiveEntity
HIVE_TO_HASS_STATE = { HIVE_TO_HASS_STATE = {
@ -59,12 +53,12 @@ _LOGGER = logging.getLogger()
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: HiveConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up Hive thermostat based on a config entry.""" """Set up Hive thermostat based on a config entry."""
hive = hass.data[DOMAIN][entry.entry_id] hive = entry.runtime_data
devices = hive.session.deviceList.get("climate") devices = hive.session.deviceList.get("climate")
if devices: if devices:
async_add_entities((HiveClimateEntity(hive, dev) for dev in devices), True) async_add_entities((HiveClimateEntity(hive, dev) for dev in devices), True)

View File

@ -16,7 +16,6 @@ import voluptuous as vol
from homeassistant.config_entries import ( from homeassistant.config_entries import (
SOURCE_REAUTH, SOURCE_REAUTH,
ConfigEntry,
ConfigFlow, ConfigFlow,
ConfigFlowResult, ConfigFlowResult,
OptionsFlow, OptionsFlow,
@ -24,6 +23,7 @@ from homeassistant.config_entries import (
from homeassistant.const import CONF_PASSWORD, CONF_SCAN_INTERVAL, CONF_USERNAME from homeassistant.const import CONF_PASSWORD, CONF_SCAN_INTERVAL, CONF_USERNAME
from homeassistant.core import callback from homeassistant.core import callback
from . import HiveConfigEntry
from .const import CONF_CODE, CONF_DEVICE_NAME, CONFIG_ENTRY_VERSION, DOMAIN from .const import CONF_CODE, CONF_DEVICE_NAME, CONFIG_ENTRY_VERSION, DOMAIN
@ -37,7 +37,6 @@ class HiveFlowHandler(ConfigFlow, domain=DOMAIN):
"""Initialize the config flow.""" """Initialize the config flow."""
self.data: dict[str, Any] = {} self.data: dict[str, Any] = {}
self.tokens: dict[str, str] = {} self.tokens: dict[str, str] = {}
self.entry: ConfigEntry | None = None
self.device_registration: bool = False self.device_registration: bool = False
self.device_name = "Home Assistant" self.device_name = "Home Assistant"
@ -54,7 +53,7 @@ class HiveFlowHandler(ConfigFlow, domain=DOMAIN):
) )
# Get user from existing entry and abort if already setup # Get user from existing entry and abort if already setup
self.entry = await self.async_set_unique_id(self.data[CONF_USERNAME]) await self.async_set_unique_id(self.data[CONF_USERNAME])
if self.context["source"] != SOURCE_REAUTH: if self.context["source"] != SOURCE_REAUTH:
self._abort_if_unique_id_configured() self._abort_if_unique_id_configured()
@ -145,12 +144,12 @@ class HiveFlowHandler(ConfigFlow, domain=DOMAIN):
# Setup the config entry # Setup the config entry
self.data["tokens"] = self.tokens self.data["tokens"] = self.tokens
if self.source == SOURCE_REAUTH: if self.source == SOURCE_REAUTH:
assert self.entry return self.async_update_reload_and_abort(
self.hass.config_entries.async_update_entry( self._get_reauth_entry(),
self.entry, title=self.data["username"], data=self.data title=self.data["username"],
data=self.data,
reason="reauth_successful",
) )
await self.hass.config_entries.async_reload(self.entry.entry_id)
return self.async_abort(reason="reauth_successful")
return self.async_create_entry(title=self.data["username"], data=self.data) return self.async_create_entry(title=self.data["username"], data=self.data)
async def async_step_reauth( async def async_step_reauth(
@ -166,7 +165,7 @@ class HiveFlowHandler(ConfigFlow, domain=DOMAIN):
@staticmethod @staticmethod
@callback @callback
def async_get_options_flow( def async_get_options_flow(
config_entry: ConfigEntry, config_entry: HiveConfigEntry,
) -> HiveOptionsFlowHandler: ) -> HiveOptionsFlowHandler:
"""Hive options callback.""" """Hive options callback."""
return HiveOptionsFlowHandler(config_entry) return HiveOptionsFlowHandler(config_entry)
@ -175,7 +174,9 @@ class HiveFlowHandler(ConfigFlow, domain=DOMAIN):
class HiveOptionsFlowHandler(OptionsFlow): class HiveOptionsFlowHandler(OptionsFlow):
"""Config flow options for Hive.""" """Config flow options for Hive."""
def __init__(self, config_entry: ConfigEntry) -> None: config_entry: HiveConfigEntry
def __init__(self, config_entry: HiveConfigEntry) -> None:
"""Initialize Hive options flow.""" """Initialize Hive options flow."""
self.hive = None self.hive = None
self.interval = config_entry.options.get(CONF_SCAN_INTERVAL, 120) self.interval = config_entry.options.get(CONF_SCAN_INTERVAL, 120)
@ -190,7 +191,7 @@ class HiveOptionsFlowHandler(OptionsFlow):
self, user_input: dict[str, Any] | None = None self, user_input: dict[str, Any] | None = None
) -> ConfigFlowResult: ) -> ConfigFlowResult:
"""Handle a flow initialized by the user.""" """Handle a flow initialized by the user."""
self.hive = self.hass.data["hive"][self.config_entry.entry_id] self.hive = self.config_entry.runtime_data
errors: dict[str, str] = {} errors: dict[str, str] = {}
if user_input is not None: if user_input is not None:
new_interval = user_input.get(CONF_SCAN_INTERVAL) new_interval = user_input.get(CONF_SCAN_INTERVAL)

View File

@ -3,7 +3,9 @@
from __future__ import annotations from __future__ import annotations
from datetime import timedelta from datetime import timedelta
from typing import TYPE_CHECKING, Any from typing import Any
from apyhiveapi import Hive
from homeassistant.components.light import ( from homeassistant.components.light import (
ATTR_BRIGHTNESS, ATTR_BRIGHTNESS,
@ -12,30 +14,26 @@ from homeassistant.components.light import (
ColorMode, ColorMode,
LightEntity, LightEntity,
) )
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.util import color as color_util from homeassistant.util import color as color_util
from . import refresh_system from . import HiveConfigEntry, refresh_system
from .const import ATTR_MODE, DOMAIN from .const import ATTR_MODE
from .entity import HiveEntity from .entity import HiveEntity
if TYPE_CHECKING:
from apyhiveapi import Hive
PARALLEL_UPDATES = 0 PARALLEL_UPDATES = 0
SCAN_INTERVAL = timedelta(seconds=15) SCAN_INTERVAL = timedelta(seconds=15)
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: HiveConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up Hive thermostat based on a config entry.""" """Set up Hive thermostat based on a config entry."""
hive: Hive = hass.data[DOMAIN][entry.entry_id] hive = entry.runtime_data
devices = hive.session.deviceList.get("light") devices = hive.session.deviceList.get("light")
if not devices: if not devices:
return return

View File

@ -13,7 +13,6 @@ from homeassistant.components.sensor import (
SensorEntityDescription, SensorEntityDescription,
SensorStateClass, SensorStateClass,
) )
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ( from homeassistant.const import (
PERCENTAGE, PERCENTAGE,
EntityCategory, EntityCategory,
@ -24,7 +23,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.typing import StateType from homeassistant.helpers.typing import StateType
from .const import DOMAIN from . import HiveConfigEntry
from .entity import HiveEntity from .entity import HiveEntity
PARALLEL_UPDATES = 0 PARALLEL_UPDATES = 0
@ -90,11 +89,11 @@ SENSOR_TYPES: tuple[HiveSensorEntityDescription, ...] = (
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: HiveConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up Hive thermostat based on a config entry.""" """Set up Hive thermostat based on a config entry."""
hive = hass.data[DOMAIN][entry.entry_id] hive = entry.runtime_data
devices = hive.session.deviceList.get("sensor") devices = hive.session.deviceList.get("sensor")
if not devices: if not devices:
return return

View File

@ -8,13 +8,12 @@ from typing import Any
from apyhiveapi import Hive from apyhiveapi import Hive
from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import refresh_system from . import HiveConfigEntry, refresh_system
from .const import ATTR_MODE, DOMAIN from .const import ATTR_MODE
from .entity import HiveEntity from .entity import HiveEntity
PARALLEL_UPDATES = 0 PARALLEL_UPDATES = 0
@ -34,12 +33,12 @@ SWITCH_TYPES: tuple[SwitchEntityDescription, ...] = (
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: HiveConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up Hive thermostat based on a config entry.""" """Set up Hive thermostat based on a config entry."""
hive = hass.data[DOMAIN][entry.entry_id] hive = entry.runtime_data
devices = hive.session.deviceList.get("switch") devices = hive.session.deviceList.get("switch")
if not devices: if not devices:
return return

View File

@ -10,17 +10,15 @@ from homeassistant.components.water_heater import (
WaterHeaterEntity, WaterHeaterEntity,
WaterHeaterEntityFeature, WaterHeaterEntityFeature,
) )
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import STATE_OFF, STATE_ON, UnitOfTemperature from homeassistant.const import STATE_OFF, STATE_ON, UnitOfTemperature
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import config_validation as cv, entity_platform from homeassistant.helpers import config_validation as cv, entity_platform
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import refresh_system from . import HiveConfigEntry, refresh_system
from .const import ( from .const import (
ATTR_ONOFF, ATTR_ONOFF,
ATTR_TIME_PERIOD, ATTR_TIME_PERIOD,
DOMAIN,
SERVICE_BOOST_HOT_WATER, SERVICE_BOOST_HOT_WATER,
WATER_HEATER_MODES, WATER_HEATER_MODES,
) )
@ -46,12 +44,12 @@ SUPPORT_WATER_HEATER = [STATE_ECO, STATE_ON, STATE_OFF]
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: HiveConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up Hive thermostat based on a config entry.""" """Set up Hive thermostat based on a config entry."""
hive = hass.data[DOMAIN][entry.entry_id] hive = entry.runtime_data
devices = hive.session.deviceList.get("water_heater") devices = hive.session.deviceList.get("water_heater")
if devices: if devices:
async_add_entities((HiveWaterHeater(hive, dev) for dev in devices), True) async_add_entities((HiveWaterHeater(hive, dev) for dev in devices), True)