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

في Home APIs for Android، يمكن رصد التغييرات في حالة المنزل من خلال استخدام عمليات نقل البيانات في Kotlin. يمكنك مراقبة التغييرات في البِنى والغرف وبيانات الجهاز الوصفية وحالة الجهاز في واجهات برمجة التطبيقات الخاصة بمنزل Google باستخدام أي واجهة برمجة تطبيقات موروثة من واجهة 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. للاطّلاع على القائمة الكاملة، يُرجى الانتقال إلى 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. للاطّلاع على القائمة الكاملة، يُرجى الانتقال إلى 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> الناتج عن طريقة 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 -> {}
  }
}