2024-10-05 21:34:06 +00:00
|
|
|
"""The tests for water_heater entities of evohome.
|
|
|
|
|
|
|
|
Not all evohome systems will have a DHW zone.
|
|
|
|
"""
|
|
|
|
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
from unittest.mock import patch
|
|
|
|
|
2024-10-24 14:01:29 +00:00
|
|
|
from evohomeasync2 import EvohomeClient
|
2024-10-05 21:34:06 +00:00
|
|
|
from freezegun.api import FrozenDateTimeFactory
|
|
|
|
import pytest
|
|
|
|
from syrupy import SnapshotAssertion
|
|
|
|
|
2024-10-24 14:01:29 +00:00
|
|
|
from homeassistant.components.water_heater import (
|
|
|
|
ATTR_AWAY_MODE,
|
|
|
|
ATTR_OPERATION_MODE,
|
|
|
|
SERVICE_SET_AWAY_MODE,
|
|
|
|
SERVICE_SET_OPERATION_MODE,
|
|
|
|
)
|
|
|
|
from homeassistant.const import (
|
|
|
|
ATTR_ENTITY_ID,
|
|
|
|
SERVICE_TURN_OFF,
|
|
|
|
SERVICE_TURN_ON,
|
|
|
|
Platform,
|
|
|
|
)
|
2024-10-05 21:34:06 +00:00
|
|
|
from homeassistant.core import HomeAssistant
|
2024-10-24 14:01:29 +00:00
|
|
|
from homeassistant.exceptions import HomeAssistantError
|
2024-10-05 21:34:06 +00:00
|
|
|
|
|
|
|
from .const import TEST_INSTALLS_WITH_DHW
|
|
|
|
|
2024-10-24 14:01:29 +00:00
|
|
|
DHW_ENTITY_ID = "water_heater.domestic_hot_water"
|
2024-10-05 21:34:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("install", TEST_INSTALLS_WITH_DHW)
|
|
|
|
async def test_set_operation_mode(
|
|
|
|
hass: HomeAssistant,
|
2024-10-24 14:01:29 +00:00
|
|
|
evohome: EvohomeClient,
|
2024-10-05 21:34:06 +00:00
|
|
|
freezer: FrozenDateTimeFactory,
|
|
|
|
snapshot: SnapshotAssertion,
|
|
|
|
) -> None:
|
2024-10-24 14:01:29 +00:00
|
|
|
"""Test SERVICE_SET_OPERATION_MODE of a evohome HotWater entity."""
|
2024-10-05 21:34:06 +00:00
|
|
|
|
|
|
|
freezer.move_to("2024-07-10T11:55:00Z")
|
|
|
|
results = []
|
|
|
|
|
2024-10-24 14:01:29 +00:00
|
|
|
# SERVICE_SET_OPERATION_MODE: auto
|
|
|
|
with patch("evohomeasync2.hotwater.HotWater.reset_mode") as mock_fcn:
|
|
|
|
await hass.services.async_call(
|
|
|
|
Platform.WATER_HEATER,
|
|
|
|
SERVICE_SET_OPERATION_MODE,
|
|
|
|
{
|
|
|
|
ATTR_ENTITY_ID: DHW_ENTITY_ID,
|
|
|
|
ATTR_OPERATION_MODE: "auto",
|
|
|
|
},
|
|
|
|
blocking=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
assert mock_fcn.await_count == 1
|
|
|
|
assert mock_fcn.await_args.args == ()
|
|
|
|
assert mock_fcn.await_args.kwargs == {}
|
|
|
|
|
|
|
|
# SERVICE_SET_OPERATION_MODE: off (until next scheduled setpoint)
|
|
|
|
with patch("evohomeasync2.hotwater.HotWater.set_off") as mock_fcn:
|
|
|
|
await hass.services.async_call(
|
|
|
|
Platform.WATER_HEATER,
|
|
|
|
SERVICE_SET_OPERATION_MODE,
|
|
|
|
{
|
|
|
|
ATTR_ENTITY_ID: DHW_ENTITY_ID,
|
|
|
|
ATTR_OPERATION_MODE: "off",
|
|
|
|
},
|
|
|
|
blocking=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
assert mock_fcn.await_count == 1
|
|
|
|
assert mock_fcn.await_args.args == ()
|
|
|
|
results.append(mock_fcn.await_args.args)
|
|
|
|
|
|
|
|
# SERVICE_SET_OPERATION_MODE: on (until next scheduled setpoint)
|
|
|
|
with patch("evohomeasync2.hotwater.HotWater.set_on") as mock_fcn:
|
|
|
|
await hass.services.async_call(
|
|
|
|
Platform.WATER_HEATER,
|
|
|
|
SERVICE_SET_OPERATION_MODE,
|
|
|
|
{
|
|
|
|
ATTR_ENTITY_ID: DHW_ENTITY_ID,
|
|
|
|
ATTR_OPERATION_MODE: "on",
|
|
|
|
},
|
|
|
|
blocking=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
assert mock_fcn.await_count == 1
|
|
|
|
assert mock_fcn.await_args.args == ()
|
|
|
|
results.append(mock_fcn.await_args.args)
|
2024-10-05 21:34:06 +00:00
|
|
|
|
|
|
|
assert results == snapshot
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("install", TEST_INSTALLS_WITH_DHW)
|
2024-10-24 14:01:29 +00:00
|
|
|
async def test_set_away_mode(hass: HomeAssistant, evohome: EvohomeClient) -> None:
|
|
|
|
"""Test SERVICE_SET_AWAY_MODE of a evohome HotWater entity."""
|
|
|
|
|
|
|
|
# set_away_mode: off
|
|
|
|
with patch("evohomeasync2.hotwater.HotWater.reset_mode") as mock_fcn:
|
|
|
|
await hass.services.async_call(
|
|
|
|
Platform.WATER_HEATER,
|
|
|
|
SERVICE_SET_AWAY_MODE,
|
|
|
|
{
|
|
|
|
ATTR_ENTITY_ID: DHW_ENTITY_ID,
|
|
|
|
ATTR_AWAY_MODE: "off",
|
|
|
|
},
|
|
|
|
blocking=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
assert mock_fcn.await_count == 1
|
|
|
|
assert mock_fcn.await_args.args == ()
|
|
|
|
assert mock_fcn.await_args.kwargs == {}
|
|
|
|
|
|
|
|
# set_away_mode: off
|
|
|
|
with patch("evohomeasync2.hotwater.HotWater.set_off") as mock_fcn:
|
|
|
|
await hass.services.async_call(
|
|
|
|
Platform.WATER_HEATER,
|
|
|
|
SERVICE_SET_AWAY_MODE,
|
|
|
|
{
|
|
|
|
ATTR_ENTITY_ID: DHW_ENTITY_ID,
|
|
|
|
ATTR_AWAY_MODE: "on",
|
|
|
|
},
|
|
|
|
blocking=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
assert mock_fcn.await_count == 1
|
|
|
|
assert mock_fcn.await_args.args == ()
|
|
|
|
assert mock_fcn.await_args.kwargs == {}
|
2024-10-05 21:34:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("install", TEST_INSTALLS_WITH_DHW)
|
2024-10-24 14:01:29 +00:00
|
|
|
async def test_turn_off(hass: HomeAssistant, evohome: EvohomeClient) -> None:
|
|
|
|
"""Test SERVICE_TURN_OFF of a evohome HotWater entity."""
|
2024-10-05 21:34:06 +00:00
|
|
|
|
2024-10-24 14:01:29 +00:00
|
|
|
# Entity water_heater.domestic_hot_water does not support this service
|
|
|
|
with pytest.raises(HomeAssistantError):
|
|
|
|
await hass.services.async_call(
|
|
|
|
Platform.WATER_HEATER,
|
|
|
|
SERVICE_TURN_OFF,
|
|
|
|
{
|
|
|
|
ATTR_ENTITY_ID: DHW_ENTITY_ID,
|
|
|
|
},
|
|
|
|
blocking=True,
|
|
|
|
)
|
2024-10-05 21:34:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("install", TEST_INSTALLS_WITH_DHW)
|
2024-10-24 14:01:29 +00:00
|
|
|
async def test_turn_on(hass: HomeAssistant, evohome: EvohomeClient) -> None:
|
|
|
|
"""Test SERVICE_TURN_ON of a evohome HotWater entity."""
|
|
|
|
|
|
|
|
# Entity water_heater.domestic_hot_water does not support this service
|
|
|
|
with pytest.raises(HomeAssistantError):
|
|
|
|
await hass.services.async_call(
|
|
|
|
Platform.WATER_HEATER,
|
|
|
|
SERVICE_TURN_ON,
|
|
|
|
{
|
|
|
|
ATTR_ENTITY_ID: DHW_ENTITY_ID,
|
|
|
|
},
|
|
|
|
blocking=True,
|
|
|
|
)
|