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

Trong Home API cho Android, việc theo dõi các thay đổi về trạng thái trong nhà được thực hiện 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ừ 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 dữ liệu.

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ể 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 luồng

Sau đây là một số ví dụ cơ bản về việc thu thập dữ liệu 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 bộ sưu tập trên trang chủ:

val context = LocalContext.current
val homeManager = Home.getClient(context)

Theo dõi các thay đổi đối với cấu trúc

Những 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ể

Những thay đổi sau đây đối với một 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 mọi đặc điểm mà 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 một loại thiết bị sẽ kích hoạt bộ sưu tập này:

Sử dụng mọi loại thiết bị Matter mà 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 ngôi nhà

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 thiết bị được thêm hoặc xoá 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ý nhận thông báo về 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 thiết bị.

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

  1. 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)
    
  2. events(trait: TraitFactory<T>) trả về một luồng gồm tất cả cá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 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 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. Những 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.

Để 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:

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 -> {}
  }
}