APIهای ساختار ممکن است از طریق APIهای Home برای iOS قابل دسترسی باشند.
برای کار با Structure API، ابتدا بسته GoogleHomeSDK
را به برنامه خود وارد کنید:
import GoogleHomeSDK
رسیدگی به خطا
برخی از روشها در APIهای Home یک HomeError
ایجاد میکنند، بنابراین توصیه میکنیم از بلوک do-catch
برای دریافت HomeError
در آن تماسها استفاده کنید.
هنگام رسیدگی به HomeError
، فیلدهای code
و message
آن را بررسی کنید تا بدانید چه مشکلی پیش آمده است.
هر گونه خطای کنترل نشده باعث از کار افتادن برنامه شما می شود.
برای اطلاعات بیشتر، رسیدگی به خطا را ببینید.
API ساختار
Home
نمودار Home را نشان می دهد و نقطه ورود به Structure API است. ارجاعاتی به سازه ها، اتاق ها و دستگاه ها ارائه می دهد.
Structure
ساختاری را در نمودار Home شما نشان می دهد. این امکان دسترسی به ابرداده های ساختاری مانند id
و name
را فراهم می کند.
از structures()
برای دریافت تمام ساختارها در حساب خود استفاده کنید. ساختارها در قالب یک Query
برگردانده می شوند که راه های انتخابی برای مصرف داده های خود را ارائه می دهد:
API | توضیحات |
---|---|
stream() | یک Publisher را برمیگرداند که هر شیء را بهصورت جداگانه با تغییرات ایجاد میکند. |
batched() | یک Publisher را برمیگرداند که نتیجه فعلی را بهعنوان Set از اشیاء منتشر میکند. هر Set منتشر شده نشان دهنده وضعیت فعلی نمودار شی است. |
list() | نتیجه فعلی را به عنوان Set ای از اشیاء برمی گرداند. |
فراخوانی structures().list()
ممکن است بلافاصله مجموعه معتبری از ساختارها را برنگرداند. اگر برنامه شما واکنشپذیر است و stream()
را برای اشتراک در همه تغییرات ساختار برای هدایت UI فراخوانی میکند، در نهایت باید فهرست معتبری از ساختارها برگردانده شود. موقعیتهای دیگری وجود دارد که میتوان یک لیست ساختار خالی را برگرداند، برای مثال اگر تلفن کاربر اتصال را قطع کند یا کاربر مجوزهای برنامه شما را لغو کرده باشد. شما باید مطمئن شوید که این موارد را در برنامه خود مدیریت می کنید.
@Published public private(set) var structures: [Structure] = []
private var structuresCancellable: AnyCancellable?
self.structuresCancellable = home
.structures()
.batched()
.receive(on: DispatchQueue.main)
.map { Array($0) }
.catch {
Logger.error("Failed to load structures: \($0)")
return Just([Structure]())
}
.assign(to: \.structures, on: self)
نمونه فراخوانی ساختار
مجموعه ای از ساختارها را دریافت کنید
فراخوانی list()
در Query<Structure>
جدیدترین مجموعه عناصر را برمی گرداند:
// Get a stream of all structures accessible to the user let allStructuresChanges = try await self.home.structures() let allStructures = try? await allStructuresChanges.list()
هنگام طراحی یک برنامه واکنشگرا، میخواهید از فراخوانیهای batched()
و stream()
به جای list()
استفاده کنید، زیرا اینها به طور خودکار دادهها را زمانی که نمودار اصلی تغییر میکند تولید میکنند.
خواص ساختار را دریافت کنید
با فهرستی از ساختارها، می توانید به ویژگی های آنها دسترسی داشته باشید:
// Get a stream of changes taking place on a structure. let structureChanges = try await home.structures().list().filter { $0.id == structureID } // Get a snapshot of the structure. let structure = try await structureChanges.first! // Get structure properties print("id \(structure.id) ") print("name \(structure.name) ")
یک سازه را با نام پیدا کنید
اگر نام یک ساختار را می دانید، می توانید با استفاده از ویژگی name
نیز به آن دسترسی داشته باشید:
do { structure1 = try await home.structures().list().first(where: { $0.name == "Main House" }) } catch let error as HomeError { // Code for handling the exception }
از آنجا، املاک، اتاقها و دستگاههای هر سازه قابل دسترسی هستند.
با چندین ساختار کار کنید
برای استفاده از بیش از یک ساختار، یک مرجع جداگانه برای هر ساختار دریافت کنید:
var structure1: Structure! var structure2: Structure! do { structure1 = try await home.structures().list().first(where: { $0.name == "Main House" }) } catch let error as HomeError { // Code for handling the exception } do { structure2 = try await home.structures().list().first(where: { $0.name == "Guest Cottage" }) } catch let error as HomeError { // Code for handling the exception }
اتاق ها
یک اتاق شامل گروهی از وسایل است. یک اتاق همیشه بخشی از یک سازه است و یک سازه ممکن است چندین اتاق داشته باشد. حذف یک اتاق از یک سازه، دستگاه های موجود در آن اتاق را از سازه حذف نمی کند. با این حال، اگر اتاق حذف شود، دستگاههای موجود در آن اتاق تخصیص داده نمیشوند.
از Home.rooms()
برای بازیابی تمام اتاق های حساب استفاده کنید، سپس از roomID = device.roomID
برای نمایش دستگاه های مربوطه در هر اتاق استفاده کنید.
self.home.rooms().batched()
.combineLatest(self.home.devices().batched())
.receive(on: DispatchQueue.main)
.catch { error in
Logger.error("Failed to load rooms and devices: \(error)")
return Just((Set<Room>(), Set<HomeDevice>()))
}
.map { rooms, devices in
var devicesByRoom = [Room: [HomeDevice]]()
for room in rooms where room.structureID == currentStructureID {
devicesByRoom[room] = devices.filter { $0.roomID == room.id }
}
return devicesByRoom
}.assign(to: &self.$devicesByRoom)
نمونه تماس های اتاق
لیستی از اتاق ها را دریافت کنید
با استفاده از کلاس Home
، میتوانید فهرستی از اتاقها را دریافت کنید و به ویژگیهای آنها دسترسی داشته باشید:
let allRoomsChanges = self.home.rooms() let allRooms = try await allRoomsChanges.list() let room = allRooms.first! XCTAssertTrue(allRooms.contains(room)) print("id \(room.id) ") print("name \(room.name) ")
یک اتاق ایجاد کنید
برای ایجاد یک اتاق جدید در یک Structure
:
let testName = "Test Room Name" var newRoom: Room! do { newRoom = try await structure.createRoom(name: testName) XCTAssertNotNil(newRoom) } catch let error as HomeError { // Code for handling the exception }
یک اتاق را حذف کنید
یا، در عوض، می توانید یک اتاق را حذف کنید:
val roomToDelete = structure.rooms().list().filter { it.name == "room_id1" }.firstOrNull() structure.deleteRoom(roomToDelete!!)
همچنین می توانید یک اتاق را با استفاده از شناسه آن حذف کنید:
let roomToDelete = allRooms.first(where: { $0.id == room.id }) if let roomToDelete1 = roomToDelete { do { try await structure.deleteRoom(roomToDelete1) } catch let error as HomeError { // Code for handling the exception } }
اگر اتاقی با دستگاهها حذف شود، دستگاهها همچنان در ساختار هستند اما دیگر به اتاق اختصاص داده نمیشوند.
دستگاه ها را به اتاق دیگری منتقل کنید
Structure
همچنین به شما امکان می دهد دستگاه را به اتاق دیگری منتقل کنید:
do { try await structure.move(device: light, to: room) } catch let error as HomeError { // Code for handling the exception }
نام اتاق را تغییر دهید
برای تغییر نام اتاق، متد setName(_:)
را فراخوانی کنید:
let updatedRoom = try await theRoom.setName("new room name")
هنگام تغییر نام یک اتاق، ساختار اصلی Room
ثابت می ماند و تغییر در شی Room
به روز شده برگشتی منعکس می شود.
اگر بیش از 60 نقطه کد یونیکد (نویسه) حد مجاز باشد، نام ها کوتاه می شوند و هیچ خطایی ایجاد نمی شود. توسعهدهندگان مسئول رسیدگی به نامهای طولانی هستند و به عنوان مثال، میتوانند تصمیم بگیرند که آیا میخواهند به کاربران اطلاع دهند که نامهای کوتاه میشوند یا خیر.
لیست API
هنگامی که یک نمونه از Home
ایجاد می شود، API های ساختار زیر از طریق آن قابل دسترسی هستند:
API | توضیحات |
---|---|
devices() | دریافت همه دستگاهها برای این حساب. |
device(id:) | یک Publisher برای دستگاه مشخصی دریافت کنید که وضعیت فعلی و دوباره در هر بهروزرسانی وضعیت آینده را منتشر میکند. |
structures() | تمام ساختارهای موجود در حساب Google را دریافت کنید. یک Query<Structure> را برمی گرداند که گزینه های بازیابی و فیلتر بیشتر را ارائه می دهد. |
structure(id:) | ساختار را با شناسه منطبق دریافت کنید. |
rooms() | همه اتاقها را در حساب Google دریافت کنید. یک Query<strRoom> را برمی گرداند که گزینه های بازیابی و فیلتر بیشتر را ارائه می دهد. |
room(id:) | یک Publisher برای اتاق مشخصی دریافت کنید که وضعیت فعلی و دوباره در هر بهروزرسانی وضعیت آینده را منتشر میکند. |
Structure
دارای API های زیر است:
API | توضیحات |
---|---|
deleteRoom(id:) | اتاقی با شناسه اتاق را حذف کنید. |
id | شناسه سیستم منحصر به فرد سازه. |
move(device:, to:) | یک دستگاه را به اتاق دیگری در ساختار منتقل کنید. |
move(device:, to:) | دستگاه با شناسه داده شده را به اتاق دارای شناسه داده شده منتقل کنید. |
move(devices:, to:) | دستگاه های داده شده را به اتاق داده شده منتقل می کند. |
move(devices:, to:) | دستگاه های دارای شناسه داده شده را به اتاق دارای شناسه داده شده منتقل می کند. |
name | نام ساختار ارائه شده توسط کاربر. |
Room
دارای API های زیر است:
API | توضیحات |
---|---|
id | شناسه سیستم منحصر به فرد اتاق. |
name | نام اتاق ارائه شده توسط کاربر. |
structureID | شناسه سیستم منحصر به فرد ساختاری که اتاق به آن تعلق دارد. |