Bazı Matter cihazlar, aynı cihaz türüne sahip birden fazla uç noktadan oluşur. Diğer Matter cihazlar hiyerarşiktir ve uç noktalar diğer uç noktaların içine yerleştirilmiştir. Home API'lerinde her iki cihaz türü de çok parçalı cihazlar olarak adlandırılır.
Düz gösterim
Home API'lerinin 1.8 sürümünden önce, çok parçalı cihazlar Home API'leri tarafından ayrı ve ilişkisiz bir cihaz grubu olarak temsil ediliyordu. Bu, düz gösterim olarak adlandırılır.
Örneğin, dört anahtarlı tek bir duvar paneli cihazı, Home API'lerinde dört ayrı ve ilişkisiz cihaz olarak görünür. Ayrıca, buzdolabı gibi hiyerarşik bir Matter cihaz, Home API'lerinde her biri uç noktalardan birine karşılık gelen bir cihaz grubu olarak temsil edilebilir.
4 anahtarlı bir duvar panelinin düz temsili.
Buzdolabının düz gösterimi
Çok parçalı gösterim
Home API'lerinin 1.8 sürümünden itibaren, çok parçalı bir cihaz API'de tek bir cihaz olarak temsil edilebilir. Bu davranışı etkinleştirmek için devices() yöntemini Structure, Room veya HomeManager üzerinde çağırın ve enableMultipartDevices parametresini true olarak ayarlayın:
var multipartDevice = structure.devices(enableMultipartDevices = multipartEnabled) var multipartDevice = multipartDevices.list().filter{ device -> device.has(PowerStrip)}
Aşağıdaki şemalarda, enableMultipartDevices seçeneğinin çok parçalı bir cihazın Home API'lerinde nasıl gösterildiği açıklanmaktadır:
Duvar panelinin çok parçalı temsili.
Buzdolabının çok parçalı temsili.
enableMultipartDevices parametresini atlayarak veya false olarak ayarlayarak her zaman düz gösterimi elde edebilirsiniz.
Çok parçalı bir cihazda gezinme
Çok parçalı bir cihazda, bir cihaz türünün her bileşen örneğine parça adı verilir.
Parçalara doğrudan üst cihazdan veya cihaz türleri ya da Matter semantik etiketleri kullanılarak hiyerarşik bir şekilde erişilebilir. Anlamsal etiketler, Home API'lerinde DescriptorTrait.SemanticTagStruct ile uygulanır.
DeviceType soyut sınıfı, HasParts arayüzünü uygular. Bu sayede geliştiriciler, parts özelliği ve part() yöntemi aracılığıyla cihaz ağacında gezinebilir. Her bir parça örneği, HasParts arayüzünü de uygular. Böylece bir parçada parts() çağrıldığında sıfır veya daha fazla alt parçanın listesi oluşturulur.
Aşağıdaki örnekte, çok anahtarlı cihazın parçalarına nasıl erişileceği gösterilmektedir:
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()
Sonraki örnekte, bir buzdolabı cihazının parçalarına nasıl erişileceği gösterilmektedir:
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()