Android पर Structure API

Android के लिए Home API के ज़रिए, स्ट्रक्चर API को ऐक्सेस किया जा सकता है. इन पैकेज को अपने ऐप्लिकेशन में इंपोर्ट करें:

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

गड़बड़ी ठीक करना

होम एपीआई में मौजूद कोई भी तरीका, HomeException को थ्रो कर सकता है. इसलिए, हमारा सुझाव है कि सभी कॉल पर HomeException को पकड़ने के लिए, try-catch ब्लॉक का इस्तेमाल करें.

HomeException को मैनेज करते समय, उसके error.code और error.message फ़ील्ड देखें. इससे आपको गड़बड़ी के बारे में पता चलेगा. इसमें सब-गड़बड़ी कोड भी हो सकते हैं. इसलिए, getSubErrorCodes() तरीके को कॉल करें और नतीजे देखें.

अगर किसी अपवाद को हैंडल नहीं किया जाता है, तो आपका ऐप्लिकेशन क्रैश हो जाएगा.

ज़्यादा जानकारी के लिए, गड़बड़ी ठीक करना लेख पढ़ें.

कॉल के सैंपल

स्ट्रक्चर की सूची पाना

शुरू होने के बाद, structures() कॉल से आपको ऐक्सेस किए जा सकने वाले स्ट्रक्चर का फ़्लो मिलता है:

// 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() एपीआई एक ऐसा फ़्लो है जो तुरंत स्ट्रक्चर की मान्य सूची नहीं दिखाता है. अगर आपका ऐप्लिकेशन, यूज़र इंटरफ़ेस (यूआई) को चलाने के लिए उस फ़्लो पर प्रतिक्रिया करता है और उसकी सदस्यता लेता है, तो स्ट्रक्चर की मान्य सूची आखिर में वापस कर दी जानी चाहिए. कुछ अन्य स्थितियों में भी, स्ट्रक्चर की खाली सूची दिख सकती है. उदाहरण के लिए, अगर उपयोगकर्ता के फ़ोन का इंटरनेट कनेक्शन बंद हो जाता है या अगर उपयोगकर्ता ने आपके ऐप्लिकेशन को दी गई अनुमतियां रद्द कर दी हैं. आपको अपने ऐप्लिकेशन में इन मामलों को हैंडल करना चाहिए.

इसके अलावा, अगर रिएक्टिव प्रोग्रामिंग के बजाय इंपरेटिव प्रोग्रामिंग का इस्तेमाल करना ज़रूरी है, तो टर्मिनल फ़्लो ऑपरेटर का इस्तेमाल किया जा सकता है:

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

यह कॉल, फ़्लो के ज़रिए स्ट्रक्चर की मान्य सूची मिलने का इंतज़ार करता है. अगर सूची, ऐप्लिकेशन के लिए तय किए गए टाइम आउट के अंदर नहीं मिलती है, तो यह कॉल टाइम आउट हो जाता है.

स्ट्रक्चर की प्रॉपर्टी पाना

स्ट्रक्चर की सूची की मदद से, इनके लिए प्रॉपर्टी ऐक्सेस की जा सकती हैं:

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

नाम के हिसाब से स्ट्रक्चर ढूंढना

अगर आपको किसी स्ट्रक्चर का नाम पता है, तो name प्रॉपर्टी का इस्तेमाल करके भी उसे ऐक्सेस किया जा सकता है:

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

यहां से, हर स्ट्रक्चर के लिए प्रॉपर्टी, कमरे, और डिवाइसों को ऐक्सेस किया जा सकता है.

एक से ज़्यादा स्ट्रक्चर के साथ काम करना

एक से ज़्यादा स्ट्रक्चर का इस्तेमाल करने के लिए, हर स्ट्रक्चर का अलग रेफ़रंस पाएं:

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
}

चैट रूम की सूची पाना

स्ट्रक्चर की मदद से, चैट रूम की सूची देखी जा सकती है. साथ ही, उनके लिए प्रॉपर्टी ऐक्सेस की जा सकती हैं:

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

चैट रूम बनाएं

नया रूम बनाने के लिए:

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

किसी रूम को मिटाना

इसके अलावा, चैट रूम को मिटाने के लिए:

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

