Trong Home API dành cho Android, bạn có thể quan sát các thay đổi về trạng thái trong nhà thông qua việc sử dụng
luồng
trong Kotlin. Bạn có thể quan sát các thay đổi về cấu trúc, phòng, siêu dữ liệu thiết bị và
trạng thái thiết bị trong Home API bằng bất kỳ API nào kế thừa từ
HomeObjectsFlow
giao diện. Việc này được thực hiện bằng cách thu thập dữ liệu từ luồng.
Khi bất kỳ mục nào trong một bộ sưu tập được thêm, xoá hoặc sửa đổi, ảnh chụp nhanh mới nhất của bộ sưu tập sẽ được trả về.
Nhà phát triển có trách nhiệm suy luận các thay đổi cụ thể bằng cách so sánh ảnh chụp nhanh này với một bản sao cũ hơn. Bạn có thể sử dụng trường id được cung cấp cho từng loại đối tượng mẹ
trong Home API cho mục đích này.
Cách sử dụng luồng
Sau đây là một số ví dụ cơ bản về việc thu thập dữ liệu từ luồng trong Home API.
Đối với các ví dụ sau, bạn phải tạo một thực thể của Home trước khi truy cập vào các bộ sưu tập trong nhà:
val context = LocalContext.current
val homeManager = Home.getClient(context)
Theo dõi các thay đổi đối với một cấu trúc
Các thay đổi sau đây đối với một cấu trúc sẽ kích hoạt bộ sưu tập này:
homeManager.structures().map { it.firstOrNull() }.collect {
println("Structure ${it.id} updated to ${it}")
}
val structure = homeManager.structures().list().firstOrNull()!!
Theo dõi các thay đổi đối với một thiết bị cụ thể
Các thay đổi sau đây đối với một thiết bị sẽ kích hoạt bộ sưu tập này:
- Trạng thái kết nối
- Tên thiết bị
- Tư cách thành viên phòng
- Tập hợp các trait được hỗ trợ
- Tập hợp các loại được hỗ trợ types
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" }!!
Theo dõi các thay đổi đối với một trait cụ thể trên một thiết bị
Sử dụng bất kỳ trait nào được thiết bị và Home API hỗ trợ. Để xem danh sách đầy đủ, hãy xem
Trait.
val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()
trait?.collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
Theo dõi các thay đổi đối với một loại cụ thể trên một thiết bị
Các thay đổi sau đây đối với một loại thiết bị sẽ kích hoạt bộ sưu tập này:
Sử dụng bất kỳ loại thiết bị Matter nào được Home API hỗ trợ. Để xem danh sách đầy đủ, hãy xem DeviceType.
device.type(DimmableLightDevice).collect { type ->
println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}
Theo dõi các thay đổi đối với một phòng trong một cấu trúc
Các thay đổi sau đây đối với một phòng sẽ kích hoạt bộ sưu tập này:
- Tên phòng
- Tư cách thành viên cấu trúc
Để theo dõi thời điểm thiết bị được thêm hoặc xoá khỏi một phòng, hãy sử dụng devices()
luồng.
structure.rooms().collect {
println("Got a new updated set of rooms!")
for (room in it) {
println("Got room $room")
}
}
Đăng ký nhận sự kiện
Trong Home API, các sự kiện được dùng để phát hiện các thay đổi về trạng thái của một thiết bị.
Để đăng ký nhận sự kiện trên một thiết bị cụ thể, hãy gọi một trong ba
HomeDevice.events
hàm, mỗi hàm trả về mộtFlow<Event>:
events(event: EventFactory<T>)trả về một luồng cho một loại sự kiện cụ thể:val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)events(trait: TraitFactory<T>)trả về một luồng của tất cả các sự kiện do một trait gửi:val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)events()trả về một luồng sự kiện có sẵn cho đối tượng:val eventflow = homeDevice.type(DoorLockDevice).first().events()
Để sử dụng các sự kiện từ một luồng, hãy sử dụng hàm flow.collect():
eventflow.collect { event ->
if (event != null) {
logger.atInfo().log("Received event %s", event)
// do something
}
}
Đăng ký nhận sự kiện về mối quan hệ thực thể
Bạn có thể theo dõi các sự kiện được phát ra mỗi khi một thực thể (chẳng hạn như cấu trúc, phòng, thiết bị hoặc quy trình tự động hoá) được thêm, xoá hoặc cập nhật. Các
sự kiện này là thực thể của
HomeObjectChangeEvent
và mang mã của thực thể đã thay đổi.
Để có được một luồng tạo ra các sự kiện bạn muốn, hãy gọi phương thức
stream() trên HomeObjectsFlow<T>
do phương thức Flow tương ứng tạo ra:
| Thực thể | Giao diện | Phương thức luồng |
|---|---|---|
Structure
|
HasStructures
|
structures()
|
Room
|
HasRooms
|
rooms()
|
HomeDevice
|
HasHomeDevices
|
devices()
|
Automation
|
HasAutomations
|
automations()
|
Ví dụ: sau đây là cách bạn có thể xử lý các thay đổi đối với thiết bị:
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 -> {} } }