Structure API'lerine iOS için Home API'leri üzerinden erişilebilir.
Yapı API'leriyle ç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 bir do-catch
bloğu kullanmanızı öneririz.
HomeError
ile çalışırken neyin yanlış gittiğini öğrenmek için code
ve message
alanlarını kontrol edin.
İşlenmemiş hatalar, uygulamanızın kilitlenmesine neden olur.
Daha fazla bilgi için Hata işleme bölümüne bakın.
Structure API
Home
, ana sayfa grafiğini temsil eder ve Structure API'nin giriş noktasıdır.
Yapılar, odalar ve cihazlara referanslar sağlar.
Structure
, Ana Sayfa grafınızdaki bir yapıyı temsil eder. id
ve name
gibi yapı meta verilerine erişim sağlar.
Hesabınızdaki tüm yapıları görmek için structures()
simgesini kullanın. Yapılar, verilerini kullanmanın çeşitli yollarını sunan bir Query
biçiminde döndürülür:
API | Açıklama |
---|---|
stream() |
Değişiklik yapıldıkça her nesneyi ayrı ayrı yayınlayan bir Publisher döndürür. |
batched() |
Geçerli sonucu bir nesne Set olarak yayınlayan bir Publisher döndürür. Yayınlanan her Set , nesne grafiğinin mevcut durumunu temsil eder. |
list() |
Geçerli sonucu bir nesne Set olarak döndürür. |
structures().list()
çağrısı, geçerli bir yapı grubunu hemen döndürmeyebilir. Uygulamanız reaktifse ve kullanıcı arayüzünü yönlendirmek için tüm yapı değişikliklerine abone olmak üzere stream()
'yi çağırıyorsa sonunda geçerli bir yapı listesi döndürülür. Boş bir yapı listesinin döndürülebileceği başka durumlar da vardır (ör. kullanıcının telefonu bağlantıyı kaybederse veya kullanıcı uygulamanıza yönelik izinleri iptal ederse). Bu durumları uygulamanızda ele almanız gerekir.
@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 yapı çağrıları
Bir yapı grubu alma
Query<Structure>
üzerinde list()
ç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()
Etkileşimli bir uygulama tasarlarken ana sayfa grafiği değiştiğinde otomatik olarak veri ürettikleri için list()
yerine batched()
ve stream()
çağrılarını kullanmak istersiniz.
Yapı özelliklerini alma
Elinizdeki yapı listesini kullanarak bu yapıların ö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) ")
Bir yapıyı ada göre bulma
Bir yapının adını biliyorsanız name
özelliğini kullanarak da bu yapıya 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ının mülkleri, odaları ve cihazlarına erişebilirsiniz.
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 cihaz grubu içerir. Bir oda her zaman bir yapının parçasıdır ve bir yapıda birden fazla oda bulunabilir. Bir odanın yapıdan kaldırılması, o odadaki cihazların yapıdan kaldırılmasını sağlamaz. Ancak oda silinirse o odadaki cihazların ataması kaldırılır.
Hesaptaki tüm odaları almak için Home.rooms()
'i, her odada ilgili cihazları görüntülemek 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 Room aramaları
Oda listesini alma
Home
sınıfını kullanarak odaların listesini alabilir ve bu odalara ait özelliklere 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
'te 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!!)
Odaları kimliklerini 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 kalır ancak artık bir odaya atanmaz.
Cihazları farklı bir odaya taşıma
Structure
, cihazları farklı odalara taşımanıza da olanak tanır:
do { try await structure.move(device: light, to: room) } catch let error as HomeError { // Code for handling the exception }
API listesi
Home
örneği oluşturulduktan sonra aşağıdaki yapı API'lerine bu örnek üzerinden erişilebilir:
API | Açıklama |
---|---|
devices() |
Bu hesap tarafından görülebilen tüm cihazları görün. |
device(id:) |
Belirli bir cihaz için mevcut durumu yayınlayan ve gelecekteki tüm durum güncellemelerinde tekrar yayınlayan bir Publisher alın. |
structures() |
Google Hesabı'ndaki tüm yapıları alın. Daha fazla getirme 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 getirme ve filtreleme seçeneği sunan bir Query<strRoom> döndürür. |
room(id:) |
Belirtilen bir oda için mevcut durumu yayınlayan ve gelecekteki durum güncellemelerinde tekrar yayınlayan bir Publisher alın. |
Structure
aşağıdaki API'lere sahiptir:
API | Açıklama |
---|---|
deleteRoom(id:) |
Oda kimliğiyle bir odayı silin. |
id |
Yapının benzersiz sistem kimliği. |
move(device:, to:) |
Bir cihazı yapıdaki farklı bir odaya 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 |
Odanın kullanıcı tarafından sağlanan adı. |
structureID |
Odanın ait olduğu yapının benzersiz sistem kimliği. |