Android でデバイスのステータスをモニタリングする

Android 向け Home API では、Kotlin のフローを使用して、家の状態の変化を監視できます。Home API の構造、部屋、デバイスのメタデータ、デバイスの状態の変化を監視するには、HomeObjectsFlow インターフェースを継承する任意の API を使用します。これは、フローから収集することで行われます。

コレクション内のアイテムが追加、削除、変更されると、コレクションの最新のスナップショットが返されます。

このスナップショットを古いコピーと比較して、具体的な変更を推測するのはデベロッパーの責任です。この目的には、Home API の各親オブジェクト タイプに用意されている id フィールドを使用できます。

フローの使用方法

以下に、Home API のフローからデータを収集する基本的な例を示します。次の例では、家のコレクションにアクセスする前に Home のインスタンスを作成する必要があります。

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

構造の変更を追跡する

構造に対する次の変更は、このコレクションをトリガーします。

homeManager.structures().map { it.firstOrNull() }.collect {
  println("Structure ${it.id} updated to ${it}")
}

val structure =  homeManager.structures().list().firstOrNull()!!

特定のデバイスの変更を追跡する

デバイスに対する次の変更がこの収集をトリガーします。

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" }!!

デバイス上の特定の特徴の変化を追跡する

デバイスと Home API でサポートされているトレイトを使用します。完全なリストについては、Trait をご覧ください。

device.trait(OnOff).collect {
  if (it != null) {
    println("Got new state update! ${it.onOff}")
  }
}

デバイス上の特定のタイプの変更を追跡する

デバイスタイプに対する次の変更がこのコレクションをトリガーします。

Home API でサポートされている Matter デバイスタイプを使用します。完全なリストについては、DeviceType をご覧ください。

device.type(DimmableLightDevice).collect { type ->
    println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}

構造物内の部屋の変更を追跡する

チャットルームで次の変更が行われると、このコレクションがトリガーされます。

部屋にデバイスが追加または削除されたタイミングを追跡するには、devices() フローを使用します。

structure.rooms().collect {
  println("Got a new updated set of rooms!")

  for (room in it) {
    println("Got room $room")
  }
}

イベントに登録する

Home API では、デバイスの状態の変化を検出するためにイベントが使用されます。

特定のデバイスのイベントをサブスクライブするには、3 つの HomeDevice のいずれかを呼び出します。events 関数。それぞれが Flow<Event> を返します。

  1. events(event: EventFactory<T>) は、特定の種類のイベントのフローを返します。

    val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
    
  2. events(trait: TraitFactory<T>) は、トレイトによって送信されたすべてのイベントのフローを返します。

    val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
    
  3. events() は、オブジェクトで使用可能なイベントのフローを返します。

    val eventflow = homeDevice.type(DoorLockDevice).first().events()
    

フローからイベントを使用するには、flow.collect() 関数を使用します。

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

エンティティ関係イベントに登録する

エンティティ(構造、部屋、デバイス、自動化など)が追加、削除、更新されるたびに発生するイベントをリッスンできます。これらのイベントは HomeObjectChangeEvent のインスタンスであり、変更されたエンティティの ID を保持します。

目的のイベントを生成するストリームを取得するには、対応する Flow メソッドによって生成された HomeObjectsFlow<T>stream() メソッドを呼び出します。

表: イベント ストリーム
エンティティ インターフェース フロー方法
Structure HasStructures structures()
Room HasRooms rooms()
HomeDevice HasHomeDevices devices()
Automation HasAutomations automations()

たとえば、デバイスの変更を処理する方法は次のとおりです。

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 -> {}
  }
}