mirror of
https://github.com/home-assistant/core.git
synced 2025-07-12 07:47:08 +00:00
Prevent yeelight discovery from overloading the bulb (#57820)
This commit is contained in:
parent
dafea00f41
commit
147febb18a
@ -8,6 +8,7 @@ from yeelight.aio import AsyncBulb
|
|||||||
|
|
||||||
from homeassistant import config_entries, exceptions
|
from homeassistant import config_entries, exceptions
|
||||||
from homeassistant.components.dhcp import IP_ADDRESS
|
from homeassistant.components.dhcp import IP_ADDRESS
|
||||||
|
from homeassistant.config_entries import ConfigEntryState
|
||||||
from homeassistant.const import CONF_DEVICE, CONF_HOST, CONF_ID, CONF_NAME
|
from homeassistant.const import CONF_DEVICE, CONF_HOST, CONF_ID, CONF_NAME
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
@ -66,18 +67,30 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
await self.async_set_unique_id(
|
await self.async_set_unique_id(
|
||||||
"{0:#0{1}x}".format(int(discovery_info["name"][-26:-18]), 18)
|
"{0:#0{1}x}".format(int(discovery_info["name"][-26:-18]), 18)
|
||||||
)
|
)
|
||||||
self._abort_if_unique_id_configured(
|
return await self._async_handle_discovery_with_unique_id()
|
||||||
updates={CONF_HOST: self._discovered_ip}, reload_on_update=False
|
|
||||||
)
|
|
||||||
return await self._async_handle_discovery()
|
|
||||||
|
|
||||||
async def async_step_ssdp(self, discovery_info):
|
async def async_step_ssdp(self, discovery_info):
|
||||||
"""Handle discovery from ssdp."""
|
"""Handle discovery from ssdp."""
|
||||||
self._discovered_ip = urlparse(discovery_info["location"]).hostname
|
self._discovered_ip = urlparse(discovery_info["location"]).hostname
|
||||||
await self.async_set_unique_id(discovery_info["id"])
|
await self.async_set_unique_id(discovery_info["id"])
|
||||||
self._abort_if_unique_id_configured(
|
return await self._async_handle_discovery_with_unique_id()
|
||||||
updates={CONF_HOST: self._discovered_ip}, reload_on_update=False
|
|
||||||
|
async def _async_handle_discovery_with_unique_id(self):
|
||||||
|
"""Handle any discovery with a unique id."""
|
||||||
|
for entry in self._async_current_entries():
|
||||||
|
if entry.unique_id != self.unique_id:
|
||||||
|
continue
|
||||||
|
reload = entry.state == ConfigEntryState.SETUP_RETRY
|
||||||
|
if entry.data[CONF_HOST] != self._discovered_ip:
|
||||||
|
self.hass.config_entries.async_update_entry(
|
||||||
|
entry, data={**entry.data, CONF_HOST: self._discovered_ip}
|
||||||
)
|
)
|
||||||
|
reload = True
|
||||||
|
if reload:
|
||||||
|
self.hass.async_create_task(
|
||||||
|
self.hass.config_entries.async_reload(entry.entry_id)
|
||||||
|
)
|
||||||
|
return self.async_abort(reason="already_configured")
|
||||||
return await self._async_handle_discovery()
|
return await self._async_handle_discovery()
|
||||||
|
|
||||||
async def _async_handle_discovery(self):
|
async def _async_handle_discovery(self):
|
||||||
@ -86,6 +99,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
for progress in self._async_in_progress():
|
for progress in self._async_in_progress():
|
||||||
if progress.get("context", {}).get(CONF_HOST) == self._discovered_ip:
|
if progress.get("context", {}).get(CONF_HOST) == self._discovered_ip:
|
||||||
return self.async_abort(reason="already_in_progress")
|
return self.async_abort(reason="already_in_progress")
|
||||||
|
self._async_abort_entries_match({CONF_HOST: self._discovered_ip})
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self._discovered_model = await self._async_try_connect(
|
self._discovered_model = await self._async_try_connect(
|
||||||
|
@ -500,6 +500,18 @@ async def test_discovered_by_dhcp_or_homekit(hass, source, data):
|
|||||||
assert mock_async_setup.called
|
assert mock_async_setup.called
|
||||||
assert mock_async_setup_entry.called
|
assert mock_async_setup_entry.called
|
||||||
|
|
||||||
|
with _patch_discovery(
|
||||||
|
no_device=True
|
||||||
|
), _patch_discovery_timeout(), _patch_discovery_interval(), patch(
|
||||||
|
f"{MODULE_CONFIG_FLOW}.AsyncBulb", side_effect=CannotConnect
|
||||||
|
):
|
||||||
|
result3 = await hass.config_entries.flow.async_init(
|
||||||
|
DOMAIN, context={"source": source}, data=data
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert result3["type"] == RESULT_TYPE_ABORT
|
||||||
|
assert result3["reason"] == "already_configured"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"source, data",
|
"source, data",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user