Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions huum/huum.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()
Expand Down
40 changes: 39 additions & 1 deletion tests/test_huum.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from typing import Any
from unittest.mock import patch
from unittest.mock import ANY, patch

import aiohttp
import pytest
Expand Down Expand Up @@ -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:
Expand All @@ -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