diff --git a/homeassistant/components/honeywell/climate.py b/homeassistant/components/honeywell/climate.py index 11cf2a24ac1..f7878e21c27 100644 --- a/homeassistant/components/honeywell/climate.py +++ b/homeassistant/components/honeywell/climate.py @@ -26,6 +26,7 @@ from homeassistant.const import ATTR_TEMPERATURE, UnitOfTemperature from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddEntitiesCallback +from . import HoneywellData from .const import ( _LOGGER, CONF_COOL_AWAY_TEMPERATURE, @@ -70,7 +71,7 @@ HW_FAN_MODE_TO_HA = { "follow schedule": FAN_AUTO, } -SCAN_INTERVAL = datetime.timedelta(seconds=10) +SCAN_INTERVAL = datetime.timedelta(seconds=30) async def async_setup_entry( @@ -93,7 +94,13 @@ async def async_setup_entry( class HoneywellUSThermostat(ClimateEntity): """Representation of a Honeywell US Thermostat.""" - def __init__(self, data, device, cool_away_temp, heat_away_temp): + def __init__( + self, + data: HoneywellData, + device: AIOSomecomfort.device.Device, + cool_away_temp: int | None, + heat_away_temp: int | None, + ) -> None: """Initialize the thermostat.""" self._data = data self._device = device @@ -110,8 +117,13 @@ class HoneywellUSThermostat(ClimateEntity): self._attr_is_aux_heat = device.system_mode == "emheat" # not all honeywell HVACs support all modes - mappings = [v for k, v in HVAC_MODE_TO_HW_MODE.items() if device.raw_ui_data[k]] - self._hvac_mode_map = {k: v for d in mappings for k, v in d.items()} + + self._hvac_mode_map = { + key2: value2 + for key1, value1 in HVAC_MODE_TO_HW_MODE.items() + if device.raw_ui_data[key1] + for key2, value2 in value1.items() + } self._attr_hvac_modes = list(self._hvac_mode_map) self._attr_supported_features = ( @@ -130,8 +142,12 @@ class HoneywellUSThermostat(ClimateEntity): return # not all honeywell fans support all modes - mappings = [v for k, v in FAN_MODE_TO_HW.items() if device.raw_fan_data[k]] - self._fan_mode_map = {k: v for d in mappings for k, v in d.items()} + self._fan_mode_map = { + key2: value2 + for key1, value1 in FAN_MODE_TO_HW.items() + if device.raw_fan_data[key1] + for key2, value2 in value1.items() + } self._attr_fan_modes = list(self._fan_mode_map) @@ -246,15 +262,15 @@ class HoneywellUSThermostat(ClimateEntity): # Get next period time hour, minute = divmod(next_period * 15, 60) # Set hold time - if mode == HVACMode.COOL: + if mode == "cool": await self._device.set_hold_cool(datetime.time(hour, minute)) - elif mode == HVACMode.HEAT: + elif mode == "heat": await self._device.set_hold_heat(datetime.time(hour, minute)) # Set temperature - if mode == HVACMode.COOL: + if mode == "cool": await self._device.set_setpoint_cool(temperature) - elif mode == HVACMode.HEAT: + elif mode == "heat": await self._device.set_setpoint_heat(temperature) except AIOSomecomfort.SomeComfortError: @@ -301,10 +317,10 @@ class HoneywellUSThermostat(ClimateEntity): # Set permanent hold # and Set temperature away_temp = getattr(self, f"_{mode}_away_temp") - if mode == HVACMode.COOL: + if mode == "cool": self._device.set_hold_cool(True) self._device.set_setpoint_cool(away_temp) - elif mode == HVACMode.HEAT: + elif mode == "heat": self._device.set_hold_heat(True) self._device.set_setpoint_heat(away_temp) @@ -325,9 +341,9 @@ class HoneywellUSThermostat(ClimateEntity): if mode in HW_MODE_TO_HVAC_MODE: try: # Set permanent hold - if mode == HVACMode.COOL: + if mode == "cool": await self._device.set_hold_cool(True) - elif mode == HVACMode.HEAT: + elif mode == "heat": await self._device.set_hold_heat(True) except AIOSomecomfort.SomeComfortError: diff --git a/homeassistant/components/honeywell/config_flow.py b/homeassistant/components/honeywell/config_flow.py index 71419577d76..9f630d90fbe 100644 --- a/homeassistant/components/honeywell/config_flow.py +++ b/homeassistant/components/honeywell/config_flow.py @@ -29,10 +29,9 @@ class HoneywellConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): async def async_step_user(self, user_input=None) -> FlowResult: """Create config entry. Show the setup form to the user.""" errors = {} - valid = False if user_input is not None: try: - valid = await self.is_valid(**user_input) + await self.is_valid(**user_input) except AIOSomecomfort.AuthError: errors["base"] = "invalid_auth" except ( @@ -42,7 +41,7 @@ class HoneywellConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): ): errors["base"] = "cannot_connect" - if valid: + if not errors: return self.async_create_entry( title=DOMAIN, data=user_input, diff --git a/tests/components/honeywell/test_config_flow.py b/tests/components/honeywell/test_config_flow.py index 84fbd29325d..46ab48572f8 100644 --- a/tests/components/honeywell/test_config_flow.py +++ b/tests/components/honeywell/test_config_flow.py @@ -36,6 +36,7 @@ async def test_show_authenticate_form(hass: HomeAssistant) -> None: async def test_connection_error(hass: HomeAssistant, client: MagicMock) -> None: """Test that an error message is shown on connection fail.""" client.login.side_effect = AIOSomecomfort.ConnectionError + result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, data=FAKE_CONFIG ) @@ -45,6 +46,7 @@ async def test_connection_error(hass: HomeAssistant, client: MagicMock) -> None: async def test_auth_error(hass: HomeAssistant, client: MagicMock) -> None: """Test that an error message is shown on login fail.""" client.login.side_effect = AIOSomecomfort.AuthError + result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": SOURCE_USER}, data=FAKE_CONFIG ) @@ -53,17 +55,21 @@ async def test_auth_error(hass: HomeAssistant, client: MagicMock) -> None: async def test_create_entry(hass: HomeAssistant) -> None: """Test that the config entry is created.""" + with patch( + "homeassistant.components.honeywell.async_setup_entry", + return_value=True, + ): + result = await hass.config_entries.flow.async_init( + DOMAIN, context={"source": SOURCE_USER}, data=FAKE_CONFIG + ) + await hass.async_block_till_done() - result = await hass.config_entries.flow.async_init( - DOMAIN, context={"source": SOURCE_USER}, data=FAKE_CONFIG - ) assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY assert result["data"] == FAKE_CONFIG -@patch("homeassistant.components.honeywell.UPDATE_LOOP_SLEEP_TIME", 0) async def test_show_option_form( - hass: HomeAssistant, config_entry: MockConfigEntry, location + hass: HomeAssistant, config_entry: MockConfigEntry ) -> None: """Test that the option form is shown.""" config_entry.add_to_hass(hass) @@ -72,15 +78,18 @@ async def test_show_option_form( assert config_entry.state is ConfigEntryState.LOADED - result = await hass.config_entries.options.async_init(config_entry.entry_id) + with patch( + "homeassistant.components.honeywell.async_setup_entry", + return_value=True, + ): + result = await hass.config_entries.options.async_init(config_entry.entry_id) assert result["type"] == data_entry_flow.FlowResultType.FORM assert result["step_id"] == "init" -@patch("homeassistant.components.honeywell.UPDATE_LOOP_SLEEP_TIME", 0) async def test_create_option_entry( - hass: HomeAssistant, config_entry: MockConfigEntry, location + hass: HomeAssistant, config_entry: MockConfigEntry ) -> None: """Test that the config entry is created.""" config_entry.add_to_hass(hass) @@ -89,11 +98,18 @@ async def test_create_option_entry( assert config_entry.state is ConfigEntryState.LOADED - options_form = await hass.config_entries.options.async_init(config_entry.entry_id) - result = await hass.config_entries.options.async_configure( - options_form["flow_id"], - user_input={CONF_COOL_AWAY_TEMPERATURE: 1, CONF_HEAT_AWAY_TEMPERATURE: 2}, - ) + with patch( + "homeassistant.components.honeywell.async_setup_entry", + return_value=True, + ): + options_form = await hass.config_entries.options.async_init( + config_entry.entry_id + ) + result = await hass.config_entries.options.async_configure( + options_form["flow_id"], + user_input={CONF_COOL_AWAY_TEMPERATURE: 1, CONF_HEAT_AWAY_TEMPERATURE: 2}, + ) + await hass.async_block_till_done() assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY assert config_entry.options == {