Convert enphase_envoy to use entry.runtime_data (#122345)

This commit is contained in:
J. Nick Koston 2024-07-22 00:44:00 -05:00 committed by GitHub
parent ac1ad9680b
commit db9fc27a5c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 33 additions and 41 deletions

View file

@ -4,7 +4,6 @@ from __future__ import annotations
from pyenphase import Envoy from pyenphase import Envoy
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST from homeassistant.const import CONF_HOST
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.exceptions import ConfigEntryNotReady
@ -12,10 +11,10 @@ from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.httpx_client import get_async_client from homeassistant.helpers.httpx_client import get_async_client
from .const import DOMAIN, PLATFORMS from .const import DOMAIN, PLATFORMS
from .coordinator import EnphaseUpdateCoordinator from .coordinator import EnphaseConfigEntry, EnphaseUpdateCoordinator
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: EnphaseConfigEntry) -> bool:
"""Set up Enphase Envoy from a config entry.""" """Set up Enphase Envoy from a config entry."""
host = entry.data[CONF_HOST] host = entry.data[CONF_HOST]
@ -37,29 +36,26 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
f"found {envoy.serial_number}" f"found {envoy.serial_number}"
) )
hass.data.setdefault(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)
return True return True
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_unload_entry(hass: HomeAssistant, entry: EnphaseConfigEntry) -> bool:
"""Unload a config entry.""" """Unload a config entry."""
coordinator: EnphaseUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] coordinator: EnphaseUpdateCoordinator = entry.runtime_data
coordinator.async_cancel_token_refresh() coordinator.async_cancel_token_refresh()
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_config_entry_device( async def async_remove_config_entry_device(
hass: HomeAssistant, config_entry: ConfigEntry, device_entry: dr.DeviceEntry hass: HomeAssistant, config_entry: EnphaseConfigEntry, device_entry: dr.DeviceEntry
) -> bool: ) -> bool:
"""Remove an enphase_envoy config entry from a device.""" """Remove an enphase_envoy config entry from a device."""
dev_ids = {dev_id[1] for dev_id in device_entry.identifiers if dev_id[0] == DOMAIN} dev_ids = {dev_id[1] for dev_id in device_entry.identifiers if dev_id[0] == DOMAIN}
coordinator: EnphaseUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id] coordinator = config_entry.runtime_data
envoy_data = coordinator.envoy.data envoy_data = coordinator.envoy.data
envoy_serial_num = config_entry.unique_id envoy_serial_num = config_entry.unique_id
if envoy_serial_num in dev_ids: if envoy_serial_num in dev_ids:

View file

@ -13,14 +13,13 @@ from homeassistant.components.binary_sensor import (
BinarySensorEntity, BinarySensorEntity,
BinarySensorEntityDescription, BinarySensorEntityDescription,
) )
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.device_registry import DeviceInfo from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN from .const import DOMAIN
from .coordinator import EnphaseUpdateCoordinator from .coordinator import EnphaseConfigEntry, EnphaseUpdateCoordinator
from .entity import EnvoyBaseEntity from .entity import EnvoyBaseEntity
@ -74,11 +73,11 @@ ENPOWER_SENSORS = (
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: EnphaseConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up envoy binary sensor platform.""" """Set up envoy binary sensor platform."""
coordinator: EnphaseUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id] coordinator = config_entry.runtime_data
envoy_data = coordinator.envoy.data envoy_data = coordinator.envoy.data
assert envoy_data is not None assert envoy_data is not None
entities: list[BinarySensorEntity] = [] entities: list[BinarySensorEntity] = []

View file

@ -28,12 +28,17 @@ STALE_TOKEN_THRESHOLD = timedelta(days=30).total_seconds()
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
type EnphaseConfigEntry = ConfigEntry[EnphaseUpdateCoordinator]
class EnphaseUpdateCoordinator(DataUpdateCoordinator[dict[str, Any]]): class EnphaseUpdateCoordinator(DataUpdateCoordinator[dict[str, Any]]):
"""DataUpdateCoordinator to gather data from any envoy.""" """DataUpdateCoordinator to gather data from any envoy."""
envoy_serial_number: str envoy_serial_number: str
def __init__(self, hass: HomeAssistant, envoy: Envoy, entry: ConfigEntry) -> None: def __init__(
self, hass: HomeAssistant, envoy: Envoy, entry: EnphaseConfigEntry
) -> None:
"""Initialize DataUpdateCoordinator for the envoy.""" """Initialize DataUpdateCoordinator for the envoy."""
self.envoy = envoy self.envoy = envoy
entry_data = entry.data entry_data = entry.data

View file

@ -10,7 +10,6 @@ from pyenphase.envoy import Envoy
from pyenphase.exceptions import EnvoyError from pyenphase.exceptions import EnvoyError
from homeassistant.components.diagnostics import async_redact_data from homeassistant.components.diagnostics import async_redact_data
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ( from homeassistant.const import (
CONF_NAME, CONF_NAME,
CONF_PASSWORD, CONF_PASSWORD,
@ -23,8 +22,8 @@ from homeassistant.helpers import device_registry as dr, entity_registry as er
from homeassistant.helpers.json import json_dumps from homeassistant.helpers.json import json_dumps
from homeassistant.util.json import json_loads from homeassistant.util.json import json_loads
from .const import DOMAIN, OPTION_DIAGNOSTICS_INCLUDE_FIXTURES from .const import OPTION_DIAGNOSTICS_INCLUDE_FIXTURES
from .coordinator import EnphaseUpdateCoordinator from .coordinator import EnphaseConfigEntry
CONF_TITLE = "title" CONF_TITLE = "title"
CLEAN_TEXT = "<<envoyserial>>" CLEAN_TEXT = "<<envoyserial>>"
@ -81,10 +80,10 @@ async def _get_fixture_collection(envoy: Envoy, serial: str) -> dict[str, Any]:
async def async_get_config_entry_diagnostics( async def async_get_config_entry_diagnostics(
hass: HomeAssistant, entry: ConfigEntry hass: HomeAssistant, entry: EnphaseConfigEntry
) -> dict[str, Any]: ) -> dict[str, Any]:
"""Return diagnostics for a config entry.""" """Return diagnostics for a config entry."""
coordinator: EnphaseUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] coordinator = entry.runtime_data
if TYPE_CHECKING: if TYPE_CHECKING:
assert coordinator.envoy.data assert coordinator.envoy.data

View file

@ -16,14 +16,13 @@ from homeassistant.components.number import (
NumberEntity, NumberEntity,
NumberEntityDescription, 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.device_registry import DeviceInfo from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN from .const import DOMAIN
from .coordinator import EnphaseUpdateCoordinator from .coordinator import EnphaseConfigEntry, EnphaseUpdateCoordinator
from .entity import EnvoyBaseEntity from .entity import EnvoyBaseEntity
@ -71,11 +70,11 @@ STORAGE_RESERVE_SOC_ENTITY = EnvoyStorageSettingsNumberEntityDescription(
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: EnphaseConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Enphase Envoy number platform.""" """Set up Enphase Envoy number platform."""
coordinator: EnphaseUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id] coordinator = config_entry.runtime_data
envoy_data = coordinator.envoy.data envoy_data = coordinator.envoy.data
assert envoy_data is not None assert envoy_data is not None
entities: list[NumberEntity] = [] entities: list[NumberEntity] = []

View file

@ -12,13 +12,12 @@ from pyenphase.models.dry_contacts import DryContactAction, DryContactMode
from pyenphase.models.tariff import EnvoyStorageMode, EnvoyStorageSettings from pyenphase.models.tariff import EnvoyStorageMode, EnvoyStorageSettings
from homeassistant.components.select import SelectEntity, SelectEntityDescription from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN from .const import DOMAIN
from .coordinator import EnphaseUpdateCoordinator from .coordinator import EnphaseConfigEntry, EnphaseUpdateCoordinator
from .entity import EnvoyBaseEntity from .entity import EnvoyBaseEntity
@ -126,11 +125,11 @@ STORAGE_MODE_ENTITY = EnvoyStorageSettingsSelectEntityDescription(
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: EnphaseConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Enphase Envoy select platform.""" """Set up Enphase Envoy select platform."""
coordinator: EnphaseUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id] coordinator = config_entry.runtime_data
envoy_data = coordinator.envoy.data envoy_data = coordinator.envoy.data
assert envoy_data is not None assert envoy_data is not None
entities: list[SelectEntity] = [] entities: list[SelectEntity] = []

View file

@ -33,7 +33,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,
UnitOfApparentPower, UnitOfApparentPower,
@ -50,7 +49,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
from .const import DOMAIN from .const import DOMAIN
from .coordinator import EnphaseUpdateCoordinator from .coordinator import EnphaseConfigEntry, EnphaseUpdateCoordinator
from .entity import EnvoyBaseEntity from .entity import EnvoyBaseEntity
ICON = "mdi:flash" ICON = "mdi:flash"
@ -579,11 +578,11 @@ ENCHARGE_AGGREGATE_SENSORS = (
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: EnphaseConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up envoy sensor platform.""" """Set up envoy sensor platform."""
coordinator: EnphaseUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id] coordinator = config_entry.runtime_data
envoy_data = coordinator.envoy.data envoy_data = coordinator.envoy.data
assert envoy_data is not None assert envoy_data is not None
_LOGGER.debug("Envoy data: %s", envoy_data) _LOGGER.debug("Envoy data: %s", envoy_data)

View file

@ -4,7 +4,6 @@ from __future__ import annotations
from collections.abc import Awaitable, Callable, Coroutine from collections.abc import Awaitable, Callable, Coroutine
from dataclasses import dataclass from dataclasses import dataclass
import logging
from typing import Any from typing import Any
from pyenphase import Envoy, EnvoyDryContactStatus, EnvoyEnpower from pyenphase import Envoy, EnvoyDryContactStatus, EnvoyEnpower
@ -13,17 +12,14 @@ from pyenphase.models.dry_contacts import DryContactStatus
from pyenphase.models.tariff import EnvoyStorageSettings from pyenphase.models.tariff import EnvoyStorageSettings
from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN from .const import DOMAIN
from .coordinator import EnphaseUpdateCoordinator from .coordinator import EnphaseConfigEntry, EnphaseUpdateCoordinator
from .entity import EnvoyBaseEntity from .entity import EnvoyBaseEntity
_LOGGER = logging.getLogger(__name__)
@dataclass(frozen=True, kw_only=True) @dataclass(frozen=True, kw_only=True)
class EnvoyEnpowerSwitchEntityDescription(SwitchEntityDescription): class EnvoyEnpowerSwitchEntityDescription(SwitchEntityDescription):
@ -78,11 +74,11 @@ CHARGE_FROM_GRID_SWITCH = EnvoyStorageSettingsSwitchEntityDescription(
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: EnphaseConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Enphase Envoy switch platform.""" """Set up Enphase Envoy switch platform."""
coordinator: EnphaseUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id] coordinator = config_entry.runtime_data
envoy_data = coordinator.envoy.data envoy_data = coordinator.envoy.data
assert envoy_data is not None assert envoy_data is not None
entities: list[SwitchEntity] = [] entities: list[SwitchEntity] = []