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 code
i message
, 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()
, id
i name
) są też dostępne w przypadku Room
.