ใน Home API สำหรับ Android คุณสามารถสังเกตการเปลี่ยนแปลงสถานะในบ้านได้โดยใช้
โฟลว์
ใน Kotlin การสังเกตการเปลี่ยนแปลงในโครงสร้าง ห้อง ข้อมูลเมตาของอุปกรณ์ และ
สถานะของอุปกรณ์ใน Home API สามารถทำได้ด้วย API ใดก็ได้ที่สืบทอดมาจาก
HomeObjectsFlow
อินเทอร์เฟซ โดยการ รวบรวม จากโฟลว์
เมื่อมีการเพิ่ม ลบ หรือแก้ไขรายการใดก็ตามในคอลเล็กชัน ระบบจะแสดงสแนปชอตล่าสุดของคอลเล็กชัน
นักพัฒนาแอปต้องอนุมานการเปลี่ยนแปลงที่เฉพาะเจาะจงด้วยการเปรียบเทียบสแนปชอตนี้กับสำเนาที่เก่ากว่า คุณสามารถใช้ช่อง id ที่ระบุไว้สำหรับ ออบเจ็กต์หลักแต่ละ
ประเภทใน Home API เพื่อวัตถุประสงค์นี้
วิธีใช้โฟลว์
ต่อไปนี้เป็นตัวอย่างพื้นฐานของการรวบรวมจากโฟลว์ใน Home API
สำหรับตัวอย่างต่อไปนี้ คุณต้องสร้างอินสแตนซ์ของ Home ก่อนที่จะเข้าถึงคอลเล็กชันในบ้าน
val context = LocalContext.current
val homeManager = Home.getClient(context)
ติดตามการเปลี่ยนแปลงโครงสร้าง
การเปลี่ยนแปลงโครงสร้างต่อไปนี้จะเรียกใช้คอลเล็กชันนี้
homeManager.structures().map { it.firstOrNull() }.collect {
println("Structure ${it.id} updated to ${it}")
}
val structure = homeManager.structures().list().firstOrNull()!!
ติดตามการเปลี่ยนแปลงอุปกรณ์ที่เฉพาะเจาะจง
การเปลี่ยนแปลงอุปกรณ์ต่อไปนี้จะเรียกใช้คอลเล็กชันนี้
- สถานะการเชื่อมต่อ
- ชื่ออุปกรณ์
- การเป็นสมาชิกห้อง
- ชุดลักษณะที่รองรับ ที่
- ชุดประเภทที่รองรับ ประเภท
structure
.devices()
.map { devices -> device.filter { it.name == "Bedroom Lamp" }.single() }
.collect {
println("The bedroom lamp has changed!")
}
val device = structure.devices().list().firstOrNull { it.name == "Bedroom Lamp" }!!
ติดตามการเปลี่ยนแปลงลักษณะที่เฉพาะเจาะจงในอุปกรณ์
ใช้ลักษณะใดก็ได้ที่อุปกรณ์และ Home API รองรับ ดูรายการทั้งหมดได้ที่
Trait
val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()
trait?.collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
ติดตามการเปลี่ยนแปลงประเภทที่เฉพาะเจาะจงในอุปกรณ์
การเปลี่ยนแปลงประเภทอุปกรณ์ต่อไปนี้จะเรียกใช้คอลเล็กชันนี้
ใช้ประเภทอุปกรณ์ Matter ใดก็ได้ที่ Home API รองรับ ดูรายการทั้งหมดได้ที่ DeviceTypeFor
device.type(DimmableLightDevice).collect { type ->
println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}
ติดตามการเปลี่ยนแปลงห้องในโครงสร้าง
การเปลี่ยนแปลงห้องต่อไปนี้จะเรียกใช้คอลเล็กชันนี้
- ชื่อห้อง
- การเป็นสมาชิกโครงสร้าง
หากต้องการติดตามเมื่อมีการเพิ่มหรือนำอุปกรณ์ออกจากห้อง ให้ใช้devices()
โฟลว์
structure.rooms().collect {
println("Got a new updated set of rooms!")
for (room in it) {
println("Got room $room")
}
}
สมัครรับข้อมูลเหตุการณ์
ใน Home API เราใช้เหตุการณ์เพื่อตรวจหาการเปลี่ยนแปลงสถานะของอุปกรณ์
หากต้องการสมัครรับข้อมูลเหตุการณ์ในอุปกรณ์ที่เฉพาะเจาะจง ให้เรียกใช้ฟังก์ชัน `events` ของ `HomeDevice`
HomeDeviceevents
ฟังก์ชัน ซึ่งแต่ละฟังก์ชันจะแสดงผลFlow<Event> ดังนี้
events(event: EventFactory<T>)จะแสดงผลโฟลว์สำหรับเหตุการณ์ประเภทที่เฉพาะเจาะจงval eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)events(trait: TraitFactory<T>)จะแสดงผลโฟลว์ของเหตุการณ์ทั้งหมด ที่ส่งโดยลักษณะval eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)events()จะแสดงผลโฟลว์ของเหตุการณ์ที่พร้อมใช้งานสำหรับออบเจ็กต์val eventflow = homeDevice.type(DoorLockDevice).first().events()
หากต้องการใช้เหตุการณ์จากโฟลว์ ให้ใช้ฟังก์ชัน flow.collect()
eventflow.collect { event ->
if (event != null) {
logger.atInfo().log("Received event %s", event)
// do something
}
}
สมัครรับข้อมูลเหตุการณ์ความสัมพันธ์ของเอนทิตี
คุณสามารถฟังเหตุการณ์ที่ปล่อยออกมาทุกครั้งที่มีการเพิ่ม นำออก หรืออัปเดตเอนทิตี (เช่น โครงสร้าง ห้อง อุปกรณ์ หรือระบบอัตโนมัติ) เหตุการณ์เหล่านี้เป็นอินสแตนซ์ของ
HomeObjectChangeEvent
และมีรหัสของเอนทิตีที่เปลี่ยนแปลง
หากต้องการรับสตรีมที่สร้างเหตุการณ์ที่ต้องการ ให้เรียกใช้
stream() เมธอด
ใน HomeObjectsFlow<T>
ที่สร้างโดยเมธอด Flow ที่เกี่ยวข้อง
| เอนทิตี | อินเทอร์เฟซ | เมธอดโฟลว์ |
|---|---|---|
Structure
|
HasStructures
|
structures()
|
Room
|
HasRooms
|
rooms()
|
HomeDevice
|
HasHomeDevices
|
devices()
|
Automation
|
HasAutomations
|
automations()
|
ตัวอย่างเช่น วิธีจัดการการเปลี่ยนแปลงอุปกรณ์มีดังนี้
val devicesStream = home.devices().stream() // Collect and react to device changes. devicesStream.collect { deviceEvent -> when (deviceEvent) { is HomeObjectAddedEvent -> println("New device now available with id: ${deviceEvent.id}") is HomeObjectUpdatedEvent -> println("Device ${deviceEvent.id} has been updated") is HomeObjectRemovedEvent -> println("Device is removed from your account") else -> {} } }