* Add inverse switch command for ThermostatOverSwitch --------- Co-authored-by: Jean-Marc Collin <jean-marc.collin-extern@renault.com>
125 lines
4.7 KiB
Python
125 lines
4.7 KiB
Python
# pylint: disable=unused-argument, line-too-long, protected-access
|
|
""" Test the Window management """
|
|
import asyncio
|
|
import logging
|
|
from unittest.mock import patch, call
|
|
from datetime import datetime, timedelta
|
|
|
|
from custom_components.versatile_thermostat.thermostat_switch import ThermostatOverSwitch
|
|
from .commons import * # pylint: disable=wildcard-import, unused-wildcard-import
|
|
|
|
logging.getLogger().setLevel(logging.DEBUG)
|
|
|
|
@pytest.mark.parametrize("expected_lingering_tasks", [True])
|
|
@pytest.mark.parametrize("expected_lingering_timers", [True])
|
|
async def test_inverted_switch(hass: HomeAssistant, skip_hass_states_is_state):
|
|
"""Test the Window auto management"""
|
|
|
|
entry = MockConfigEntry(
|
|
domain=DOMAIN,
|
|
title="TheOverSwitchMockName",
|
|
unique_id="uniqueId",
|
|
data={
|
|
CONF_NAME: "TheOverSwitchMockName",
|
|
CONF_THERMOSTAT_TYPE: CONF_THERMOSTAT_SWITCH,
|
|
CONF_TEMP_SENSOR: "sensor.mock_temp_sensor",
|
|
CONF_EXTERNAL_TEMP_SENSOR: "sensor.mock_ext_temp_sensor",
|
|
CONF_CYCLE_MIN: 5,
|
|
CONF_TEMP_MIN: 15,
|
|
CONF_TEMP_MAX: 30,
|
|
"eco_temp": 17,
|
|
"comfort_temp": 18,
|
|
"boost_temp": 21,
|
|
CONF_USE_WINDOW_FEATURE: False,
|
|
CONF_USE_MOTION_FEATURE: False,
|
|
CONF_USE_POWER_FEATURE: False,
|
|
CONF_USE_PRESENCE_FEATURE: False,
|
|
CONF_HEATER: "switch.mock_switch",
|
|
CONF_PROP_FUNCTION: PROPORTIONAL_FUNCTION_TPI,
|
|
CONF_TPI_COEF_INT: 0.3,
|
|
CONF_TPI_COEF_EXT: 0.01,
|
|
CONF_MINIMAL_ACTIVATION_DELAY: 30,
|
|
CONF_SECURITY_DELAY_MIN: 5,
|
|
CONF_SECURITY_MIN_ON_PERCENT: 0.3,
|
|
CONF_WINDOW_AUTO_OPEN_THRESHOLD: 0.1,
|
|
CONF_WINDOW_AUTO_CLOSE_THRESHOLD: 0.1,
|
|
CONF_WINDOW_AUTO_MAX_DURATION: 0, # Should be 0 for test
|
|
CONF_INVERSE_SWITCH: True
|
|
},
|
|
)
|
|
|
|
with patch(
|
|
"homeassistant.core.ServiceRegistry.async_call"
|
|
) as mock_service_call, patch(
|
|
"homeassistant.core.StateMachine.is_state", return_value=True # switch is On
|
|
):
|
|
entity: ThermostatOverSwitch = await create_thermostat(
|
|
hass, entry, "climate.theoverswitchmockname"
|
|
)
|
|
assert entity
|
|
assert entity.is_inversed
|
|
|
|
tz = get_tz(hass) # pylint: disable=invalid-name
|
|
now = datetime.now(tz)
|
|
|
|
tpi_algo = entity._prop_algorithm
|
|
assert tpi_algo
|
|
|
|
await entity.async_set_hvac_mode(HVACMode.HEAT)
|
|
await entity.async_set_preset_mode(PRESET_BOOST)
|
|
assert entity.hvac_mode is HVACMode.HEAT
|
|
assert entity.preset_mode is PRESET_BOOST
|
|
assert entity.target_temperature == 21
|
|
assert entity.is_device_active is False
|
|
|
|
assert mock_service_call.call_count == 0
|
|
|
|
# 1. Make the temperature down to activate the switch
|
|
with patch(
|
|
"custom_components.versatile_thermostat.base_thermostat.BaseThermostat.send_event"
|
|
), patch(
|
|
"homeassistant.core.ServiceRegistry.async_call"
|
|
) as mock_service_call, patch(
|
|
"homeassistant.core.StateMachine.is_state", return_value=True # switch is Off
|
|
):
|
|
event_timestamp = now - timedelta(minutes=4)
|
|
await send_temperature_change_event(entity, 19, event_timestamp)
|
|
|
|
# The heater turns on
|
|
assert entity.hvac_mode is HVACMode.HEAT
|
|
# not updated cause mocked assert entity.is_device_active is True
|
|
|
|
assert mock_service_call.call_count == 1
|
|
mock_service_call.assert_has_calls([
|
|
call.async_call('switch', SERVICE_TURN_OFF, {'entity_id': 'switch.mock_switch'}),
|
|
])
|
|
|
|
# 2. Make the temperature up to deactivate the switch
|
|
with patch(
|
|
"custom_components.versatile_thermostat.base_thermostat.BaseThermostat.send_event"
|
|
), patch(
|
|
"homeassistant.core.ServiceRegistry.async_call"
|
|
) as mock_service_call, patch(
|
|
"homeassistant.core.StateMachine.is_state", return_value=False # switch is On -> it should turned off
|
|
):
|
|
event_timestamp = now - timedelta(minutes=3)
|
|
await send_temperature_change_event(entity, 25, event_timestamp)
|
|
|
|
# The heater turns on
|
|
assert entity.hvac_mode is HVACMode.HEAT
|
|
# not updated cause mocked assert entity.is_device_active is False
|
|
|
|
# there is no change because the cycle is currenlty running.
|
|
# we should simulate the end of the cycle to see oif underlying switch turns on
|
|
await entity._underlyings[0].turn_off()
|
|
|
|
assert mock_service_call.call_count == 1
|
|
mock_service_call.assert_has_calls([
|
|
call.async_call('switch', SERVICE_TURN_ON, {'entity_id': 'switch.mock_switch'}),
|
|
])
|
|
|
|
|
|
|
|
# Clean the entity
|
|
entity.remove_thermostat()
|