API per la struttura

È possibile accedere alle API Structure tramite le API Home. Importa questi pacchetti nella tua app:

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

Gestione degli errori

Qualsiasi metodo nelle API Home può generare un HomeException, pertanto ti consigliamo di utilizzare un blocco try-catch per intercettare HomeException in tutte le chiamate.

Quando gestisci HomeException, controlla i campi code e message per scoprire cosa è andato storto.

Eventuali eccezioni non gestite causeranno l'arresto anomalo dell'app.

Per ulteriori informazioni, consulta la sezione Gestione degli errori.

Chiamate di esempio

Ottenere un elenco di strutture

Una volta inizializzata, una chiamata structures() restituisce un flusso di strutture a cui hai accesso:

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

L'API structures() è un flusso che potrebbe non restituire immediatamente un elenco valido di strutture. Se la tua app è reattiva e si iscrive a questo flusso per gestire l'interfaccia utente, dovrebbe essere restituito un elenco valido di strutture. Esistono altre situazioni in cui potrebbe essere restituito un elenco di strutture vuoto, ad esempio se lo smartphone dell'utente perde la connettività o se l'utente ha revocato le autorizzazioni per la tua app. Assicurati di gestire questi casi nella tua app.

In alternativa, se è fortemente richiesta la programmazione imperativa anziché la programmazione reattiva, è possibile utilizzare un operatore di flusso terminale:

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

Questa chiamata attende che venga visualizzato un elenco valido di strutture nel flusso e scade se l'elenco non viene ricevuto entro un timeout specificato dall'app.

Recupera le proprietà della struttura

Una volta ottenuto l'elenco delle strutture, puoi accedere alle relative proprietà:

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

Trovare una struttura per nome

Se conosci il nome di una struttura, puoi accedervi anche utilizzando la proprietà name:

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

Da qui, puoi accedere a proprietà, stanze e dispositivi di ogni struttura.

Lavorare con più strutture

Per utilizzare più di una struttura, ottieni un riferimento separato per ogni struttura:

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
}

Ottenere un elenco di stanze

Una volta scelta una struttura, puoi ottenere un elenco di stanze e accedere alle proprietà per loro:

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

Crea una stanza virtuale

Per creare una nuova stanza:

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

Eliminare una stanza

In alternativa, puoi eliminare una stanza:

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

Puoi anche eliminare una stanza solo con un ID:

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

Se una stanza con dispositivi viene eliminata, i dispositivi rimarranno nella struttura, ma non saranno più assegnati a una stanza.

Spostare i dispositivi in un'altra stanza

Una volta creata una casa, puoi spostare i dispositivi in un'altra stanza all'interno della casa:

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

Se hai solo gli ID dispositivo e stanza, puoi anche spostare i dispositivi:

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

Automazioni

Il punto di contatto dell'API Automation è una struttura. Per scoprire di più sulle automazioni nelle API Home, consulta Creare un'automazione.

elenco delle API

Una volta creata un'istanza di Home, tramite questa sono accessibili le seguenti API Structure:

API Descrizione
structures() Visualizza tutte le strutture nell'Account Google. Restituisce un HomeObjectsFlow che fornisce ulteriori opzioni di recupero e filtro.

Una volta ottenuto un Structure, potrai accedere alle seguenti API:

API Descrizione
automations() Elenca tutte le automazioni che appartengono alla struttura. Vengono restituite solo le automazioni create tramite le API Home.
createAutomation(automation) Crea un'istanza di automazione per una struttura.
createRoom(name) Crea una stanza con il nome assegnato dall'utente.
deleteAutomation(automationId) Elimina un'istanza di automazione in base al relativo ID.
deleteRoom(roomId) Elimina una stanza con l'ID stanza.
devices() Recupera tutti i dispositivi della struttura. Restituisce un HomeObjectsFlow.
getAutomation(automationId) Recupera un'istanza di automazione tramite il relativo ID.
getSourceConnectivity(trait) Ottieni i metadati per un determinato tratto. Restituisce un SourceConnectivity.
has(trait) Controlla se la caratteristica attualmente richiesta è supportata dal dispositivo.
id L'ID sistema univoco della struttura.
moveDevicesToRoom(roomId, deviceIds) Sposta i dispositivi in un ID stanza diverso nella struttura.
name Il nome della struttura fornito dall'utente.
rooms() Visualizza tutte le camere della struttura. Restituisce un HomeObjectsFlow.
trait(trait) Visualizza uno snapshot corrente degli attributi del tratto.

Alcune API comuni (ad esempio devices(), id e name) sono disponibili anche per un Room.