En las APIs de Home para Android, la observación de los cambios de estado en la casa es posible gracias al uso de flujos en Kotlin. Los cambios en las estructuras, las habitaciones, los metadatos de los dispositivos y el estado de los dispositivos en las APIs de Home se pueden observar con cualquier API que herede de la interfaz HomeObjectsFlow
. Para ello, se recopilan datos del flujo.
Cuando se agrega, borra o modifica cualquier elemento de una colección, se devuelve 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 principal en las APIs de Home se puede usar para este propósito.
Cómo usar los flujos
A continuación, se incluyen algunos ejemplos básicos de recopilación de datos 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)
Cómo hacer 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()!!
Cómo hacer 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 sala
- El conjunto de traits compatibles
- El conjunto de tipos admitidos
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 rasgo específico de un dispositivo
Usar cualquier rasgo admitido por 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 recopilación:
- Cambios en cualquier rasgo dentro del tipo de dispositivo generado
Usa cualquier tipo de dispositivo Matter compatible con las APIs de Home. Para obtener una 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 habitación de una estructura
Los siguientes cambios en una habitación activan esta recopilación:
Para hacer un seguimiento de cuándo se agregan o quitan dispositivos de una habitación, usa el flujo de 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 devuelve unFlow<Event>
:
events(event: EventFactory<T>)
devuelve un flujo para un tipo específico de evento:val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
events(trait: TraitFactory<T>)
devuelve un flujo de todos los eventos que envía un rasgo:val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
events()
devuelve 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
}
}
Suscríbete a eventos de relación entre entidades
Puedes escuchar los eventos que se emiten cada vez que se agrega, quita o actualiza una entidad (como una estructura, una habitación, un dispositivo o una automatización). Estos eventos son instancias de HomeObjectChangeEvent
y contienen el ID de la entidad que cambió.
Para adquirir un flujo que produzca los eventos que deseas, llama al método stream()
en el HomeObjectsFlow<T>
producido por el método Flow correspondiente:
Entidad | Interfaz | Método de flujo |
---|---|---|
Structure
|
HasStructures
|
structures()
|
Room
|
HasRooms
|
rooms()
|
HomeDevice
|
HasHomeDevices
|
devices()
|
Automation
|
HasAutomations
|
automations()
|
Por ejemplo, a continuación, se muestra cómo puedes controlar los cambios en los dispositivos:
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 -> {} } }