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>
を返します。
events(event: EventFactory<T>)
は、特定の種類のイベントのフローを返します。val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
events(trait: TraitFactory<T>)
は、トレイトによって送信されたすべてのイベントのフローを返します。val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
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
}
}