기기 상태 모니터링

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 중 하나를 호출합니다.events 함수: 각각 Flow<Event>를 반환합니다.

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