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