diff --git a/huum/huum.py b/huum/huum.py index f933e99..42d074e 100644 --- a/huum/huum.py +++ b/huum/huum.py @@ -84,13 +84,16 @@ async def _make_call(self, method: str, url: str, json: Any | None = None) -> Cl return response - async def turn_on(self, temperature: int, safety_override: bool = False) -> HuumStatusResponse: + async def turn_on( + self, temperature: int, safety_override: bool = False, humidity: Optional[int] = None + ) -> HuumStatusResponse: """ - Turns on the sauna at a given temperature + Turns on the sauna at a given temperature and optionally humidity Args: temperature: Target temperature to set the sauna to safety_override: If False, check if door is close before turning on the sauna + humidity: Target humidity duty cycle (optional) Returns: A `HuumStatusResponse` from the Huum API @@ -99,12 +102,17 @@ async def turn_on(self, temperature: int, safety_override: bool = False) -> Huum raise ValueError( f"Temperature '{temperature}' must be between {self.min_temp}-{self.max_temp}" ) + data = {"targetTemperature": temperature} + + if humidity is not None: + if humidity not in range(0, 11): + raise ValueError(f"Humidity '{humidity}' must be between 0-10") + data["humidity"] = humidity if not safety_override: await self._check_door() url = urljoin(API_HOME_BASE, "start") - data = {"targetTemperature": temperature} response = await self._make_call("post", url, json=data) json_data = await response.json() diff --git a/tests/test_huum.py b/tests/test_huum.py index 4c07ba7..e1c671e 100644 --- a/tests/test_huum.py +++ b/tests/test_huum.py @@ -1,5 +1,5 @@ from typing import Any -from unittest.mock import patch +from unittest.mock import ANY, patch import aiohttp import pytest @@ -60,6 +60,17 @@ async def test_bad_temperature_value(mock_request: Any) -> None: await huum.turn_on(temperature=200) +@pytest.mark.asyncio +@patch("aiohttp.ClientSession._request") +async def test_bad_humidity_value(mock_request: Any) -> None: + mock_request.return_value = MockResponse({}, 400) + + huum = Huum("test", "test") + await huum.open_session() + with pytest.raises(ValueError): + await huum.turn_on(temperature=40, humidity=11) + + @pytest.mark.asyncio @patch("aiohttp.ClientSession._request") async def test_set_temperature_turn_on(mock_request: Any) -> None: @@ -78,3 +89,30 @@ async def test_set_temperature_turn_on(mock_request: Any) -> None: result_set_temperature = await huum.set_temperature(temperature=80) assert result_turn_on == result_set_temperature + + +@pytest.mark.asyncio +@patch("aiohttp.ClientSession._request") +async def test_humidity_turn_on(mock_request: Any) -> None: + response = { + "statusCode": SaunaStatus.ONLINE_NOT_HEATING, + "door": True, + "temperature": 80, + "maxHeatingTime": 180, + "saunaName": "test", + "humidity": 5, + } + mock_request.return_value = MockResponse(response, 200) + + huum = Huum("test", "test") + await huum.open_session() + result_turn_on = await huum.turn_on(temperature=80, humidity=5) + + mock_request.assert_called_with( + "POST", + "https://sauna.huum.eu/action/home/start", + data=None, + auth=ANY, + json={"targetTemperature": 80, "humidity": 5}, + ) + assert result_turn_on.humidity == 5