一部の Matter デバイスは、同じデバイス タイプの複数のエンドポイントで構成されています。他の Matter デバイスは階層構造になっており、エンドポイントが他のエンドポイント内にネストされています。Home API では、どちらの種類のデバイスもマルチパート デバイスと呼ばれます。
フラットな表現
Home API のリリース 1.8 より前は、マルチパート デバイスは Home API によって、別々の関連性のないデバイスのセットとして表されます。これはフラット表現と呼ばれます。
たとえば、4 つのスイッチを備えた 1 つの壁パネル デバイスは、Google Home API では 4 つの個別のデバイスとして表示されます。冷蔵庫などの階層型 Matter デバイスは、Home API でデバイスのセットとして表されることがあります。各デバイスはエンドポイントの 1 つに対応します。
4 スイッチの壁パネルの平面図。
冷蔵庫のフラットな表現
マルチパート表現
Home API のリリース 1.8 以降では、マルチパート デバイスを API で 1 つのデバイスとして表すことができます。この動作を有効にするには、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 でのマルチパート デバイスの表現にどのように影響するかを示しています。
壁パネルのマルチパート表現。
冷蔵庫のマルチパート表現。
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) }