Некоторые устройства Matter состоят из нескольких конечных точек одного типа. Другие устройства Matter имеют иерархическую структуру, в которой конечные точки вложены в другие конечные точки. В Home API оба типа устройств называются составными.
Плоское представление
До выпуска 1.8 Home API составные устройства представлялись в Home API как набор отдельных, не связанных между собой устройств. Это называется плоским представлением.
Например, одно устройство настенной панели с четырьмя переключателями отображается в Home API как четыре отдельных и несвязанных устройства. А иерархическое Matter устройство, например холодильник, может быть представлено в Home API как набор устройств, каждое из которых соответствует одной из конечных точек.
Плоское изображение настенной панели с четырьмя переключателями.
Плоское изображение холодильника
Составное представление
Начиная с версии 1.8 Home API, составное устройство может быть представлено в API как одно устройство. Чтобы включить эту функцию, вызовите метод devices() для экземпляра Home и задайте для параметра 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) }