某些 Matter 设备由具有相同设备类型的多个端点组成。其他 Matter 设备采用分层结构,端点嵌套在其他端点中。在 Home API 中,这两种设备都称为多部分设备。
平面表示
在 Home API 1.8 版之前,Home API 会将多部分设备表示为一组单独、不相关的设备。这称为扁平表示法。
例如,在 Home API 中,一个具有四个开关的墙壁面板设备会显示为四个不同的不相关设备。而分层 Matter 设备(例如冰箱)在 Home API 中可能表示为一组设备,每个设备对应一个端点。
4 开关墙壁面板的平面图。
冰箱的平面图
多部分表示法
从 Home API 1.8 版开始,多部分设备可以在 API 中表示为单个设备。如需启用此行为,请在 Home 实例上调用 devices() 方法,并将 enableMultipartDevices 参数设置为 true:
let multipartDevices = try await self.home.devices(enableMultipartDevices: true).list() let multipartDevice = multipartDevices.first { $0.id == powerStrip.device.id } let outlets = try await device.types.getAll(of: OnOffPluginUnitDeviceType.self)
下图展示了 enableMultipartDevices 选项如何影响 Home API 中多部分设备的表示:
墙板的多部分表示形式。
冰箱的多部分表示形式。
您始终可以选择通过省略 enableMultipartDevices 参数或将其设置为 false 来获取平面表示法。
操作多部分设备
在多部分设备中,设备类型的每个组件实例称为一个部分。
您可以使用设备类型或 Matter 语义标记,直接在父级设备或部件上以分层方式访问部件。语义标记在 Home API 中通过 SemanticTag 实现。
借助 DeviceType 类,开发者可以通过 parts() 方法遍历设备树:
let outlet1 = await device.parts.getAll(of: OnOffPluginUnitDeviceType.self).first { $0.tags.contains(SemanticTag.CommonNumber.one) } let outlet3 = await device.parts.getAll(of: OnOffPluginUnitDeviceType.self).first { $0.tags.contains(SemanticTag.CommonNumber.three) }
以下示例展示了如何访问冰箱设备的部件:
let refrigerator: RefrigeratorDeviceType? = await home.devices(enableMultipartDevices: true).first { $0.id == FRIDGE_ID } // Get different cabinets of the refrigerator let freezer = refrigerator!.parts(type: TemperatureControlledCabinetDeviceType.self).first { $0.tags.contains(SemanticTag.Refrigerator.freezer) }