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>
를 반환합니다.
events(event: EventFactory<T>)
는 특정 종류의 이벤트에 관한 흐름을 반환합니다.val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
events(trait: TraitFactory<T>)
는 트레잇에서 전송한 모든 이벤트의 흐름을 반환합니다.val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
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
}
}