From 321da50a7e735aed6511c1acfd2b5f033461098a 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 e40db60d5edd..dd257bb9301f 100644 --- a/homeassistant/components/nest/climate_sdm.py +++ b/homeassistant/components/nest/climate_sdm.py @@ -315,6 +315,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 440855f6ab77..b6992a5772fd 100644 --- a/tests/components/nest/test_climate_sdm.py +++ b/tests/components/nest/test_climate_sdm.py @@ -598,6 +598,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,