某些 Matter 设备由多个具有 相同设备类型的端点组成。其他 Matter 设备采用 分层结构,端点嵌套在其他端点内。在 Home API 中,这两种设备都称为“多部分设备” 。
平面表示法
在 Home API 1.8 版发布之前,多部分设备在 Home API 中表示为一组单独且不相关的设备。这称为“平面” 表示法。
例如,一个带有四个开关的单个墙板设备在 Home API 中显示为四个不同的且不相关的设备。而冰箱等分层 Matter设备在 Home API 中可能会表示为一组设备,每个设备对应一个端点。
4 开关墙板的平面表示法。
冰箱的平面表示法
多部分表示法
从 Home API 1.8 版开始,多部分设备可以在 API 中表示为单个设备。如需启用此行为,请对
devices()实例调用
Home
方法,并将enableMultipartDevices参数设置为true:
let devices = try await self.home.devices(enableMultipartDevices: true).list() let device = devices.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) }