Structure API dapat diakses melalui Home API untuk iOS.
Untuk menggunakan Structure API, impor paket GoogleHomeSDK
terlebih dahulu ke
aplikasi Anda:
import GoogleHomeSDK
Penanganan error
Beberapa metode di Home API menampilkan
HomeError
, jadi sebaiknya gunakan blok do-catch
untuk menangkap
HomeError
pada panggilan tersebut.
Saat menangani HomeError
, periksa kolom code
dan message
untuk mempelajari masalah yang terjadi.
Error yang tidak ditangani akan menyebabkan aplikasi Anda error.
Untuk mengetahui informasi selengkapnya, lihat Penanganan error.
Structure API
Home
mewakili grafik Rumah, dan merupakan titik entri ke Structure API.
Data ini memberikan referensi ke struktur, ruangan, dan perangkat.
Structure
mewakili struktur di grafik Beranda Anda. Class ini menyediakan akses ke
metadata struktur seperti id
dan name
.
Gunakan structures()
untuk
mendapatkan semua struktur di akun Anda. Struktur ditampilkan dalam bentuk
Query
, yang menawarkan pilihan
cara menggunakan datanya:
API | Deskripsi |
---|---|
stream() |
Menampilkan Publisher yang memunculkan setiap objek satu per satu saat perubahan terjadi. |
batched() |
Menampilkan Publisher yang memunculkan hasil saat ini sebagai Set objek. Setiap Set yang dimunculkan mewakili status grafik objek saat ini. |
list() |
Menampilkan hasil saat ini sebagai Set objek. |
Panggilan structures().list()
mungkin tidak langsung menampilkan kumpulan struktur yang valid. Jika aplikasi Anda reaktif dan memanggil stream()
untuk berlangganan
semua perubahan struktur guna mendorong UI, daftar struktur yang valid
pada akhirnya akan ditampilkan. Ada situasi lain saat daftar struktur kosong
dapat ditampilkan, misalnya jika ponsel pengguna kehilangan konektivitas atau jika
pengguna telah mencabut izin ke aplikasi Anda. Anda harus memastikan untuk menangani kasus
ini di aplikasi Anda.
@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)
Contoh panggilan Struktur
Mendapatkan kumpulan struktur
Memanggil list()
pada Query<Structure>
akan menampilkan Set elemen terbaru:
// Get a stream of all structures accessible to the user let allStructuresChanges = try await self.home.structures() let allStructures = try? await allStructuresChanges.list()
Saat mendesain aplikasi reaktif, sebaiknya gunakan panggilan batched()
dan stream()
, bukan list()
, karena panggilan ini akan otomatis menghasilkan data saat grafik rumah berubah.
Mendapatkan properti struktur
Dengan daftar struktur yang ada, Anda dapat mengakses propertinya:
// 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) ")
Menemukan struktur berdasarkan nama
Jika mengetahui nama struktur, Anda juga dapat mengaksesnya menggunakan properti name
:
do { structure1 = try await home.structures().list().first(where: { $0.name == "Main House" }) } catch let error as HomeError { // Code for handling the exception }
Dari sana, properti, ruangan, dan perangkat untuk setiap struktur dapat diakses.
Menggunakan beberapa struktur
Untuk menggunakan lebih dari satu struktur, dapatkan referensi terpisah ke setiap struktur:
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 }
Kamar
Ruang berisi grup perangkat. Ruang selalu menjadi bagian dari struktur dan struktur dapat memiliki beberapa ruang. Menghapus ruangan dari struktur tidak akan menghapus perangkat di ruangan tersebut dari struktur. Namun, jika ruang dihapus, perangkat di ruang tersebut akan dibatalkan penetapannya.
Gunakan Home.rooms()
untuk
mengambil semua ruangan di akun, lalu gunakan roomID = device.roomID
untuk
menampilkan perangkat yang sesuai di setiap ruangan.
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)
Contoh panggilan Room
Mendapatkan daftar ruang
Dengan menggunakan class Home
, Anda bisa mendapatkan daftar ruangan dan mengakses
propertinya:
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) ")
Buat ruang
Untuk membuat ruangan baru di 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 }
Menghapus ruangan
Atau, Anda dapat menghapus ruang:
val roomToDelete = structure.rooms().list().filter { it.name == "room_id1" }.firstOrNull() structure.deleteRoom(roomToDelete!!)
Anda juga dapat menghapus ruangan menggunakan ID-nya:
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 } }
Jika ruangan dengan perangkat dihapus, perangkat akan tetap berada dalam struktur, tetapi tidak lagi ditetapkan ke ruangan.
Memindahkan perangkat ke ruangan lain
Structure
juga memungkinkan Anda memindahkan perangkat ke ruangan lain:
do { try await structure.move(device: light, to: room) } catch let error as HomeError { // Code for handling the exception }
Mengubah nama ruangan
Panggil metode
setName(_:)
untuk mengubah nama ruangan:
let updatedRoom = try await theRoom.setName("new room name")
Saat mengubah nama ruangan, struct Room
asli tetap sama dan
perubahan tersebut tercermin dalam objek Room
yang diperbarui dan ditampilkan.
Daftar API
Setelah instance
Home
dibuat, Structure API berikut dapat diakses melalui instance tersebut:
API | Deskripsi |
---|---|
devices() |
Mendapatkan semua perangkat yang dapat dilihat oleh akun ini. |
device(id:) |
Dapatkan Publisher untuk perangkat tertentu yang menampilkan status saat ini dan lagi pada pembaruan status mendatang. |
structures() |
Dapatkan semua struktur di Akun Google. Menampilkan Query<Structure> yang menyediakan opsi pengambilan dan pemfilteran lebih lanjut. |
structure(id:) |
Dapatkan struktur dengan ID yang cocok. |
rooms() |
Mendapatkan semua ruangan di Akun Google. Menampilkan Query<strRoom> yang menyediakan opsi pengambilan dan pemfilteran lebih lanjut. |
room(id:) |
Mendapatkan Publisher untuk ruangan tertentu yang menampilkan status saat ini dan lagi pada pembaruan status mendatang. |
Structure
memiliki API
berikut:
API | Deskripsi |
---|---|
deleteRoom(id:) |
Menghapus ruang dengan ID ruang. |
id |
ID sistem unik struktur. |
move(device:, to:) |
Pindahkan perangkat ke ruangan lain dalam struktur. |
move(device:, to:) |
Pindahkan perangkat dengan ID yang diberikan ke ruangan dengan ID yang diberikan. |
move(devices:, to:) |
Memindahkan perangkat yang diberikan ke ruangan yang diberikan. |
move(devices:, to:) |
Memindahkan perangkat dengan ID yang diberikan ke ruangan dengan ID yang diberikan. |
name |
Nama struktur yang diberikan pengguna. |
Room
memiliki API berikut:
API | Deskripsi |
---|---|
id |
ID sistem unik kamar. |
name |
Nama ruangan yang diberikan pengguna. |
structureID |
ID sistem unik dari struktur tempat kamar berada. |