diff --git a/homeassistant/components/dynalite/__init__.py b/homeassistant/components/dynalite/__init__.py index f4fc65b8261..618268206b0 100755 --- a/homeassistant/components/dynalite/__init__.py +++ b/homeassistant/components/dynalite/__init__.py @@ -108,22 +108,28 @@ async def async_setup(hass, config): return True +async def async_entry_changed(hass, entry): + """Reload entry since the data has changed.""" + LOGGER.debug("Reconfiguring entry %s", entry.data) + bridge = hass.data[DOMAIN][entry.entry_id] + await bridge.reload_config(entry.data) + LOGGER.debug("Reconfiguring entry finished %s", entry.data) + + async def async_setup_entry(hass, entry): """Set up a bridge from a config entry.""" LOGGER.debug("Setting up entry %s", entry.data) - bridge = DynaliteBridge(hass, entry.data) - + hass.data[DOMAIN][entry.entry_id] = bridge + entry.add_update_listener(async_entry_changed) if not await bridge.async_setup(): LOGGER.error("Could not set up bridge for entry %s", entry.data) + hass.data[DOMAIN].pop(entry.entry_id) return False - if not await bridge.try_connection(): - LOGGER.errot("Could not connect with entry %s", entry) + LOGGER.error("Could not connect with entry %s", entry) + hass.data[DOMAIN].pop(entry.entry_id) raise ConfigEntryNotReady - - hass.data[DOMAIN][entry.entry_id] = bridge - hass.async_create_task( hass.config_entries.async_forward_entry_setup(entry, "light") ) diff --git a/homeassistant/components/dynalite/bridge.py b/homeassistant/components/dynalite/bridge.py index cbe08fdadb5..f2ffe447d6c 100755 --- a/homeassistant/components/dynalite/bridge.py +++ b/homeassistant/components/dynalite/bridge.py @@ -25,16 +25,22 @@ class DynaliteBridge: self.host = config[CONF_HOST] # Configure the dynalite devices self.dynalite_devices = DynaliteDevices( - config=config, newDeviceFunc=self.add_devices_when_registered, updateDeviceFunc=self.update_device, ) + self.dynalite_devices.configure(config) async def async_setup(self): """Set up a Dynalite bridge.""" # Configure the dynalite devices + LOGGER.debug("Setting up bridge - host %s", self.host) return await self.dynalite_devices.async_setup() + async def reload_config(self, config): + """Reconfigure a bridge when config changes.""" + LOGGER.debug("Setting up bridge - host %s, config %s", self.host, config) + self.dynalite_devices.configure(config) + def update_signal(self, device=None): """Create signal to use to trigger entity update.""" if device: diff --git a/homeassistant/components/dynalite/config_flow.py b/homeassistant/components/dynalite/config_flow.py index aac42172181..c5508bc8db2 100755 --- a/homeassistant/components/dynalite/config_flow.py +++ b/homeassistant/components/dynalite/config_flow.py @@ -22,8 +22,11 @@ class DynaliteFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): """Import a new bridge as a config entry.""" LOGGER.debug("Starting async_step_import - %s", import_info) host = import_info[CONF_HOST] - await self.async_set_unique_id(host) - self._abort_if_unique_id_configured(import_info) + for entry in self.hass.config_entries.async_entries(DOMAIN): + if entry.data[CONF_HOST] == host: + if entry.data != import_info: + self.hass.config_entries.async_update_entry(entry, data=import_info) + return self.async_abort(reason="already_configured") # New entry bridge = DynaliteBridge(self.hass, import_info) if not await bridge.async_setup(): diff --git a/homeassistant/components/dynalite/manifest.json b/homeassistant/components/dynalite/manifest.json index 95667733d38..fc552ea6ad1 100755 --- a/homeassistant/components/dynalite/manifest.json +++ b/homeassistant/components/dynalite/manifest.json @@ -5,5 +5,5 @@ "documentation": "https://www.home-assistant.io/integrations/dynalite", "dependencies": [], "codeowners": ["@ziv1234"], - "requirements": ["dynalite_devices==0.1.22"] + "requirements": ["dynalite_devices==0.1.26"] } diff --git a/requirements_all.txt b/requirements_all.txt index 5e4d37c2ba8..b7f02fec5ca 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -460,7 +460,7 @@ dsmr_parser==0.18 dweepy==0.3.0 # homeassistant.components.dynalite -dynalite_devices==0.1.22 +dynalite_devices==0.1.26 # homeassistant.components.rainforest_eagle eagle200_reader==0.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index c16dbdebb4e..4f92b1ac027 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -171,7 +171,7 @@ distro==1.4.0 dsmr_parser==0.18 # homeassistant.components.dynalite -dynalite_devices==0.1.22 +dynalite_devices==0.1.26 # homeassistant.components.ee_brightbox eebrightbox==0.0.4 diff --git a/tests/components/dynalite/common.py b/tests/components/dynalite/common.py new file mode 100755 index 00000000000..3bdf3a60dd7 --- /dev/null +++ b/tests/components/dynalite/common.py @@ -0,0 +1,9 @@ +"""Common functions for the Dynalite tests.""" + +from homeassistant.components import dynalite + + +def get_bridge_from_hass(hass_obj): + """Get the bridge from hass.data.""" + key = next(iter(hass_obj.data[dynalite.DOMAIN])) + return hass_obj.data[dynalite.DOMAIN][key] diff --git a/tests/components/dynalite/test_bridge.py b/tests/components/dynalite/test_bridge.py index 133e03d9f3d..7b3a8312402 100755 --- a/tests/components/dynalite/test_bridge.py +++ b/tests/components/dynalite/test_bridge.py @@ -2,7 +2,7 @@ from unittest.mock import Mock, call from asynctest import patch -from dynalite_lib import CONF_ALL +from dynalite_devices_lib import CONF_ALL import pytest from homeassistant.components import dynalite diff --git a/tests/components/dynalite/test_config_flow.py b/tests/components/dynalite/test_config_flow.py index 1f8be61f646..fb8530aec1e 100755 --- a/tests/components/dynalite/test_config_flow.py +++ b/tests/components/dynalite/test_config_flow.py @@ -4,6 +4,8 @@ from asynctest import patch from homeassistant import config_entries from homeassistant.components import dynalite +from .common import get_bridge_from_hass + from tests.common import MockConfigEntry @@ -70,21 +72,29 @@ async def test_existing(hass): async def test_existing_update(hass): """Test when the entry exists with the same config.""" host = "1.2.3.4" - mock_entry = MockConfigEntry( - domain=dynalite.DOMAIN, unique_id=host, data={dynalite.CONF_HOST: host} - ) - mock_entry.add_to_hass(hass) + port1 = 7777 + port2 = 8888 with patch( "homeassistant.components.dynalite.bridge.DynaliteDevices.async_setup", return_value=True, ), patch( "homeassistant.components.dynalite.bridge.DynaliteDevices.available", True ): + assert await hass.config_entries.flow.async_init( + dynalite.DOMAIN, + context={"source": config_entries.SOURCE_IMPORT}, + data={dynalite.CONF_HOST: host, dynalite.CONF_PORT: port1}, + ) + await hass.async_block_till_done() + old_bridge = get_bridge_from_hass(hass) + assert old_bridge.dynalite_devices.port == port1 result = await hass.config_entries.flow.async_init( dynalite.DOMAIN, context={"source": config_entries.SOURCE_IMPORT}, - data={dynalite.CONF_HOST: host, "aaa": "bbb"}, + data={dynalite.CONF_HOST: host, dynalite.CONF_PORT: port2}, ) + await hass.async_block_till_done() assert result["type"] == "abort" assert result["reason"] == "already_configured" - assert mock_entry.data.get("aaa") == "bbb" + bridge = get_bridge_from_hass(hass) + assert bridge.dynalite_devices.port == port2