Bump tololib to 1.1.0 (#113268)

* upgrade tololib dependency to v1.0.0

* use latest available patch version

* fixed tolo tests

* fixed test cases
This commit is contained in:
Matthias Lohr 2024-03-14 13:55:16 +01:00 committed by GitHub
parent 1fd447f65b
commit 6a1913b372
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 50 additions and 60 deletions

View File

@ -6,9 +6,7 @@ from datetime import timedelta
import logging import logging
from typing import NamedTuple from typing import NamedTuple
from tololib import ToloClient from tololib import ToloClient, ToloSettings, ToloStatus
from tololib.errors import ResponseTimedOutError
from tololib.message_info import SettingsInfo, StatusInfo
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_HOST, Platform from homeassistant.const import CONF_HOST, Platform
@ -59,8 +57,8 @@ async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
class ToloSaunaData(NamedTuple): class ToloSaunaData(NamedTuple):
"""Compound class for reflecting full state (status and info) of a TOLO Sauna.""" """Compound class for reflecting full state (status and info) of a TOLO Sauna."""
status: StatusInfo status: ToloStatus
settings: SettingsInfo settings: ToloSettings
class ToloSaunaUpdateCoordinator(DataUpdateCoordinator[ToloSaunaData]): # pylint: disable=hass-enforce-coordinator-module 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: def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None:
"""Initialize ToloSaunaUpdateCoordinator.""" """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__( super().__init__(
hass=hass, hass=hass,
logger=_LOGGER, logger=_LOGGER,
@ -81,13 +83,9 @@ class ToloSaunaUpdateCoordinator(DataUpdateCoordinator[ToloSaunaData]): # pylin
def _get_tolo_sauna_data(self) -> ToloSaunaData: def _get_tolo_sauna_data(self) -> ToloSaunaData:
try: try:
status = self.client.get_status_info( status = self.client.get_status()
resend_timeout=DEFAULT_RETRY_TIMEOUT, retries=DEFAULT_RETRY_COUNT settings = self.client.get_settings()
) except TimeoutError as error:
settings = self.client.get_settings_info(
resend_timeout=DEFAULT_RETRY_TIMEOUT, retries=DEFAULT_RETRY_COUNT
)
except ResponseTimedOutError as error:
raise UpdateFailed("communication timeout") from error raise UpdateFailed("communication timeout") from error
return ToloSaunaData(status, settings) return ToloSaunaData(status, settings)

View File

@ -1,6 +1,6 @@
"""TOLO Sauna Button controls.""" """TOLO Sauna Button controls."""
from tololib.const import LampMode from tololib import LampMode
from homeassistant.components.button import ButtonEntity from homeassistant.components.button import ButtonEntity
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry

View File

@ -4,7 +4,13 @@ from __future__ import annotations
from typing import Any 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 ( from homeassistant.components.climate import (
FAN_OFF, FAN_OFF,
@ -20,13 +26,7 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import ToloSaunaCoordinatorEntity, ToloSaunaUpdateCoordinator from . import ToloSaunaCoordinatorEntity, ToloSaunaUpdateCoordinator
from .const import ( from .const import DOMAIN
DEFAULT_MAX_HUMIDITY,
DEFAULT_MAX_TEMP,
DEFAULT_MIN_HUMIDITY,
DEFAULT_MIN_TEMP,
DOMAIN,
)
async def async_setup_entry( async def async_setup_entry(
@ -44,10 +44,10 @@ class SaunaClimate(ToloSaunaCoordinatorEntity, ClimateEntity):
_attr_fan_modes = [FAN_ON, FAN_OFF] _attr_fan_modes = [FAN_ON, FAN_OFF]
_attr_hvac_modes = [HVACMode.OFF, HVACMode.HEAT, HVACMode.DRY] _attr_hvac_modes = [HVACMode.OFF, HVACMode.HEAT, HVACMode.DRY]
_attr_max_humidity = DEFAULT_MAX_HUMIDITY _attr_max_humidity = TARGET_HUMIDITY_MAX
_attr_max_temp = DEFAULT_MAX_TEMP _attr_max_temp = TARGET_TEMPERATURE_MAX
_attr_min_humidity = DEFAULT_MIN_HUMIDITY _attr_min_humidity = TARGET_HUMIDITY_MIN
_attr_min_temp = DEFAULT_MIN_TEMP _attr_min_temp = TARGET_TEMPERATURE_MIN
_attr_name = None _attr_name = None
_attr_precision = PRECISION_WHOLE _attr_precision = PRECISION_WHOLE
_attr_supported_features = ( _attr_supported_features = (

View File

@ -5,8 +5,7 @@ from __future__ import annotations
import logging import logging
from typing import Any from typing import Any
from tololib import ToloClient from tololib import ToloClient, ToloCommunicationError
from tololib.errors import ResponseTimedOutError
import voluptuous as vol import voluptuous as vol
from homeassistant.components import dhcp from homeassistant.components import dhcp
@ -14,7 +13,7 @@ from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.const import CONF_HOST from homeassistant.const import CONF_HOST
from homeassistant.helpers.device_registry import format_mac 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__) _LOGGER = logging.getLogger(__name__)
@ -30,10 +29,8 @@ class ToloSaunaConfigFlow(ConfigFlow, domain=DOMAIN):
def _check_device_availability(host: str) -> bool: def _check_device_availability(host: str) -> bool:
client = ToloClient(host) client = ToloClient(host)
try: try:
result = client.get_status_info( result = client.get_status()
resend_timeout=DEFAULT_RETRY_TIMEOUT, retries=DEFAULT_RETRY_COUNT except ToloCommunicationError:
)
except ResponseTimedOutError:
return False return False
return result is not None return result is not None

View File

@ -5,13 +5,3 @@ DEFAULT_NAME = "TOLO Sauna"
DEFAULT_RETRY_TIMEOUT = 1 DEFAULT_RETRY_TIMEOUT = 1
DEFAULT_RETRY_COUNT = 3 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

View File

@ -11,5 +11,5 @@
"documentation": "https://www.home-assistant.io/integrations/tolo", "documentation": "https://www.home-assistant.io/integrations/tolo",
"iot_class": "local_polling", "iot_class": "local_polling",
"loggers": ["tololib"], "loggers": ["tololib"],
"requirements": ["tololib==0.1.0b4"] "requirements": ["tololib==1.1.0"]
} }

View File

@ -6,8 +6,13 @@ from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any from typing import Any
from tololib import ToloClient from tololib import (
from tololib.message_info import SettingsInfo FAN_TIMER_MAX,
POWER_TIMER_MAX,
SALT_BATH_TIMER_MAX,
ToloClient,
ToloSettings,
)
from homeassistant.components.number import NumberEntity, NumberEntityDescription from homeassistant.components.number import NumberEntity, NumberEntityDescription
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
@ -16,14 +21,14 @@ from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import ToloSaunaCoordinatorEntity, ToloSaunaUpdateCoordinator 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) @dataclass(frozen=True, kw_only=True)
class ToloNumberEntityDescription(NumberEntityDescription): class ToloNumberEntityDescription(NumberEntityDescription):
"""Class describing TOLO Number entities.""" """Class describing TOLO Number entities."""
getter: Callable[[SettingsInfo], int | None] getter: Callable[[ToloSettings], int | None]
setter: Callable[[ToloClient, int | None], Any] setter: Callable[[ToloClient, int | None], Any]
entity_category = EntityCategory.CONFIG entity_category = EntityCategory.CONFIG

View File

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
from tololib.const import LampMode from tololib import LampMode
from homeassistant.components.select import SelectEntity from homeassistant.components.select import SelectEntity
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry

View File

@ -5,7 +5,7 @@ from __future__ import annotations
from collections.abc import Callable from collections.abc import Callable
from dataclasses import dataclass from dataclasses import dataclass
from tololib.message_info import SettingsInfo, StatusInfo from tololib import ToloSettings, ToloStatus
from homeassistant.components.sensor import ( from homeassistant.components.sensor import (
SensorDeviceClass, SensorDeviceClass,
@ -31,8 +31,8 @@ from .const import DOMAIN
class ToloSensorEntityDescription(SensorEntityDescription): class ToloSensorEntityDescription(SensorEntityDescription):
"""Class describing TOLO Sensor entities.""" """Class describing TOLO Sensor entities."""
getter: Callable[[StatusInfo], int | None] getter: Callable[[ToloStatus], int | None]
availability_checker: Callable[[SettingsInfo, StatusInfo], bool] | None availability_checker: Callable[[ToloSettings, ToloStatus], bool] | None
state_class = SensorStateClass.MEASUREMENT state_class = SensorStateClass.MEASUREMENT

View File

@ -2716,7 +2716,7 @@ tmb==0.0.4
todoist-api-python==2.1.2 todoist-api-python==2.1.2
# homeassistant.components.tolo # homeassistant.components.tolo
tololib==0.1.0b4 tololib==1.1.0
# homeassistant.components.toon # homeassistant.components.toon
toonapi==0.3.0 toonapi==0.3.0

View File

@ -2075,7 +2075,7 @@ tilt-ble==0.2.3
todoist-api-python==2.1.2 todoist-api-python==2.1.2
# homeassistant.components.tolo # homeassistant.components.tolo
tololib==0.1.0b4 tololib==1.1.0
# homeassistant.components.toon # homeassistant.components.toon
toonapi==0.3.0 toonapi==0.3.0

View File

@ -3,7 +3,7 @@
from unittest.mock import Mock, patch from unittest.mock import Mock, patch
import pytest import pytest
from tololib.errors import ResponseTimedOutError from tololib import ToloCommunicationError
from homeassistant.components import dhcp from homeassistant.components import dhcp
from homeassistant.components.tolo.const import DOMAIN 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: 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.""" """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( result = await hass.config_entries.flow.async_init(
DOMAIN, DOMAIN,
@ -62,7 +62,7 @@ async def test_user_walkthrough(
assert result["type"] == FlowResultType.FORM assert result["type"] == FlowResultType.FORM
assert result["step_id"] == "user" 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( result2 = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
@ -73,7 +73,7 @@ async def test_user_walkthrough(
assert result2["step_id"] == "user" assert result2["step_id"] == "user"
assert result2["errors"] == {"base": "cannot_connect"} 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( result3 = await hass.config_entries.flow.async_configure(
result["flow_id"], result["flow_id"],
@ -89,7 +89,7 @@ async def test_dhcp(
hass: HomeAssistant, toloclient: Mock, coordinator_toloclient: Mock hass: HomeAssistant, toloclient: Mock, coordinator_toloclient: Mock
) -> None: ) -> None:
"""Test starting a flow from discovery.""" """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( result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_DHCP}, data=MOCK_DHCP_DATA 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: async def test_dhcp_invalid_device(hass: HomeAssistant, toloclient: Mock) -> None:
"""Test starting a flow from discovery.""" """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( result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": SOURCE_DHCP}, data=MOCK_DHCP_DATA DOMAIN, context={"source": SOURCE_DHCP}, data=MOCK_DHCP_DATA