In den Home APIs für Android ist die Beobachtung von Zustandsänderungen im Zuhause durch die Verwendung von Flows in Kotlin möglich. Änderungen an Strukturen, Räumen, Gerätemetadaten und Gerätestatus in den Home APIs können mit jeder API beobachtet werden, die vom HomeObjectsFlow
-Interface abgeleitet wird. Dazu wird im Ablauf gesammelt.
Wenn ein Element in einer Sammlung hinzugefügt, gelöscht oder geändert wird, wird der letzte Snapshot der Sammlung zurückgegeben.
Es liegt am Entwickler, die spezifischen Änderungen abzuleiten, indem er diesen Snapshot mit einer älteren Kopie vergleicht. Das Feld id
, das für jeden übergeordneten Objekttyp in den Home APIs bereitgestellt wird, kann für diesen Zweck verwendet werden.
Abläufe verwenden
Im Folgenden finden Sie einige grundlegende Beispiele für das Erfassen von Daten aus Abläufen in den Home-APIs.
Für die folgenden Beispiele muss eine Instanz von Home
erstellt werden, bevor auf Sammlungen im Zuhause zugegriffen werden kann:
val context = LocalContext.current
val homeManager = Home.getClient(context)
Änderungen an einer Struktur verfolgen
Die folgenden Änderungen an einer Struktur lösen diese Erfassung aus:
- Name der Struktur
homeManager.structures().map { it.firstOrNull() }.collect {
println("Structure ${it.id} updated to ${it}")
}
val structure = homeManager.structures().list().firstOrNull()!!
Änderungen an einem bestimmten Gerät verfolgen
Die folgenden Änderungen an einem Gerät lösen diese Sammlung aus:
- Verbindungsstatus
- Gerätename
- Chatroom-Mitgliedschaft
- Die unterstützten Eigenschaften
- Die unterstützten Typen
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" }!!
Änderungen an einem bestimmten Merkmal auf einem Gerät verfolgen
Verwenden Sie ein beliebiges Merkmal, das vom Gerät und den Home-APIs unterstützt wird. Eine vollständige Liste finden Sie unter Trait
.
device.trait(OnOff).collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
Änderungen an einem bestimmten Typ auf einem Gerät verfolgen
Die folgenden Änderungen an einem Gerätetyp lösen diese Erfassung aus:
- Änderungen an einem beliebigen Merkmal innerhalb des generierten Gerätetyps
Verwenden Sie einen beliebigen Matter-Gerätetyp, der von den Home APIs unterstützt wird. Eine vollständige Liste finden Sie unter DeviceType
.
device.type(DimmableLightDevice).collect { type ->
println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}
Änderungen an einem Raum in einem Gebäude verfolgen
Die folgenden Änderungen an einem Chatroom lösen diese Sammlung aus:
Wenn Sie nachverfolgen möchten, wann Geräte einem Raum hinzugefügt oder daraus entfernt werden, verwenden Sie den devices()
-Ablauf.
structure.rooms().collect {
println("Got a new updated set of rooms!")
for (room in it) {
println("Got room $room")
}
}
Ereignisse abonnieren
In den Home-APIs werden Ereignisse verwendet, um Änderungen am Status eines Geräts zu erkennen.
Wenn Sie Ereignisse auf einem bestimmten Gerät abonnieren möchten, rufen Sie eine der drei HomeDevice
auf.events
-Funktionen, die jeweils einFlow<Event>
zurückgeben:
events(event: EventFactory<T>)
gibt einen Ablauf für eine bestimmte Art von Ereignis zurück:val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
events(trait: TraitFactory<T>)
gibt einen Stream aller Ereignisse zurück, die von einem Merkmal gesendet werden:val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
events()
gibt einen Ereignisfluss zurück, der für das Objekt verfügbar ist:val eventflow = homeDevice.type(DoorLockDevice).first().events()
Verwenden Sie die Funktion flow.collect()
, um Ereignisse aus einem Flow zu nutzen:
eventflow.collect { event ->
if (event != null) {
logger.atInfo().log("Received event %s", event)
// do something
}
}
Ereignisse für Entitätsbeziehungen abonnieren
Sie können auf Ereignisse warten, die jedes Mal ausgegeben werden, wenn eine Entität (z. B. ein Gebäude, ein Raum, ein Gerät oder eine Automatisierung) hinzugefügt, entfernt oder aktualisiert wird. Diese Ereignisse sind Instanzen von HomeObjectChangeEvent
und enthalten die ID der geänderten Entität.
Wenn Sie einen Stream abrufen möchten, der die gewünschten Ereignisse erzeugt, rufen Sie die Methode stream()
für die HomeObjectsFlow<T>
auf, die von der entsprechenden Flow-Methode erzeugt wird:
Entität | Schnittstelle | Flow-Methode |
---|---|---|
Structure
|
HasStructures
|
structures()
|
Room
|
HasRooms
|
rooms()
|
HomeDevice
|
HasHomeDevices
|
devices()
|
Automation
|
HasAutomations
|
automations()
|
So können Sie beispielsweise Änderungen an Geräten vornehmen:
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 -> {} } }