Use ConfigEntry runtime_data in TwenteMilieu (#116642)

This commit is contained in:
Franck Nijhof 2024-05-06 19:21:34 +02:00 committed by GitHub
parent f5c54bcc0d
commit 72d6b4d1c9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 27 additions and 64 deletions

View file

@ -23,6 +23,9 @@ SERVICE_SCHEMA = vol.Schema({vol.Optional(CONF_ID): cv.string})
PLATFORMS = [Platform.CALENDAR, Platform.SENSOR] PLATFORMS = [Platform.CALENDAR, Platform.SENSOR]
TwenteMilieuDataUpdateCoordinator = DataUpdateCoordinator[dict[WasteType, list[date]]]
TwenteMilieuConfigEntry = ConfigEntry[TwenteMilieuDataUpdateCoordinator]
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up Twente Milieu from a config entry.""" """Set up Twente Milieu from a config entry."""
@ -34,14 +37,12 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
session=session, session=session,
) )
coordinator: DataUpdateCoordinator[dict[WasteType, list[date]]] = ( coordinator: TwenteMilieuDataUpdateCoordinator = DataUpdateCoordinator(
DataUpdateCoordinator( hass,
hass, LOGGER,
LOGGER, name=DOMAIN,
name=DOMAIN, update_interval=SCAN_INTERVAL,
update_interval=SCAN_INTERVAL, update_method=twentemilieu.update,
update_method=twentemilieu.update,
)
) )
await coordinator.async_config_entry_first_refresh() await coordinator.async_config_entry_first_refresh()
@ -51,7 +52,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
entry, unique_id=str(entry.data[CONF_ID]) entry, unique_id=str(entry.data[CONF_ID])
) )
hass.data.setdefault(DOMAIN, {})[entry.data[CONF_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
@ -59,7 +60,4 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Unload Twente Milieu config entry.""" """Unload Twente Milieu 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:
del hass.data[DOMAIN][entry.data[CONF_ID]]
return unload_ok

View file

@ -2,30 +2,26 @@
from __future__ import annotations from __future__ import annotations
from datetime import date, datetime, timedelta from datetime import datetime, timedelta
from twentemilieu import WasteType
from homeassistant.components.calendar import CalendarEntity, CalendarEvent from homeassistant.components.calendar import CalendarEntity, CalendarEvent
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_ID from homeassistant.const import CONF_ID
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
import homeassistant.util.dt as dt_util import homeassistant.util.dt as dt_util
from .const import DOMAIN, WASTE_TYPE_TO_DESCRIPTION from . import TwenteMilieuConfigEntry
from .const import WASTE_TYPE_TO_DESCRIPTION
from .entity import TwenteMilieuEntity from .entity import TwenteMilieuEntity
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: TwenteMilieuConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Twente Milieu calendar based on a config entry.""" """Set up Twente Milieu calendar based on a config entry."""
coordinator = hass.data[DOMAIN][entry.data[CONF_ID]] async_add_entities([TwenteMilieuCalendar(entry)])
async_add_entities([TwenteMilieuCalendar(coordinator, entry)])
class TwenteMilieuCalendar(TwenteMilieuEntity, CalendarEntity): class TwenteMilieuCalendar(TwenteMilieuEntity, CalendarEntity):
@ -35,13 +31,9 @@ class TwenteMilieuCalendar(TwenteMilieuEntity, CalendarEntity):
_attr_name = None _attr_name = None
_attr_translation_key = "calendar" _attr_translation_key = "calendar"
def __init__( def __init__(self, entry: TwenteMilieuConfigEntry) -> None:
self,
coordinator: DataUpdateCoordinator[dict[WasteType, list[date]]],
entry: ConfigEntry,
) -> None:
"""Initialize the Twente Milieu entity.""" """Initialize the Twente Milieu entity."""
super().__init__(coordinator, entry) super().__init__(entry)
self._attr_unique_id = str(entry.data[CONF_ID]) self._attr_unique_id = str(entry.data[CONF_ID])
self._event: CalendarEvent | None = None self._event: CalendarEvent | None = None

View file

@ -2,29 +2,19 @@
from __future__ import annotations from __future__ import annotations
from datetime import date
from typing import Any from typing import Any
from twentemilieu import WasteType
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_ID
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import DOMAIN
async def async_get_config_entry_diagnostics( async def async_get_config_entry_diagnostics(
hass: HomeAssistant, entry: ConfigEntry hass: HomeAssistant, entry: ConfigEntry
) -> dict[str, Any]: ) -> dict[str, Any]:
"""Return diagnostics for a config entry.""" """Return diagnostics for a config entry."""
coordinator: DataUpdateCoordinator[dict[WasteType, list[date]]] = hass.data[DOMAIN][
entry.data[CONF_ID]
]
return { return {
f"WasteType.{waste_type.name}": [ f"WasteType.{waste_type.name}": [
waste_date.isoformat() for waste_date in waste_dates waste_date.isoformat() for waste_date in waste_dates
] ]
for waste_type, waste_dates in coordinator.data.items() for waste_type, waste_dates in entry.runtime_data.data.items()
} }

View file

@ -2,36 +2,24 @@
from __future__ import annotations from __future__ import annotations
from datetime import date
from twentemilieu import WasteType
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_ID from homeassistant.const import CONF_ID
from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
from homeassistant.helpers.update_coordinator import ( from homeassistant.helpers.update_coordinator import CoordinatorEntity
CoordinatorEntity,
DataUpdateCoordinator,
)
from . import TwenteMilieuDataUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
class TwenteMilieuEntity( class TwenteMilieuEntity(CoordinatorEntity[TwenteMilieuDataUpdateCoordinator], Entity):
CoordinatorEntity[DataUpdateCoordinator[dict[WasteType, list[date]]]], Entity
):
"""Defines a Twente Milieu entity.""" """Defines a Twente Milieu entity."""
_attr_has_entity_name = True _attr_has_entity_name = True
def __init__( def __init__(self, entry: ConfigEntry) -> None:
self,
coordinator: DataUpdateCoordinator[dict[WasteType, list[date]]],
entry: ConfigEntry,
) -> None:
"""Initialize the Twente Milieu entity.""" """Initialize the Twente Milieu entity."""
super().__init__(coordinator=coordinator) super().__init__(coordinator=entry.runtime_data)
self._attr_device_info = DeviceInfo( self._attr_device_info = DeviceInfo(
configuration_url="https://www.twentemilieu.nl", configuration_url="https://www.twentemilieu.nl",
entry_type=DeviceEntryType.SERVICE, entry_type=DeviceEntryType.SERVICE,

View file

@ -16,7 +16,6 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_ID from homeassistant.const import CONF_ID
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
from .entity import TwenteMilieuEntity from .entity import TwenteMilieuEntity
@ -69,9 +68,8 @@ async def async_setup_entry(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Twente Milieu sensor based on a config entry.""" """Set up Twente Milieu sensor based on a config entry."""
coordinator = hass.data[DOMAIN][entry.data[CONF_ID]]
async_add_entities( async_add_entities(
TwenteMilieuSensor(coordinator, description, entry) for description in SENSORS TwenteMilieuSensor(entry, description) for description in SENSORS
) )
@ -82,12 +80,11 @@ class TwenteMilieuSensor(TwenteMilieuEntity, SensorEntity):
def __init__( def __init__(
self, self,
coordinator: DataUpdateCoordinator[dict[WasteType, list[date]]],
description: TwenteMilieuSensorDescription,
entry: ConfigEntry, entry: ConfigEntry,
description: TwenteMilieuSensorDescription,
) -> None: ) -> None:
"""Initialize the Twente Milieu entity.""" """Initialize the Twente Milieu entity."""
super().__init__(coordinator, entry) super().__init__(entry)
self.entity_description = description self.entity_description = description
self._attr_unique_id = f"{DOMAIN}_{entry.data[CONF_ID]}_{description.key}" self._attr_unique_id = f"{DOMAIN}_{entry.data[CONF_ID]}_{description.key}"

View file

@ -4,7 +4,6 @@ from unittest.mock import MagicMock, patch
import pytest import pytest
from homeassistant.components.twentemilieu.const import DOMAIN
from homeassistant.config_entries import ConfigEntryState from homeassistant.config_entries import ConfigEntryState
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -26,7 +25,6 @@ async def test_load_unload_config_entry(
await hass.config_entries.async_unload(mock_config_entry.entry_id) await hass.config_entries.async_unload(mock_config_entry.entry_id)
await hass.async_block_till_done() await hass.async_block_till_done()
assert not hass.data.get(DOMAIN)
assert mock_config_entry.state is ConfigEntryState.NOT_LOADED assert mock_config_entry.state is ConfigEntryState.NOT_LOADED