En las APIs de Home, observar los cambios de estado en la casa es posible gracias al uso de flujos en Kotlin. Observar los cambios en las estructuras, las habitaciones, los metadatos del dispositivo y el estado del dispositivo en las APIs de Home se puede hacer con cualquier API que herede de la interfaz HomeObjectsFlow
. Para ello, se recopila desde el flujo. Consulta Presentación de los flujos para obtener más información sobre ellos.
Cuando se agrega, borra o modifica un elemento de una colección, se muestra la instantánea más reciente de la colección.
Depende del desarrollador deducir los cambios específicos comparando esta
instantánea con una copia anterior. El campo id
proporcionado para cada tipo de objeto superior en las APIs de Home se puede usar para este fin.
Cómo usar flujos
Veamos algunos ejemplos básicos de recopilación de flujos en las APIs de Home. En los siguientes ejemplos, se debe crear una instancia de Home
antes de acceder a las colecciones en la página principal:
val context = LocalContext.current
val homeManager = Home.getClient(context)
Realiza un seguimiento de los cambios en una estructura
Los siguientes cambios en una estructura activan esta colección:
- Nombre de la estructura
homeManager.structures().map { it.firstOrNull() }.collect {
println("Structure ${it.id} updated to ${it}")
}
val structure = homeManager.structures().list().firstOrNull()!!
Realiza un seguimiento de los cambios en un dispositivo específico
Los siguientes cambios en un dispositivo activan esta colección:
- Estado de conectividad
- Nombre del dispositivo
- Membresía de habitación
- El conjunto de características compatibles
- El conjunto de tipos compatibles
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" }!!
Realiza un seguimiento de los cambios en un atributo específico en un dispositivo
Usa cualquier atributo compatible con el dispositivo y las APIs de Home. Para obtener una lista completa, consulta Trait
.
device.trait(OnOff).collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
Realiza un seguimiento de los cambios en un tipo específico en un dispositivo
Los siguientes cambios en un tipo de dispositivo activan esta colección:
- Cambios en cualquier atributo dentro del tipo de dispositivo generado
Usa cualquier tipo de dispositivo Matter compatible con las APIs de Home. Para ver la lista completa, consulta DeviceType
.
device.type(DimmableLightDevice).collect { type ->
println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}
Realiza un seguimiento de los cambios en una sala de una estructura
Los siguientes cambios en una sala activan esta colección:
Para hacer un seguimiento de cuándo se agregan o quitan dispositivos de una habitación, usa el flujo devices()
.
structure.rooms().collect {
println("Got a new updated set of rooms!")
for (room in it) {
println("Got room $room")
}
}
Suscríbete a eventos
En las APIs de Home, los eventos se usan para detectar cambios en el estado de un dispositivo.
Para suscribirte a eventos en un dispositivo específico, llama a uno de los tres HomeDevice
.Funciones events
, cada una de las cuales muestra unFlow<Event>
:
events(event: EventFactory<T>)
muestra un flujo para un tipo de evento específico:val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
events(trait: TraitFactory<T>)
muestra un flujo de todos los eventos que envía un atributo:val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
events()
muestra un flujo de eventos disponibles para el objeto:val eventflow = homeDevice.type(DoorLockDevice).first().events()
Para consumir eventos de un flujo, usa la función flow.collect()
:
eventflow.collect { event ->
if (event != null) {
logger.atInfo().log("Received event %s", event)
// do something
}
}