Android에서 기기 상태 모니터링

Android용 Home API에서 홈의 상태 변경사항을 관찰하는 것은 Kotlin의 흐름을 사용하여 가능합니다. Home API에서 구조, 방, 기기 메타데이터, 기기 상태의 변경사항을 관찰하는 작업은 HomeObjectsFlow 인터페이스에서 상속되는 API를 사용하여 실행할 수 있습니다. 이는 흐름에서 수집하여 수행됩니다.

컬렉션의 항목이 추가, 삭제 또는 수정되면 컬렉션의 최신 스냅샷이 반환됩니다.

이 스냅샷을 이전 사본과 비교하여 구체적인 변경사항을 추론하는 것은 개발자의 몫입니다. Home API의 각 상위 객체 유형에 제공된 id 필드를 이 용도로 사용할 수 있습니다.

흐름 사용 방법

다음은 Home API에서 흐름을 통해 수집하는 기본 예입니다. 다음 예에서는 홈의 컬렉션에 액세스하기 전에 Home 인스턴스를 만들어야 합니다.

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

구조 변경사항 추적

다음과 같은 구조 변경사항이 이 수집을 트리거합니다.

homeManager.structures().map { it.firstOrNull() }.collect {
  println("Structure ${it.id} updated to ${it}")
}

val structure =  homeManager.structures().list().firstOrNull()!!

특정 기기의 변경사항 추적

기기의 다음 변경사항은 이 수집을 트리거합니다.

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" }!!

기기의 특정 특성 변경사항 추적

기기와 Home API에서 지원하는 특성을 사용합니다. 전체 목록은 Trait을 참고하세요.

device.trait(OnOff).collect {
  if (it != null) {
    println("Got new state update! ${it.onOff}")
  }
}

기기에서 특정 유형의 변경사항 추적

기기 유형의 다음 변경사항은 이 수집을 트리거합니다.

Home API에서 지원하는 Matter 기기 유형을 사용합니다. 전체 목록은 DeviceType를 참고하세요.

device.type(DimmableLightDevice).collect { type ->
    println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}

구조의 방 변경사항 추적

다음과 같은 채팅방 변경사항이 이 수집을 트리거합니다.

기기가 방에 추가되거나 방에서 삭제되는 시점을 추적하려면 devices() 흐름을 사용하세요.

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

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

이벤트 구독

Home API에서 이벤트는 기기 상태의 변경사항을 감지하는 데 사용됩니다.

특정 기기의 이벤트를 구독하려면 세 가지 HomeDevice 중 하나를 호출합니다.각각 Flow<Event>를 반환하는 events 함수:

  1. events(event: EventFactory<T>)는 특정 종류의 이벤트에 대한 흐름을 반환합니다.

    val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
    
  2. events(trait: TraitFactory<T>)는 특성에서 전송한 모든 이벤트의 흐름을 반환합니다.

    val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
    
  3. events()는 객체에 사용할 수 있는 이벤트 흐름을 반환합니다.

    val eventflow = homeDevice.type(DoorLockDevice).first().events()
    

흐름에서 이벤트를 사용하려면 flow.collect() 함수를 사용합니다.

eventflow.collect { event ->
  if (event != null) {
    logger.atInfo().log("Received event %s", event)
    // do something
  }
}

엔티티 관계 이벤트 구독

구조, 방, 기기, 자동화와 같은 엔티티가 추가, 삭제 또는 업데이트될 때마다 발생하는 이벤트를 수신할 수 있습니다. 이러한 이벤트는 HomeObjectChangeEvent의 인스턴스이며 변경된 항목의 ID를 전달합니다.

원하는 이벤트를 생성하는 스트림을 획득하려면 해당 Flow 메서드에서 생성된 HomeObjectsFlow<T>에서 stream() 메서드를 호출합니다.

표: 이벤트 스트림
항목 인터페이스 흐름 메서드
Structure HasStructures structures()
Room HasRooms rooms()
HomeDevice HasHomeDevices devices()
Automation HasAutomations automations()

예를 들어 기기 변경사항을 처리하는 방법은 다음과 같습니다.

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