Add type to device registry ()

pull/35153/head
Paulus Schoutsen 2020-05-03 13:56:58 -07:00 committed by GitHub
parent 6f6c670b3b
commit b90cb09fd1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 42 additions and 13 deletions

View File

@ -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",
}

View File

@ -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,

View File

@ -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,

View File

@ -353,6 +353,7 @@ class EntityPlatform:
"model",
"name",
"sw_version",
"entry_type",
"via_device",
):
if key in device_info:

View File

@ -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,

View File

@ -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)

View File

@ -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