diff --git a/homeassistant/components/adguard/__init__.py b/homeassistant/components/adguard/__init__.py index 6996a2b0d51..3e0ea2cfb74 100644 --- a/homeassistant/components/adguard/__init__.py +++ b/homeassistant/components/adguard/__init__.py @@ -206,4 +206,5 @@ class AdGuardHomeDeviceEntity(AdGuardHomeEntity): "name": "AdGuard Home", "manufacturer": "AdGuard Team", "sw_version": self.hass.data[DOMAIN].get(DATA_ADGUARD_VERION), + "type": "service", } diff --git a/homeassistant/components/config/device_registry.py b/homeassistant/components/config/device_registry.py index 08f53f948fe..5b12ccb92eb 100644 --- a/homeassistant/components/config/device_registry.py +++ b/homeassistant/components/config/device_registry.py @@ -71,6 +71,7 @@ def _entry_dict(entry): "model": entry.model, "name": entry.name, "sw_version": entry.sw_version, + "entry_type": entry.entry_type, "id": entry.id, "via_device_id": entry.via_device_id, "area_id": entry.area_id, diff --git a/homeassistant/helpers/device_registry.py b/homeassistant/helpers/device_registry.py index 56b8170b99a..139c9fe2b84 100644 --- a/homeassistant/helpers/device_registry.py +++ b/homeassistant/helpers/device_registry.py @@ -1,7 +1,7 @@ """Provide a way to connect entities belonging to one device.""" from collections import OrderedDict import logging -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List, Optional, Set, Tuple import uuid import attr @@ -32,19 +32,24 @@ CONNECTION_ZIGBEE = "zigbee" class DeviceEntry: """Device Registry Entry.""" - config_entries = attr.ib(type=set, converter=set, default=attr.Factory(set)) - connections = attr.ib(type=set, converter=set, default=attr.Factory(set)) - identifiers = attr.ib(type=set, converter=set, default=attr.Factory(set)) - manufacturer = attr.ib(type=str, default=None) - model = attr.ib(type=str, default=None) - name = attr.ib(type=str, default=None) - sw_version = attr.ib(type=str, default=None) - via_device_id = attr.ib(type=str, default=None) - area_id = attr.ib(type=str, default=None) - name_by_user = attr.ib(type=str, default=None) - id = attr.ib(type=str, default=attr.Factory(lambda: uuid.uuid4().hex)) + config_entries: Set[str] = attr.ib(converter=set, default=attr.Factory(set)) + connections: Set[Tuple[str, str]] = attr.ib( + converter=set, default=attr.Factory(set) + ) + identifiers: Set[Tuple[str, str]] = attr.ib( + converter=set, default=attr.Factory(set) + ) + manufacturer: str = attr.ib(default=None) + model: str = attr.ib(default=None) + name: str = attr.ib(default=None) + sw_version: str = attr.ib(default=None) + via_device_id: str = attr.ib(default=None) + area_id: str = attr.ib(default=None) + name_by_user: str = attr.ib(default=None) + entry_type: str = attr.ib(default=None) + id: str = attr.ib(default=attr.Factory(lambda: uuid.uuid4().hex)) # This value is not stored, just used to keep track of events to fire. - is_new = attr.ib(type=bool, default=False) + is_new: bool = attr.ib(default=False) def format_mac(mac: str) -> str: @@ -105,6 +110,7 @@ class DeviceRegistry: model=_UNDEF, name=_UNDEF, sw_version=_UNDEF, + entry_type=_UNDEF, via_device=None, ): """Get device. Create if it doesn't exist.""" @@ -144,6 +150,7 @@ class DeviceRegistry: model=model, name=name, sw_version=sw_version, + entry_type=entry_type, ) @callback @@ -189,6 +196,7 @@ class DeviceRegistry: model=_UNDEF, name=_UNDEF, sw_version=_UNDEF, + entry_type=_UNDEF, via_device_id=_UNDEF, area_id=_UNDEF, name_by_user=_UNDEF, @@ -236,6 +244,7 @@ class DeviceRegistry: ("model", model), ("name", name), ("sw_version", sw_version), + ("entry_type", entry_type), ("via_device_id", via_device_id), ): if value is not _UNDEF and value != getattr(old, attr_name): @@ -291,6 +300,8 @@ class DeviceRegistry: model=device["model"], name=device["name"], sw_version=device["sw_version"], + # Introduced in 0.110 + entry_type=device.get("entry_type"), id=device["id"], # Introduced in 0.79 # renamed in 0.95 @@ -323,6 +334,7 @@ class DeviceRegistry: "model": entry.model, "name": entry.name, "sw_version": entry.sw_version, + "entry_type": entry.entry_type, "id": entry.id, "via_device_id": entry.via_device_id, "area_id": entry.area_id, diff --git a/homeassistant/helpers/entity_platform.py b/homeassistant/helpers/entity_platform.py index e4d52aaa3a1..30b07c98252 100644 --- a/homeassistant/helpers/entity_platform.py +++ b/homeassistant/helpers/entity_platform.py @@ -353,6 +353,7 @@ class EntityPlatform: "model", "name", "sw_version", + "entry_type", "via_device", ): if key in device_info: diff --git a/tests/components/config/test_device_registry.py b/tests/components/config/test_device_registry.py index a3710d48b94..c2557c83a4a 100644 --- a/tests/components/config/test_device_registry.py +++ b/tests/components/config/test_device_registry.py @@ -34,6 +34,7 @@ async def test_list_devices(hass, client, registry): manufacturer="manufacturer", model="model", via_device=("bridgeid", "0123"), + entry_type="service", ) await client.send_json({"id": 5, "type": "config/device_registry/list"}) @@ -49,6 +50,7 @@ async def test_list_devices(hass, client, registry): "model": "model", "name": None, "sw_version": None, + "entry_type": None, "via_device_id": None, "area_id": None, "name_by_user": None, @@ -60,6 +62,7 @@ async def test_list_devices(hass, client, registry): "model": "model", "name": None, "sw_version": None, + "entry_type": "service", "via_device_id": dev1, "area_id": None, "name_by_user": None, diff --git a/tests/helpers/test_device_registry.py b/tests/helpers/test_device_registry.py index 30f991db724..2823ea6ca07 100644 --- a/tests/helpers/test_device_registry.py +++ b/tests/helpers/test_device_registry.py @@ -149,6 +149,7 @@ async def test_loading_from_storage(hass, hass_storage): "model": "model", "name": "name", "sw_version": "version", + "entry_type": "service", "area_id": "12345A", "name_by_user": "Test Friendly Name", } @@ -168,6 +169,7 @@ async def test_loading_from_storage(hass, hass_storage): assert entry.id == "abcdefghijklm" assert entry.area_id == "12345A" assert entry.name_by_user == "Test Friendly Name" + assert entry.entry_type == "service" assert isinstance(entry.config_entries, set) @@ -304,6 +306,9 @@ async def test_loading_saving_data(hass, registry): identifiers={("hue", "0123")}, manufacturer="manufacturer", model="via", + name="Original Name", + sw_version="Orig SW 1", + entry_type="device", ) orig_light = registry.async_get_or_create( @@ -317,6 +322,10 @@ async def test_loading_saving_data(hass, registry): assert len(registry.devices) == 2 + orig_via = registry.async_update_device( + orig_via.id, area_id="mock-area-id", name_by_user="mock-name-by-user" + ) + # Now load written data in new registry registry2 = device_registry.DeviceRegistry(hass) await flush_store(registry._store) diff --git a/tests/helpers/test_entity_platform.py b/tests/helpers/test_entity_platform.py index 3f03dfece11..eb24ea971a7 100644 --- a/tests/helpers/test_entity_platform.py +++ b/tests/helpers/test_entity_platform.py @@ -704,6 +704,7 @@ async def test_device_info_called(hass): "model": "test-model", "name": "test-name", "sw_version": "test-sw", + "entry_type": "service", "via_device": ("hue", "via-id"), }, ), @@ -730,6 +731,7 @@ async def test_device_info_called(hass): assert device.model == "test-model" assert device.name == "test-name" assert device.sw_version == "test-sw" + assert device.entry_type == "service" assert device.via_device_id == via.id