diff --git a/homeassistant/components/hue/__init__.py b/homeassistant/components/hue/__init__.py index c04380e1303..38b521078f4 100644 --- a/homeassistant/components/hue/__init__.py +++ b/homeassistant/components/hue/__init__.py @@ -11,7 +11,8 @@ import voluptuous as vol from homeassistant import config_entries from homeassistant.const import CONF_FILENAME, CONF_HOST -from homeassistant.helpers import aiohttp_client, config_validation as cv +from homeassistant.helpers import ( + aiohttp_client, config_validation as cv, device_registry as dr) from .const import DOMAIN, API_NUPNP from .bridge import HueBridge @@ -132,7 +133,28 @@ async def async_setup_entry(hass, entry): bridge = HueBridge(hass, entry, allow_unreachable, allow_groups) hass.data[DOMAIN][host] = bridge - return await bridge.async_setup() + + if not await bridge.async_setup(): + return False + + config = bridge.api.config + device_registry = await dr.async_get_registry(hass) + device_registry.async_get_or_create( + config_entry=entry.entry_id, + connections={ + (dr.CONNECTION_NETWORK_MAC, config.mac) + }, + identifiers={ + (DOMAIN, config.bridgeid) + }, + manufacturer='Signify', + name=config.name, + # Not yet exposed as properties in aiohue + model=config.raw['modelid'], + sw_version=config.raw['swversion'], + ) + + return True async def async_unload_entry(hass, entry): diff --git a/homeassistant/components/light/hue.py b/homeassistant/components/light/hue.py index 2a51423a7a8..6f6e0ed617e 100644 --- a/homeassistant/components/light/hue.py +++ b/homeassistant/components/light/hue.py @@ -285,6 +285,25 @@ class HueLight(Light): """Return the list of supported effects.""" return [EFFECT_COLORLOOP, EFFECT_RANDOM] + @property + def device_info(self): + """Return the device info.""" + if self.light.type in ('LightGroup', 'Room'): + return None + + return { + 'identifiers': { + (hue.DOMAIN, self.unique_id) + }, + 'name': self.name, + 'manufacturer': self.light.manufacturername, + # productname added in Hue Bridge API 1.24 + # (published 03/05/2018) + 'model': self.light.productname or self.light.modelid, + # Not yet exposed as properties in aiohue + 'sw_version': self.light.raw['swversion'], + } + async def async_turn_on(self, **kwargs): """Turn the specified or all lights on.""" command = {'on': True} diff --git a/tests/components/hue/test_init.py b/tests/components/hue/test_init.py index d12270cd908..1c4768746d5 100644 --- a/tests/components/hue/test_init.py +++ b/tests/components/hue/test_init.py @@ -1,5 +1,5 @@ """Test Hue setup process.""" -from unittest.mock import patch +from unittest.mock import Mock, patch from homeassistant.setup import async_setup_component from homeassistant.components import hue @@ -145,9 +145,21 @@ async def test_config_passed_to_config_entry(hass): 'host': '0.0.0.0', }) entry.add_to_hass(hass) - - with patch.object(hue, 'HueBridge') as mock_bridge: + mock_registry = Mock() + with patch.object(hue, 'HueBridge') as mock_bridge, \ + patch('homeassistant.helpers.device_registry.async_get_registry', + return_value=mock_coro(mock_registry)): mock_bridge.return_value.async_setup.return_value = mock_coro(True) + mock_bridge.return_value.api.config = Mock( + mac='mock-mac', + bridgeid='mock-bridgeid', + raw={ + 'modelid': 'mock-modelid', + 'swversion': 'mock-swversion', + } + ) + # Can't set name via kwargs + mock_bridge.return_value.api.config.name = 'mock-name' assert await async_setup_component(hass, hue.DOMAIN, { hue.DOMAIN: { hue.CONF_BRIDGES: { @@ -168,6 +180,21 @@ async def test_config_passed_to_config_entry(hass): assert p_allow_unreachable is True assert p_allow_groups is False + assert len(mock_registry.mock_calls) == 1 + assert mock_registry.mock_calls[0][2] == { + 'config_entry': entry.entry_id, + 'connections': { + ('mac', 'mock-mac') + }, + 'identifiers': { + ('hue', 'mock-bridgeid') + }, + 'manufacturer': 'Signify', + 'name': 'mock-name', + 'model': 'mock-modelid', + 'sw_version': 'mock-swversion' + } + async def test_unload_entry(hass): """Test being able to unload an entry.""" @@ -176,8 +203,11 @@ async def test_unload_entry(hass): }) entry.add_to_hass(hass) - with patch.object(hue, 'HueBridge') as mock_bridge: + with patch.object(hue, 'HueBridge') as mock_bridge, \ + patch('homeassistant.helpers.device_registry.async_get_registry', + return_value=mock_coro(Mock())): mock_bridge.return_value.async_setup.return_value = mock_coro(True) + mock_bridge.return_value.api.config = Mock() assert await async_setup_component(hass, hue.DOMAIN, {}) is True assert len(mock_bridge.return_value.mock_calls) == 1