Interfejsy Structure API na Androidzie

Dostęp do interfejsów Structure API można uzyskać za pomocą interfejsów Home API na Androida. Zaimportuj te pakiety do aplikacji:

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

Obsługa błędów

Każda metoda w interfejsach Home API może zgłosić wyjątek HomeException, dlatego zalecamy używanie bloku try-catch do przechwytywania wyjątku HomeException we wszystkich wywołaniach.

Podczas obsługi HomeException sprawdź pola codemessage, aby dowiedzieć się, co poszło nie tak.

Wszelkie nieobsłużone wyjątki spowodują awarię aplikacji.

Więcej informacji znajdziesz w sekcji Obsługa błędów.

Przykładowe połączenia

Pobieranie listy struktur

Po zainicjowaniu wywołanie structures() zwraca dostępny dla Ciebie przepływ struktur:

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

Interfejs structures() API to proces, który może nie od razu zwracać prawidłową listę struktur. Jeśli Twoja aplikacja jest reaktywna i subskrybuje ten przepływ, aby sterować interfejsem, powinna ostatecznie zwrócić prawidłową listę struktur. Pusta lista struktur może zostać zwrócona w innych sytuacjach, np. gdy telefon użytkownika utraci połączenie lub gdy użytkownik cofnie uprawnienia aplikacji. Pamiętaj, aby obsłużyć te przypadki w swojej aplikacji.

Jeśli zamiast programowania reaktywnego konieczne jest programowanie imperatywne, można użyć operatora przepływu terminala:

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

To wywołanie czeka na prawidłową listę struktur, która ma się pojawić w przepływie, i przekracza limit czasu, jeśli lista nie zostanie odebrana w określonym przez aplikację limicie czasu.

Pobieranie właściwości struktury

Gdy masz już listę struktur, możesz uzyskać dostęp do ich właściwości:

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

Znajdź strukturę według nazwy

Jeśli znasz nazwę struktury, możesz też uzyskać do niej dostęp za pomocą właściwości name:

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

Stamtąd można uzyskać dostęp do usług, pomieszczeń i urządzeń w każdym domu.

Praca z wieloma strukturami

Aby użyć więcej niż jednej struktury, uzyskaj osobne odwołanie do każdej z nich:

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
}

Pobieranie listy pokoi

Mając strukturę, możesz uzyskać listę pokoi i dostęp do ich właściwości:

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

Utwórz pokój

Aby utworzyć nowe pomieszczenie:

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

Usuwanie pomieszczenia

Możesz też usunąć pokój:

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

Możesz też usunąć pokój, podając tylko jego identyfikator:

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

Jeśli usuniesz pomieszczenie z urządzeniami, urządzenia nadal będą w strukturze, ale nie będą już przypisane do pomieszczenia.

Przenoszenie urządzeń do innego pomieszczenia

Gdy masz już strukturę, możesz przenieść urządzenia do innego pomieszczenia w jej obrębie:

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

Jeśli masz tylko identyfikatory urządzeń i pomieszczeń, możesz też przenieść urządzenia:

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

Zmienianie nazwy pomieszczenia

Wywołaj metodę setName(), aby zmienić nazwę pokoju:

livingRoom.setName("Living Room")

Nazwy zostaną obcięte, jeśli przekroczą limit 60 punktów kodowych Unicode (znaków), i nie zostaną zgłoszone żadne błędy. Deweloperzy odpowiadają za obsługę długich nazw i mogą na przykład zdecydować, czy chcą informować użytkowników o tym, że nazwy będą skracane.

Automatyzacja

Punktem wejścia do interfejsu Automation API jest struktura. Więcej informacji o automatyzacjach w interfejsach Home API znajdziesz w artykule Omówienie interfejsu Automation API na Androidzie.

Lista interfejsów API

Po utworzeniu instancji Home można uzyskać dostęp do tych interfejsów API struktury:

Interfejs API Opis
structures() Pobierz wszystkie struktury na koncie Google. Zwraca obiekt HomeObjectsFlow, który udostępnia dodatkowe opcje pobierania i filtrowania.

Gdy uzyskasz Structure, możesz za jego pomocą uzyskać dostęp do tych interfejsów API:

Interfejs API Opis
automations() Wyświetl wszystkie automatyzacje należące do struktury. Zwracane są tylko automatyzacje utworzone za pomocą interfejsów Home API.
createAutomation(automation) Utwórz instancję automatyzacji dla struktury.
createRoom(name) Utwórz pokój o nazwie podanej przez użytkownika.
deleteAutomation(automationId) Usuń instancję automatyzacji według jej identyfikatora.
deleteRoom(roomId) Usuń pokój za pomocą identyfikatora pokoju.
devices() Pobierz wszystkie urządzenia w budynku. Zwraca wartość HomeObjectsFlow.
getAutomation(automationId) Pobierz instancję automatyzacji według jej identyfikatora.
getSourceConnectivity(trait) Pobierz metadane konkretnej cechy. Zwraca wartość SourceConnectivity.
has(trait) Sprawdź, czy bieżąca żądana cecha jest obsługiwana przez urządzenie.
id Unikalny identyfikator struktury w systemie.
moveDevicesToRoom(roomId, deviceIds) Przenoszenie urządzeń do innego identyfikatora pomieszczenia w budynku.
name Nazwa struktury podana przez użytkownika.
rooms() Pobierz wszystkie pokoje w obiekcie. Zwraca wartość HomeObjectsFlow.
trait(trait) Uzyskaj aktualny zrzut atrybutów cechy.

Niektóre popularne interfejsy API (np. devices(), idname) są też dostępne w przypadku Room.