Beberapa perangkat Matter terdiri dari beberapa endpoint dengan jenis perangkat yang sama. Perangkat Matter lainnya bersifat hierarkis, dengan endpoint yang bertingkat di dalam endpoint lain. Di Home API, kedua jenis perangkat ini disebut sebagai perangkat multibagian.
Representasi datar
Sebelum rilis 1.8 Home API, perangkat multibagian direpresentasikan oleh Home API sebagai kumpulan perangkat terpisah yang tidak terkait. Hal ini disebut sebagai representasi flat.
Misalnya, satu perangkat panel dinding dengan empat sakelar muncul di Home API sebagai empat perangkat yang berbeda dan tidak terkait. Dan perangkat Matter hierarkis seperti kulkas dapat direpresentasikan di Home API sebagai sekumpulan perangkat, yang masing-masing sesuai dengan salah satu endpoint.
Representasi datar panel dinding 4 sakelar.
Representasi datar kulkas
Representasi multibagian
Mulai rilis 1.8 Home API, perangkat multibagian dapat
direpresentasikan di API sebagai satu perangkat. Untuk mengaktifkan perilaku ini, panggil
metode devices() di
Structure, Room, atau HomeManager
dan tetapkan parameter enableMultipartDevices ke true:
var multipartDevice = structure.devices(enableMultipartDevices = multipartEnabled) var multipartDevice = multipartDevices.list().filter{ device -> device.has(PowerStrip)}
Diagram berikut menggambarkan pengaruh opsi enableMultipartDevices
terhadap representasi perangkat multibagian di Home API:
Representasi multibagian dari panel dinding.
Representasi multibagian dari kulkas.
Anda selalu memiliki opsi untuk mendapatkan representasi datar dengan menghilangkan parameter enableMultipartDevices, atau dengan menyetelnya ke false.
Menavigasi perangkat multi-bagian
Dalam perangkat multibagian, setiap instance komponen dari jenis perangkat disebut bagian.
Komponen dapat diakses langsung di perangkat induk atau komponen secara
hierarkis, menggunakan jenis perangkat atau tag semantik
Matter. Tag semantik diterapkan di Home API dengan
DescriptorTrait.SemanticTagStruct.
Class abstrak DeviceType
mengimplementasikan
antarmuka HasParts,
sehingga developer dapat menavigasi hierarki perangkat melalui
properti parts dan
metode
part(). Setiap instance bagian juga mengimplementasikan antarmuka HasParts, sehingga
memanggil parts() pada suatu bagian akan menghasilkan daftar yang berisi nol atau beberapa sub-bagian.
Contoh berikut menunjukkan cara mengakses bagian-bagian perangkat multi-tombol:
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()
Contoh berikutnya menunjukkan cara mengakses bagian-bagian perangkat kulkas:
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()