Einige Matter-Geräte bestehen aus mehreren Endpunkten desselben Gerätetyps. Andere Matter-Geräte sind hierarchisch, wobei Endpunkte in anderen Endpunkten verschachtelt sind. In den Home APIs werden beide Arten von Geräten als mehrteilige Geräte bezeichnet.
Flache Darstellung
Vor Version 1.8 der Home APIs werden mehrteilige Geräte von den Home APIs als eine Reihe separater, nicht zusammenhängender Geräte dargestellt. Dies wird als flache Darstellung bezeichnet.
Ein einzelnes Wandpanel mit vier Schaltern wird in den Home APIs beispielsweise als vier separate und voneinander unabhängige Geräte angezeigt. Ein hierarchisches Matter-Gerät wie ein Kühlschrank kann in den Home APIs als eine Reihe von Geräten dargestellt werden, die jeweils einem der Endpunkte entsprechen.
Flache Darstellung einer Wandhalterung mit 4 Schaltern.
Flache Darstellung eines Kühlschranks
Mehrteilige Darstellung
Ab Version 1.8 der Home APIs kann ein mehrteiliges Gerät in der API als einzelnes Gerät dargestellt werden. Wenn Sie dieses Verhalten aktivieren möchten, rufen Sie die Methode devices() für Structure, Room oder HomeManager auf und setzen Sie den Parameter enableMultipartDevices auf true:
var multipartDevice = structure.devices(enableMultipartDevices = multipartEnabled) var multipartDevice = multipartDevices.list().filter{ device -> device.has(PowerStrip)}
Die folgenden Diagramme veranschaulichen, wie sich die Option enableMultipartDevices auf die Darstellung eines mehrteiligen Geräts in den Home APIs auswirkt:
Mehrteilige Darstellung eines Wandpaneels.
Mehrteilige Darstellung eines Kühlschranks.
Sie können die flache Darstellung jederzeit abrufen, indem Sie entweder den Parameter enableMultipartDevices weglassen oder ihn auf false setzen.
Mehrteiliges Gerät bedienen
In einem mehrteiligen Gerät wird jede Komponenteninstanz eines Gerätetyps als Teil bezeichnet.
Auf Teile kann entweder direkt über das übergeordnete Gerät oder über ein Teil hierarchisch zugegriffen werden, wobei Gerätetypen oder semantische Matter-Tags verwendet werden. Semantische Tags werden in den Home APIs mit DescriptorTrait.SemanticTagStruct implementiert.
Die abstrakte Klasse DeviceType implementiert die Schnittstelle HasParts, sodass Entwickler über die Property parts und die Methode part() im Gerätebaum navigieren können. Jede Teilinstanz implementiert auch die Schnittstelle HasParts, sodass der Aufruf von parts() für einen Teil eine Liste mit null oder mehr Unterteilen erzeugt.
Das folgende Beispiel zeigt, wie Sie auf die Teile des Geräts mit mehreren Schaltern zugreifen:
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()
Das nächste Beispiel zeigt, wie auf die Teile eines Kühlschranks zugegriffen wird:
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()