Structure API di Android

Structure API dapat diakses melalui Home API untuk Android. Impor paket ini ke dalam aplikasi Anda:

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

Penanganan error

Setiap metode di Home API dapat memunculkan HomeException, jadi sebaiknya gunakan blok try-catch untuk menangkap HomeException pada semua panggilan.

Saat menangani HomeException, periksa kolom code dan message untuk mengetahui apa yang salah.

Setiap pengecualian yang tidak ditangani akan menyebabkan aplikasi Anda error.

Untuk mengetahui informasi selengkapnya, lihat Penanganan error.

Contoh panggilan

Mendapatkan daftar struktur

Setelah diinisialisasi, panggilan structures() akan menampilkan Flow struktur yang dapat diakses oleh Anda:

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

structures() API adalah alur yang mungkin tidak langsung menampilkan daftar struktur yang valid. Jika aplikasi Anda reaktif dan berlangganan alur tersebut untuk mendorong UI, daftar struktur yang valid pada akhirnya akan ditampilkan. Ada situasi lain saat daftar struktur kosong dapat ditampilkan, misalnya jika konektivitas ponsel pengguna terputus atau jika pengguna telah mencabut izin ke aplikasi Anda. Anda harus memastikan untuk menangani kasus ini di aplikasi Anda.

Atau, jika pemrograman imperatif sangat diperlukan, bukan pemrograman reaktif, operator alur terminal dapat digunakan:

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

Panggilan ini menunggu daftar struktur yang valid masuk melalui alur dan berakhir jika daftar tidak diterima dalam waktu tunggu yang ditetapkan aplikasi.

Mendapatkan properti struktur

Dengan daftar struktur yang ada, Anda dapat mengakses propertinya:

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

Menemukan struktur berdasarkan nama

Jika mengetahui nama struktur, Anda juga dapat mengaksesnya menggunakan properti name:

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

Dari sana, properti, ruangan, dan perangkat untuk setiap struktur dapat diakses.

Bekerja dengan beberapa struktur

Untuk menggunakan lebih dari satu struktur, dapatkan referensi terpisah untuk setiap struktur:

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
}

Mendapatkan daftar ruang

Dengan struktur di tangan, Anda bisa mendapatkan daftar ruang dan mengakses properti untuk ruang tersebut:

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

Buat ruang

Untuk membuat ruangan baru:

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

Menghapus ruangan

Atau, Anda dapat menghapus ruang:

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

Anda juga dapat menghapus kamar hanya dengan ID:

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

Jika ruangan dengan perangkat dihapus, perangkat akan tetap berada dalam struktur, tetapi tidak lagi ditetapkan ke ruangan.

Memindahkan perangkat ke ruangan lain

Setelah memiliki struktur, Anda dapat memindahkan perangkat ke ruangan lain dalam struktur tersebut:

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

Jika hanya memiliki ID perangkat dan ruangan, Anda juga dapat memindahkan perangkat:

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

Mengubah nama ruangan

Panggil metode setName() untuk mengubah nama ruangan:

livingRoom.setName("Living Room")

Nama akan dipangkas jika melebihi batas 60 poin kode Unicode (karakter) dan tidak ada error yang akan ditampilkan. Developer bertanggung jawab untuk menangani nama panjang dan, misalnya, dapat memutuskan apakah mereka ingin memberi tahu pengguna bahwa nama akan dipangkas.

Otomatisasi

Titik entri ke Automation API adalah melalui struktur. Untuk mempelajari lebih lanjut Otomatisasi di Home API, lihat Ringkasan Automation API di Android.

Daftar API

Setelah instance Home dibuat, API Struktur berikut dapat diakses melalui instance tersebut:

API Deskripsi
structures() Mendapatkan semua struktur di Akun Google. Menampilkan HomeObjectsFlow yang menyediakan opsi pengambilan dan pemfilteran lebih lanjut.

Setelah Anda memiliki Structure, API berikut dapat diakses melalui Structure tersebut:

API Deskripsi
automations() Mencantumkan semua otomatisasi yang termasuk dalam struktur. Hanya otomatisasi yang dibuat melalui Home API yang ditampilkan.
createAutomation(automation) Buat instance otomatisasi untuk struktur.
createRoom(name) Buat ruangan dengan nama yang diberikan pengguna.
deleteAutomation(automationId) Menghapus instance otomatisasi menurut ID-nya.
deleteRoom(roomId) Menghapus ruang dengan ID ruang.
devices() Mendapatkan semua perangkat dalam struktur. Menampilkan nilai HomeObjectsFlow.
getAutomation(automationId) Mendapatkan instance otomatisasi berdasarkan ID-nya.
getSourceConnectivity(trait) Mendapatkan metadata untuk ciri tertentu. Menampilkan nilai SourceConnectivity.
has(trait) Periksa apakah trait yang diminta saat ini didukung oleh perangkat.
id ID sistem unik struktur.
moveDevicesToRoom(roomId, deviceIds) Pindahkan perangkat ke ID ruangan yang berbeda dalam struktur.
name Nama struktur yang diberikan pengguna.
rooms() Dapatkan semua ruangan dalam struktur. Menampilkan nilai HomeObjectsFlow.
trait(trait) Mendapatkan ringkasan atribut sifat saat ini.

Beberapa API umum (seperti devices(), id, dan name) juga tersedia untuk Room.