Trong Home API cho Android, bạn có thể quan sát các thay đổi về trạng thái trong nhà bằng cách 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ừ giao diện HomeObjectsFlow. Bạn có thể thực hiện việc này bằng cách
thu thập từ luồng.
Khi bất kỳ mục nào trong một tập hợp được thêm, xoá hoặc sửa đổi, ảnh chụp nhanh mới nhất của tập hợp đó sẽ được trả về.
Nhà phát triển có thể suy ra 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ể dùng trường id được cung cấp cho mỗi loại đối tượng mẹ trong Home API cho mục đích này.
Cách sử dụng quy trình
Sau đây là một số ví dụ cơ bản về việc thu thập từ các 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 tập hợ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
Những thay đổi sau đây đối với một cấu trúc sẽ kích hoạt tập hợp này:
- Tên nhà
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ể
Những thay đổi sau đây đối với thiết bị sẽ kích hoạt hoạt động thu thập này:
- Trạng thái kết nối
- Tên thiết bị
- Thành viên của phòng
- Tập hợp các đặc điểm được hỗ trợ
- Tập hợp các loại được hỗ trợ
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 đặc điểm cụ thể trên thiết bị
Sử dụng bất kỳ đặc điểm 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 thiết bị
Những thay đổi sau đây đối với loại thiết bị sẽ kích hoạt việc thu thập dữ liệu này:
- Thay đổi đối với bất kỳ đặc điểm nào trong loại thiết bị được tạo
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ông trình
Những thay đổi sau đây đối với phòng sẽ kích hoạt bộ sưu tập này:
Để theo dõi thời điểm thiết bị được thêm hoặc xoá khỏi phòng, hãy sử dụng quy trình devices().
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 những 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 phương thức HomeDevice.events, 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 gồm tất cả sự kiện do một đặc điểm 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 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ệ giữa các 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ư một công trình, 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ã nhận dạng 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 Flow |
|---|---|---|
Structure
|
HasStructures
|
structures()
|
Room
|
HasRooms
|
rooms()
|
HomeDevice
|
HasHomeDevices
|
devices()
|
Automation
|
HasAutomations
|
automations()
|
Ví dụ: dưới đâ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 -> {} } }