Theo dõi trạng thái thiết bị trên Android

Trong API Home cho Android, bạn có thể quan sát các thay đổi về trạng thái trong trang chủ 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 API Home 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ừ flow.

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, bản tổng quan nhanh mới nhất của bộ sưu tậ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ũ. Bạn có thể sử dụng trường id được cung cấp cho mỗi loại đối tượng cấp trên trong API Home cho mục đích này.

Cách sử dụng flow

Sau đây là một số ví dụ cơ bản về việc thu thập từ các luồng trong API Home. Đố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 trang chủ:

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 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 thiết bị sẽ kích hoạt bộ sưu tập này:

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 mà thiết bị và API Home hỗ trợ. Để xem danh sách đầy đủ, hãy xem Trait.

device.trait(OnOff).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ị

Các thay đổi sau đây đối với loại thiết bị sẽ kích hoạt việc thu thập này:

Sử dụng mọi loại thiết bị Matter mà API Home hỗ trợ. Để biết 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

Những thay đổi sau đây đối với một phòng sẽ kích hoạt bộ sưu tập này:

Để theo dõi thời điểm thêm hoặc xoá thiết bị khỏi một phòng, hãy sử dụng luồng devices().

structure.rooms().collect {
  println("Got a new updated set of rooms!")

  for (room in it) {
    println("Got room $room")
  }
}

Đăng ký sự kiện

Trong API Home, các sự kiện được dùng để phát hiện các thay đổi về trạng thái của thiết bị.

Để đăng ký sự kiện trên một thiết bị cụ thể, hãy gọi một trong ba HomeDevice.các hàm events, mỗi hàm trả về mộtFlow<Event>:

  1. events(event: EventFactory<T>) trả về một flow cho một loại sự kiện cụ thể:

    val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
    
  2. events(trait: TraitFactory<T>) trả về một luồng của tất cả sự kiện do một đặc điểm gửi:

    val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
    
  3. 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 flow, 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ý sự kiện liên quan đến 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) được thêm, xoá hoặc cập nhật. Các sự kiện này là các thực thể của HomeObjectChangeEvent và mang mã nhận dạng của thực thể đã thay đổi.

Để thu nạp luồng tạo ra các sự kiện mà 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:

Bảng: Luồng sự kiện
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ụ: 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 -> {}
  }
}