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.
Rappresentazione piatta di un pannello a parete con 4 interruttori.
Rappresentazione piatta di un frigorifero
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:
Rappresentazione in più parti di un pannello a parete.
Rappresentazione multiparte di un frigorifero.
Hai sempre la possibilità di ottenere la rappresentazione piatta omettendo il parametro enableMultipartDevices o impostandolo su false.
Naviga su un dispositivo con più parti
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) }