Migrate lametric to use runtime_data (#147328)

* Migrate lametric to use runtime_data

* One more

* Drop unused hass_config
This commit is contained in:
epenet 2025-06-23 13:15:08 +02:00 committed by GitHub
parent 1119716c32
commit 3b4eb7c749
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 43 additions and 58 deletions

View File

@ -1,14 +1,13 @@
"""Support for LaMetric time.""" """Support for LaMetric time."""
from homeassistant.components import notify as hass_notify from homeassistant.components import notify as hass_notify
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_NAME, Platform from homeassistant.const import CONF_NAME, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import config_validation as cv, discovery from homeassistant.helpers import config_validation as cv, discovery
from homeassistant.helpers.typing import ConfigType from homeassistant.helpers.typing import ConfigType
from .const import DOMAIN, PLATFORMS from .const import DOMAIN, PLATFORMS
from .coordinator import LaMetricDataUpdateCoordinator from .coordinator import LaMetricConfigEntry, LaMetricDataUpdateCoordinator
from .services import async_setup_services from .services import async_setup_services
CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
@ -17,16 +16,16 @@ CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
"""Set up the LaMetric integration.""" """Set up the LaMetric integration."""
async_setup_services(hass) async_setup_services(hass)
hass.data[DOMAIN] = {"hass_config": config}
return True return True
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: LaMetricConfigEntry) -> bool:
"""Set up LaMetric from a config entry.""" """Set up LaMetric from a config entry."""
coordinator = LaMetricDataUpdateCoordinator(hass, entry) coordinator = LaMetricDataUpdateCoordinator(hass, entry)
await coordinator.async_config_entry_first_refresh() await coordinator.async_config_entry_first_refresh()
hass.data[DOMAIN][entry.entry_id] = coordinator entry.runtime_data = coordinator
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
# Set up notify platform, no entry support for notify component yet, # Set up notify platform, no entry support for notify component yet,
@ -37,15 +36,14 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
Platform.NOTIFY, Platform.NOTIFY,
DOMAIN, DOMAIN,
{CONF_NAME: coordinator.data.name, "entry_id": entry.entry_id}, {CONF_NAME: coordinator.data.name, "entry_id": entry.entry_id},
hass.data[DOMAIN]["hass_config"], {},
) )
) )
return True return True
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_unload_entry(hass: HomeAssistant, entry: LaMetricConfigEntry) -> bool:
"""Unload LaMetric config entry.""" """Unload LaMetric config entry."""
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS): if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
del hass.data[DOMAIN][entry.entry_id]
await hass_notify.async_reload(hass, DOMAIN) await hass_notify.async_reload(hass, DOMAIN)
return unload_ok return unload_ok

View File