सिर्फ़ आईडी का इस्तेमाल करके भी किसी रूम को मिटाया जा सकता है:

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

अगर डिवाइसों वाले किसी रूम को मिटा दिया जाता है, तो डिवाइस अब भी स्ट्रक्चर में मौजूद रहेंगे. हालांकि, उन्हें किसी रूम के लिए असाइन नहीं किया जाएगा.

डिवाइसों को किसी दूसरे कमरे में ले जाना

स्ट्रक्चर बनाने के बाद, डिवाइसों को उस स्ट्रक्चर के किसी दूसरे रूम में ट्रांसफ़र किया जा सकता है:

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

अगर आपके पास सिर्फ़ डिवाइस और कमरे के आईडी हैं, तो भी डिवाइसों को ट्रांसफ़र किया जा सकता है:

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

किसी रूम का नाम बदलना

किसी रूम का नाम बदलने के लिए, setName() तरीके को कॉल करें:

livingRoom.setName("Living Room")

अगर नाम में 60 यूनिकोड कोड पॉइंट (वर्ण) से ज़्यादा हैं, तो उन्हें छोटा कर दिया जाएगा. हालांकि, कोई गड़बड़ी नहीं दिखेगी. डेवलपर की यह ज़िम्मेदारी है कि वे लंबे नामों को मैनेज करें. उदाहरण के लिए, वे यह तय कर सकते हैं कि उन्हें उपयोगकर्ताओं को यह सूचना देनी है या नहीं कि नाम छोटा कर दिया जाएगा.

ऑटोमेशन

ऑटोमेशन एपीआई का एंट्री पॉइंट, स्ट्रक्चर के ज़रिए होता है. Home API में ऑटोमेशन के बारे में ज़्यादा जानने के लिए, Android पर Automation API की खास जानकारी देखें.

एपीआई की सूची

Home का इंस्टेंस बनने के बाद, इसके ज़रिए इन स्ट्रक्चर एपीआई को ऐक्सेस किया जा सकता है:

एपीआई ब्यौरा
structures() Google खाते में मौजूद सभी स्ट्रक्चर पाएं. यह एक HomeObjectsFlow दिखाता है, जो डेटा को वापस पाने और फ़िल्टर करने के ज़्यादा विकल्प देता है.

Structure मिलने के बाद, इन एपीआई को ऐक्सेस किया जा सकता है:

एपीआई ब्यौरा
automations() स्ट्रक्चर से जुड़े सभी ऑटोमेशन की सूची बनाएं. सिर्फ़ Home API के ज़रिए बनाए गए ऑटोमेशन दिखाए जाते हैं.
createAutomation(automation) किसी स्ट्रक्चर के लिए ऑटोमेशन इंस्टेंस बनाएं.
createRoom(name) उपयोगकर्ता के दिए गए नाम से कोई कमरा बनाओ.
deleteAutomation(automationId) ऑटोमेशन इंस्टेंस को उसके आईडी से मिटाता है.
deleteRoom(roomId) रूम आईडी की मदद से किसी रूम को मिटाएं.
devices() स्ट्रक्चर में मौजूद सभी डिवाइसों की जानकारी पाएं. यह HomeObjectsFlow दिखाता है.
getAutomation(automationId) ऑटोमेशन इंस्टेंस को उसके आईडी से पाएं.
getSourceConnectivity(trait) किसी खास ट्रेट के लिए मेटाडेटा पाएं. यह SourceConnectivity दिखाता है.
has(trait) देखें कि डिवाइस, अनुरोध की गई मौजूदा ट्रेट के साथ काम करता है या नहीं.
id स्ट्रक्चर का यूनीक सिस्टम आईडी.
moveDevicesToRoom(roomId, deviceIds) डिवाइसों को स्ट्रक्चर में मौजूद किसी दूसरे रूम आईडी में ट्रांसफ़र करें.
name उपयोगकर्ता की ओर से दिया गया स्ट्रक्चर का नाम.
rooms() स्ट्रक्चर में मौजूद सभी कमरों की जानकारी पाएं. यह HomeObjectsFlow दिखाता है.
trait(trait) ट्रेट एट्रिब्यूट का मौजूदा स्नैपशॉट पाएं.

कुछ सामान्य एपीआई (जैसे कि devices(), id, और name) भी Room के लिए उपलब्ध हैं.