Некоторые устройства Matter состоят из нескольких конечных точек одного типа. Другие устройства Matter имеют иерархическую структуру, в которой конечные точки вложены в другие конечные точки. В API для умного дома оба типа устройств называются многокомпонентными устройствами.
Плоское представление
До версии 1.8 Home API многокомпонентные устройства представлялись в Home API как набор отдельных, не связанных друг с другом устройств. Такое представление называется плоским.
Например, одна настенная панель с четырьмя переключателями будет представлена в API умного дома как четыре отдельных устройства, не связанных друг с другом. Иерархическое устройство, например холодильник, может быть представлено в API Home как набор устройств, каждое из которых соответствует одной из конечных точек.Matter
Плоское изображение настенной панели с четырьмя переключателями.
Плоское изображение холодильника
Многокомпонентное представление
Начиная с версии 1.8 API Google Home, многокомпонентное устройство может быть представлено в 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. Семантические теги реализованы в 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) }