مراقبة حالة الجهاز على Android

في Home APIs لنظام التشغيل Android، يمكن رصد التغييرات في الحالة في المنزل من خلال استخدام عمليات في Kotlin. يمكن رصد التغييرات في الهياكل والغرف والبيانات الوصفية للأجهزة وحالتها في واجهات برمجة التطبيقات Home باستخدام أي واجهة برمجة تطبيقات ترث من واجهة HomeObjectsFlow. ويتم ذلك من خلال الجمع من عملية التنقّل.

عند إضافة أي عنصر في مجموعة أو حذفه أو تعديله، يتم عرض أحدث لقطة لمجموعة.

على المطوّر استنتاج التغييرات المحدّدة من خلال مقارنة هذه لقطة الشاشة بنسخة قديمة. يمكن استخدام حقل id المقدَّم لكل نوع من أنواع العناصر الأساسية في Home APIs للقيام بهذا الغرض.

كيفية استخدام مسارات الإحالات الناجحة

في ما يلي بعض الأمثلة الأساسية على جمع البيانات من عمليات المعالجة في Home APIs. في الأمثلة التالية، يجب إنشاء مثيل من 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.

device.trait(OnOff).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 APIs، تُستخدَم الأحداث لرصد التغيُّرات في حالة أحد الأجهزة.

للاشتراك في الأحداث على جهاز معيّن، اتصل بأحد الإجراءَين التاليَين: 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 -> {}
  }
}