diff --git a/homeassistant/components/generic_thermostat/climate.py b/homeassistant/components/generic_thermostat/climate.py index 081bf1900d6..9e6df475d39 100644 --- a/homeassistant/components/generic_thermostat/climate.py +++ b/homeassistant/components/generic_thermostat/climate.py @@ -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, diff --git a/tests/components/generic_thermostat/test_climate.py b/tests/components/generic_thermostat/test_climate.py index 70337f6f679..d607c6dbb61 100644 --- a/tests/components/generic_thermostat/test_climate.py +++ b/tests/components/generic_thermostat/test_climate.py @@ -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, (