APIs strukturieren

Auf Gebäude-APIs kann über die Home APIs zugegriffen werden. Importieren Sie die folgenden Pakete in Ihre App:

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

Fehlerbehandlung

Bei jeder Methode in den Home APIs kann eine HomeException geworfen werden. Wir empfehlen daher, einen try-catch-Block zu verwenden, um HomeException bei allen Aufrufen zu fangen.

Prüfen Sie bei der Verarbeitung von HomeException die Felder code und message, um herauszufinden, was schiefgelaufen ist.

Alle nicht behandelten Ausnahmen führen zum Absturz Ihrer App.

Weitere Informationen finden Sie unter Fehlerbehandlung.

Beispielanrufe

Liste der Gebäude abrufen

Nach der Initialisierung gibt ein structures()-Aufruf einen Fluss von Strukturen zurück, auf die du zugreifen kannst:

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

Die structures() API ist ein Ablauf, der möglicherweise nicht sofort eine gültige Liste von Gebäuden zurückgibt. Wenn Ihre App reaktiv ist und diesen Ablauf abonniert, um die Benutzeroberfläche zu steuern, sollte schließlich eine gültige Liste der Gebäude zurückgegeben werden. Es gibt auch andere Situationen, in denen eine leere Strukturliste zurückgegeben werden kann, z. B. wenn die Verbindung des Smartphones des Nutzers unterbrochen wird oder der Nutzer die Berechtigungen für Ihre App widerrufen hat. Sie sollten diese Fälle in Ihrer App berücksichtigen.

Alternativ kann ein Terminalablaufoperator verwendet werden, wenn anstelle der reaktiven Programmierung eine imperative Programmierung erforderlich ist:

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

Bei diesem Aufruf wird gewartet, bis eine gültige Liste von Gebäuden über den Ablauf gesendet wird. Wenn die Liste nicht innerhalb des von der App festgelegten Zeitlimits empfangen wird, tritt ein Zeitüberschreitungsfehler auf.

Gebäudeeigenschaften abrufen

Mit der Liste der Gebäude können Sie auf die zugehörigen Properties zugreifen:

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

Gebäude nach Name suchen

Wenn du den Namen eines Gebäudes kennst, kannst du auch über das Attribut name darauf zugreifen:

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

Von dort aus können Sie auf Unterkünfte, Zimmer und Geräte für jedes Gebäude zugreifen.

Mit mehreren Strukturen arbeiten

Wenn Sie mehrere Strukturen verwenden möchten, müssen Sie für jede Struktur einen separaten Verweis abrufen:

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
}

Liste der Räume abrufen

Wenn Sie ein Gebäude ausgewählt haben, können Sie eine Liste der zugehörigen Räume abrufen und auf die zugehörigen Unterkünfte zugreifen:

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

Chatroom erstellen

So erstellen Sie einen neuen Raum:

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

Raum löschen

Alternativ können Sie einen Raum auch so löschen:

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

Sie können einen Raum auch nur mit einer ID löschen:

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

Wenn ein Raum mit Geräten gelöscht wird, befinden sich die Geräte weiterhin im Gebäude, sind aber keinem Raum mehr zugewiesen.

Geräte in einen anderen Raum verschieben

Sobald Sie ein Gebäude haben, können Sie Geräte in einen anderen Raum innerhalb dieses Gebäudes verschieben:

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

Wenn Sie nur Geräte- und Raum-IDs haben, können Sie Geräte auch so verschieben:

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

Automatisierungen

Der Einstiegspunkt in die Automation API ist eine Struktur. Weitere Informationen zu Automatisierungen in den Home APIs finden Sie unter Automatisierung entwerfen.

API-Liste

Sobald eine Instanz von Home erstellt wurde, sind über diese die folgenden Structure APIs zugänglich:

API Beschreibung
structures() Alle Strukturen im Google-Konto abrufen Gibt einen HomeObjectsFlow zurück, der weitere Abruf- und Filteroptionen bietet.

Sobald Sie eine Structure haben, können Sie über diese auf die folgenden APIs zugreifen:

API Beschreibung
automations() Listet alle Automatisierungen auf, die zum Gebäude gehören. Es werden nur Automatisierungen zurückgegeben, die über die Home APIs erstellt wurden.
createAutomation(automation) Erstellen Sie eine Automatisierungs-Instanz für ein Gebäude.
createRoom(name) Erstellen Sie einen Gruppenbereich mit dem vom Nutzer angegebenen Namen.
deleteAutomation(automationId) Automatisierungsinstanzen anhand ihrer ID löschen
deleteRoom(roomId) Löschen Sie einen Raum mit der Raum-ID.
devices() Alle Geräte im Gebäude abrufen Gibt ein HomeObjectsFlow zurück.
getAutomation(automationId) Eine Automatisierungs-Instanz anhand ihrer ID abrufen
getSourceConnectivity(trait) Metadaten für ein bestimmtes Merkmal abrufen Gibt ein SourceConnectivity zurück.
has(trait) Prüfen, ob das aktuell angeforderte Merkmal vom Gerät unterstützt wird
id Die eindeutige System-ID des Gebäudes.
moveDevicesToRoom(roomId, deviceIds) Verschieben Sie die Geräte in ein anderes Gebäude.
name Der vom Nutzer angegebene Name des Gebäudes.
rooms() Alle Zimmer im Gebäude abrufen Gibt ein HomeObjectsFlow zurück.
trait(trait) Aktuellen Snapshot der Merkmalsattribute abrufen

Einige gängige APIs wie devices(), id und name sind auch für ein Room verfügbar.