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