Dispositivos multipartes en iOS

Algunos Matter dispositivos se componen de varios extremos con el mismo tipo de dispositivo. Otros dispositivos Matter son jerárquicos, con extremos anidados dentro de otros extremos. En las APIs de Home, ambos tipos de dispositivos se conocen como dispositivos de varias partes.

Representación plana

Antes de la versión 1.8 de las APIs de Home, los dispositivos de varias partes se representaban en las APIs de Home como un conjunto de dispositivos separados y no relacionados. Esto se conoce como la representación plana.

Por ejemplo, un solo dispositivo de panel de pared con cuatro interruptores aparece en las APIs de Home como cuatro dispositivos distintos y no relacionados. Además, un dispositivo jerárquico Matter como un refrigerador se puede representar en las APIs de Home como un conjunto de dispositivos, cada uno correspondiente a uno de los extremos.

  • Ejemplo de panel de pared con varios interruptores que muestra la representación nativa de Matter y la renderización plana de la API de Home

    Representación plana de un panel de pared de 4 interruptores.

  • Ejemplo de refrigerador que muestra la representación nativa de Matter y la renderización plana de la API de Home

    Representación plana de un refrigerador

Figura 1: Ejemplos de renderización plana

Representación de varias partes

A partir de la versión 1.8 de las APIs de Home, un dispositivo de varias partes se puede representar en la API como un solo dispositivo. Para habilitar este comportamiento, llama al devices() método en la Home instancia y establece el enableMultipartDevices parámetro en 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)

En los siguientes diagramas, se ilustra cómo la opción enableMultipartDevices afecta la representación de un dispositivo de varias partes en las APIs de Home:

  • Ejemplo de panel de pared con varios interruptores que muestra la representación nativa de Matter y la renderización de varias partes de la API de Home

    Representación de varias partes de un panel de pared.

  • Ejemplo de refrigerador que muestra la representación nativa de Matter y la renderización multiparte de la API de Home

    Representación de varias partes de un refrigerador.

Figura 2: Ejemplos de renderización de varias partes

Siempre tienes la opción de obtener la representación plana omitiendo el parámetro enableMultipartDevices o configurándolo como false.

Dentro de un dispositivo de varias partes, cada instancia de componente de un tipo de dispositivo se denomina parte.

Se puede acceder a las partes directamente en el dispositivo superior o en una parte de forma jerárquica, usando tipos de dispositivos o Matter semánticas etiquetas. Las etiquetas semánticas se implementan en las APIs de Home con SemanticTag.

La DeviceType clase permite a los desarrolladores recorrer el árbol de dispositivos a través del parts() método:

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)
}

En el siguiente ejemplo, se muestra cómo acceder a las partes de un dispositivo de refrigerador:

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)
}