iOS 上的多部分裝置

部分 Matter 裝置是由多個端點組成,且裝置類型相同。其他 Matter 裝置具有階層結構,端點會巢狀內嵌在其他端點中。在 Home API 中,這兩種裝置都稱為「多部分裝置」

平面式表示法

在 1.8 版的 Home API 推出前,Home API 會將多部分裝置視為一組不相關的獨立裝置。這稱為「平面」表示法。

舉例來說,如果單一牆面控制面板裝置有四個開關,在 Home API 中會顯示為四個不同的不相關裝置。冰箱等階層式裝置可能會在 Home API 中以一組裝置表示,每個裝置對應一個端點。Matter

  • 牆面面板,包含多個切換開關,顯示原生 Matter 呈現方式和 Google Home API 的平面算繪

    4 個開關的牆面面板平面圖。

  • 冰箱範例,顯示原生 Matter 表示法和 Home API 的平面算繪

    冰箱的平面圖

圖 1:平面算繪範例

多部分表示法

從 Home API 1.8 版開始,多零件裝置在 API 中可以表示為單一裝置。如要啟用這項行為,請在 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 中多部分裝置的表示方式:

  • 牆面面板,包含多個切換開關示例,顯示原生 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)
}