iOS의 멀티파트 기기

일부 Matter 기기는 기기 유형이 동일한 여러 엔드포인트로 구성됩니다. 다른 Matter 기기는 계층적이며 엔드포인트가 다른 엔드포인트 내에 중첩되어 있습니다. Home API에서 두 종류의 기기 모두 멀티파트 기기라고 합니다.

플랫 표현

Home API 1.8 이전에는 멀티파트 기기가 Home API에 별도의 관련 없는 기기 집합으로 표시됩니다. 이를 플랫 표현이라고 합니다.

예를 들어 스위치가 4개 있는 단일 벽면 패널 기기는 Home API에 서로 관련이 없는 4개의 개별 기기로 표시됩니다. 냉장고와 같은 계층적 Matter 기기는 각 엔드포인트에 해당하는 기기 집합으로 Home API에 표시될 수 있습니다.

  • 기본 Matter 표현과 Home API의 플랫 렌더링을 보여주는 여러 스위치가 있는 벽면 패널 예시

    4스위치 벽면 패널의 평면 표현

  • 네이티브 Matter 표현과 Home API의 플랫 렌더링을 보여주는 냉장고 예

    냉장고의 평면 표현

그림 1: 평면 렌더링 예

멀티파트 표현

Home API 1.8 버전부터 멀티파트 기기를 API에서 단일 기기로 나타낼 수 있습니다. 이 동작을 사용 설정하려면 Home 인스턴스에서 devices() 메서드를 호출하고 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에서 멀티파트 기기의 표현에 미치는 영향을 보여줍니다.

  • 기본 Matter 표현과 Home API의 멀티파트 렌더링을 보여주는 스위치가 여러 개인 벽면 패널의 예

    벽 패널의 멀티파트 표현입니다.

  • 네이티브 Matter 표현과 Home API의 멀티파트 렌더링을 보여주는 냉장고 예시

    냉장고의 멀티파트 표현입니다.

그림 2: 멀티파트 렌더링 예시

enableMultipartDevices 매개변수를 생략하거나 false으로 설정하여 항상 플랫 표현을 가져올 수 있습니다.

멀티파트 기기 내에서 기기 유형의 각 구성요소 인스턴스를 파트라고 합니다.

기기 유형이나 Matter 시맨틱 태그를 사용하여 상위 기기에서 직접 또는 계층적 방식으로 파트에 액세스할 수 있습니다. 시맨틱 태그는 SemanticTag를 사용하여 Home API에 구현됩니다.

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)
}