Certains appareils Matter sont composés de plusieurs points de terminaison du même type d'appareil. Les autres appareils Matter sont hiérarchiques, avec des points de terminaison imbriqués dans d'autres points de terminaison. Dans les API Home, ces deux types d'appareils sont appelés appareils multiparties.
Représentation plate
Avant la version 1.8 des API Home, les appareils multiparts sont représentés par les API Home comme un ensemble d'appareils distincts et non liés. C'est ce qu'on appelle la représentation plate.
Par exemple, un seul panneau mural doté de quatre interrupteurs apparaît dans les API Home comme quatre appareils distincts et non liés. Un appareil Matter hiérarchique, tel qu'un réfrigérateur, peut être représenté dans les API Home comme un ensemble d'appareils, chacun correspondant à l'un des points de terminaison.
Représentation à plat d'un panneau mural à quatre interrupteurs.
Représentation en 2D d'un réfrigérateur
Représentation multipartite
À partir de la version 1.8 des API Home, un appareil multipartie peut être représenté dans l'API comme un seul appareil. Pour activer ce comportement, appelez la méthode devices() sur Structure, Room ou HomeManager, puis définissez le paramètre enableMultipartDevices sur true :
var multipartDevice = structure.devices(enableMultipartDevices = multipartEnabled) var multipartDevice = multipartDevices.list().filter{ device -> device.has(PowerStrip)}
Les schémas suivants illustrent l'impact de l'option enableMultipartDevices sur la représentation d'un appareil multipartie dans les API Home :
Représentation en plusieurs parties d'un panneau mural.
Représentation multipart d'un réfrigérateur.
Vous pouvez toujours obtenir la représentation plate en omettant le paramètre enableMultipartDevices ou en le définissant sur false.
Naviguer sur un appareil en plusieurs parties
Dans un appareil multipartie, chaque instance de composant d'un type d'appareil est appelée partie.
Les composants sont accessibles directement sur l'appareil parent ou sur un composant de manière hiérarchique, à l'aide de types d'appareils ou de tags sémantiques Matter. Les tags sémantiques sont implémentés dans les API Home avec DescriptorTrait.SemanticTagStruct.
La classe abstraite DeviceType implémente l'interface HasParts, ce qui permet aux développeurs de parcourir l'arborescence de périphériques via la propriété parts et la méthode part(). Chaque instance de partie implémente également l'interface HasParts, de sorte que l'appel de parts() sur une partie produit une liste de zéro ou plusieurs sous-parties.
L'exemple suivant montre comment accéder aux parties de l'appareil à plusieurs contacteurs :
val device = homeManager .devices(enableMultipartDevices = true) .itemFlow(Id(MULTI_SWITCH_DEVICE)) .first() // Here at top-level, we are using the homeDevice.parts() API to access flow of // all the switches. Then we get the part ids. val partIds = device .parts() .map { parts -> parts.filter { it.has(Switch) }.mapNotNull { it.metadata.partId } } .first() .toSet()
L'exemple suivant montre comment accéder aux parties d'un réfrigérateur :
val rootDevice = homeManager.devices(true).itemFlow(Id("device@uuid1")) // On the top level, HomeDevice provides both plural (parts) // and singular (part) APIs. // The parts() API returns all the parts accessible from the top level, // including Endpoint 0 and its children. val childParts = rootDevice.parts().first() // childParts contain (EP0 as RootNode, EP1 as Refrigerator) // The singular part() API accepts DeviceType and tags (optional). val refrigerator = rootDevice.part(Refrigerator).first() // Get the refrigerator device which in this case is just device@uuid1 val refrigeratorDevice = homeManager.devices(false).itemFlow(refrigerator.metadata.partId.deviceId) // DeviceType uses a synchronous API for providing access to parts val cabinets = refrigerator.parts // [EP2, EP3] // Get the HomeDevice for these cabinets (device@uuid2 and device@uuid3) val cabinetDeviceIds = cabinets.map { it.metadata.partId } // Now use the devices API with enableMultipartDevices = false. val cabinetDevices = homeManager.devices(false) .map { devices -> devices.filter { it.id in cabinetDeviceIds } }.first()