iOS'te Structure API'leri

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.