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

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

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

این به توسعه‌دهنده بستگی دارد که با مقایسه این snapshot با یک کپی قدیمی‌تر، تغییرات خاص را استنباط کند. فیلد id ارائه شده برای هر نوع شیء والد در Home APIs می‌تواند برای این منظور استفاده شود.

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

در ادامه چند مثال اساسی از جمع‌آوری جریان‌ها در APIهای Home آورده شده است. برای مثال‌های زیر، قبل از دسترسی به مجموعه‌ها در Home، باید یک نمونه از 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 مراجعه کنید.

    val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()

    trait?.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>) جریانی از تمام رویدادهای ارسال شده توسط یک trait را برمی‌گرداند:

    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 هستند و شناسه موجودیتی را که تغییر کرده است، حمل می‌کنند.

برای به دست آوردن جریانی که رویدادهای مورد نظر شما را تولید می‌کند، متد stream() را در HomeObjectsFlow<T> تولید شده توسط متد Flow مربوطه فراخوانی کنید:

جدول: جریان‌های رویداد
نهاد رابط روش جریان
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 -> {}
  }
}