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

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

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

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

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

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

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

در رویدادهای مربوط به نهاد مشترک شوید

می‌توانید به رویدادهایی گوش دهید که هر بار که یک موجودیت (مانند ساختار، اتاق، دستگاه یا اتوماسیون) اضافه، حذف یا به‌روزرسانی می‌شود، منتشر می‌شوند. این رویدادها نمونه‌هایی از 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 -> {}
  }
}