APIهای ساختاری ممکن است از طریق APIهای Home قابل دسترسی باشند. این بسته ها را به برنامه خود وارد کنید:
import com.google.home.Home
import com.google.home.Id
import com.google.home.Structure
رسیدگی به خطا
هر روشی در APIهای Home میتواند یک HomeException
ایجاد کند، بنابراین توصیه میکنیم از یک بلوک try-catch
برای گرفتن HomeException
در همه تماسها استفاده کنید.
هنگام مدیریت HomeException
، قسمت های code
و message
آن را بررسی کنید تا متوجه شوید چه مشکلی پیش آمده است.
هرگونه استثناء کنترل نشده منجر به خرابی برنامه شما می شود.
برای اطلاعات بیشتر، رسیدگی به خطا را ببینید.
تماس های نمونه
لیستی از سازه ها را دریافت کنید
پس از مقداردهی اولیه، یک فراخوانی 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()
API جریانی است که ممکن است بلافاصله لیست معتبری از ساختارها را برنگرداند. اگر برنامه شما واکنشپذیر است و برای هدایت UI در آن جریان مشترک است، در نهایت باید فهرست معتبری از ساختارها برگردانده شود. موقعیتهای دیگری وجود دارد که میتوان یک لیست ساختار خالی را برگرداند، برای مثال اگر تلفن کاربر اتصال را قطع کند یا کاربر مجوزهای برنامه شما را لغو کرده باشد. شما باید مطمئن شوید که این موارد را در برنامه خود مدیریت می کنید.
متناوباً، اگر به جای برنامهریزی واکنشی، برنامهریزی ضروری به شدت مورد نیاز باشد، میتوان از یک اپراتور جریان ترمینال استفاده کرد:
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")))
اتوماسیون ها
نقطه ورود به Automation API از طریق یک ساختار است. برای کسب اطلاعات بیشتر در مورد اتوماسیون در APIهای Home، به طراحی یک اتوماسیون مراجعه کنید.
لیست API
هنگامی که یک نمونه از Home
ایجاد می شود، API های ساختار زیر از طریق آن قابل دسترسی هستند:
API | توضیحات |
---|---|
structures() | تمام ساختارهای موجود در حساب Google را دریافت کنید. HomeObjectsFlow را برمیگرداند که گزینههای بازیابی و فیلتر بیشتر را ارائه میدهد. |
هنگامی که یک Structure
دارید، API های زیر از طریق آن قابل دسترسی هستند:
API | توضیحات |
---|---|
automations() | تمام اتوماسیون هایی که به ساختار تعلق دارند را فهرست کنید. فقط اتوماسیون های ایجاد شده از طریق API های Home برگردانده می شوند. |
createAutomation(automation) | یک نمونه اتوماسیون برای یک ساختار ایجاد کنید. |
createRoom(name) | یک اتاق با نام کاربر ایجاد کنید. |
deleteAutomation(automationId) | یک نمونه اتوماسیون را با شناسه آن حذف کنید. |
deleteRoom(roomId) | اتاقی با شناسه اتاق را حذف کنید. |
devices() | تمام وسایل موجود در ساختار را دریافت کنید. HomeObjectsFlow را برمیگرداند. |
getAutomation(automationId) | یک نمونه اتوماسیون را با شناسه آن دریافت کنید. |
getSourceConnectivity(trait) | برای یک ویژگی خاص متادیتا دریافت کنید. یک SourceConnectivity برمیگرداند. |
has(trait) | بررسی کنید که آیا ویژگی فعلی درخواست شده توسط دستگاه پشتیبانی می شود. |
id | شناسه سیستم منحصر به فرد سازه. |
moveDevicesToRoom(roomId, deviceIds) | دستگاه ها را به شناسه اتاق دیگری در ساختار منتقل کنید. |
name | نام ساختار ارائه شده توسط کاربر. |
rooms() | تمام اتاق های ساختار را دریافت کنید. HomeObjectsFlow را برمیگرداند. |
trait(trait) | یک عکس فوری از ویژگی های صفت دریافت کنید. |
برخی از APIهای رایج (مانند devices()
، id
و name
) نیز برای یک Room
در دسترس هستند.