deCONZ - properly identify configured bridge (#24378)

This commit is contained in:
Robert Svensson 2019-06-08 08:43:18 +02:00 committed by Paulus Schoutsen
parent bfafe9ccbe
commit b68a796c7c
2 changed files with 23 additions and 12 deletions

View File

@ -18,6 +18,7 @@ from .const import CONF_BRIDGEID, DEFAULT_PORT, DOMAIN
DECONZ_MANUFACTURERURL = 'http://www.dresden-elektronik.de' DECONZ_MANUFACTURERURL = 'http://www.dresden-elektronik.de'
CONF_SERIAL = 'serial' CONF_SERIAL = 'serial'
ATTR_UUID = 'udn'
@callback @callback
@ -156,25 +157,28 @@ class DeconzFlowHandler(config_entries.ConfigFlow):
if discovery_info[ATTR_MANUFACTURERURL] != DECONZ_MANUFACTURERURL: if discovery_info[ATTR_MANUFACTURERURL] != DECONZ_MANUFACTURERURL:
return self.async_abort(reason='not_deconz_bridge') return self.async_abort(reason='not_deconz_bridge')
bridgeid = discovery_info[ATTR_SERIAL] uuid = discovery_info[ATTR_UUID].replace('uuid:', '')
gateway_entries = configured_gateways(self.hass) gateways = {
gateway.api.config.uuid: gateway
for gateway in self.hass.data.get(DOMAIN, {}).values()
}
if bridgeid in gateway_entries: if uuid in gateways:
entry = gateway_entries[bridgeid] entry = gateways[uuid].config_entry
await self._update_entry(entry, discovery_info[CONF_HOST]) await self._update_entry(entry, discovery_info[CONF_HOST])
return self.async_abort(reason='updated_instance') return self.async_abort(reason='updated_instance')
# pylint: disable=unsupported-assignment-operation bridgeid = discovery_info[ATTR_SERIAL]
self.context[ATTR_SERIAL] = bridgeid if any(bridgeid == flow['context'][CONF_BRIDGEID]
if any(bridgeid == flow['context'][ATTR_SERIAL]
for flow in self._async_in_progress()): for flow in self._async_in_progress()):
return self.async_abort(reason='already_in_progress') return self.async_abort(reason='already_in_progress')
# pylint: disable=unsupported-assignment-operation
self.context[CONF_BRIDGEID] = bridgeid
deconz_config = { deconz_config = {
CONF_HOST: discovery_info[CONF_HOST], CONF_HOST: discovery_info[CONF_HOST],
CONF_PORT: discovery_info[CONF_PORT], CONF_PORT: discovery_info[CONF_PORT],
CONF_BRIDGEID: bridgeid
} }
return await self.async_step_import(deconz_config) return await self.async_step_import(deconz_config)

View File

@ -1,5 +1,5 @@
"""Tests for deCONZ config flow.""" """Tests for deCONZ config flow."""
from unittest.mock import patch from unittest.mock import Mock, patch
import asyncio import asyncio
@ -177,7 +177,8 @@ async def test_bridge_ssdp_discovery(hass):
config_flow.CONF_PORT: 80, config_flow.CONF_PORT: 80,
config_flow.ATTR_SERIAL: 'id', config_flow.ATTR_SERIAL: 'id',
config_flow.ATTR_MANUFACTURERURL: config_flow.ATTR_MANUFACTURERURL:
config_flow.DECONZ_MANUFACTURERURL config_flow.DECONZ_MANUFACTURERURL,
config_flow.ATTR_UUID: 'uuid:1234'
}, },
context={'source': 'ssdp'} context={'source': 'ssdp'}
) )
@ -207,13 +208,19 @@ async def test_bridge_discovery_update_existing_entry(hass):
}) })
entry.add_to_hass(hass) entry.add_to_hass(hass)
gateway = Mock()
gateway.config_entry = entry
gateway.api.config.uuid = '1234'
hass.data[config_flow.DOMAIN] = {'id': gateway}
result = await hass.config_entries.flow.async_init( result = await hass.config_entries.flow.async_init(
config_flow.DOMAIN, config_flow.DOMAIN,
data={ data={
config_flow.CONF_HOST: 'mock-deconz', config_flow.CONF_HOST: 'mock-deconz',
config_flow.ATTR_SERIAL: 'id', config_flow.ATTR_SERIAL: 'id',
config_flow.ATTR_MANUFACTURERURL: config_flow.ATTR_MANUFACTURERURL:
config_flow.DECONZ_MANUFACTURERURL config_flow.DECONZ_MANUFACTURERURL,
config_flow.ATTR_UUID: 'uuid:1234'
}, },
context={'source': 'ssdp'} context={'source': 'ssdp'}
) )