From 7b8b73f82682e5d276d464d915b76130e4a2f573 Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Sat, 1 Oct 2022 18:59:10 -0700 Subject: [PATCH] Update nest climate to avoid duplicate set mode commands (#79445) --- homeassistant/components/nest/climate_sdm.py | 2 ++ tests/components/nest/test_climate_sdm.py | 23 ++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/homeassistant/components/nest/climate_sdm.py b/homeassistant/components/nest/climate_sdm.py index 3113cb2dd40..bed44045c11 100644 --- a/homeassistant/components/nest/climate_sdm.py +++ b/homeassistant/components/nest/climate_sdm.py @@ -320,6 +320,8 @@ class ThermostatEntity(ClimateEntity): """Set new target preset mode.""" if preset_mode not in self.preset_modes: raise ValueError(f"Unsupported preset_mode '{preset_mode}'") + if self.preset_mode == preset_mode: # API doesn't like duplicate preset modes + return trait = self._device.traits[ThermostatEcoTrait.NAME] try: await trait.set_mode(PRESET_INV_MODE_MAP[preset_mode]) diff --git a/tests/components/nest/test_climate_sdm.py b/tests/components/nest/test_climate_sdm.py index 4ac58171fcd..ffe957a3e28 100644 --- a/tests/components/nest/test_climate_sdm.py +++ b/tests/components/nest/test_climate_sdm.py @@ -602,6 +602,29 @@ async def test_thermostat_set_eco_preset( "params": {"mode": "OFF"}, } + # Simulate the mode changing + await create_event( + { + "sdm.devices.traits.ThermostatEco": { + "availableModes": ["HEAT", "COOL", "HEATCOOL", "OFF"], + "mode": "OFF", + }, + } + ) + + auth.method = None + auth.url = None + auth.json = None + + # Attempting to set the preset mode when already in that mode will + # not send any messages to the API (it would otherwise fail) + await common.async_set_preset_mode(hass, PRESET_NONE) + await hass.async_block_till_done() + + assert auth.method is None + assert auth.url is None + assert auth.json is None + async def test_thermostat_set_cool( hass: HomeAssistant,