Gerätestatus überwachen

In den Home APIs können Statusänderungen im Zuhause mithilfe von Abläufen in Kotlin beobachtet werden. Änderungen an Gebäuden, Räumen, Gerätemetadaten und Gerätestatus in den Home APIs können mit jeder API beobachtet werden, die von der HomeObjectsFlow-Benutzeroberfläche abgeleitet ist. Dazu werden die Daten aus dem Fluss erfasst. Weitere Informationen zu Abläufen finden Sie unter Einführung in Abläufe.

Wenn ein Element einer Sammlung hinzugefügt, gelöscht oder geändert wird, wird der aktuelle Snapshot der Sammlung zurückgegeben.

Es liegt in der Verantwortung des Entwicklers, die Änderungen zu ermitteln, 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

Sehen wir uns einige grundlegende Beispiele für die Erhebung aus Abläufen in den Home APIs an. Für die folgenden Beispiele muss eine Instanz der Home erstellt werden, bevor auf Sammlungen im Zuhause zugegriffen werden kann:

val context = LocalContext.current
val homeManager = Home.getClient(context)

Änderungen an einem Gebäude verfolgen

Die folgenden Änderungen an einem Gebäude lösen diese Sammlung aus:

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 Erfassung aus:

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 eine beliebige Eigenschaft, die 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:

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 Gruppenbereich lösen diese Erfassung aus:

Wenn Sie nachverfolgen möchten, wann Geräte einem Raum hinzugefügt oder daraus entfernt werden, verwenden Sie den devices()-Vorgang.

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 einenFlow<Event> zurückgeben:

  1. events(event: EventFactory<T>) gibt einen Ablauf für eine bestimmte Ereignisart zurück:

    val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
    
  2. events(trait: TraitFactory<T>) gibt einen Stream aller Ereignisse zurück, die von einem Merkmal gesendet wurden:

    val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
    
  3. events() gibt einen Ereignisablauf 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 verarbeiten:

eventflow.collect { event ->
  if (event != null) {
    logger.atInfo().log("Received event %s", event)
    // do something
  }
}