From 73f107a4ea011b59ba7bd1fa308e97fac6bf12fd Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Fri, 2 Jul 2021 12:25:43 -0400 Subject: [PATCH 1/3] Don't raise an error when setting HVAC mode without a value --- homeassistant/components/zwave_js/climate.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/zwave_js/climate.py b/homeassistant/components/zwave_js/climate.py index 4ef13276fbe140..4477ce27dccc74 100644 --- a/homeassistant/components/zwave_js/climate.py +++ b/homeassistant/components/zwave_js/climate.py @@ -470,10 +470,8 @@ async def async_set_temperature(self, **kwargs: Any) -> None: async def async_set_hvac_mode(self, hvac_mode: str) -> None: """Set new target hvac mode.""" if not self._current_mode: - # Thermostat(valve) with no support for setting a mode - raise ValueError( - f"Thermostat {self.entity_id} does not support setting a mode" - ) + # Thermostat(valve) has no support for setting a mode, so we make it a no-op + return hvac_mode_value = self._hvac_modes.get(hvac_mode) if hvac_mode_value is None: raise ValueError(f"Received an invalid hvac mode: {hvac_mode}") From 3e56c3371263c9d7b11c803c345ac37d6bfa0118 Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Fri, 2 Jul 2021 21:58:47 -0400 Subject: [PATCH 2/3] change logic based on discord convo and add tests --- homeassistant/components/zwave_js/climate.py | 4 ++++ tests/components/zwave_js/test_climate.py | 24 ++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/homeassistant/components/zwave_js/climate.py b/homeassistant/components/zwave_js/climate.py index 4477ce27dccc74..e969d4b3a50164 100644 --- a/homeassistant/components/zwave_js/climate.py +++ b/homeassistant/components/zwave_js/climate.py @@ -469,6 +469,10 @@ async def async_set_temperature(self, **kwargs: Any) -> None: async def async_set_hvac_mode(self, hvac_mode: str) -> None: """Set new target hvac mode.""" + if hvac_mode not in self.hvac_modes: + raise ValueError( + f"Thermostat {self.entity_id} does not support the {hvac_mode} mode" + ) if not self._current_mode: # Thermostat(valve) has no support for setting a mode, so we make it a no-op return diff --git a/tests/components/zwave_js/test_climate.py b/tests/components/zwave_js/test_climate.py index f86052b3692fca..fefa680ce77735 100644 --- a/tests/components/zwave_js/test_climate.py +++ b/tests/components/zwave_js/test_climate.py @@ -382,6 +382,30 @@ async def test_setpoint_thermostat(hass, client, climate_danfoss_lc_13, integrat blocking=True, ) + # Test setting illegal mode raises an error + with pytest.raises(ValueError): + await hass.services.async_call( + CLIMATE_DOMAIN, + SERVICE_SET_HVAC_MODE, + { + ATTR_ENTITY_ID: CLIMATE_DANFOSS_LC13_ENTITY, + ATTR_HVAC_MODE: HVAC_MODE_COOL, + }, + blocking=True, + ) + + # Test that setting HVAC_MODE_HEAT works. If the no-op logic didn't work, this would + # raise an error + await hass.services.async_call( + CLIMATE_DOMAIN, + SERVICE_SET_HVAC_MODE, + { + ATTR_ENTITY_ID: CLIMATE_DANFOSS_LC13_ENTITY, + ATTR_HVAC_MODE: HVAC_MODE_HEAT, + }, + blocking=True, + ) + assert len(client.async_send_command_no_wait.call_args_list) == 1 args = client.async_send_command_no_wait.call_args_list[0][0][0] assert args["command"] == "node.set_value" From 6b48e7bce1cbe4832ca2fc74698602c794a9d277 Mon Sep 17 00:00:00 2001 From: raman325 <7243222+raman325@users.noreply.github.com> Date: Fri, 2 Jul 2021 22:08:39 -0400 Subject: [PATCH 3/3] tweak --- homeassistant/components/zwave_js/climate.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/zwave_js/climate.py b/homeassistant/components/zwave_js/climate.py index e969d4b3a50164..43363538500528 100644 --- a/homeassistant/components/zwave_js/climate.py +++ b/homeassistant/components/zwave_js/climate.py @@ -469,17 +469,15 @@ async def async_set_temperature(self, **kwargs: Any) -> None: async def async_set_hvac_mode(self, hvac_mode: str) -> None: """Set new target hvac mode.""" - if hvac_mode not in self.hvac_modes: - raise ValueError( - f"Thermostat {self.entity_id} does not support the {hvac_mode} mode" - ) + hvac_mode_id = self._hvac_modes.get(hvac_mode) + if hvac_mode_id is None: + raise ValueError(f"Received an invalid hvac mode: {hvac_mode}") + if not self._current_mode: # Thermostat(valve) has no support for setting a mode, so we make it a no-op return - hvac_mode_value = self._hvac_modes.get(hvac_mode) - if hvac_mode_value is None: - raise ValueError(f"Received an invalid hvac mode: {hvac_mode}") - await self.info.node.async_set_value(self._current_mode, hvac_mode_value) + + await self.info.node.async_set_value(self._current_mode, hvac_mode_id) async def async_set_preset_mode(self, preset_mode: str) -> None: """Set new target preset mode."""