设备注册表
Device registry 是 Home Assistant 用于跟踪设备的注册表。一个设备在 Home Assistant 中通过一个或多个 entity 来表示。例如,一个电池供电的温度和湿度传感器可能会暴露温度、湿度和电池电量的 entity。

什么是设备?
Home Assistant 中的设备代表一个拥有独立控制单元的物理设备,或者一项服务。控制单元本身不需要是智能的,但它应该掌控所发生的事情。例如,一个带有 4 个房间传感器的 Ecobee 温控器在 Home Assistant 中等于 5 个设备,其中一个是包含其内部所有传感器的温控器,另一个对应每个房间传感器。
如果你将一个传感器连接到另一个设备来读取它的一些数据,它仍然应该被表示为两个不同的设备。这样做的原因是,传感器可能被移动去读取另一个设备的数据。
一个提供多个 endpoint 的设备,可以被拆分为单独的设备,并通过 via_device 属性指向父设备。这样可以将不同的 endpoint 分配给建筑物中不同的 area,也便于对 entity 进行逻辑分组。典型的需要拆分为父设备和多个子设备的例子包括智能排插或多路墙壁开关。父设备将拥有表示排插或多路开关状态的 entity,例如网络连接状态和固件更新。子设备则将绑定到某一个通道的 entity 进行分组,例如每个通道一个开关 entity 和能耗 sensor。
虽然目前尚未可用,但我们可以考虑为用户提供合并设备的选项。
Device 属性
定义设备
通过 entity 自动注册
仅当 entity 通过 config entry 加载且定义了 unique_id 属性时,才会读取 entity 的 device info。
每个 entity 都能够通过 device_info 属性来定义一个设备。当 entity 通过 config entry 添加到 Home Assistant 时,会读取该属性。设备会通过提供的 identifiers 或 connections(如序列号或 MAC 地址)与现有设备进行匹配。如果同时提供了 identifiers 和 connections,device registry 会先尝试通过 identifiers 进行匹配。每个 identifier 和每个 connection 都会被单独匹配(例如,只需要匹配一个 connection 就会被视为同一个设备)。
除了 device 属性之外,device_info 还可以包含 default_manufacturer、default_model、default_name。如果尚未定义其他值,这些值将被添加到 device registry 中。对于了解一些信息但不够具体的集成,这非常有用。例如,一个根据 MAC 地址识别设备的路由器。
手动注册
当没有实体代表某些设备时,component 也能够注册设备。例如,一个与灯具通信的 hub。
删除设备
集成可以选择允许用户从 UI 中删除设备。为此,集成应在其 __init__.py 模块中实现函数 async_remove_config_entry_device。
当用户点击设备的删除按钮并确认时,会等待 async_remove_config_entry_device 执行,如果返回 True,config entry 将从该设备中移除。如果它是该设备唯一的 config entry,设备将从 device registry 中删除。
在 async_remove_config_entry_device 中,集成应采取必要的步骤为设备移除做准备,并在成功时返回 True。集成也可以根据 EVENT_DEVICE_REGISTRY_UPDATED 进行操作(如果这比在 async_remove_config_entry_device 中清理更方便的话)。

