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

Доступ к структурным API можно получить через Home API. Импортируйте эти пакеты в свое приложение:

import com.google.home.Home
import com.google.home.Id
import com.google.home.Structure

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

Любой метод в Home API может вызвать HomeException , поэтому мы рекомендуем использовать блок try-catch для перехвата HomeException при всех вызовах.

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

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

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

Примеры звонков

Получить список структур

После инициализации вызов structures() возвращает поток доступных вам структур:

// Get a flow of all structures accessible to the user
val allStructuresFlow: HomeObjectsFlow<Structure> = home.structures()

// Calling list() on a HomeObjectsFlow returns the first Set of elements.
val allStructures: Set<Structure> = allStructuresFlow.list()

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

В качестве альтернативы, если вместо реактивного программирования настоятельно требуется императивное программирование, можно использовать оператор терминального потока:

val everyStructure = withTimeout(5000) { home.structures().first { it.isNotEmpty() } }

Этот вызов ожидает прохождения допустимого списка структур через поток и истекает время ожидания, если список не получен в течение времени ожидания, назначенного приложением.

Получить свойства структуры

Имея на руках список структур, вы можете получить доступ к их свойствам:

// Get a flow on a structure. Flow emits new values on structure metadata changes: name.
val structureFlow: Flow<Structure> = home.structures().itemFlow(myStructureId)

// Get a snapshot of the structure.
val structure: Structure = structureFlow.first()

// Get structure properties
println("id ${structure.id}")
println("name ${structure.name}")

Найти структуру по названию

Если вы знаете имя структуры, вы также можете получить к ней доступ, используя свойство name :

val myHome = home.structures().list().first { it.name == "My home" }

Отсюда доступны свойства, комнаты и устройства для каждой структуры.

Работа с несколькими структурами.

Чтобы использовать более одной структуры, получите отдельную ссылку на каждую структуру:

var structure1: Structure? = null
var structure2: Structure? = null

try {
  structure1 = home.structures().list().firstOrNull { it.name == "Main House" }
} catch (e: HomeException) {
  // Code for handling the exception
}
try {
  structure2 = home.structures().list().firstOrNull { it.name == "Guest Cottage" }
} catch (e: HomeException) {
  // Code for handling the exception
}

Получить список номеров

Имея структуру, вы можете получить список комнат и получить доступ к их свойствам:

val allRoomsFlow: HomeObjectsFlow<Room> = structure.rooms()
val allRooms: Set<Room> = allRoomsFlow.list()
val room: Room = allRooms.first()

println("id ${room.id}")
println("name ${room.name}")

Создать комнату

Чтобы создать новую комнату:

val testName = "Test Room Name"
val newRoom: Room = structure.createRoom(testName)

Удалить комнату

Или, как вариант, вы можете удалить комнату:

val roomToDelete = structure.rooms().list().filter { it.name == "room_id1" }.firstOrNull()
    structure.deleteRoom(roomToDelete!!)

Вы также можете удалить комнату, используя только идентификатор:

val roomToDelete1 = allRooms.filter { it.id == testRoomId }.firstOrNull()
structure.deleteRoom(roomToDelete1!!)

Если комната с устройствами будет удалена, устройства останутся в структуре, но больше не будут назначены комнате.

Перенесите устройства в другую комнату

Если у вас есть структура, вы можете перемещать устройства в другую комнату внутри этой структуры:

val room2 = structure.rooms().get(Id("room_id_other_structure"))
    val device1 = structure.devices().get(Id("device_id1"))
    structure.moveDevicesToRoom(room2!!, listOf(device1!!))

Если у вас есть только идентификаторы устройства и комнаты, вы также можете перемещать устройства:

structure.moveDevicesToRoom(Id("room_id_other_structure"), listOf(Id("device_id1")))

Автоматизация

Точка входа в API автоматизации осуществляется через структуру. Дополнительные сведения об автоматизации в API Home см. в статье Проектирование автоматизации .

Список API

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

API Описание
structures() Получите все структуры аккаунта Google. Возвращает HomeObjectsFlow , предоставляющий дополнительные параметры поиска и фильтрации.

Если у вас есть Structure , через нее будут доступны следующие API:

API Описание
automations() Перечислите все средства автоматизации, относящиеся к структуре. Возвращаются только средства автоматизации, созданные с помощью Home API.
createAutomation(automation) Создайте экземпляр автоматизации для структуры.
createRoom(name) Создайте комнату с именем, заданным пользователем.
deleteAutomation(automationId) Удалить экземпляр автоматизации по его идентификатору.
deleteRoom(roomId) Удалить комнату с идентификатором комнаты.
devices() Получите все устройства в структуре. Возвращает HomeObjectsFlow .
getAutomation(automationId) Получите экземпляр автоматизации по его идентификатору.
getSourceConnectivity(trait) Получите метаданные для определенного признака. Возвращает SourceConnectivity .
has(trait) Проверьте, поддерживается ли текущая запрошенная характеристика устройством.
id Уникальный системный идентификатор структуры.
moveDevicesToRoom(roomId, deviceIds) Переместите устройства в другой идентификатор комнаты в структуре.
name Предоставленное пользователем имя структуры.
rooms() Получите все комнаты в структуре. Возвращает HomeObjectsFlow .
trait(trait) Получите текущий снимок атрибутов признака.

Некоторые распространенные API (например, devices() , id и name ) также доступны для Room .