Structure API'lere Android için Home API'ler üzerinden erişilebilir. Aşağıdaki paketleri uygulamanıza aktarın:
import com.google.home.Home
import com.google.home.Id
import com.google.home.Structure
Hata işleme
Ev API'lerindeki herhangi bir yöntem
HomeException oluşturabilir. Bu nedenle, tüm çağrılarda HomeException'ı yakalamak için try-catch bloğunu kullanmanızı öneririz.
HomeException ile ilgili işlem yaparken neyin yanlış gittiğini öğrenmek için
error.code ve
error.message alanlarını kontrol edin. Alt hata kodları da olabilir. Bu nedenle,
getSubErrorCodes() yöntemini çağırın ve sonucu kontrol edin.
İşlenmemiş istisnalar, uygulamanızın kilitlenmesine neden olur.
Daha fazla bilgi için Hata işleme bölümüne bakın.
Örnek görüşmeler
Yapıların listesini alma
Başlatıldıktan sonra structures() araması, erişebileceğiniz bir yapı Akışı döndürür:
// 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, geçerli bir yapı listesini hemen döndürmeyebilecek bir akıştır. Uygulamanız reaktifse ve kullanıcı arayüzünü yönlendirmek için bu akışa abone oluyorsa sonunda geçerli bir yapı listesi döndürülmelidir.
Boş bir yapı listesinin döndürülebileceği başka durumlar da vardır. Örneğin, kullanıcının telefonunun bağlantısı kesilirse veya kullanıcı uygulamanızın izinlerini iptal ederse. Bu durumları uygulamanızda ele aldığınızdan emin olmalısınız.
Alternatif olarak, reaktif programlama yerine zorunlu programlama kesinlikle gerekiyorsa bir terminal akış operatörü kullanılabilir:
val everyStructure = withTimeout(5000) { home.structures().first { it.isNotEmpty() } }
Bu çağrı, akıştan geçerli bir yapı listesinin gelmesini bekler ve liste, uygulamada belirtilen zaman aşımı süresi içinde alınmazsa zaman aşımına uğrar.
Yapı özelliklerini alma
Elinizde yapıların listesi varken özelliklerine erişmek için:
// 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}")
Yapıları ada göre bulma
Bir yapının adını biliyorsanız name özelliğini kullanarak da erişebilirsiniz:
val myHome = home.structures().list().first { it.name == "My home" }
Buradan her yapı için mülklere, odalara ve cihazlara erişilebilir.
Birden fazla yapıyla çalışma
Birden fazla yapı kullanmak için her yapıya ayrı bir referans alın:
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 }
Oda listesini alma
Elinizde bir yapı olduğunda odaların listesini alabilir ve özelliklerine erişebilirsiniz:
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}")
Oda oluştur
Yeni oda oluşturmak için:
val testName = "Test Room Name" val newRoom: Room = structure.createRoom(testName)
Oda silme
Alternatif olarak, bir odayı silebilirsiniz:
val roomToDelete = structure.rooms().list().filter { it.name == "room_id1" }.firstOrNull() structure.deleteRoom(roomToDelete!!)
Ayrıca, yalnızca kimlik kullanarak da oda silebilirsiniz:
val roomToDelete1 = allRooms.filter { it.id == testRoomId }.firstOrNull() structure.deleteRoom(roomToDelete1!!)
Cihaz içeren bir oda silinirse cihazlar yapıda kalmaya devam eder ancak artık bir odaya atanmaz.
Cihazları farklı bir odaya taşıma
Bir yapı oluşturduktan sonra cihazları bu yapıdaki farklı bir odaya taşıyabilirsiniz:
val room2 = structure.rooms().get(Id("room_id_other_structure")) val device1 = structure.devices().get(Id("device_id1")) structure.moveDevicesToRoom(room2!!, listOf(device1!!))
Yalnızca cihaz ve oda kimlikleriniz varsa cihazları da taşıyabilirsiniz:
structure.moveDevicesToRoom(Id("room_id_other_structure"), listOf(Id("device_id1")))
Odanın adını değiştirme
Bir odanın adını değiştirmek için setName() yöntemini çağırın:
livingRoom.setName("Living Room")
Adlar, 60 Unicode kod noktası (karakter) sınırını aşarsa kesilir ve hata verilmez. Geliştiriciler, uzun adları işlemeyle sorumludur ve örneğin, adların kısaltılacağı konusunda kullanıcıları bilgilendirmek isteyip istemediklerine karar verebilirler.
Otomasyonlar
Automation API'ye giriş noktası bir yapı aracılığıyla olur. Home API'lerindeki otomasyonlar hakkında daha fazla bilgi edinmek için Android'de Automation API'ye genel bakış başlıklı makaleyi inceleyin.
API listesi
Home örneği oluşturulduktan sonra aşağıdaki Yapı API'lerine bu örnek üzerinden erişilebilir:
| API | Açıklama |
|---|---|
structures() |
Google Hesabı'ndaki tüm yapıları alın. Daha fazla alma ve filtreleme seçeneği sunan bir HomeObjectsFlow döndürür. |
Structure aldıktan sonra aşağıdaki API'lere bu jeton aracılığıyla erişebilirsiniz:
| API | Açıklama |
|---|---|
automations() |
Yapıya ait tüm otomasyonları listeleyin. Yalnızca Home API'leri aracılığıyla oluşturulan otomasyonlar döndürülür. |
createAutomation(automation) |
Bir yapı için otomasyon örneği oluşturun. |
createRoom(name) |
Kullanıcının verdiği adla bir oda oluşturun. |
deleteAutomation(automationId) |
Otomasyon örneğini kimliğine göre silin. |
deleteRoom(roomId) |
Oda kimliğiyle odayı silin. |
devices() |
Yapıdaki tüm cihazları alma HomeObjectsFlow değerini döndürür. |
getAutomation(automationId) |
Kimliğine göre bir otomasyon örneği alın. |
getSourceConnectivity(trait) |
Belirli bir özellik için meta verileri alma SourceConnectivity değerini döndürür. |
has(trait) |
İstenen özelliğin cihaz tarafından desteklenip desteklenmediğini kontrol edin. |
id |
Yapının benzersiz sistem kimliği. |
moveDevicesToRoom(roomId, deviceIds) |
Cihazları yapıdaki farklı bir oda kimliğine taşıma |
name |
Yapının kullanıcı tarafından sağlanan adı. |
rooms() |
Yapıdaki tüm odaları alın. HomeObjectsFlow değerini döndürür. |
trait(trait) |
Özelliklerin mevcut anlık görüntüsünü alın. |
Bazı yaygın API'ler (ör. devices(), id ve name) Room için de kullanılabilir.