Структурные API на iOS

Доступ к структурным API можно получить через Home API для iOS.

Чтобы работать с API структуры, сначала импортируйте пакет GoogleHomeSDK в свое приложение:

import GoogleHomeSDK

Обработка ошибок

Некоторые методы в Home API выдают HomeError , поэтому мы рекомендуем использовать блок do-catch для перехвата HomeError при этих вызовах.

При обработке HomeError проверьте его code и поля message , чтобы узнать, что пошло не так.

Любые необработанные ошибки приведут к сбою вашего приложения.

Дополнительную информацию см. в разделе Обработка ошибок .

Структурный API

Home представляет собой домашний граф и является точкой входа в Structure API. Он предоставляет ссылки на конструкции, помещения и устройства.

Structure представляет собой структуру на вашем домашнем графике. Он обеспечивает доступ к метаданным структуры, таким как id и name .

Используйте structures() , чтобы получить все структуры в вашей учетной записи. Структуры возвращаются в форме Query , который предлагает выбор способов использования данных:

API Описание
stream() Возвращает Publisher , который отправляет каждый объект индивидуально по мере внесения изменений.
batched() Возвращает Publisher , который выдает текущий результат как Set объектов. Каждый излучаемый Set представляет текущее состояние графа объекта.
list() Возвращает текущий результат как Set объектов.

Вызов structures().list() может не сразу вернуть действительный набор структур. Если ваше приложение является реактивным и вызывает stream() , чтобы подписаться на все изменения структуры для управления пользовательским интерфейсом, в конечном итоге должен быть возвращен действительный список структур. Существуют и другие ситуации, когда может быть возвращен пустой список структур, например, если телефон пользователя теряет соединение или если пользователь отозвал разрешения для вашего приложения. Вы должны обязательно обрабатывать эти случаи в своем приложении.

@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
}

Список 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 Уникальный системный идентификатор структуры, к которой принадлежит помещение.