Estruturar APIs no Android

As APIs de estrutura podem ser acessadas pelas APIs Home para Android. Importe estes pacotes para seu app:

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

Tratamento de erros

Qualquer método nas APIs Home pode gerar um HomeException. Por isso, recomendamos usar um bloco try-catch para capturar HomeException em todas as chamadas.

Ao processar HomeException, verifique os campos code e message para saber o que deu errado.

Qualquer exceção não processada vai resultar em falha no app.

Para mais informações, consulte Tratamento de erros.

Exemplos de chamadas

Receber uma lista de estruturas

Depois de inicializada, uma chamada structures() retorna um fluxo de estruturas acessíveis a você:

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

A API structures() é um fluxo que pode não retornar imediatamente uma lista válida de estruturas. Se o app for reativo e se inscrever nesse fluxo para acionar a interface, uma lista válida de estruturas será retornada. Há outras situações em que uma lista de estruturas vazia pode ser retornada, por exemplo, se o smartphone do usuário perder a conectividade ou se ele revogar as permissões do seu app. Não se esqueça de processar esses casos no seu app.

Como alternativa, se a programação imperativa for estritamente necessária em vez da programação reativa, use um operador de fluxo terminal:

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

Essa chamada aguarda uma lista válida de estruturas passar pelo fluxo e expira se a lista não for recebida dentro de um tempo limite designado pelo app.

Receber propriedades de estrutura

Com a lista de estruturas em mãos, você pode acessar as propriedades delas:

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

Encontrar uma estrutura pelo nome

Se você souber o nome de uma estrutura, também poderá acessá-la usando a propriedade name:

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

A partir daí, é possível acessar propriedades, cômodos e dispositivos de cada estrutura.

Trabalhar com várias estruturas

Para usar mais de uma estrutura, receba uma referência separada para cada uma delas:

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
}

Receber uma lista de salas

Com uma estrutura em mãos, você pode receber uma lista de salas e acessar as propriedades delas:

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

Criar uma sala

Para criar um novo ambiente:

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

Excluir um ambiente

Ou, se preferir, exclua uma sala:

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

Você também pode excluir uma sala apenas com um ID:

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

Se um ambiente com dispositivos for excluído, os dispositivos ainda estarão na estrutura, mas não atribuídos a um ambiente.

Mover dispositivos para outro ambiente

Depois de criar uma estrutura, você pode mover os dispositivos para outro ambiente dentro dela:

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

Se você tiver apenas os códigos do dispositivo e do ambiente, também poderá mover os dispositivos:

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

Mudar o nome de um ambiente

Chame o método setName() para mudar o nome de um ambiente:

livingRoom.setName("Living Room")

Os nomes serão truncados se excederem o limite de 60 pontos de código Unicode (caracteres), e nenhum erro será gerado. Os desenvolvedores são responsáveis por processar nomes longos e, por exemplo, podem decidir se querem informar aos usuários que os nomes serão truncados.

Automações

O ponto de entrada da API Automation é uma estrutura. Para saber mais sobre as automações nas APIs Home, consulte Visão geral da API Automation no Android.

Lista de APIs

Depois que uma instância de Home é criada, as seguintes APIs de estrutura ficam acessíveis por ela:

API Descrição
structures() Recebe todas as estruturas na Conta do Google. Retorna um HomeObjectsFlow que oferece mais opções de recuperação e filtragem.

Depois de ter um Structure, as seguintes APIs poderão ser acessadas por ele:

API Descrição
automations() Liste todas as automações que pertencem à estrutura. Somente as automações criadas pelas APIs Home são retornadas.
createAutomation(automation) Cria uma instância de automação para uma estrutura.
createRoom(name) Cria uma sala com o nome fornecido pelo usuário.
deleteAutomation(automationId) Exclui uma instância de automação pelo ID.
deleteRoom(roomId) Exclua uma sala com o ID dela.
devices() Receba todos os dispositivos na estrutura. Retorna um HomeObjectsFlow.
getAutomation(automationId) Recebe uma instância de automação pelo ID.
getSourceConnectivity(trait) Recebe metadados de uma característica específica. Retorna um SourceConnectivity.
has(trait) Verifique se a característica solicitada é compatível com o dispositivo.
id O ID exclusivo do sistema da estrutura.
moveDevicesToRoom(roomId, deviceIds) Mova os dispositivos para um ID de ambiente diferente na estrutura.
name O nome da estrutura fornecido pelo usuário.
rooms() Receba todos os quartos da estrutura. Retorna um HomeObjectsFlow.
trait(trait) Receba um snapshot atual dos atributos de traço.

Algumas APIs comuns (como devices(), id e name) também estão disponíveis para um Room.