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

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

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

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

كيفية استخدام الكتابة المتواصلة

في ما يلي بعض الأمثلة الأساسية على تجميع البيانات من الكتابة المتواصلة في واجهات برمجة التطبيقات لمنزل Google. بالنسبة إلى الأمثلة التالية، يجب إنشاء مثيل من 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" }!!

تتبُّع التغييرات في سمة محدّدة على جهاز

استخدِم أي سمة متوافقة مع الجهاز وواجهات برمجة التطبيقات لمنزل Google. للاطّلاع على القائمة الكاملة، يُرجى مراجعة Trait.

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

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

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

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

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

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

في واجهات برمجة التطبيقات لمنزل Google، تُستخدَم الأحداث لرصد التغييرات في حالة الجهاز.

للاشتراك في الأحداث على جهاز محدّد، استخدِم إحدى الدوال الثلاث 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 -> {}
  }
}