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

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

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

توسعه‌دهنده باید با مقایسه این نمونه فوری با نسخه قدیمی‌تر، تغییرات خاص را استنباط کند. از فیلد id ارائه‌شده برای هر نوع شیء والد در «میاناهای برنامه‌سازی کاربردی خانه هوشمند» می‌توان برای این هدف استفاده کرد.

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

در زیر چند مثال ساده از جمع‌آوری از جریان‌ها در «میاناهای برنامه‌سازی کاربردی خانه» آورده شده است. برای مثال‌های زیر، قبل‌از دسترسی به مجموعه‌ها در خانه، باید نمونه‌ای از 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 APIs پشتیبانی می‌کنند استفاده کنید. برای مشاهده فهرست کامل، به Trait مراجعه کنید.

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

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

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

تغییرات زیر در نوع دستگاه باعث راه‌اندازی این مجموعه می‌شود:

از هر نوع دستگاه Matter پشتیبانی‌شده توسط Home APIs استفاده کنید. برای دیدن فهرست کامل، 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»، از رویدادها برای تشخیص تغییرات در وضعیت دستگاه استفاده می‌شود.

برای مشترک شدن در رویدادهای دستگاهی خاص، با یکی از سه 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> تولیدشده توسط روش «جریان» مربوطه فراخوانی کنید:

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