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에서 단일 기기로 표현할 수 있습니다. 이 동작을 사용 설정하려면 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)
}