Move tolo coordinator to separate module (#126550)

* Move tolo coordinator to separate module

* Adjust tests
This commit is contained in:
epenet 2024-09-23 15:56:59 +02:00 committed by GitHub
parent 6d83a15ad5
commit d101fb33b3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 68 additions and 58 deletions

View File

@ -2,18 +2,12 @@
from __future__ import annotations from __future__ import annotations
from datetime import timedelta
import logging
from typing import NamedTuple
from tololib import ToloClient, ToloSettings, ToloStatus
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, Platform from homeassistant.const import Platform
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DEFAULT_RETRY_COUNT, DEFAULT_RETRY_TIMEOUT, DOMAIN from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
PLATFORMS = [ PLATFORMS = [
Platform.BINARY_SENSOR, Platform.BINARY_SENSOR,
@ -27,8 +21,6 @@ PLATFORMS = [
Platform.SWITCH, Platform.SWITCH,
] ]
_LOGGER = logging.getLogger(__name__)
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""Set up tolo from a config entry.""" """Set up tolo from a config entry."""
@ -48,39 +40,3 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
hass.data[DOMAIN].pop(entry.entry_id) hass.data[DOMAIN].pop(entry.entry_id)
return unload_ok return unload_ok
class ToloSaunaData(NamedTuple):
"""Compound class for reflecting full state (status and info) of a TOLO Sauna."""
status: ToloStatus
settings: ToloSettings
class ToloSaunaUpdateCoordinator(DataUpdateCoordinator[ToloSaunaData]): # pylint: disable=hass-enforce-class-module
"""DataUpdateCoordinator for TOLO Sauna."""
def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None:
"""Initialize ToloSaunaUpdateCoordinator."""
self.client = ToloClient(
address=entry.data[CONF_HOST],
retry_timeout=DEFAULT_RETRY_TIMEOUT,
retry_count=DEFAULT_RETRY_COUNT,
)
super().__init__(
hass=hass,
logger=_LOGGER,
name=f"{entry.title} ({entry.data[CONF_HOST]}) Data Update Coordinator",
update_interval=timedelta(seconds=5),
)
async def _async_update_data(self) -> ToloSaunaData:
return await self.hass.async_add_executor_job(self._get_tolo_sauna_data)
def _get_tolo_sauna_data(self) -> ToloSaunaData:
try:
status = self.client.get_status()
settings = self.client.get_settings()
except TimeoutError as error:
raise UpdateFailed("communication timeout") from error
return ToloSaunaData(status, settings)

View File

@ -9,8 +9,8 @@ from homeassistant.const import EntityCategory
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 . import ToloSaunaUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity from .entity import ToloSaunaCoordinatorEntity

View File

@ -8,8 +8,8 @@ from homeassistant.const import EntityCategory
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 . import ToloSaunaUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity from .entity import ToloSaunaCoordinatorEntity

View File

@ -25,8 +25,8 @@ from homeassistant.const import ATTR_TEMPERATURE, PRECISION_WHOLE, UnitOfTempera
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 . import ToloSaunaUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity from .entity import ToloSaunaCoordinatorEntity

View File

@ -0,0 +1,54 @@
"""Component to control TOLO Sauna/Steam Bath."""
from __future__ import annotations
from datetime import timedelta
import logging
from typing import NamedTuple
from tololib import ToloClient, ToloSettings, ToloStatus
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST
from homeassistant.core import HomeAssistant
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
from .const import DEFAULT_RETRY_COUNT, DEFAULT_RETRY_TIMEOUT
_LOGGER = logging.getLogger(__name__)
class ToloSaunaData(NamedTuple):
"""Compound class for reflecting full state (status and info) of a TOLO Sauna."""
status: ToloStatus
settings: ToloSettings
class ToloSaunaUpdateCoordinator(DataUpdateCoordinator[ToloSaunaData]):
"""DataUpdateCoordinator for TOLO Sauna."""
def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None:
"""Initialize ToloSaunaUpdateCoordinator."""
self.client = ToloClient(
address=entry.data[CONF_HOST],
retry_timeout=DEFAULT_RETRY_TIMEOUT,
retry_count=DEFAULT_RETRY_COUNT,
)
super().__init__(
hass=hass,
logger=_LOGGER,
name=f"{entry.title} ({entry.data[CONF_HOST]}) Data Update Coordinator",
update_interval=timedelta(seconds=5),
)
async def _async_update_data(self) -> ToloSaunaData:
return await self.hass.async_add_executor_job(self._get_tolo_sauna_data)
def _get_tolo_sauna_data(self) -> ToloSaunaData:
try:
status = self.client.get_status()
settings = self.client.get_settings()
except TimeoutError as error:
raise UpdateFailed("communication timeout") from error
return ToloSaunaData(status, settings)

View File

@ -6,8 +6,8 @@ from homeassistant.config_entries import ConfigEntry
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 . import ToloSaunaUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
class ToloSaunaCoordinatorEntity(CoordinatorEntity[ToloSaunaUpdateCoordinator]): class ToloSaunaCoordinatorEntity(CoordinatorEntity[ToloSaunaUpdateCoordinator]):

View File

@ -9,8 +9,8 @@ from homeassistant.config_entries import ConfigEntry
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 . import ToloSaunaUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity from .entity import ToloSaunaCoordinatorEntity

View File

@ -9,8 +9,8 @@ from homeassistant.config_entries import ConfigEntry
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 . import ToloSaunaUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity from .entity import ToloSaunaCoordinatorEntity

View File

@ -20,8 +20,8 @@ from homeassistant.const import EntityCategory, UnitOfTime
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 . import ToloSaunaUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity from .entity import ToloSaunaCoordinatorEntity

View File

@ -13,8 +13,8 @@ from homeassistant.const import EntityCategory
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 . import ToloSaunaUpdateCoordinator
from .const import DOMAIN, AromaTherapySlot, LampMode from .const import DOMAIN, AromaTherapySlot, LampMode
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity from .entity import ToloSaunaCoordinatorEntity

View File

@ -23,8 +23,8 @@ from homeassistant.const import (
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 . import ToloSaunaUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity from .entity import ToloSaunaCoordinatorEntity

View File

@ -13,8 +13,8 @@ from homeassistant.config_entries import ConfigEntry
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 . import ToloSaunaUpdateCoordinator
from .const import DOMAIN from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity from .entity import ToloSaunaCoordinatorEntity

View File

@ -31,7 +31,7 @@ def coordinator_toloclient() -> Mock:
Throw exception to abort entry setup and prevent socket IO. Only testing config flow. Throw exception to abort entry setup and prevent socket IO. Only testing config flow.
""" """
with patch( with patch(
"homeassistant.components.tolo.ToloClient", side_effect=Exception "homeassistant.components.tolo.coordinator.ToloClient", side_effect=Exception
) as toloclient: ) as toloclient:
yield toloclient yield toloclient