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 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, Platform
from homeassistant.const import Platform
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 = [
Platform.BINARY_SENSOR,
@ -27,8 +21,6 @@ PLATFORMS = [
Platform.SWITCH,
]
_LOGGER = logging.getLogger(__name__)
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
"""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)
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.helpers.entity_platform import AddEntitiesCallback
from . import ToloSaunaUpdateCoordinator
from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity

View File

@ -8,8 +8,8 @@ from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import ToloSaunaUpdateCoordinator
from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
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.helpers.entity_platform import AddEntitiesCallback
from . import ToloSaunaUpdateCoordinator
from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
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.update_coordinator import CoordinatorEntity
from . import ToloSaunaUpdateCoordinator
from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
class ToloSaunaCoordinatorEntity(CoordinatorEntity[ToloSaunaUpdateCoordinator]):

View File

@ -9,8 +9,8 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import ToloSaunaUpdateCoordinator
from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity

View File

@ -9,8 +9,8 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import ToloSaunaUpdateCoordinator
from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity

View File

@ -20,8 +20,8 @@ from homeassistant.const import EntityCategory, UnitOfTime
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import ToloSaunaUpdateCoordinator
from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity

View File

@ -13,8 +13,8 @@ from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import ToloSaunaUpdateCoordinator
from .const import DOMAIN, AromaTherapySlot, LampMode
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity

View File

@ -23,8 +23,8 @@ from homeassistant.const import (
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import ToloSaunaUpdateCoordinator
from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
from .entity import ToloSaunaCoordinatorEntity

View File

@ -13,8 +13,8 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import ToloSaunaUpdateCoordinator
from .const import DOMAIN
from .coordinator import ToloSaunaUpdateCoordinator
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.
"""
with patch(
"homeassistant.components.tolo.ToloClient", side_effect=Exception
"homeassistant.components.tolo.coordinator.ToloClient", side_effect=Exception
) as toloclient:
yield toloclient