يمكن الوصول إلى واجهات برمجة التطبيقات الخاصة بالبنية من خلال واجهات برمجة التطبيقات الخاصة بمنزل Android. استورِد الحِزم التالية إلى تطبيقك:
import com.google.home.Home
import com.google.home.Id
import com.google.home.Structure
معالجة الأخطاء
يمكن لأي طريقة في Home APIs عرض
HomeException، لذا ننصحك باستخدام كتلة try-catch لاكتشاف HomeException في جميع عمليات الاستدعاء.
عند التعامل مع HomeException، راجِع الحقلَين
error.code و
error.message لمعرفة الخطأ الذي حدث. قد تتوفّر أيضًا رموز أخطاء فرعية، لذا استدعِ طريقة
getSubErrorCodes() وتحقّق من النتيجة.
سيؤدي أي استثناء لم تتم معالجته إلى تعطُّل تطبيقك.
لمزيد من المعلومات، اطّلِع على التعامل مع الأخطاء.
أمثلة على المكالمات
الحصول على قائمة بالبُنى
بعد إعدادها، تعرض مكالمة structures() "تدفقًا" من البُنى التي يمكنك الوصول إليها:
// Get a flow of all structures accessible to the user val allStructuresFlow: HomeObjectsFlow<Structure> = home.structures() // Calling list() on a HomeObjectsFlow returns the first Set of elements. val allStructures: Set<Structure> = allStructuresFlow.list()
واجهة برمجة التطبيقات structures() هي مسار قد لا يعرض على الفور قائمة صالحة بالبُنى. إذا كان تطبيقك تفاعليًا ويشترك في هذا التسلسل لتشغيل واجهة المستخدم، يجب أن يتم عرض قائمة صالحة من البِنى في النهاية.
هناك حالات أخرى يمكن أن يتم فيها عرض قائمة بنية فارغة، مثل فقدان اتصال هاتف المستخدم بالإنترنت أو إذا ألغى المستخدم أذونات الوصول إلى تطبيقك. عليك التأكّد من التعامل مع هذه الحالات في تطبيقك.
بدلاً من ذلك، إذا كان من الضروري استخدام البرمجة الإجرائية بدلاً من البرمجة التفاعلية، يمكن استخدام عامل تشغيل نهائي لتدفق البيانات:
val everyStructure = withTimeout(5000) { home.structures().first { it.isNotEmpty() } }
ينتظر هذا الاستدعاء وصول قائمة صالحة من البُنى خلال المسار، ويتوقف إذا لم يتم تلقّي القائمة خلال المهلة الزمنية التي يحدّدها التطبيق.
الحصول على خصائص البنية
بعد الحصول على قائمة بالبُنى، يمكنك الوصول إلى سماتها:
// Get a flow on a structure. Flow emits new values on structure metadata changes: name. val structureFlow: Flow<Structure> = home.structures().itemFlow(myStructureId) // Get a snapshot of the structure. val structure: Structure = structureFlow.first() // Get structure properties println("id ${structure.id}") println("name ${structure.name}")
العثور على بنية حسب الاسم
إذا كنت تعرف اسم بنية، يمكنك أيضًا الوصول إليها باستخدام السمة name:
val myHome = home.structures().list().first { it.name == "My home" }
ومن هناك، يمكن الوصول إلى المواقع والغرف والأجهزة لكل بنية.
التعامل مع بنى متعددة
لاستخدام أكثر من بنية واحدة، احصل على مرجع منفصل لكل بنية:
var structure1: Structure? = null var structure2: Structure? = null try { structure1 = home.structures().list().firstOrNull { it.name == "Main House" } } catch (e: HomeException) { // Code for handling the exception } try { structure2 = home.structures().list().firstOrNull { it.name == "Guest Cottage" } } catch (e: HomeException) { // Code for handling the exception }
الحصول على قائمة بالغرف
بعد الحصول على بنية، يمكنك الحصول على قائمة بالغرف والوصول إلى سماتها:
val allRoomsFlow: HomeObjectsFlow<Room> = structure.rooms() val allRooms: Set<Room> = allRoomsFlow.list() val room: Room = allRooms.first() println("id ${room.id}") println("name ${room.name}")
إنشاء غرفة
لإنشاء غرفة جديدة، اتّبِع الخطوات التالية:
val testName = "Test Room Name" val newRoom: Room = structure.createRoom(testName)
حذف غرفة
أو يمكنك بدلاً من ذلك حذف غرفة باتّباع الخطوات التالية:
val roomToDelete = structure.rooms().list().filter { it.name == "room_id1" }.firstOrNull() structure.deleteRoom(roomToDelete!!)
يمكنك أيضًا حذف غرفة باستخدام معرّف فقط:
val roomToDelete1 = allRooms.filter { it.id == testRoomId }.firstOrNull() structure.deleteRoom(roomToDelete1!!)
في حال حذف غرفة تتضمّن أجهزة، ستظل الأجهزة في المبنى، ولكن لن يتم تعيينها إلى غرفة.
نقل الأجهزة إلى غرفة مختلفة
بعد إنشاء بنية، يمكنك نقل الأجهزة إلى غرفة مختلفة ضمن هذه البنية باتّباع الخطوات التالية:
val room2 = structure.rooms().get(Id("room_id_other_structure")) val device1 = structure.devices().get(Id("device_id1")) structure.moveDevicesToRoom(room2!!, listOf(device1!!))
إذا كان لديك معرّفات الأجهزة والغرف فقط، يمكنك أيضًا نقل الأجهزة باتّباع الخطوات التالية:
structure.moveDevicesToRoom(Id("room_id_other_structure"), listOf(Id("device_id1")))
تغيير اسم غرفة
استدعِ طريقة setName()
لتغيير اسم غرفة:
livingRoom.setName("Living Room")
سيتم اقتطاع الأسماء إذا تجاوزت الحدّ الأقصى المسموح به وهو 60 نقطة رمز يونيكود (حرفًا)، ولن يتم عرض أي أخطاء. يتحمّل المطوّرون مسؤولية التعامل مع الأسماء الطويلة، ويمكنهم مثلاً تحديد ما إذا كانوا يريدون إبلاغ المستخدمين بأنّه سيتم اقتطاع الأسماء.
عرض أنواع الأجهزة التي منح المستخدم أذونات لها
في منظومة Google Home المتكاملة، يمكن للمستخدمين منح الأذونات لجميع الأجهزة من النوع نفسه في آنٍ واحد، وذلك لمعظم أنواع الأجهزة. بالنسبة إلى أنواع الأجهزة الحسّاسة أو المحظورة، مثل الأقفال أو الكاميرات أو أجراس الأبواب، يجب أن يمنح المستخدمون إذن الوصول إليها بشكل فردي.
لتحديد ما إذا كان المستخدم قد منح الإذن بالوصول إلى نوع جهاز حسّاس أو مقيّد، استخدِم الدالة consentedDeviceTypes() على مستوى البنية:
import com.google.home.Structure
import com.google.home.DeviceType
import com.google.home.DeviceTypeFactory
import com.google.home.consentedDeviceTypes // Extension function from the SDK
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
/**
* Example of how an app may monitor which device types have been granted access by a user.
*/
fun monitorDeviceConsent(structure: Structure, myScope: CoroutineScope) {
// Obtain the flow of consented device type factories
val consentedTypesFlow: Flow<Set<DeviceTypeFactory<out DeviceType>>> =
structure.consentedDeviceTypes()
myScope.launch {
consentedTypesFlow.collect { consentedSet ->
// Check if the user has consented to share a specific restricted
// type, such as a Doorbell or Camera.
val hasCameraAccess = consentedSet.any {
it.toString() == "matter.google.type.GoogleDoorbellDevice"
}
if (hasCameraAccess) {
// Enable features that require camera access
} else {
// Inform the user or disable camera-specific features
}
}
}
}
مجموعات الأجهزة
تمثّل مجموعة الأجهزة مجموعة من الأجهزة يحدّدها المستخدم ضمن بنية واحدة.
وكما هو الحال مع الغرف المادية، تنتمي مجموعات الأجهزة إلى بنية واحدة. ولكن على عكس الغرف، فإنّ مجموعات الأجهزة هي مجموعات منطقية. يمكن أن ينتمي الجهاز إلى عدة مجموعات أجهزة في الوقت نفسه. يمكن أن تحتوي مجموعات الأجهزة على ما يصل إلى 100 جهاز.
يتم تمثيل مجموعات الأجهزة بواسطة العنصر
Group، وهو يختلف عن HomeDevice.
إنشاء مجموعة أجهزة
استخدِم
GroupManagement
في البنية لإنشاء مجموعة أجهزة:
val groupManagement = structure.trait(GroupManagementTrait)
val response = groupManagement?.createUserDefinedGroup(
name = "Living room lights",
memberDeviceObjectIds = listOf(light1.id.id, light2.id.id)
)
إدارة عضوية المجموعة
لإضافة أعضاء إلى مجموعة حالية، اتّبِع الخطوات التالية:
structure.trait(GroupManagementTrait)?.addGroupMembers(
groupObjectId = group.id.id,
memberDeviceObjectIds = listOf(light3.id.id)
)
لإزالة أعضاء من مجموعة، اتّبِع الخطوات التالية:
structure.trait(GroupManagementTrait)?.removeGroupMembers(
groupObjectId = group.id.id,
memberDeviceObjectIds = listOf(light1.id.id)
)
تغيير اسم مجموعة أجهزة
لإعادة تسمية مجموعة أجهزة، عدِّل سمة الاسم في GroupTrait الخاصة بالمجموعة:
group.trait(GroupTrait)?.update {
name = "Movie corner"
}
حذف مجموعة أجهزة
لحذف مجموعة أجهزة من مبنى، اتّبِع الخطوات التالية:
structure.trait(GroupManagementTrait)?.deleteGroup(
groupObjectId = group.id.id
)
عمليات التشغيل الآلي
تكون نقطة الدخول إلى Automation API من خلال بنية. لمزيد من المعلومات حول عمليات التشغيل الآلي في واجهات برمجة التطبيقات الخاصة بمنصة Home، يُرجى الاطّلاع على نظرة عامة على Automation API على Android.