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

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

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

ويعود إلى المطوّر استنتاج التغييرات المحدّدة من خلال مقارنة هذه اللقطة بنسخة أقدم. يمكن استخدام حقل id المتوفّر لكل نوع من أنواع العناصر الرئيسية في 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. للاطّلاع على القائمة الكاملة، يُرجى الانتقال إلى Trait.

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

تتبُّع التغييرات على نوع معيّن على جهاز

تؤدي التغييرات التالية على نوع الجهاز إلى تفعيل هذه المجموعة:

استخدِم أي نوع جهاز Matter متوافق مع واجهات برمجة التطبيقات 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")
  }
}

الاشتراك في الأحداث

في واجهات برمجة التطبيقات 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 -> {}
  }
}