Nelle API Home per Android, l'osservazione delle modifiche allo stato della casa è resa possibile tramite l'utilizzo di flussi in Kotlin. L'osservazione delle modifiche alle strutture, alle stanze, ai metadati dei dispositivi e allo stato dei dispositivi nelle API Home può essere eseguita con qualsiasi API che eredita dall'interfaccia HomeObjectsFlow. Questa operazione viene eseguita raccogliendo i dati dal flusso.
Quando un elemento di una raccolta viene aggiunto, eliminato o modificato, viene restituito l'ultimo snapshot della raccolta.
Spetta allo sviluppatore dedurre le modifiche specifiche confrontando questo snapshot con una copia precedente. A questo scopo, è possibile utilizzare il campo id fornito per ogni tipo di oggetto principale nelle API Home.
Come usare i flussi
Di seguito sono riportati alcuni esempi di base di raccolta da flussi nelle API Home.
Per i seguenti esempi, è necessario creare un'istanza di Home prima di accedere alle raccolte nella casa:
val context = LocalContext.current
val homeManager = Home.getClient(context)
Monitora le modifiche apportate a una struttura
Le seguenti modifiche a una struttura attivano questa raccolta:
- Nome della struttura
homeManager.structures().map { it.firstOrNull() }.collect {
println("Structure ${it.id} updated to ${it}")
}
val structure = homeManager.structures().list().firstOrNull()!!
Monitora le modifiche apportate a un dispositivo specifico
Le seguenti modifiche a un dispositivo attivano questa raccolta:
- Stato della connettività
- Nome del dispositivo
- Iscrizione alla stanza
- L'insieme di tratti supportati
- L'insieme di tipi supportati
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" }!!
Monitorare le modifiche a un tratto specifico su un dispositivo
Utilizza qualsiasi tratto supportato dal dispositivo e dalle API Home. Per un elenco completo, consulta Trait.
val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()
trait?.collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
Monitora le modifiche a un tipo specifico su un dispositivo
Le seguenti modifiche a un tipo di dispositivo attivano questa raccolta:
- Modifiche a qualsiasi tratto all'interno del tipo di dispositivo generato
Utilizza qualsiasi tipo di dispositivo Matter supportato dalle API Home. Per un elenco completo, vedi DeviceType.
device.type(DimmableLightDevice).collect { type ->
println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}
Monitora le modifiche a una stanza di una struttura
Le seguenti modifiche a una stanza attivano questa raccolta:
Per monitorare quando i dispositivi vengono aggiunti o rimossi da una stanza, utilizza il flusso devices().
structure.rooms().collect {
println("Got a new updated set of rooms!")
for (room in it) {
println("Got room $room")
}
}
Iscriviti agli eventi
Nelle API Home, gli eventi vengono utilizzati per rilevare le modifiche allo stato di un dispositivo.
Per iscriverti agli eventi su un dispositivo specifico, chiama uno dei tre
HomeDevice.events, ognuna delle quali restituisce unFlow<Event>:
events(event: EventFactory<T>)restituisce un flusso per un tipo specifico di evento:val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)events(trait: TraitFactory<T>)restituisce un flusso di tutti gli eventi inviati da un tratto:val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)events()restituisce un flusso di eventi disponibili per l'oggetto:val eventflow = homeDevice.type(DoorLockDevice).first().events()
Per utilizzare gli eventi di un flusso, utilizza la funzione flow.collect():
eventflow.collect { event ->
if (event != null) {
logger.atInfo().log("Received event %s", event)
// do something
}
}
Iscriviti agli eventi di relazione tra entità
Puoi ascoltare gli eventi che vengono emessi ogni volta che un'entità (ad esempio una struttura, una stanza, un dispositivo o un'automazione) viene aggiunta, rimossa o aggiornata. Questi eventi sono istanze di HomeObjectChangeEvent e contengono l'ID dell'entità che è cambiata.
Per acquisire uno stream che produce gli eventi che ti interessano, chiama il metodo stream() su HomeObjectsFlow<T> prodotto dal metodo Flow corrispondente:
| Entità | Interfaccia | Metodo a flusso |
|---|---|---|
Structure
|
HasStructures
|
structures()
|
Room
|
HasRooms
|
rooms()
|
HomeDevice
|
HasHomeDevices
|
devices()
|
Automation
|
HasAutomations
|
automations()
|
Ad esempio, ecco come puoi gestire le modifiche ai dispositivi:
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 -> {} } }