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

Trong API Home, 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. Hãy xem phần Giới thiệu về Flow để biết thêm thông tin về 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

Hãy xem một số ví dụ cơ bản về cách 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 trong 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 flow 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
  }
}