@ -9,13 +9,11 @@ from typing import Any
from demetriek import LaMetricDevice from demetriek import LaMetricDevice
from homeassistant.components.button import ButtonEntity, ButtonEntityDescription from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
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 .const import DOMAIN from .coordinator import LaMetricConfigEntry, LaMetricDataUpdateCoordinator
from .coordinator import LaMetricDataUpdateCoordinator
from .entity import LaMetricEntity from .entity import LaMetricEntity
from .helpers import lametric_exception_handler from .helpers import lametric_exception_handler
@ -57,11 +55,11 @@ BUTTONS = [
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: LaMetricConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up LaMetric button based on a config entry.""" """Set up LaMetric button based on a config entry."""
coordinator: LaMetricDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] coordinator = entry.runtime_data
async_add_entities( async_add_entities(
LaMetricButtonEntity( LaMetricButtonEntity(
coordinator=coordinator, coordinator=coordinator,

View File

@ -13,13 +13,15 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, Upda
from .const import DOMAIN, LOGGER, SCAN_INTERVAL from .const import DOMAIN, LOGGER, SCAN_INTERVAL
type LaMetricConfigEntry = ConfigEntry[LaMetricDataUpdateCoordinator]
class LaMetricDataUpdateCoordinator(DataUpdateCoordinator[Device]): class LaMetricDataUpdateCoordinator(DataUpdateCoordinator[Device]):
"""The LaMetric Data Update Coordinator.""" """The LaMetric Data Update Coordinator."""
config_entry: ConfigEntry config_entry: LaMetricConfigEntry
def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None: def __init__(self, hass: HomeAssistant, entry: LaMetricConfigEntry) -> None:
"""Initialize the LaMatric coordinator.""" """Initialize the LaMatric coordinator."""
self.lametric = LaMetricDevice( self.lametric = LaMetricDevice(
host=entry.data[CONF_HOST], host=entry.data[CONF_HOST],

View File

@ -6,11 +6,9 @@ import json
from typing import Any from typing import Any
from homeassistant.components.diagnostics import async_redact_data from homeassistant.components.diagnostics import async_redact_data
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from .const import DOMAIN from .coordinator import LaMetricConfigEntry
from .coordinator import LaMetricDataUpdateCoordinator
TO_REDACT = { TO_REDACT = {
"device_id", "device_id",
@ -21,10 +19,10 @@ TO_REDACT = {
async def async_get_config_entry_diagnostics( async def async_get_config_entry_diagnostics(
hass: HomeAssistant, entry: ConfigEntry hass: HomeAssistant, entry: LaMetricConfigEntry
) -> dict[str, Any]: ) -> dict[str, Any]:
"""Return diagnostics for a config entry.""" """Return diagnostics for a config entry."""
coordinator: LaMetricDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] coordinator = entry.runtime_data
# Round-trip via JSON to trigger serialization # Round-trip via JSON to trigger serialization
data = json.loads(coordinator.data.to_json()) data = json.loads(coordinator.data.to_json())
return async_redact_data(data, TO_REDACT) return async_redact_data(data, TO_REDACT)

View File

@ -12,7 +12,7 @@ from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import device_registry as dr from homeassistant.helpers import device_registry as dr
from .const import DOMAIN from .const import DOMAIN
from .coordinator import LaMetricDataUpdateCoordinator from .coordinator import LaMetricConfigEntry, LaMetricDataUpdateCoordinator
from .entity import LaMetricEntity from .entity import LaMetricEntity
@ -57,15 +57,9 @@ def async_get_coordinator_by_device_id(
if (device_entry := device_registry.async_get(device_id)) is None: if (device_entry := device_registry.async_get(device_id)) is None:
raise ValueError(f"Unknown LaMetric device ID: {device_id}") raise ValueError(f"Unknown LaMetric device ID: {device_id}")
for entry_id in device_entry.config_entries: entry: LaMetricConfigEntry
if ( for entry in hass.config_entries.async_loaded_entries(DOMAIN):
(entry := hass.config_entries.async_get_entry(entry_id)) if entry.entry_id in device_entry.config_entries:
and entry.domain == DOMAIN return entry.runtime_data
and entry.entry_id in hass.data[DOMAIN]
):
coordinator: LaMetricDataUpdateCoordinator = hass.data[DOMAIN][
entry.entry_id
]
return coordinator
raise ValueError(f"No coordinator for device ID: {device_id}") raise ValueError(f"No coordinator for device ID: {device_id}")

View File

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
from typing import Any from typing import TYPE_CHECKING, Any
from demetriek import ( from demetriek import (
AlarmSound, AlarmSound,
@ -24,8 +24,8 @@ from homeassistant.exceptions import HomeAssistantError, ServiceValidationError
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from homeassistant.util.enum import try_parse_enum from homeassistant.util.enum import try_parse_enum
from .const import CONF_CYCLES, CONF_ICON_TYPE, CONF_PRIORITY, CONF_SOUND, DOMAIN from .const import CONF_CYCLES, CONF_ICON_TYPE, CONF_PRIORITY, CONF_SOUND
from .coordinator import LaMetricDataUpdateCoordinator from .coordinator import LaMetricConfigEntry
async def async_get_service( async def async_get_service(
@ -36,10 +36,12 @@ async def async_get_service(
"""Get the LaMetric notification service.""" """Get the LaMetric notification service."""
if discovery_info is None: if discovery_info is None:
return None return None
coordinator: LaMetricDataUpdateCoordinator = hass.data[DOMAIN][ entry: LaMetricConfigEntry | None = hass.config_entries.async_get_entry(
discovery_info["entry_id"] discovery_info["entry_id"]
] )
return LaMetricNotificationService(coordinator.lametric) if TYPE_CHECKING:
assert entry is not None
return LaMetricNotificationService(entry.runtime_data.lametric)
class LaMetricNotificationService(BaseNotificationService): class LaMetricNotificationService(BaseNotificationService):

View File

@ -9,13 +9,11 @@ from typing import Any
from demetriek import Device, LaMetricDevice, Range from demetriek import Device, LaMetricDevice, Range
from homeassistant.components.number import NumberEntity, NumberEntityDescription from homeassistant.components.number import NumberEntity, NumberEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import PERCENTAGE, EntityCategory from homeassistant.const import PERCENTAGE, 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 .const import DOMAIN from .coordinator import LaMetricConfigEntry, LaMetricDataUpdateCoordinator
from .coordinator import LaMetricDataUpdateCoordinator
from .entity import LaMetricEntity from .entity import LaMetricEntity
from .helpers import lametric_exception_handler from .helpers import lametric_exception_handler
@ -57,11 +55,11 @@ NUMBERS = [
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: LaMetricConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up LaMetric number based on a config entry.""" """Set up LaMetric number based on a config entry."""
coordinator: LaMetricDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] coordinator = entry.runtime_data
async_add_entities( async_add_entities(
LaMetricNumberEntity( LaMetricNumberEntity(
coordinator=coordinator, coordinator=coordinator,

View File

@ -17,7 +17,7 @@ rules:
Entities of this integration does not explicitly subscribe to events. Entities of this integration does not explicitly subscribe to events.
entity-unique-id: done entity-unique-id: done
has-entity-name: done has-entity-name: done
runtime-data: todo runtime-data: done
test-before-configure: done test-before-configure: done
test-before-setup: done test-before-setup: done
unique-config-entry: done unique-config-entry: done
@ -33,6 +33,7 @@ rules:
parallel-updates: todo parallel-updates: todo
reauthentication-flow: done reauthentication-flow: done
test-coverage: done test-coverage: done
# Gold # Gold
devices: done devices: done
diagnostics: done diagnostics: done

View File

@ -9,13 +9,11 @@ from typing import Any
from demetriek import BrightnessMode, Device, LaMetricDevice from demetriek import BrightnessMode, Device, LaMetricDevice
from homeassistant.components.select import SelectEntity, SelectEntityDescription from homeassistant.components.select import SelectEntity, SelectEntityDescription
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 .const import DOMAIN from .coordinator import LaMetricConfigEntry, LaMetricDataUpdateCoordinator
from .coordinator import LaMetricDataUpdateCoordinator
from .entity import LaMetricEntity from .entity import LaMetricEntity
from .helpers import lametric_exception_handler from .helpers import lametric_exception_handler
@ -42,11 +40,11 @@ SELECTS = [
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: LaMetricConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up LaMetric select based on a config entry.""" """Set up LaMetric select based on a config entry."""
coordinator: LaMetricDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] coordinator = entry.runtime_data
async_add_entities( async_add_entities(
LaMetricSelectEntity( LaMetricSelectEntity(
coordinator=coordinator, coordinator=coordinator,

View File

@ -12,13 +12,11 @@ from homeassistant.components.sensor import (
SensorEntityDescription, SensorEntityDescription,
SensorStateClass, SensorStateClass,
) )
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import PERCENTAGE, EntityCategory from homeassistant.const import PERCENTAGE, 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 .const import DOMAIN from .coordinator import LaMetricConfigEntry, LaMetricDataUpdateCoordinator
from .coordinator import LaMetricDataUpdateCoordinator
from .entity import LaMetricEntity from .entity import LaMetricEntity
@ -44,11 +42,11 @@ SENSORS = [
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: LaMetricConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up LaMetric sensor based on a config entry.""" """Set up LaMetric sensor based on a config entry."""
coordinator: LaMetricDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] coordinator = entry.runtime_data
async_add_entities( async_add_entities(
LaMetricSensorEntity( LaMetricSensorEntity(
coordinator=coordinator, coordinator=coordinator,

View File

@ -9,13 +9,11 @@ from typing import Any
from demetriek import Device, LaMetricDevice from demetriek import Device, LaMetricDevice
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 .const import DOMAIN from .coordinator import LaMetricConfigEntry, LaMetricDataUpdateCoordinator
from .coordinator import LaMetricDataUpdateCoordinator
from .entity import LaMetricEntity from .entity import LaMetricEntity
from .helpers import lametric_exception_handler from .helpers import lametric_exception_handler
@ -47,11 +45,11 @@ SWITCHES = [
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: LaMetricConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up LaMetric switch based on a config entry.""" """Set up LaMetric switch based on a config entry."""
coordinator: LaMetricDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] coordinator = entry.runtime_data
async_add_entities( async_add_entities(
LaMetricSwitchEntity( LaMetricSwitchEntity(
coordinator=coordinator, coordinator=coordinator,