نظارت بر وضعیت دستگاه

در API های Home، مشاهده تغییرات حالت در خانه با استفاده از جریان ها در Kotlin امکان پذیر است. مشاهده تغییرات در ساختارها، اتاق‌ها، فراداده‌های دستگاه و وضعیت دستگاه در APIهای Home می‌تواند با هر API به ارث رسیده از رابط HomeObjectsFlow انجام شود. این کار با جمع آوری از جریان انجام می شود. برای اطلاعات بیشتر در مورد جریان، به معرفی جریان ها مراجعه کنید.

هنگامی که هر مورد در یک مجموعه اضافه، حذف یا اصلاح می شود، آخرین عکس فوری از مجموعه برگردانده می شود.

این به توسعه دهنده بستگی دارد که تغییرات خاص را با مقایسه این عکس فوری با یک نسخه قدیمی استنباط کند. برای این منظور می توان از فیلد id ارائه شده برای هر نوع شی والد در Home API استفاده کرد.

نحوه استفاده از جریان ها

بیایید به چند نمونه اساسی از جمع آوری جریان ها در 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" }!!

ردیابی تغییرات به یک ویژگی خاص در یک دستگاه

از هر ویژگی پشتیبانی شده توسط دستگاه و APIهای Home استفاده کنید. برای فهرست کامل، Trait ببینید.

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

ردیابی تغییرات به یک نوع خاص در یک دستگاه

تغییرات زیر در نوع دستگاه این مجموعه را فعال می کند:

از هر نوع دستگاه Matter که توسط APIهای Home پشتیبانی می شود استفاده کنید. برای فهرست کامل، 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")
  }
}

اشتراک در رویدادها

در APIهای Home، رویدادها برای تشخیص تغییرات در وضعیت یک دستگاه استفاده می‌شوند.

برای اشتراک در رویدادهای یک دستگاه خاص، با یکی از سه 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
  }
}