diff --git a/homeassistant/components/saunum/climate.py b/homeassistant/components/saunum/climate.py index 52fb7ed0212..a6e55ccfe34 100644 --- a/homeassistant/components/saunum/climate.py +++ b/homeassistant/components/saunum/climate.py @@ -3,6 +3,7 @@ from __future__ import annotations import asyncio +from datetime import timedelta from typing import Any from pysaunum import MAX_TEMPERATURE, MIN_TEMPERATURE, SaunumException @@ -241,9 +242,9 @@ class LeilSaunaClimate(LeilSaunaEntity, ClimateEntity): async def async_start_session( self, - duration: int = 120, + duration: timedelta = timedelta(minutes=120), target_temperature: int = 80, - fan_duration: int = 10, + fan_duration: timedelta = timedelta(minutes=10), ) -> None: """Start a sauna session with custom parameters.""" if self.coordinator.data.door_open: @@ -254,11 +255,15 @@ class LeilSaunaClimate(LeilSaunaEntity, ClimateEntity): try: # Set all parameters before starting the session - await self.coordinator.client.async_set_sauna_duration(duration) + await self.coordinator.client.async_set_sauna_duration( + int(duration.total_seconds() // 60) + ) await self.coordinator.client.async_set_target_temperature( target_temperature ) - await self.coordinator.client.async_set_fan_duration(fan_duration) + await self.coordinator.client.async_set_fan_duration( + int(fan_duration.total_seconds() // 60) + ) await self.coordinator.client.async_start_session() except SaunumException as err: raise HomeAssistantError( diff --git a/homeassistant/components/saunum/services.py b/homeassistant/components/saunum/services.py index 0a86da8386d..88b074af15d 100644 --- a/homeassistant/components/saunum/services.py +++ b/homeassistant/components/saunum/services.py @@ -2,6 +2,8 @@ from __future__ import annotations +from datetime import timedelta + from pysaunum import MAX_DURATION, MAX_FAN_DURATION, MAX_TEMPERATURE, MIN_TEMPERATURE import voluptuous as vol @@ -27,14 +29,22 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_START_SESSION, entity_domain=CLIMATE_DOMAIN, schema={ - vol.Optional(ATTR_DURATION, default=120): vol.All( - cv.positive_int, vol.Range(min=1, max=MAX_DURATION) + vol.Optional(ATTR_DURATION, default=timedelta(minutes=120)): vol.All( + cv.time_period, + vol.Range( + min=timedelta(minutes=1), + max=timedelta(minutes=MAX_DURATION), + ), ), vol.Optional(ATTR_TARGET_TEMPERATURE, default=80): vol.All( cv.positive_int, vol.Range(min=MIN_TEMPERATURE, max=MAX_TEMPERATURE) ), - vol.Optional(ATTR_FAN_DURATION, default=10): vol.All( - cv.positive_int, vol.Range(min=1, max=MAX_FAN_DURATION) + vol.Optional(ATTR_FAN_DURATION, default=timedelta(minutes=10)): vol.All( + cv.time_period, + vol.Range( + min=timedelta(minutes=1), + max=timedelta(minutes=MAX_FAN_DURATION), + ), ), }, func="async_start_session", diff --git a/tests/components/saunum/test_services.py b/tests/components/saunum/test_services.py index 0229df1b66b..798b495b148 100644 --- a/tests/components/saunum/test_services.py +++ b/tests/components/saunum/test_services.py @@ -1,8 +1,9 @@ """Tests for Saunum services.""" +from dataclasses import replace from unittest.mock import MagicMock -from pysaunum import SaunumData, SaunumException +from pysaunum import SaunumException import pytest from homeassistant.components.saunum.const import DOMAIN @@ -36,9 +37,9 @@ async def test_start_session_success( SERVICE_START_SESSION, { ATTR_ENTITY_ID: "climate.saunum_leil", - ATTR_DURATION: 120, + ATTR_DURATION: {"hours": 2, "minutes": 0, "seconds": 0}, ATTR_TARGET_TEMPERATURE: 80, - ATTR_FAN_DURATION: 10, + ATTR_FAN_DURATION: {"minutes": 10}, }, blocking=True, ) @@ -73,11 +74,10 @@ async def test_start_session_door_open( hass: HomeAssistant, mock_config_entry: MockConfigEntry, mock_saunum_client: MagicMock, - mock_saunum_data: SaunumData, ) -> None: """Test start_session service fails when door is open.""" - mock_saunum_client.async_get_data.return_value = SaunumData( - **{**mock_saunum_data.__dict__, "door_open": True} + mock_saunum_client.async_get_data.return_value = replace( + mock_saunum_client.async_get_data.return_value, door_open=True ) mock_config_entry.add_to_hass(hass) await hass.config_entries.async_setup(mock_config_entry.entry_id)