部分 Matter 裝置是由多個相同類型的端點組成。其他 Matter 裝置則採用階層式結構,端點會以巢狀結構嵌入其他端點。在 Home API 中,這兩種裝置都稱為多部分裝置。
平面表示法
在 Home API 1.8 版之前,Home API 會將多組件裝置視為一組獨立、不相關的裝置。這稱為「平面」表示法。
舉例來說,在 Home API 中,一個具有四個開關的牆面面板裝置會顯示為四個不同且不相關的裝置。而階層式 Matter 裝置 (例如冰箱) 在 Home API 中可能會以一組裝置表示,每個裝置對應一個端點。
4 開關牆面板的平面圖。
冰箱的平面圖
多部分表示法
從 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 中多部分裝置的表示法:
牆板的多部分表示法。
冰箱的多部分表示法。
您隨時可以省略 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) }