API de estructura

Se puede acceder a las APIs de Structure a través de las APIs de Home. Importa estos paquetes a tu app:

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

Manejo de errores

Cualquier método de las APIs de Home puede generar una HomeException, por lo que te recomendamos que uses un bloque try-catch para capturar HomeException en todas las llamadas.

Cuando controles HomeException, verifica sus campos code y message para saber qué salió mal.

Cualquier excepción no controlada hará que la app falle.

Para obtener más información, consulta Manejo de errores.

Llamadas de muestra

Obtén una lista de estructuras

Una vez inicializada, una llamada a structures() muestra un flujo de estructuras al que puedes acceder:

// 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()

La API de structures() es un flujo que podría no mostrar de inmediato una lista válida de estructuras. Si tu app es reactiva y se suscribe a ese flujo para controlar la IU, se debería mostrar una lista válida de estructuras. Hay otras situaciones en las que se podría mostrar una lista de estructuras vacía, por ejemplo, si el teléfono del usuario pierde la conectividad o si el usuario revocó los permisos de tu app. Asegúrate de controlar estos casos en tu app.

Como alternativa, si se requiere en gran medida la programación imperativa en lugar de la programación reactiva, se puede usar un operador de flujo de terminal:

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

Esta llamada espera a que una lista válida de estructuras llegue a través del flujo y se agota si la lista no se recibe dentro de un tiempo de espera designado por la app.

Cómo obtener propiedades de la estructura

Con la lista de estructuras en mano, puedes acceder a sus propiedades:

// 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}")

Busca una estructura por nombre

Si conoces el nombre de una estructura, también puedes acceder a ella con la propiedad name:

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

Desde allí, se puede acceder a las propiedades, las habitaciones y los dispositivos de cada estructura.

Cómo trabajar con varias estructuras

Para usar más de una estructura, obtén una referencia independiente para cada una:

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
}

Obtén una lista de salas

Con una estructura en mano, puedes obtener una lista de salas y acceder a sus propiedades:

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}")

Crear una sala

Para crear una habitación nueva, sigue estos pasos:

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

Cómo borrar una habitación

También puedes borrar una sala de las siguientes maneras:

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

También puedes borrar una sala con solo un ID:

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

Si se borra una sala con dispositivos, estos seguirán en la estructura, pero ya no estarán asignados a una sala.

Cómo mover dispositivos a otra habitación

Una vez que tengas una estructura, podrás mover dispositivos a otra habitación dentro de esa estructura:

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

Si solo tienes los IDs de los dispositivos y las habitaciones, también puedes mover dispositivos de la siguiente manera:

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

Automatizaciones

El punto de entrada a la API de Automation es a través de una estructura. Para obtener más información sobre las automatizaciones en las APIs de Home, consulta Cómo diseñar una automatización.

Lista de APIs

Una vez que se crea una instancia de Home, se puede acceder a las siguientes APIs de Structure a través de ella:

API Descripción
structures() Obtén todas las estructuras de la Cuenta de Google. Devuelve un HomeObjectsFlow que proporciona más opciones de recuperación y filtrado.

Una vez que tengas un Structure, podrás acceder a las siguientes APIs:

API Descripción
automations() Enumera todas las automatizaciones que pertenecen a la estructura. Solo se muestran las automatizaciones creadas a través de las APIs de Home.
createAutomation(automation) Crea una instancia de automatización para una estructura.
createRoom(name) Crea una sala con el nombre que el usuario proporcionó.
deleteAutomation(automationId) Borra una instancia de automatización por su ID.
deleteRoom(roomId) Borrar una habitación con el ID de la habitación
devices() Obtén todos los dispositivos de la estructura. Muestra un HomeObjectsFlow.
getAutomation(automationId) Obtén una instancia de automatización por su ID.
getSourceConnectivity(trait) Obtén metadatos de un atributo en particular. Muestra un SourceConnectivity.
has(trait) Comprueba si el dispositivo admite el atributo solicitado actual.
id El ID de sistema único de la estructura.
moveDevicesToRoom(roomId, deviceIds) Mover los dispositivos a un ID de habitación diferente en la estructura
name Es el nombre de la estructura que proporciona el usuario.
rooms() Obtén todas las habitaciones de la estructura. Muestra un HomeObjectsFlow.
trait(trait) Obtén un resumen actual de los atributos de los rasgos.

Algunas APIs comunes (como devices(), id y name) también están disponibles para un Room.