一部の Matter デバイスは、同じデバイスタイプの複数のエンドポイントで構成されています。他の Matter デバイスは 階層構造になっており、エンドポイントが他のエンドポイント内にネストされています。スマートホーム API では、どちらの種類のデバイスも マルチパート デバイスと呼ばれます。
フラット表現
スマートホーム API のリリース 1.8 より前は、マルチパート デバイスはスマートホーム API によって、別個の関連性のないデバイスのセットとして表現されます。これはフラット表現と呼ばれます。
たとえば、4 つのスイッチを備えた 1 つのウォールパネル デバイスは、スマートホーム API では 4 つの別個の関連性のないデバイスとして表示されます。冷蔵庫などの階層型 Matterデバイスは、 スマートホーム API では、エンドポイントの 1 つに対応するデバイスのセットとして表現されることがあります。
4 スイッチ ウォールパネルのフラット表現。
冷蔵庫のフラット表現
マルチパート表現
スマートホーム API のリリース 1.8 以降では、マルチパート デバイスを API 内で 1
つのデバイスとして表現できます。この動作を有効にするには、
devices() メソッドを
Home
インスタンスで呼び出し、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 オプションがスマートホーム API でのマルチパート
デバイスの表現にどのように影響するかを示しています。
ウォールパネルのマルチパート表現。
冷蔵庫のマルチパート表現。
enableMultipartDevices パラメータを省略するか、false に設定することで、常にフラット表現を取得できます。
マルチパート デバイスを操作する
マルチパート デバイス内では、デバイスタイプの各コンポーネント インスタンスはパーツと呼ばれます。
パーツには、デバイスタイプまたは Matter セマンティック
タグを使用して、親デバイスまたはパーツに
階層的に直接アクセスできます。セマンティックタグは、スマートホーム 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) }