From 68ce59e9c11e67e8a2963e7a33297a532d280b57 Mon Sep 17 00:00:00 2001 From: Eric Severance Date: Sat, 22 Apr 2023 14:10:08 -0700 Subject: [PATCH] Skip adding WeMo device on failure (#91621) * Skip adding WeMo device on failure * Only create a single log entry for each failed device * Fix typo s/serial_number/serialnumber/ * Discard failed devices on success --- homeassistant/components/wemo/__init__.py | 13 ++++++++++++- tests/components/wemo/test_init.py | 22 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/wemo/__init__.py b/homeassistant/components/wemo/__init__.py index a70b5d70898..11a46293f29 100644 --- a/homeassistant/components/wemo/__init__.py +++ b/homeassistant/components/wemo/__init__.py @@ -140,6 +140,7 @@ class WemoDispatcher: """Initialize the WemoDispatcher.""" self._config_entry = config_entry self._added_serial_numbers: set[str] = set() + self._failed_serial_numbers: set[str] = set() self._loaded_platforms: set[Platform] = set() async def async_add_unique_device( @@ -149,7 +150,16 @@ class WemoDispatcher: if wemo.serialnumber in self._added_serial_numbers: return - coordinator = await async_register_device(hass, self._config_entry, wemo) + try: + coordinator = await async_register_device(hass, self._config_entry, wemo) + except pywemo.PyWeMoException as err: + if wemo.serialnumber not in self._failed_serial_numbers: + self._failed_serial_numbers.add(wemo.serialnumber) + _LOGGER.error( + "Unable to add WeMo %s %s: %s", repr(wemo), wemo.host, err + ) + return + platforms = set(WEMO_MODEL_DISPATCH.get(wemo.model_name, [Platform.SWITCH])) platforms.add(Platform.SENSOR) for platform in platforms: @@ -178,6 +188,7 @@ class WemoDispatcher: ) self._added_serial_numbers.add(wemo.serialnumber) + self._failed_serial_numbers.discard(wemo.serialnumber) class WemoDiscovery: diff --git a/tests/components/wemo/test_init.py b/tests/components/wemo/test_init.py index c01701f7d53..7e3e0b2dce8 100644 --- a/tests/components/wemo/test_init.py +++ b/tests/components/wemo/test_init.py @@ -107,6 +107,28 @@ async def test_static_config_with_invalid_host(hass: HomeAssistant) -> None: assert not setup_success +async def test_static_with_upnp_failure( + hass: HomeAssistant, pywemo_device: pywemo.WeMoDevice +) -> None: + """Device that fails to get state is not added.""" + pywemo_device.get_state.side_effect = pywemo.exceptions.ActionException("Failed") + assert await async_setup_component( + hass, + DOMAIN, + { + DOMAIN: { + CONF_DISCOVERY: False, + CONF_STATIC: [f"{MOCK_HOST}:{MOCK_PORT}"], + }, + }, + ) + await hass.async_block_till_done() + entity_reg = er.async_get(hass) + entity_entries = list(entity_reg.entities.values()) + assert len(entity_entries) == 0 + pywemo_device.get_state.assert_called_once() + + async def test_discovery(hass: HomeAssistant, pywemo_registry) -> None: """Verify that discovery dispatches devices to the platform for setup."""