Structure API'lere iOS için Home API'ler aracılığıyla erişilebilir.
Structure API'leri ile çalışmak için önce GoogleHomeSDK
paketini uygulamanıza aktarın:
import GoogleHomeSDK
Hata işleme
Home API'lerindeki bazı yöntemler HomeError
oluşturur. Bu nedenle, bu çağrılarda HomeError
yakalamak için do-catch
bloğu kullanmanızı öneririz.
HomeError
işlenirken neyin yanlış gittiğini öğrenmek için code
ve message
alanlarını kontrol edin.
İşlenmeyen hatalar, uygulamanızın kilitlenmesine neden olur.
Daha fazla bilgi için Hata işleme bölümüne bakın.
Structure API
Home
, Ev grafiğini temsil eder ve Structure API'nin giriş noktasıdır.
Yapılar, odalar ve cihazlarla ilgili referanslar sağlar.
Structure
, ev grafiğinizdeki bir yapıyı temsil eder. id
ve name
gibi yapı meta verilerine erişim sağlar.
Hesabınızdaki tüm yapıları almak için structures()
öğesini kullanın. Yapılar, verilerinin tüketilmesi için çeşitli seçenekler sunan bir Query
biçiminde döndürülür:
API | Açıklama |
---|---|
stream() |
Değişiklikler gerçekleşirken her nesneyi ayrı ayrı yayan bir Publisher döndürür. |
batched() |
Geçerli sonucu nesne Set olarak yayan bir Publisher döndürür. Her yayınlanan Set , nesne grafiğinin mevcut durumunu temsil eder. |
list() |
Geçerli sonucu bir Set nesne olarak döndürür. |
structures().list()
çağrısı, geçerli bir yapı kümesini hemen döndürmeyebilir. Uygulamanız tepkisel ise ve kullanıcı arayüzünü yönlendirmek için tüm yapı değişikliklerine abone olmak üzere stream()
işlevini çağırıyorsa sonunda geçerli bir yapı listesi döndürülmelidir. Boş bir yapı listesinin döndürülebileceği başka durumlar da vardır. Örneğin, kullanıcının telefonunun bağlantısı kesilirse veya kullanıcı, uygulamanızın izinlerini iptal ederse. Bu durumları uygulamanızda ele aldığınızdan emin olmalısınız.
@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)
Örnek Structure calls
Bir yapı grubu alma
list()
üzerinde Query<Structure>
çağrısı yapıldığında en son öğe grubu döndürülür:
// Get a stream of all structures accessible to the user let allStructuresChanges = try await self.home.structures() let allStructures = try? await allStructuresChanges.list()
Tepkisel bir uygulama tasarlarken batched()
ve stream()
çağrılarını kullanmak isteyeceksiniz. Çünkü bunlar, ana grafik değiştiğinde verileri otomatik olarak üretir.list()
Yapı özelliklerini alma
Elinizde yapıların listesi varken özelliklerine erişebilirsiniz:
// 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) ")
Yapıları ada göre bulma
Bir yapının adını biliyorsanız name
özelliğini kullanarak da erişebilirsiniz:
do { structure1 = try await home.structures().list().first(where: { $0.name == "Main House" }) } catch let error as HomeError { // Code for handling the exception }
Buradan her yapı için mülklere, odalara ve cihazlara erişilebilir.
Birden fazla yapıyla çalışma
Birden fazla yapı kullanmak için her yapıya ayrı bir referans alın:
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 }
Odalar
Bir oda, bir grup cihaz içerir. Bir oda her zaman bir yapının parçasıdır ve bir yapıda birden fazla oda olabilir. Bir yapının odadan kaldırılması, o odadaki cihazları yapıdan kaldırmaz. Ancak oda silinirse odadaki cihazların ataması kaldırılır.
Hesaptaki tüm odaları almak için Home.rooms()
, her odadaki ilgili cihazları göstermek için roomID = device.roomID
kullanın.
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)
Örnek oda aramaları
Oda listesini alma
Home
sınıfını kullanarak odaların listesini alabilir ve bu odaların özelliklerine erişebilirsiniz:
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) ")
Oda oluştur
Structure
içinde yeni bir oda oluşturmak için:
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 }
Oda silme
Alternatif olarak, bir odayı şu şekilde de silebilirsiniz:
val roomToDelete = structure.rooms().list().filter { it.name == "room_id1" }.firstOrNull() structure.deleteRoom(roomToDelete!!)
Ayrıca, bir odayı kimliğini kullanarak da silebilirsiniz:
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 } }
Cihaz içeren bir oda silinirse cihazlar yapıda kalmaya devam eder ancak artık bir odaya atanmaz.
Cihazları farklı bir odaya taşıma
Structure
simgesiyle cihazları farklı bir odaya da taşıyabilirsiniz:
do { try await structure.move(device: light, to: room) } catch let error as HomeError { // Code for handling the exception }
Odanın adını değiştirme
Bir odanın adını değiştirmek için setName(_:)
yöntemini çağırın:
let updatedRoom = try await theRoom.setName("new room name")
Bir odanın adı değiştirildiğinde orijinal Room
yapısı aynı kalır ve değişiklik, döndürülen güncellenmiş Room
nesnesine yansıtılır.
Adlar, 60 Unicode kod noktası (karakter) sınırını aşarsa kesilir ve hata verilmez. Geliştiriciler, uzun adları işlemeyle sorumludur ve örneğin, adların kısaltılacağı konusunda kullanıcıları bilgilendirmek isteyip istemediklerine karar verebilirler.
API listesi
Home
örneği oluşturulduktan sonra aşağıdaki Yapı API'lerine bu örnek üzerinden erişilebilir:
API | Açıklama |
---|---|
devices() |
Bu hesabın görebildiği tüm cihazları alın. |
device(id:) |
Belirli bir cihaz için mevcut durumu ve gelecekteki durum güncellemelerini yayan bir Publisher alın. |
structures() |
Google Hesabı'ndaki tüm yapıları alın. Daha fazla alma ve filtreleme seçeneği sunan bir Query<Structure> döndürür. |
structure(id:) |
Eşleşen kimliğe sahip yapıyı alın. |
rooms() |
Google Hesabı'ndaki tüm odaları alın. Daha fazla alma ve filtreleme seçeneği sunan bir Query<strRoom> döndürür. |
room(id:) |
Belirli bir oda için Publisher alın. Bu, mevcut durumu ve gelecekteki durum güncellemelerini yayınlar. |
Structure
aşağıdaki API'leri içerir:
API | Açıklama |
---|---|
deleteRoom(id:) |
Oda kimliğini kullanarak odayı silin. |
id |
Yapının benzersiz sistem kimliği. |
move(device:, to:) |
Cihazları yapının farklı bir odasına taşıma |
move(device:, to:) |
Belirtilen kimliğe sahip cihazı, belirtilen kimliğe sahip odaya taşıyın. |
move(devices:, to:) |
Belirtilen cihazları belirtilen odaya taşır. |
move(devices:, to:) |
Belirtilen kimliklere sahip cihazları, belirtilen kimliğe sahip odaya taşır. |
name |
Yapının kullanıcı tarafından sağlanan adı. |
Room
aşağıdaki API'lere sahiptir:
API | Açıklama |
---|---|
id |
Odanın benzersiz sistem kimliği. |
name |
Kullanıcı tarafından sağlanan oda adı. |
structureID |
Odanın ait olduğu yapının benzersiz sistem kimliği. |