Многокомпонентные устройства на iOS

Некоторые устройства Matter состоят из нескольких конечных точек одного типа. Другие устройства Matter имеют иерархическую структуру, в которой конечные точки вложены в другие конечные точки. В Home API оба типа устройств называются составными.

Плоское представление

До выпуска 1.8 Home API составные устройства представлялись в Home API как набор отдельных, не связанных между собой устройств. Это называется плоским представлением.

Например, одно устройство настенной панели с четырьмя переключателями отображается в Home API как четыре отдельных и несвязанных устройства. А иерархическое Matter устройство, например холодильник, может быть представлено в Home API как набор устройств, каждое из которых соответствует одной из конечных точек.

  • Пример настенной панели с несколькими переключателями, показывающий нативное представление Matter и плоское представление Home API

    Плоское изображение настенной панели с четырьмя переключателями.

  • Пример с холодильником, показывающий нативное представление Matter и плоское представление Home API

    Плоское изображение холодильника

Рисунок 1. Примеры плоского рендеринга.

Составное представление

Начиная с версии 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:

  • Пример настенной панели с несколькими переключателями, показывающий нативное представление Matter и составной рендеринг Home API.

    Составное представление настенной панели.

  • Пример холодильника, показывающий собственное представление Matter и составной рендеринг Home API.

    Составное представление холодильника.

Рисунок 2. Примеры отрисовки составных креативов

Вы всегда можете получить плоское представление, опустив параметр 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)
}