Use runtime_data in gogogate2 (#144322)

This commit is contained in:
epenet 2025-05-06 12:14:46 +02:00 committed by GitHub
parent 5a01521ff8
commit 57217b46ed
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 50 additions and 57 deletions

View File

@ -1,16 +1,16 @@
"""The gogogate2 component.""" """The gogogate2 component."""
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_DEVICE, Platform from homeassistant.const import CONF_DEVICE, Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from .common import get_data_update_coordinator from .common import create_data_update_coordinator
from .const import DEVICE_TYPE_GOGOGATE2 from .const import DEVICE_TYPE_GOGOGATE2
from .coordinator import GogoGateConfigEntry
PLATFORMS = [Platform.COVER, Platform.SENSOR] PLATFORMS = [Platform.COVER, Platform.SENSOR]
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: GogoGateConfigEntry) -> bool:
"""Do setup of Gogogate2.""" """Do setup of Gogogate2."""
# Update the config entry. # Update the config entry.
@ -24,14 +24,16 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
if config_updates: if config_updates:
hass.config_entries.async_update_entry(entry, data=config_updates) hass.config_entries.async_update_entry(entry, data=config_updates)
data_update_coordinator = get_data_update_coordinator(hass, entry) data_update_coordinator = create_data_update_coordinator(hass, entry)
await data_update_coordinator.async_config_entry_first_refresh() await data_update_coordinator.async_config_entry_first_refresh()
entry.runtime_data = data_update_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: GogoGateConfigEntry) -> bool:
"""Unload Gogogate2 config entry.""" """Unload Gogogate2 config entry."""
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS) return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)

View File

