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 중 하나를 호출합니다.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
  }
}

항목 관계 이벤트 구독

항목 (예: 구조물, 방, 기기, 자동화)이 추가, 삭제 또는 업데이트될 때마다 내보내는 이벤트를 리슨할 수 있습니다. 이러한 이벤트는 HomeObjectChangeEvent의 인스턴스이며 변경된 항목의 ID를 전달합니다.

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

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

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