Доступ к структурным 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
.