@ -16,7 +16,6 @@ from ismartgate import (
) )
from ismartgate.common import AbstractDoor from ismartgate.common import AbstractDoor
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ( from homeassistant.const import (
CONF_DEVICE, CONF_DEVICE,
CONF_IP_ADDRESS, CONF_IP_ADDRESS,
@ -27,8 +26,8 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.httpx_client import get_async_client from homeassistant.helpers.httpx_client import get_async_client
from homeassistant.helpers.update_coordinator import UpdateFailed from homeassistant.helpers.update_coordinator import UpdateFailed
from .const import DATA_UPDATE_COORDINATOR, DEVICE_TYPE_ISMARTGATE, DOMAIN from .const import DEVICE_TYPE_ISMARTGATE
from .coordinator import DeviceDataUpdateCoordinator from .coordinator import DeviceDataUpdateCoordinator, GogoGateConfigEntry
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -41,15 +40,10 @@ class StateData(NamedTuple):
door: AbstractDoor | None door: AbstractDoor | None
def get_data_update_coordinator( def create_data_update_coordinator(
hass: HomeAssistant, config_entry: ConfigEntry hass: HomeAssistant, config_entry: GogoGateConfigEntry
) -> DeviceDataUpdateCoordinator: ) -> DeviceDataUpdateCoordinator:
"""Get an update coordinator.""" """Get an update coordinator."""
hass.data.setdefault(DOMAIN, {})
hass.data[DOMAIN].setdefault(config_entry.entry_id, {})
config_entry_data = hass.data[DOMAIN][config_entry.entry_id]
if DATA_UPDATE_COORDINATOR not in config_entry_data:
api = get_api(hass, config_entry.data) api = get_api(hass, config_entry.data)
async def async_update_data() -> GogoGate2InfoResponse | ISmartGateInfoResponse: async def async_update_data() -> GogoGate2InfoResponse | ISmartGateInfoResponse:
@ -60,7 +54,7 @@ def get_data_update_coordinator(
f"Error communicating with API: {exception}" f"Error communicating with API: {exception}"
) from exception ) from exception
config_entry_data[DATA_UPDATE_COORDINATOR] = DeviceDataUpdateCoordinator( return DeviceDataUpdateCoordinator(
hass, hass,
config_entry, config_entry,
_LOGGER, _LOGGER,
@ -72,16 +66,14 @@ def get_data_update_coordinator(
update_interval=timedelta(seconds=5), update_interval=timedelta(seconds=5),
) )
return config_entry_data[DATA_UPDATE_COORDINATOR]
def cover_unique_id(config_entry: GogoGateConfigEntry, door: AbstractDoor) -> str:
def cover_unique_id(config_entry: ConfigEntry, door: AbstractDoor) -> str:
"""Generate a cover entity unique id.""" """Generate a cover entity unique id."""
return f"{config_entry.unique_id}_{door.door_id}" return f"{config_entry.unique_id}_{door.door_id}"
def sensor_unique_id( def sensor_unique_id(
config_entry: ConfigEntry, door: AbstractDoor, sensor_type: str config_entry: GogoGateConfigEntry, door: AbstractDoor, sensor_type: str
) -> str: ) -> str:
"""Generate a cover entity unique id.""" """Generate a cover entity unique id."""
return f"{config_entry.unique_id}_{door.door_id}_{sensor_type}" return f"{config_entry.unique_id}_{door.door_id}_{sensor_type}"

View File

@ -1,7 +1,7 @@
"""Constants for integration.""" """Constants for integration."""
DOMAIN = "gogogate2" DOMAIN = "gogogate2"
DATA_UPDATE_COORDINATOR = "data_update_coordinator"
DEVICE_TYPE_GOGOGATE2 = "gogogate2" DEVICE_TYPE_GOGOGATE2 = "gogogate2"
DEVICE_TYPE_ISMARTGATE = "ismartgate" DEVICE_TYPE_ISMARTGATE = "ismartgate"
MANUFACTURER = "Remsol" MANUFACTURER = "Remsol"

View File

@ -13,18 +13,20 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.debounce import Debouncer from homeassistant.helpers.debounce import Debouncer
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
type GogoGateConfigEntry = ConfigEntry[DeviceDataUpdateCoordinator]
class DeviceDataUpdateCoordinator( class DeviceDataUpdateCoordinator(
DataUpdateCoordinator[GogoGate2InfoResponse | ISmartGateInfoResponse] DataUpdateCoordinator[GogoGate2InfoResponse | ISmartGateInfoResponse]
): ):
"""Manages polling for state changes from the device.""" """Manages polling for state changes from the device."""
config_entry: ConfigEntry config_entry: GogoGateConfigEntry
def __init__( def __init__(
self, self,
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: GogoGateConfigEntry,
logger: logging.Logger, logger: logging.Logger,
api: AbstractGateApi, api: AbstractGateApi,
*, *,

View File

@ -16,22 +16,21 @@ from homeassistant.components.cover import (
CoverEntity, CoverEntity,
CoverEntityFeature, CoverEntityFeature,
) )
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 .common import cover_unique_id, get_data_update_coordinator from .common import cover_unique_id
from .coordinator import DeviceDataUpdateCoordinator from .coordinator import DeviceDataUpdateCoordinator, GogoGateConfigEntry
from .entity import GoGoGate2Entity from .entity import GoGoGate2Entity
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: GogoGateConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up the config entry.""" """Set up the config entry."""
data_update_coordinator = get_data_update_coordinator(hass, config_entry) data_update_coordinator = config_entry.runtime_data
async_add_entities( async_add_entities(
[ [
@ -48,7 +47,7 @@ class DeviceCover(GoGoGate2Entity, CoverEntity):
def __init__( def __init__(
self, self,
config_entry: ConfigEntry, config_entry: GogoGateConfigEntry,
data_update_coordinator: DeviceDataUpdateCoordinator, data_update_coordinator: DeviceDataUpdateCoordinator,
door: AbstractDoor, door: AbstractDoor,
) -> None: ) -> None:

View File

@ -4,13 +4,12 @@ from __future__ import annotations
from ismartgate.common import AbstractDoor, get_door_by_id from ismartgate.common import AbstractDoor, get_door_by_id
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_IP_ADDRESS from homeassistant.const import CONF_IP_ADDRESS
from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import DOMAIN, MANUFACTURER from .const import DOMAIN, MANUFACTURER
from .coordinator import DeviceDataUpdateCoordinator from .coordinator import DeviceDataUpdateCoordinator, GogoGateConfigEntry
class GoGoGate2Entity(CoordinatorEntity[DeviceDataUpdateCoordinator]): class GoGoGate2Entity(CoordinatorEntity[DeviceDataUpdateCoordinator]):
@ -18,7 +17,7 @@ class GoGoGate2Entity(CoordinatorEntity[DeviceDataUpdateCoordinator]):
def __init__( def __init__(
self, self,
config_entry: ConfigEntry, config_entry: GogoGateConfigEntry,
data_update_coordinator: DeviceDataUpdateCoordinator, data_update_coordinator: DeviceDataUpdateCoordinator,
door: AbstractDoor, door: AbstractDoor,
unique_id: str, unique_id: str,

View File

@ -11,13 +11,12 @@ from homeassistant.components.sensor import (
SensorEntity, SensorEntity,
SensorStateClass, SensorStateClass,
) )
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import PERCENTAGE, EntityCategory, UnitOfTemperature from homeassistant.const import PERCENTAGE, EntityCategory, UnitOfTemperature
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 .common import get_data_update_coordinator, sensor_unique_id from .common import sensor_unique_id
from .coordinator import DeviceDataUpdateCoordinator from .coordinator import DeviceDataUpdateCoordinator, GogoGateConfigEntry
from .entity import GoGoGate2Entity from .entity import GoGoGate2Entity
SENSOR_ID_WIRED = "WIRE" SENSOR_ID_WIRED = "WIRE"
@ -25,11 +24,11 @@ SENSOR_ID_WIRED = "WIRE"
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: GogoGateConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback, async_add_entities: AddConfigEntryEntitiesCallback,
) -> None: ) -> None:
"""Set up the config entry.""" """Set up the config entry."""
data_update_coordinator = get_data_update_coordinator(hass, config_entry) data_update_coordinator = config_entry.runtime_data
sensors = chain( sensors = chain(
[ [
@ -69,7 +68,7 @@ class DoorSensorBattery(DoorSensorEntity):
def __init__( def __init__(
self, self,
config_entry: ConfigEntry, config_entry: GogoGateConfigEntry,
data_update_coordinator: DeviceDataUpdateCoordinator, data_update_coordinator: DeviceDataUpdateCoordinator,
door: AbstractDoor, door: AbstractDoor,
) -> None: ) -> None:
@ -97,7 +96,7 @@ class DoorSensorTemperature(DoorSensorEntity):
def __init__( def __init__(
self, self,
config_entry: ConfigEntry, config_entry: GogoGateConfigEntry,
data_update_coordinator: DeviceDataUpdateCoordinator, data_update_coordinator: DeviceDataUpdateCoordinator,
door: AbstractDoor, door: AbstractDoor,
) -> None: ) -> None: