Nelle API Home, l'osservazione delle modifiche dello stato in casa è resa possibile tramite l'utilizzo dei flussi in Kotlin. È possibile osservare le modifiche a strutture, stanze, metadati dei dispositivi e stato dei dispositivi nelle API Home con qualsiasi API che eredita dall'interfaccia HomeObjectsFlow
. Per farlo,
raccogli i dati dal flusso. Per ulteriori informazioni sui flussi, consulta la sezione Introduzione ai flussi.
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 questa istantanea con una copia precedente. A questo scopo, puoi utilizzare il campo id
fornito per ogni tipo di oggetto principale nelle API Home.
Come utilizzare i flussi
Vediamo alcuni esempi di base di raccolta dai flussi nelle API Home. Per
gli esempi riportati di seguito, è necessario creare un'istanza di Home
prima di accedere alle raccolte nella casa:
val context = LocalContext.current
val homeManager = Home.getClient(context)
Monitorare 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()!!
Monitorare le modifiche apportate a un dispositivo specifico
Le seguenti modifiche a un dispositivo attivano questa raccolta:
- Stato della connettività
- Nome del dispositivo
- Abbonamento a Room
- L'insieme di trait 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 apportate a un tratto specifico su un dispositivo
Utilizza qualsiasi tratto supportato dal dispositivo e dalle API Home. Per un elenco completo, consulta
Trait
.
device.trait(OnOff).collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
Monitorare 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, consulta DeviceType
.
device.type(DimmableLightDevice).collect { type ->
println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}
Monitorare le modifiche apportate 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")
}
}
Iscriversi agli eventi
Nelle API Home, gli eventi vengono utilizzati per rilevare le modifiche dello stato di un dispositivo.
Per iscriverti agli eventi su un dispositivo specifico, chiama una delle tre funzioni
HomeDevice
.events
funzioni, 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
}
}