في واجهات برمجة التطبيقات Home APIs لنظام التشغيل Android، يمكن رصد التغييرات في حالة المنزل من خلال استخدام
التدفقات
في لغة Kotlin. يمكن رصد التغييرات في البُنى والغرف والبيانات الوصفية للأجهزة وحالة الأجهزة في واجهات برمجة التطبيقات لمنزل Google باستخدام أي واجهة برمجة تطبيقات تكتسب من واجهة HomeObjectsFlow. ويتم ذلك من خلال
جمع البيانات من التدفق.
عند إضافة أي عنصر في مجموعة أو حذفه أو تعديله، يتم عرض أحدث لقطة للمجموعة.
ويعود الأمر إلى المطوّر لاستنتاج التغييرات المحدّدة من خلال مقارنة هذه اللقطة بنسخة قديمة. يمكن استخدام حقل id المقدَّم لكل نوع عنصر رئيسي في Home APIs لهذا الغرض.
كيفية استخدام المسارات
في ما يلي بعض الأمثلة الأساسية على جمع البيانات من التدفقات في واجهات برمجة التطبيقات Home API.
For the following examples, an instance of the Home must be created before
accessing collections in the 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 متوافق مع Home APIs. للاطّلاع على القائمة الكاملة، يُرجى مراجعة DeviceType.
device.type(DimmableLightDevice).collect { type ->
println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}
تتبُّع التغييرات في غرفة في مبنى
تؤدي التغييرات التالية في الغرفة إلى تفعيل هذه المجموعة:
لتتبُّع وقت إضافة الأجهزة إلى غرفة أو إزالتها منها، استخدِم devices()
flow.
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>:
تعرض الدالة
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 -> {} } }