في واجهات برمجة التطبيقات Home APIs لنظام التشغيل Android، يمكن رصد التغييرات في حالة المنزل من خلال استخدام عمليات نقل البيانات في Kotlin. يمكنك مراقبة التغييرات في البِنى والغرف وبيانات الجهاز الوصفية وحالة الجهاز في واجهات برمجة التطبيقات الخاصة بمنزل Google باستخدام أي واجهة برمجة تطبيقات موروثة من واجهة HomeObjectsFlow. ويتم ذلك من خلال الجمع من التدفق.
عند إضافة أي عنصر إلى مجموعة أو حذفه أو تعديله، يتم عرض أحدث لقطة للمجموعة.
ويعود إلى المطوّر تحديد التغييرات المحدّدة من خلال مقارنة هذه اللقطة بنسخة أقدم. يمكن استخدام حقل id المتوفّر لكل نوع من أنواع العناصر الرئيسية في Home APIs لهذا الغرض.
كيفية استخدام التدفقات
في ما يلي بعض الأمثلة الأساسية على جمع البيانات من عمليات سير العمل في واجهات برمجة التطبيقات الخاصة بمنصة Google Home.
في الأمثلة التالية، يجب إنشاء مثيل من 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>:
- تعرض - events(event: EventFactory<T>)تدفقًا لنوع معيّن من الأحداث:- val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
- تعرض السمة - events(trait: TraitFactory<T>)سلسلة من جميع الأحداث التي أرسلتها سمة:- val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
- تعرض الدالة - 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 -> {} } }