iOS のマルチパート デバイス

一部の Matter デバイスは、同じデバイスタイプを持つ複数のエンドポイントで構成されています。他の Matter デバイスは階層構造になっており、エンドポイントが他のエンドポイント内にネストされています。Home API では、どちらの種類のデバイスもマルチパート デバイスと呼ばれます。

フラット表現

Home API のリリース 1.8 より前では、マルチパート デバイスは、関連性のない個別のデバイスのセットとして Home API で表されます。これはフラット表現と呼ばれます。

たとえば、4 つのスイッチを備えた 1 つの壁パネル デバイスは、Home API では 4 つの異なる無関係なデバイスとして表示されます。また、冷蔵庫などの階層型 Matter デバイスは、Home API ではデバイスのセットとして表され、それぞれがエンドポイントの 1 つに対応します。

  • 複数のスイッチを備えた壁パネルの例。ネイティブの Matter 表現と Home API のフラット レンダリングを示しています。

    4 スイッチの壁パネルの平面図。

  • ネイティブの Matter 表現と Home API のフラット レンダリングを示す冷蔵庫の例

    冷蔵庫の平面図

図 1: フラット レンダリングの例

マルチパート表現

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 でのマルチパート デバイスの表現にどのように影響するかを示しています。

  • 複数のスイッチを備えた壁パネルの例。ネイティブの 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)
}