Use config entry runtime data in Trafikverket Camera (#116552)

This commit is contained in:
G Johansson 2024-05-01 21:59:07 +02:00 committed by GitHub
parent 6cb703aa1d
commit b2c1cd3e2a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 33 additions and 26 deletions

View File

@ -19,13 +19,15 @@ CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN)
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
TVCameraConfigEntry = ConfigEntry[TVDataUpdateCoordinator]
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
async def async_setup_entry(hass: HomeAssistant, entry: TVCameraConfigEntry) -> bool:
"""Set up Trafikverket Camera from a config entry.""" """Set up Trafikverket Camera from a config entry."""
coordinator = TVDataUpdateCoordinator(hass, entry) coordinator = TVDataUpdateCoordinator(hass)
await coordinator.async_config_entry_first_refresh() await coordinator.async_config_entry_first_refresh()
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)
@ -34,11 +36,7 @@ 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 Trafikverket Camera config entry.""" """Unload Trafikverket Camera config entry."""
return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
if unload_ok := await hass.config_entries.async_unload_platforms(entry, PLATFORMS):
hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok
async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:

View File

@ -9,12 +9,11 @@ from homeassistant.components.binary_sensor import (
BinarySensorEntity, BinarySensorEntity,
BinarySensorEntityDescription, BinarySensorEntityDescription,
) )
from homeassistant.config_entries import ConfigEntry
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 .const import DOMAIN from . import TVCameraConfigEntry
from .coordinator import CameraData, TVDataUpdateCoordinator from .coordinator import CameraData
from .entity import TrafikverketCameraNonCameraEntity from .entity import TrafikverketCameraNonCameraEntity
PARALLEL_UPDATES = 0 PARALLEL_UPDATES = 0
@ -35,11 +34,13 @@ BINARY_SENSOR_TYPE = TVCameraSensorEntityDescription(
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback hass: HomeAssistant,
entry: TVCameraConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Trafikverket Camera binary sensor platform.""" """Set up Trafikverket Camera binary sensor platform."""
coordinator: TVDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] coordinator = entry.runtime_data
async_add_entities( async_add_entities(
[ [
TrafikverketCameraBinarySensor( TrafikverketCameraBinarySensor(

View File

@ -6,24 +6,24 @@ from collections.abc import Mapping
from typing import Any from typing import Any
from homeassistant.components.camera import Camera from homeassistant.components.camera import Camera
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ATTR_LOCATION from homeassistant.const import ATTR_LOCATION
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 .const import ATTR_DESCRIPTION, ATTR_TYPE, DOMAIN from . import TVCameraConfigEntry
from .const import ATTR_DESCRIPTION, ATTR_TYPE
from .coordinator import TVDataUpdateCoordinator from .coordinator import TVDataUpdateCoordinator
from .entity import TrafikverketCameraEntity from .entity import TrafikverketCameraEntity
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
entry: ConfigEntry, entry: TVCameraConfigEntry,
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up a Trafikverket Camera.""" """Set up a Trafikverket Camera."""
coordinator: TVDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] coordinator = entry.runtime_data
async_add_entities( async_add_entities(
[ [

View File

@ -6,6 +6,7 @@ from dataclasses import dataclass
from datetime import timedelta from datetime import timedelta
from io import BytesIO from io import BytesIO
import logging import logging
from typing import TYPE_CHECKING
from pytrafikverket.exceptions import ( from pytrafikverket.exceptions import (
InvalidAuthentication, InvalidAuthentication,
@ -15,7 +16,6 @@ from pytrafikverket.exceptions import (
) )
from pytrafikverket.trafikverket_camera import CameraInfo, TrafikverketCamera from pytrafikverket.trafikverket_camera import CameraInfo, TrafikverketCamera
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_API_KEY, CONF_ID from homeassistant.const import CONF_API_KEY, CONF_ID
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.exceptions import ConfigEntryAuthFailed from homeassistant.exceptions import ConfigEntryAuthFailed
@ -24,6 +24,9 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, Upda
from .const import DOMAIN from .const import DOMAIN
if TYPE_CHECKING:
from . import TVCameraConfigEntry
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
TIME_BETWEEN_UPDATES = timedelta(minutes=5) TIME_BETWEEN_UPDATES = timedelta(minutes=5)
@ -39,7 +42,9 @@ class CameraData:
class TVDataUpdateCoordinator(DataUpdateCoordinator[CameraData]): class TVDataUpdateCoordinator(DataUpdateCoordinator[CameraData]):
"""A Trafikverket Data Update Coordinator.""" """A Trafikverket Data Update Coordinator."""
def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None: config_entry: TVCameraConfigEntry
def __init__(self, hass: HomeAssistant) -> None:
"""Initialize the Trafikverket coordinator.""" """Initialize the Trafikverket coordinator."""
super().__init__( super().__init__(
hass, hass,
@ -48,8 +53,10 @@ class TVDataUpdateCoordinator(DataUpdateCoordinator[CameraData]):
update_interval=TIME_BETWEEN_UPDATES, update_interval=TIME_BETWEEN_UPDATES,
) )
self.session = async_get_clientsession(hass) self.session = async_get_clientsession(hass)
self._camera_api = TrafikverketCamera(self.session, entry.data[CONF_API_KEY]) self._camera_api = TrafikverketCamera(
self._id = entry.data[CONF_ID] self.session, self.config_entry.data[CONF_API_KEY]
)
self._id = self.config_entry.data[CONF_ID]
async def _async_update_data(self) -> CameraData: async def _async_update_data(self) -> CameraData:
"""Fetch data from Trafikverket.""" """Fetch data from Trafikverket."""

View File

@ -11,14 +11,13 @@ from homeassistant.components.sensor import (
SensorEntity, SensorEntity,
SensorEntityDescription, SensorEntityDescription,
) )
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import DEGREE from homeassistant.const import DEGREE
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.typing import StateType from homeassistant.helpers.typing import StateType
from .const import DOMAIN from . import TVCameraConfigEntry
from .coordinator import CameraData, TVDataUpdateCoordinator from .coordinator import CameraData
from .entity import TrafikverketCameraNonCameraEntity from .entity import TrafikverketCameraNonCameraEntity
PARALLEL_UPDATES = 0 PARALLEL_UPDATES = 0
@ -73,11 +72,13 @@ SENSOR_TYPES: tuple[TVCameraSensorEntityDescription, ...] = (
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback hass: HomeAssistant,
entry: TVCameraConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None: ) -> None:
"""Set up Trafikverket Camera sensor platform.""" """Set up Trafikverket Camera sensor platform."""
coordinator: TVDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id] coordinator = entry.runtime_data
async_add_entities( async_add_entities(
TrafikverketCameraSensor(coordinator, entry.entry_id, description) TrafikverketCameraSensor(coordinator, entry.entry_id, description)
for description in SENSOR_TYPES for description in SENSOR_TYPES