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>
를 반환합니다.
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
}
}
항목 관계 이벤트 구독
항목 (예: 구조물, 방, 기기, 자동화)이 추가, 삭제 또는 업데이트될 때마다 내보내는 이벤트를 리슨할 수 있습니다. 이러한 이벤트는 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 -> {} } }