일부 Matter 기기는 기기 유형이 동일한 여러 엔드포인트로 구성됩니다. 다른 Matter 기기는 계층적이며 엔드포인트가 다른 엔드포인트 내에 중첩되어 있습니다. Home API에서는 두 종류의 기기를 모두 다중 부분 기기라고 합니다.
플랫 표현
Home API 버전 1.8 이전에는 Home API에서 다중 부분 기기를 관련 없는 별도의 기기 집합으로 표현했습니다. 이를 플랫 표현이라고 합니다.
예를 들어 스위치가 4개 있는 단일 벽 패널 기기는 Home API에서 관련 없는 4개의 개별 기기로 표시됩니다. 냉장고와 같은 계층적 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) }