Dispositivi multiparte su iOS

Alcuni dispositivi Matter sono costituiti da più endpoint con lo stesso tipo di dispositivo. Altri dispositivi Matter sono gerarchici, con endpoint nidificati all'interno di altri endpoint. Nelle API Home, entrambi i tipi di dispositivi sono definiti dispositivi multiparte.

Rappresentazione piatta

Prima della release 1.8 delle API Home, i dispositivi multiparte sono rappresentati dalle API Home come un insieme di dispositivi separati e non correlati. Questa è la rappresentazione piatta.

Ad esempio, un singolo dispositivo con pannello a parete con quattro interruttori viene visualizzato nelle API Home come quattro dispositivi distinti e non correlati. Un dispositivo Matter gerarchico, come un frigorifero, può essere rappresentato nelle API Home come un insieme di dispositivi, ciascuno corrispondente a uno degli endpoint.

  • Esempio di pannello a parete con più interruttori che mostra la rappresentazione nativa di Matter e il rendering piatto dell'API Home

    Rappresentazione piatta di un pannello a parete con 4 interruttori.

  • Esempio di frigorifero che mostra la rappresentazione nativa di Matter e il rendering piatto dell'API Home

    Rappresentazione piatta di un frigorifero

Figura 1: esempi di rendering piatto

Rappresentazione multiparte

A partire dalla versione 1.8 delle API Home, un dispositivo multiparte può essere rappresentato nell'API come un singolo dispositivo. Per attivare questo comportamento, chiama il metodo devices() nell'istanza Home e imposta il parametro enableMultipartDevices su 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)

I seguenti diagrammi illustrano in che modo l'opzione enableMultipartDevices influisce sulla rappresentazione di un dispositivo multiparte nelle API Home:

  • Esempio di pannello a parete con più interruttori che mostra la rappresentazione Matter nativa e il rendering in più parti dell'API Home

    Rappresentazione in più parti di un pannello a parete.

  • Esempio di frigorifero che mostra la rappresentazione nativa di Matter e il rendering multiparte dell'API Home

    Rappresentazione multiparte di un frigorifero.

Figura 2: esempi di rendering di più parti

Hai sempre la possibilità di ottenere la rappresentazione piatta omettendo il parametro enableMultipartDevices o impostandolo su false.

All'interno di un dispositivo multiparte, ogni istanza di componente di un tipo di dispositivo è chiamata parte.

È possibile accedere alle parti direttamente sul dispositivo principale o su una parte in modo gerarchico, utilizzando i tipi di dispositivi o i tag semantici Matter. I tag semantici sono implementati nelle API Home con SemanticTag.

La classe DeviceType consente agli sviluppatori di attraversare il Device Tree tramite il metodo 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)
}

L'esempio seguente mostra come accedere alle parti di un frigorifero:

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