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

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

Для работы с API-интерфейсами Structure сначала импортируйте пакет GoogleHomeSDK в свое приложение:

import GoogleHomeSDK

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

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

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

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

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

Структура API

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

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

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

API Описание
stream() Возвращает Publisher , который выпускает каждый объект по отдельности по мере внесения изменений.
batched() Возвращает Publisher , который выдает текущий результат как Set of objects. Каждый выданный 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
}

Изменить название комнаты

Вызовите метод setName(_:) чтобы изменить название комнаты:

let updatedRoom = try await theRoom.setName("new room name")

При изменении названия комнаты исходная структура Room остается прежней, а изменение отражается в возвращаемом обновленном объекте Room .

список API

После создания экземпляра Home через него становятся доступны следующие API-интерфейсы Structure:

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