diff --git a/homeassistant/components/tolo/__init__.py b/homeassistant/components/tolo/__init__.py index 2fc41fac3af..165e5804d61 100644 --- a/homeassistant/components/tolo/__init__.py +++ b/homeassistant/components/tolo/__init__.py @@ -6,9 +6,7 @@ from datetime import timedelta import logging from typing import NamedTuple -from tololib import ToloClient -from tololib.errors import ResponseTimedOutError -from tololib.message_info import SettingsInfo, StatusInfo +from tololib import ToloClient, ToloSettings, ToloStatus from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_HOST, Platform @@ -59,8 +57,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: class ToloSaunaData(NamedTuple): """Compound class for reflecting full state (status and info) of a TOLO Sauna.""" - status: StatusInfo - settings: SettingsInfo + status: ToloStatus + settings: ToloSettings class ToloSaunaUpdateCoordinator(DataUpdateCoordinator[ToloSaunaData]): # pylint: disable=hass-enforce-coordinator-module @@ -68,7 +66,11 @@ class ToloSaunaUpdateCoordinator(DataUpdateCoordinator[ToloSaunaData]): # pylin def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None: """Initialize ToloSaunaUpdateCoordinator.""" - self.client = ToloClient(entry.data[CONF_HOST]) + self.client = ToloClient( + address=entry.data[CONF_HOST], + retry_timeout=DEFAULT_RETRY_TIMEOUT, + retry_count=DEFAULT_RETRY_COUNT, + ) super().__init__( hass=hass, logger=_LOGGER, @@ -81,13 +83,9 @@ class ToloSaunaUpdateCoordinator(DataUpdateCoordinator[ToloSaunaData]): # pylin def _get_tolo_sauna_data(self) -> ToloSaunaData: try: - status = self.client.get_status_info( - resend_timeout=DEFAULT_RETRY_TIMEOUT, retries=DEFAULT_RETRY_COUNT - ) - settings = self.client.get_settings_info( - resend_timeout=DEFAULT_RETRY_TIMEOUT, retries=DEFAULT_RETRY_COUNT - ) - except ResponseTimedOutError as error: + 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/button.py b/homeassistant/components/tolo/button.py index 82daa79d1c1..9a8ac67b9fe 100644 --- a/homeassistant/components/tolo/button.py +++ b/homeassistant/components/tolo/button.py @@ -1,6 +1,6 @@ """TOLO Sauna Button controls.""" -from tololib.const import LampMode +from tololib import LampMode from homeassistant.components.button import ButtonEntity from homeassistant.config_entries import ConfigEntry diff --git a/homeassistant/components/tolo/climate.py b/homeassistant/components/tolo/climate.py index bbe7bf57202..2994d97d54a 100644 --- a/homeassistant/components/tolo/climate.py +++ b/homeassistant/components/tolo/climate.py @@ -4,7 +4,13 @@ from __future__ import annotations from typing import Any -from tololib.const import Calefaction +from tololib import ( + TARGET_HUMIDITY_MAX, + TARGET_HUMIDITY_MIN, + TARGET_TEMPERATURE_MAX, + TARGET_TEMPERATURE_MIN, + Calefaction, +) from homeassistant.components.climate import ( FAN_OFF, @@ -20,13 +26,7 @@ from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from . import ToloSaunaCoordinatorEntity, ToloSaunaUpdateCoordinator -from .const import ( - DEFAULT_MAX_HUMIDITY, - DEFAULT_MAX_TEMP, - DEFAULT_MIN_HUMIDITY, - DEFAULT_MIN_TEMP, - DOMAIN, -) +from .const import DOMAIN async def async_setup_entry( @@ -44,10 +44,10 @@ class SaunaClimate(ToloSaunaCoordinatorEntity, ClimateEntity): _attr_fan_modes = [FAN_ON, FAN_OFF] _attr_hvac_modes = [HVACMode.OFF, HVACMode.HEAT, HVACMode.DRY] - _attr_max_humidity = DEFAULT_MAX_HUMIDITY - _attr_max_temp = DEFAULT_MAX_TEMP - _attr_min_humidity = DEFAULT_MIN_HUMIDITY - _attr_min_temp = DEFAULT_MIN_TEMP + _attr_max_humidity = TARGET_HUMIDITY_MAX + _attr_max_temp = TARGET_TEMPERATURE_MAX + _attr_min_humidity = TARGET_HUMIDITY_MIN + _attr_min_temp = TARGET_TEMPERATURE_MIN _attr_name = None _attr_precision = PRECISION_WHOLE _attr_supported_features = ( diff --git a/homeassistant/components/tolo/config_flow.py b/homeassistant/components/tolo/config_flow.py index ed15030b372..5cf91bdc3a8 100644 --- a/homeassistant/components/tolo/config_flow.py +++ b/homeassistant/components/tolo/config_flow.py @@ -5,8 +5,7 @@ from __future__ import annotations import logging from typing import Any -from tololib import ToloClient -from tololib.errors import ResponseTimedOutError +from tololib import ToloClient, ToloCommunicationError import voluptuous as vol from homeassistant.components import dhcp @@ -14,7 +13,7 @@ from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST from homeassistant.helpers.device_registry import format_mac -from .const import DEFAULT_NAME, DEFAULT_RETRY_COUNT, DEFAULT_RETRY_TIMEOUT, DOMAIN +from .const import DEFAULT_NAME, DOMAIN _LOGGER = logging.getLogger(__name__) @@ -30,10 +29,8 @@ class ToloSaunaConfigFlow(ConfigFlow, domain=DOMAIN): def _check_device_availability(host: str) -> bool: client = ToloClient(host) try: - result = client.get_status_info( - resend_timeout=DEFAULT_RETRY_TIMEOUT, retries=DEFAULT_RETRY_COUNT - ) - except ResponseTimedOutError: + result = client.get_status() + except ToloCommunicationError: return False return result is not None diff --git a/homeassistant/components/tolo/const.py b/homeassistant/components/tolo/const.py index 77bee92d521..16fcbd04bb7 100644 --- a/homeassistant/components/tolo/const.py +++ b/homeassistant/components/tolo/const.py @@ -5,13 +5,3 @@ DEFAULT_NAME = "TOLO Sauna" DEFAULT_RETRY_TIMEOUT = 1 DEFAULT_RETRY_COUNT = 3 - -DEFAULT_MAX_TEMP = 60 -DEFAULT_MIN_TEMP = 20 - -DEFAULT_MAX_HUMIDITY = 99 -DEFAULT_MIN_HUMIDITY = 60 - -POWER_TIMER_MAX = 60 -SALT_BATH_TIMER_MAX = 60 -FAN_TIMER_MAX = 60 diff --git a/homeassistant/components/tolo/manifest.json b/homeassistant/components/tolo/manifest.json index 57a63e55cf3..14125a857f6 100644 --- a/homeassistant/components/tolo/manifest.json +++ b/homeassistant/components/tolo/manifest.json @@ -11,5 +11,5 @@ "documentation": "https://www.home-assistant.io/integrations/tolo", "iot_class": "local_polling", "loggers": ["tololib"], - "requirements": ["tololib==0.1.0b4"] + "requirements": ["tololib==1.1.0"] } diff --git a/homeassistant/components/tolo/number.py b/homeassistant/components/tolo/number.py index 6a9783aacd4..2d2c20715fa 100644 --- a/homeassistant/components/tolo/number.py +++ b/homeassistant/components/tolo/number.py @@ -6,8 +6,13 @@ from collections.abc import Callable from dataclasses import dataclass from typing import Any -from tololib import ToloClient -from tololib.message_info import SettingsInfo +from tololib import ( + FAN_TIMER_MAX, + POWER_TIMER_MAX, + SALT_BATH_TIMER_MAX, + ToloClient, + ToloSettings, +) from homeassistant.components.number import NumberEntity, NumberEntityDescription from homeassistant.config_entries import ConfigEntry @@ -16,14 +21,14 @@ from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback from . import ToloSaunaCoordinatorEntity, ToloSaunaUpdateCoordinator -from .const import DOMAIN, FAN_TIMER_MAX, POWER_TIMER_MAX, SALT_BATH_TIMER_MAX +from .const import DOMAIN @dataclass(frozen=True, kw_only=True) class ToloNumberEntityDescription(NumberEntityDescription): """Class describing TOLO Number entities.""" - getter: Callable[[SettingsInfo], int | None] + getter: Callable[[ToloSettings], int | None] setter: Callable[[ToloClient, int | None], Any] entity_category = EntityCategory.CONFIG diff --git a/homeassistant/components/tolo/select.py b/homeassistant/components/tolo/select.py index 26480aa3527..8d574f9dff5 100644 --- a/homeassistant/components/tolo/select.py +++ b/homeassistant/components/tolo/select.py @@ -2,7 +2,7 @@ from __future__ import annotations -from tololib.const import LampMode +from tololib import LampMode from homeassistant.components.select import SelectEntity from homeassistant.config_entries import ConfigEntry diff --git a/homeassistant/components/tolo/sensor.py b/homeassistant/components/tolo/sensor.py index 27aa331c9cf..bee01cc283f 100644 --- a/homeassistant/components/tolo/sensor.py +++ b/homeassistant/components/tolo/sensor.py @@ -5,7 +5,7 @@ from __future__ import annotations from collections.abc import Callable from dataclasses import dataclass -from tololib.message_info import SettingsInfo, StatusInfo +from tololib import ToloSettings, ToloStatus from homeassistant.components.sensor import ( SensorDeviceClass, @@ -31,8 +31,8 @@ from .const import DOMAIN class ToloSensorEntityDescription(SensorEntityDescription): """Class describing TOLO Sensor entities.""" - getter: Callable[[StatusInfo], int | None] - availability_checker: Callable[[SettingsInfo, StatusInfo], bool] | None + getter: Callable[[ToloStatus], int | None] + availability_checker: Callable[[ToloSettings, ToloStatus], bool] | None state_class = SensorStateClass.MEASUREMENT diff --git a/requirements_all.txt b/requirements_all.txt index 79dfd705988..3c4faaad46c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2716,7 +2716,7 @@ tmb==0.0.4 todoist-api-python==2.1.2 # homeassistant.components.tolo -tololib==0.1.0b4 +tololib==1.1.0 # homeassistant.components.toon toonapi==0.3.0 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 9650ff49963..ada8b08ee1f 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -2075,7 +2075,7 @@ tilt-ble==0.2.3 todoist-api-python==2.1.2 # homeassistant.components.tolo -tololib==0.1.0b4 +tololib==1.1.0 # homeassistant.components.toon toonapi==0.3.0 diff --git a/tests/components/tolo/test_config_flow.py b/tests/components/tolo/test_config_flow.py index ff704bcd5cd..711ded3880b 100644 --- a/tests/components/tolo/test_config_flow.py +++ b/tests/components/tolo/test_config_flow.py @@ -3,7 +3,7 @@ from unittest.mock import Mock, patch import pytest -from tololib.errors import ResponseTimedOutError +from tololib import ToloCommunicationError from homeassistant.components import dhcp from homeassistant.components.tolo.const import DOMAIN @@ -38,7 +38,7 @@ def coordinator_toloclient() -> Mock: async def test_user_with_timed_out_host(hass: HomeAssistant, toloclient: Mock) -> None: """Test a user initiated config flow with provided host which times out.""" - toloclient().get_status_info.side_effect = ResponseTimedOutError() + toloclient().get_status.side_effect = ToloCommunicationError result = await hass.config_entries.flow.async_init( DOMAIN, @@ -62,7 +62,7 @@ async def test_user_walkthrough( assert result["type"] == FlowResultType.FORM assert result["step_id"] == "user" - toloclient().get_status_info.side_effect = lambda *args, **kwargs: None + toloclient().get_status.side_effect = lambda *args, **kwargs: None result2 = await hass.config_entries.flow.async_configure( result["flow_id"], @@ -73,7 +73,7 @@ async def test_user_walkthrough( assert result2["step_id"] == "user" assert result2["errors"] == {"base": "cannot_connect"} - toloclient().get_status_info.side_effect = lambda *args, **kwargs: object() + toloclient().get_status.side_effect = lambda *args, **kwargs: object() result3 = await hass.config_entries.flow.async_configure( result["flow_id"], @@ -89,7 +89,7 @@ async def test_dhcp( hass: HomeAssistant, toloclient: Mock, coordinator_toloclient: Mock ) -> None: """Test starting a flow from discovery.""" - toloclient().get_status_info.side_effect = lambda *args, **kwargs: object() + toloclient().get_status.side_effect = lambda *args, **kwargs: object() result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_DHCP}, data=MOCK_DHCP_DATA @@ -110,7 +110,7 @@ async def test_dhcp( async def test_dhcp_invalid_device(hass: HomeAssistant, toloclient: Mock) -> None: """Test starting a flow from discovery.""" - toloclient().get_status_info.side_effect = lambda *args, **kwargs: None + toloclient().get_status.side_effect = lambda *args, **kwargs: None result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_DHCP}, data=MOCK_DHCP_DATA