From d101fb33b3ff826ad509bc5498e7fa235d3e927e Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 23 Sep 2024 15:56:59 +0200 Subject: [PATCH] Move tolo coordinator to separate module (#126550) * Move tolo coordinator to separate module * Adjust tests --- homeassistant/components/tolo/__init__.py | 50 ++--------------- .../components/tolo/binary_sensor.py | 2 +- homeassistant/components/tolo/button.py | 2 +- homeassistant/components/tolo/climate.py | 2 +- homeassistant/components/tolo/coordinator.py | 54 +++++++++++++++++++ homeassistant/components/tolo/entity.py | 2 +- homeassistant/components/tolo/fan.py | 2 +- homeassistant/components/tolo/light.py | 2 +- homeassistant/components/tolo/number.py | 2 +- homeassistant/components/tolo/select.py | 2 +- homeassistant/components/tolo/sensor.py | 2 +- homeassistant/components/tolo/switch.py | 2 +- tests/components/tolo/test_config_flow.py | 2 +- 13 files changed, 68 insertions(+), 58 deletions(-) create mode 100644 homeassistant/components/tolo/coordinator.py diff --git a/homeassistant/components/tolo/__init__.py b/homeassistant/components/tolo/__init__.py index 58ba9f550a9..d2a43ef525b 100644 --- a/homeassistant/components/tolo/__init__.py +++ b/homeassistant/components/tolo/__init__.py @@ -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) diff --git a/homeassistant/components/tolo/binary_sensor.py b/homeassistant/components/tolo/binary_sensor.py index 835bc913a86..845f8ed22e3 100644 --- a/homeassistant/components/tolo/binary_sensor.py +++ b/homeassistant/components/tolo/binary_sensor.py @@ -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 diff --git a/homeassistant/components/tolo/button.py b/homeassistant/components/tolo/button.py index 7c32d7d7a29..b7c4362ca7b 100644 --- a/homeassistant/components/tolo/button.py +++ b/homeassistant/components/tolo/button.py @@ -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 diff --git a/homeassistant/components/tolo/climate.py b/homeassistant/components/tolo/climate.py index f6360e1d99b..8c5176b3e4e 100644 --- a/homeassistant/components/tolo/climate.py +++ b/homeassistant/components/tolo/climate.py @@ -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 diff --git a/homeassistant/components/tolo/coordinator.py b/homeassistant/components/tolo/coordinator.py new file mode 100644 index 00000000000..632cc819f5a --- /dev/null +++ b/homeassistant/components/tolo/coordinator.py @@ -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) diff --git a/homeassistant/components/tolo/entity.py b/homeassistant/components/tolo/entity.py index 68ddc382e7f..261cfc7cb0c 100644 --- a/homeassistant/components/tolo/entity.py +++ b/homeassistant/components/tolo/entity.py @@ -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]): diff --git a/homeassistant/components/tolo/fan.py b/homeassistant/components/tolo/fan.py index 396dc0b0da4..9b62346a83b 100644 --- a/homeassistant/components/tolo/fan.py +++ b/homeassistant/components/tolo/fan.py @@ -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 diff --git a/homeassistant/components/tolo/light.py b/homeassistant/components/tolo/light.py index 5491aa90ea4..eeb37305fe8 100644 --- a/homeassistant/components/tolo/light.py +++ b/homeassistant/components/tolo/light.py @@ -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 diff --git a/homeassistant/components/tolo/number.py b/homeassistant/components/tolo/number.py index acdd26fe9c0..73505c5b251 100644 --- a/homeassistant/components/tolo/number.py +++ b/homeassistant/components/tolo/number.py @@ -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 diff --git a/homeassistant/components/tolo/select.py b/homeassistant/components/tolo/select.py index b41595d3a34..fee1ac1774e 100644 --- a/homeassistant/components/tolo/select.py +++ b/homeassistant/components/tolo/select.py @@ -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 diff --git a/homeassistant/components/tolo/sensor.py b/homeassistant/components/tolo/sensor.py index 8ea6b68ae95..0e94ec0ae1e 100644 --- a/homeassistant/components/tolo/sensor.py +++ b/homeassistant/components/tolo/sensor.py @@ -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 diff --git a/homeassistant/components/tolo/switch.py b/homeassistant/components/tolo/switch.py index 9799d106658..d39dd17f0f3 100644 --- a/homeassistant/components/tolo/switch.py +++ b/homeassistant/components/tolo/switch.py @@ -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 diff --git a/tests/components/tolo/test_config_flow.py b/tests/components/tolo/test_config_flow.py index 9dcca4b704f..73382944cf0 100644 --- a/tests/components/tolo/test_config_flow.py +++ b/tests/components/tolo/test_config_flow.py @@ -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