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
Home API'lerindeki tüm yöntemler HomeException
istisnası oluşturabilir. Bu nedenle, tüm çağrılarda HomeException
istisnasını yakalamak için try-catch
bloğu kullanmanızı öneririz.
HomeException
işlenirken neyin yanlış gittiğini öğrenmek için code
ve message
alanlarını 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 olmanız gerekir.
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şebilirsiniz:
// 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 bu odaların ö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 bir oda oluşturmak için:
val testName = "Test Room Name" val newRoom: Room = structure.createRoom(testName)
Oda silme
Alternatif olarak, bir odayı şu şekilde de 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ı şu şekilde de 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'lerdeki 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 oda oluşturun. |
deleteAutomation(automationId) |
Otomasyon örneğini kimliğine göre silin. |
deleteRoom(roomId) |
Oda kimliğini kullanarak 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.