Use climate enums in generic_thermostat (#70656)

* Use climate enums in generic_thermostat

* Adjust tests
This commit is contained in:
epenet 2022-04-25 10:58:05 +02:00 committed by GitHub
parent 8db4994345
commit b81f8e75ee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 62 additions and 72 deletions

View file

@ -7,26 +7,18 @@ import math
import voluptuous as vol
from homeassistant.components.climate import (
PLATFORM_SCHEMA,
ClimateEntity,
ClimateEntityFeature,
)
from homeassistant.components.climate import PLATFORM_SCHEMA, ClimateEntity
from homeassistant.components.climate.const import (
ATTR_PRESET_MODE,
CURRENT_HVAC_COOL,
CURRENT_HVAC_HEAT,
CURRENT_HVAC_IDLE,
CURRENT_HVAC_OFF,
HVAC_MODE_COOL,
HVAC_MODE_HEAT,
HVAC_MODE_OFF,
PRESET_ACTIVITY,
PRESET_AWAY,
PRESET_COMFORT,
PRESET_HOME,
PRESET_NONE,
PRESET_SLEEP,
ClimateEntityFeature,
HVACAction,
HVACMode,
)
from homeassistant.const import (
ATTR_ENTITY_ID,
@ -102,7 +94,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
vol.Optional(CONF_TARGET_TEMP): vol.Coerce(float),
vol.Optional(CONF_KEEP_ALIVE): cv.positive_time_period,
vol.Optional(CONF_INITIAL_HVAC_MODE): vol.In(
[HVAC_MODE_COOL, HVAC_MODE_HEAT, HVAC_MODE_OFF]
[HVACMode.COOL, HVACMode.HEAT, HVACMode.OFF]
),
vol.Optional(CONF_PRECISION): vol.In(
[PRECISION_TENTHS, PRECISION_HALVES, PRECISION_WHOLE]
@ -207,9 +199,9 @@ class GenericThermostat(ClimateEntity, RestoreEntity):
self._temp_precision = precision
self._temp_target_temperature_step = target_temperature_step
if self.ac_mode:
self._hvac_list = [HVAC_MODE_COOL, HVAC_MODE_OFF]
self._hvac_list = [HVACMode.COOL, HVACMode.OFF]
else:
self._hvac_list = [HVAC_MODE_HEAT, HVAC_MODE_OFF]
self._hvac_list = [HVACMode.HEAT, HVACMode.OFF]
self._active = False
self._cur_temp = None
self._temp_lock = asyncio.Lock()
@ -306,7 +298,7 @@ class GenericThermostat(ClimateEntity, RestoreEntity):
# Set default state to off
if not self._hvac_mode:
self._hvac_mode = HVAC_MODE_OFF
self._hvac_mode = HVACMode.OFF
@property
def should_poll(self):
@ -359,13 +351,13 @@ class GenericThermostat(ClimateEntity, RestoreEntity):
Need to be one of CURRENT_HVAC_*.
"""
if self._hvac_mode == HVAC_MODE_OFF:
return CURRENT_HVAC_OFF
if self._hvac_mode == HVACMode.OFF:
return HVACAction.OFF
if not self._is_device_active:
return CURRENT_HVAC_IDLE
return HVACAction.IDLE
if self.ac_mode:
return CURRENT_HVAC_COOL
return CURRENT_HVAC_HEAT
return HVACAction.COOLING
return HVACAction.HEATING
@property
def target_temperature(self):
@ -379,14 +371,14 @@ class GenericThermostat(ClimateEntity, RestoreEntity):
async def async_set_hvac_mode(self, hvac_mode):
"""Set hvac mode."""
if hvac_mode == HVAC_MODE_HEAT:
self._hvac_mode = HVAC_MODE_HEAT
if hvac_mode == HVACMode.HEAT:
self._hvac_mode = HVACMode.HEAT
await self._async_control_heating(force=True)
elif hvac_mode == HVAC_MODE_COOL:
self._hvac_mode = HVAC_MODE_COOL
elif hvac_mode == HVACMode.COOL:
self._hvac_mode = HVACMode.COOL
await self._async_control_heating(force=True)
elif hvac_mode == HVAC_MODE_OFF:
self._hvac_mode = HVAC_MODE_OFF
elif hvac_mode == HVACMode.OFF:
self._hvac_mode = HVACMode.OFF
if self._is_device_active:
await self._async_heater_turn_off()
else:
@ -432,8 +424,8 @@ class GenericThermostat(ClimateEntity, RestoreEntity):
self.async_write_ha_state()
async def _check_switch_initial_state(self):
"""Prevent the device from keep running if HVAC_MODE_OFF."""
if self._hvac_mode == HVAC_MODE_OFF and self._is_device_active:
"""Prevent the device from keep running if HVACMode.OFF."""
if self._hvac_mode == HVACMode.OFF and self._is_device_active:
_LOGGER.warning(
"The climate mode is OFF, but the switch device is ON. Turning off device %s",
self.heater_entity_id,
@ -477,7 +469,7 @@ class GenericThermostat(ClimateEntity, RestoreEntity):
self._target_temp,
)
if not self._active or self._hvac_mode == HVAC_MODE_OFF:
if not self._active or self._hvac_mode == HVACMode.OFF:
return
# If the `force` argument is True, we
@ -488,7 +480,7 @@ class GenericThermostat(ClimateEntity, RestoreEntity):
if self._is_device_active:
current_state = STATE_ON
else:
current_state = HVAC_MODE_OFF
current_state = HVACMode.OFF
try:
long_enough = condition.state(
self.hass,

View file

@ -10,15 +10,13 @@ from homeassistant.components import input_boolean, switch
from homeassistant.components.climate.const import (
ATTR_PRESET_MODE,
DOMAIN,
HVAC_MODE_COOL,
HVAC_MODE_HEAT,
HVAC_MODE_OFF,
PRESET_ACTIVITY,
PRESET_AWAY,
PRESET_COMFORT,
PRESET_HOME,
PRESET_NONE,
PRESET_SLEEP,
HVACMode,
)
from homeassistant.components.generic_thermostat import (
DOMAIN as GENERIC_THERMOSTAT_DOMAIN,
@ -115,7 +113,7 @@ async def test_heater_input_boolean(hass, setup_comp_1):
"name": "test",
"heater": heater_switch,
"target_sensor": ENT_SENSOR,
"initial_hvac_mode": HVAC_MODE_HEAT,
"initial_hvac_mode": HVACMode.HEAT,
}
},
)
@ -150,7 +148,7 @@ async def test_heater_switch(hass, setup_comp_1, enable_custom_integrations):
"name": "test",
"heater": heater_switch,
"target_sensor": ENT_SENSOR,
"initial_hvac_mode": HVAC_MODE_HEAT,
"initial_hvac_mode": HVACMode.HEAT,
}
},
)
@ -217,7 +215,7 @@ async def setup_comp_2(hass):
"home_temp": 19,
"comfort_temp": 20,
"activity_temp": 21,
"initial_hvac_mode": HVAC_MODE_HEAT,
"initial_hvac_mode": HVACMode.HEAT,
}
},
)
@ -243,7 +241,7 @@ async def test_setup_defaults_to_unknown(hass):
},
)
await hass.async_block_till_done()
assert hass.states.get(ENTITY).state == HVAC_MODE_OFF
assert hass.states.get(ENTITY).state == HVACMode.OFF
async def test_setup_gets_current_temp_from_sensor(hass):
@ -283,7 +281,7 @@ async def test_get_hvac_modes(hass, setup_comp_2):
"""Test that the operation list returns the correct modes."""
state = hass.states.get(ENTITY)
modes = state.attributes.get("hvac_modes")
assert modes == [HVAC_MODE_HEAT, HVAC_MODE_OFF]
assert modes == [HVACMode.HEAT, HVACMode.OFF]
async def test_set_target_temp(hass, setup_comp_2):
@ -519,7 +517,7 @@ async def test_running_when_hvac_mode_is_off(hass, setup_comp_2):
"""Test that the switch turns off when enabled is set False."""
calls = _setup_switch(hass, True)
await common.async_set_temperature(hass, 30)
await common.async_set_hvac_mode(hass, HVAC_MODE_OFF)
await common.async_set_hvac_mode(hass, HVACMode.OFF)
assert len(calls) == 1
call = calls[0]
assert call.domain == HASS_DOMAIN
@ -531,7 +529,7 @@ async def test_no_state_change_when_hvac_mode_off(hass, setup_comp_2):
"""Test that the switch doesn't turn on when enabled is False."""
calls = _setup_switch(hass, False)
await common.async_set_temperature(hass, 30)
await common.async_set_hvac_mode(hass, HVAC_MODE_OFF)
await common.async_set_hvac_mode(hass, HVACMode.OFF)
_setup_sensor(hass, 25)
await hass.async_block_till_done()
assert len(calls) == 0
@ -542,12 +540,12 @@ async def test_hvac_mode_heat(hass, setup_comp_2):
Switch turns on when temp below setpoint and mode changes.
"""
await common.async_set_hvac_mode(hass, HVAC_MODE_OFF)
await common.async_set_hvac_mode(hass, HVACMode.OFF)
await common.async_set_temperature(hass, 30)
_setup_sensor(hass, 25)
await hass.async_block_till_done()
calls = _setup_switch(hass, False)
await common.async_set_hvac_mode(hass, HVAC_MODE_HEAT)
await common.async_set_hvac_mode(hass, HVACMode.HEAT)
assert len(calls) == 1
call = calls[0]
assert call.domain == HASS_DOMAIN
@ -588,7 +586,7 @@ async def setup_comp_3(hass):
"heater": ENT_SWITCH,
"target_sensor": ENT_SENSOR,
"ac_mode": True,
"initial_hvac_mode": HVAC_MODE_COOL,
"initial_hvac_mode": HVACMode.COOL,
}
},
)
@ -624,12 +622,12 @@ async def test_hvac_mode_cool(hass, setup_comp_3):
Switch turns on when temp below setpoint and mode changes.
"""
await common.async_set_hvac_mode(hass, HVAC_MODE_OFF)
await common.async_set_hvac_mode(hass, HVACMode.OFF)
await common.async_set_temperature(hass, 25)
_setup_sensor(hass, 30)
await hass.async_block_till_done()
calls = _setup_switch(hass, False)
await common.async_set_hvac_mode(hass, HVAC_MODE_COOL)
await common.async_set_hvac_mode(hass, HVACMode.COOL)
assert len(calls) == 1
call = calls[0]
assert call.domain == HASS_DOMAIN
@ -698,7 +696,7 @@ async def test_running_when_operating_mode_is_off_2(hass, setup_comp_3):
"""Test that the switch turns off when enabled is set False."""
calls = _setup_switch(hass, True)
await common.async_set_temperature(hass, 30)
await common.async_set_hvac_mode(hass, HVAC_MODE_OFF)
await common.async_set_hvac_mode(hass, HVACMode.OFF)
assert len(calls) == 1
call = calls[0]
assert call.domain == HASS_DOMAIN
@ -710,7 +708,7 @@ async def test_no_state_change_when_operation_mode_off_2(hass, setup_comp_3):
"""Test that the switch doesn't turn on when enabled is False."""
calls = _setup_switch(hass, False)
await common.async_set_temperature(hass, 30)
await common.async_set_hvac_mode(hass, HVAC_MODE_OFF)
await common.async_set_hvac_mode(hass, HVACMode.OFF)
_setup_sensor(hass, 35)
await hass.async_block_till_done()
assert len(calls) == 0
@ -733,7 +731,7 @@ async def setup_comp_4(hass):
"target_sensor": ENT_SENSOR,
"ac_mode": True,
"min_cycle_duration": datetime.timedelta(minutes=10),
"initial_hvac_mode": HVAC_MODE_COOL,
"initial_hvac_mode": HVACMode.COOL,
}
},
)
@ -799,7 +797,7 @@ async def test_mode_change_ac_trigger_off_not_long_enough(hass, setup_comp_4):
_setup_sensor(hass, 25)
await hass.async_block_till_done()
assert len(calls) == 0
await common.async_set_hvac_mode(hass, HVAC_MODE_OFF)
await common.async_set_hvac_mode(hass, HVACMode.OFF)
assert len(calls) == 1
call = calls[0]
assert call.domain == "homeassistant"
@ -814,7 +812,7 @@ async def test_mode_change_ac_trigger_on_not_long_enough(hass, setup_comp_4):
_setup_sensor(hass, 30)
await hass.async_block_till_done()
assert len(calls) == 0
await common.async_set_hvac_mode(hass, HVAC_MODE_HEAT)
await common.async_set_hvac_mode(hass, HVACMode.HEAT)
assert len(calls) == 1
call = calls[0]
assert call.domain == "homeassistant"
@ -839,7 +837,7 @@ async def setup_comp_5(hass):
"target_sensor": ENT_SENSOR,
"ac_mode": True,
"min_cycle_duration": datetime.timedelta(minutes=10),
"initial_hvac_mode": HVAC_MODE_COOL,
"initial_hvac_mode": HVACMode.COOL,
}
},
)
@ -905,7 +903,7 @@ async def test_mode_change_ac_trigger_off_not_long_enough_2(hass, setup_comp_5):
_setup_sensor(hass, 25)
await hass.async_block_till_done()
assert len(calls) == 0
await common.async_set_hvac_mode(hass, HVAC_MODE_OFF)
await common.async_set_hvac_mode(hass, HVACMode.OFF)
assert len(calls) == 1
call = calls[0]
assert call.domain == "homeassistant"
@ -920,7 +918,7 @@ async def test_mode_change_ac_trigger_on_not_long_enough_2(hass, setup_comp_5):
_setup_sensor(hass, 30)
await hass.async_block_till_done()
assert len(calls) == 0
await common.async_set_hvac_mode(hass, HVAC_MODE_HEAT)
await common.async_set_hvac_mode(hass, HVACMode.HEAT)
assert len(calls) == 1
call = calls[0]
assert call.domain == "homeassistant"
@ -944,7 +942,7 @@ async def setup_comp_6(hass):
"heater": ENT_SWITCH,
"target_sensor": ENT_SENSOR,
"min_cycle_duration": datetime.timedelta(minutes=10),
"initial_hvac_mode": HVAC_MODE_HEAT,
"initial_hvac_mode": HVACMode.HEAT,
}
},
)
@ -1010,7 +1008,7 @@ async def test_mode_change_heater_trigger_off_not_long_enough(hass, setup_comp_6
_setup_sensor(hass, 30)
await hass.async_block_till_done()
assert len(calls) == 0
await common.async_set_hvac_mode(hass, HVAC_MODE_OFF)
await common.async_set_hvac_mode(hass, HVACMode.OFF)
assert len(calls) == 1
call = calls[0]
assert call.domain == "homeassistant"
@ -1025,7 +1023,7 @@ async def test_mode_change_heater_trigger_on_not_long_enough(hass, setup_comp_6)
_setup_sensor(hass, 25)
await hass.async_block_till_done()
assert len(calls) == 0
await common.async_set_hvac_mode(hass, HVAC_MODE_HEAT)
await common.async_set_hvac_mode(hass, HVACMode.HEAT)
assert len(calls) == 1
call = calls[0]
assert call.domain == "homeassistant"
@ -1052,7 +1050,7 @@ async def setup_comp_7(hass):
"ac_mode": True,
"min_cycle_duration": datetime.timedelta(minutes=15),
"keep_alive": datetime.timedelta(minutes=10),
"initial_hvac_mode": HVAC_MODE_COOL,
"initial_hvac_mode": HVACMode.COOL,
}
},
)
@ -1124,7 +1122,7 @@ async def setup_comp_8(hass):
"target_sensor": ENT_SENSOR,
"min_cycle_duration": datetime.timedelta(minutes=15),
"keep_alive": datetime.timedelta(minutes=10),
"initial_hvac_mode": HVAC_MODE_HEAT,
"initial_hvac_mode": HVACMode.HEAT,
}
},
)
@ -1238,7 +1236,7 @@ async def test_custom_setup_params(hass):
assert state.attributes.get("target_temp_step") == TARGET_TEMP_STEP
@pytest.mark.parametrize("hvac_mode", [HVAC_MODE_OFF, HVAC_MODE_HEAT, HVAC_MODE_COOL])
@pytest.mark.parametrize("hvac_mode", [HVACMode.OFF, HVACMode.HEAT, HVACMode.COOL])
async def test_restore_state(hass, hvac_mode):
"""Ensure states are restored on startup."""
mock_restore_cache(
@ -1284,7 +1282,7 @@ async def test_no_restore_state(hass):
(
State(
"climate.test_thermostat",
HVAC_MODE_OFF,
HVACMode.OFF,
{ATTR_TEMPERATURE: "20", ATTR_PRESET_MODE: PRESET_AWAY},
),
),
@ -1308,7 +1306,7 @@ async def test_no_restore_state(hass):
await hass.async_block_till_done()
state = hass.states.get("climate.test_thermostat")
assert state.attributes[ATTR_TEMPERATURE] == 22
assert state.state == HVAC_MODE_OFF
assert state.state == HVACMode.OFF
async def test_initial_hvac_off_force_heater_off(hass):
@ -1333,14 +1331,14 @@ async def test_initial_hvac_off_force_heater_off(hass):
"heater": ENT_SWITCH,
"target_sensor": ENT_SENSOR,
"target_temp": 20,
"initial_hvac_mode": HVAC_MODE_OFF,
"initial_hvac_mode": HVACMode.OFF,
}
},
)
await hass.async_block_till_done()
state = hass.states.get("climate.test_thermostat")
# 'initial_hvac_mode' will force state but must prevent heather keep working
assert state.state == HVAC_MODE_OFF
assert state.state == HVACMode.OFF
# heater must be switched off
assert len(calls) == 1
call = calls[0]
@ -1360,7 +1358,7 @@ async def test_restore_will_turn_off_(hass):
(
State(
"climate.test_thermostat",
HVAC_MODE_HEAT,
HVACMode.HEAT,
{ATTR_TEMPERATURE: "18", ATTR_PRESET_MODE: PRESET_NONE},
),
State(heater_switch, STATE_ON, {}),
@ -1393,7 +1391,7 @@ async def test_restore_will_turn_off_(hass):
await hass.async_block_till_done()
state = hass.states.get("climate.test_thermostat")
assert state.attributes[ATTR_TEMPERATURE] == 20
assert state.state == HVAC_MODE_HEAT
assert state.state == HVACMode.HEAT
assert hass.states.get(heater_switch).state == STATE_ON
@ -1408,7 +1406,7 @@ async def test_restore_will_turn_off_when_loaded_second(hass):
(
State(
"climate.test_thermostat",
HVAC_MODE_HEAT,
HVACMode.HEAT,
{ATTR_TEMPERATURE: "18", ATTR_PRESET_MODE: PRESET_NONE},
),
State(heater_switch, STATE_ON, {}),
@ -1432,14 +1430,14 @@ async def test_restore_will_turn_off_when_loaded_second(hass):
"heater": heater_switch,
"target_sensor": ENT_SENSOR,
"target_temp": 20,
"initial_hvac_mode": HVAC_MODE_OFF,
"initial_hvac_mode": HVACMode.OFF,
}
},
)
await hass.async_block_till_done()
state = hass.states.get("climate.test_thermostat")
assert state.attributes[ATTR_TEMPERATURE] == 20
assert state.state == HVAC_MODE_OFF
assert state.state == HVACMode.OFF
calls_on = async_mock_service(hass, ha.DOMAIN, SERVICE_TURN_ON)
calls_off = async_mock_service(hass, ha.DOMAIN, SERVICE_TURN_OFF)
@ -1473,13 +1471,13 @@ async def test_restore_state_uncoherence_case(hass):
state = hass.states.get(ENTITY)
assert state.attributes[ATTR_TEMPERATURE] == 20
assert state.state == HVAC_MODE_OFF
assert state.state == HVACMode.OFF
assert len(calls) == 0
calls = _setup_switch(hass, False)
await hass.async_block_till_done()
state = hass.states.get(ENTITY)
assert state.state == HVAC_MODE_OFF
assert state.state == HVACMode.OFF
async def _setup_climate(hass):
@ -1501,7 +1499,7 @@ async def _setup_climate(hass):
)
def _mock_restore_cache(hass, temperature=20, hvac_mode=HVAC_MODE_OFF):
def _mock_restore_cache(hass, temperature=20, hvac_mode=HVACMode.OFF):
mock_restore_cache(
hass,
(