Android এ স্ট্রাকচার API

স্ট্রাকচার API গুলি Android এর জন্য Home API গুলির মাধ্যমে অ্যাক্সেস করা যেতে পারে। আপনার অ্যাপে এই প্যাকেজগুলি আমদানি করুন:

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

ত্রুটি পরিচালনা

Home API গুলির যেকোনো পদ্ধতিতে 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() API হল এমন একটি প্রবাহ যা তাৎক্ষণিকভাবে কাঠামোর একটি বৈধ তালিকা ফেরত নাও দিতে পারে। যদি আপনার অ্যাপটি প্রতিক্রিয়াশীল হয় এবং UI চালানোর জন্য সেই প্রবাহে সাবস্ক্রাইব করে, তাহলে অবশেষে কাঠামোর একটি বৈধ তালিকা ফেরত দেওয়া উচিত। অন্যান্য পরিস্থিতিতেও একটি খালি কাঠামো তালিকা ফেরত দেওয়া যেতে পারে, উদাহরণস্বরূপ যদি ব্যবহারকারীর ফোন সংযোগ হারিয়ে ফেলে বা ব্যবহারকারী আপনার অ্যাপের অনুমতি প্রত্যাহার করে নেয়। আপনার অ্যাপে এই বিষয়গুলি পরিচালনা করা উচিত।

বিকল্পভাবে, যদি প্রতিক্রিয়াশীল প্রোগ্রামিংয়ের পরিবর্তে ইমপেরেটিভ প্রোগ্রামিং জোরালোভাবে প্রয়োজন হয়, তাহলে একটি টার্মিনাল ফ্লো অপারেটর ব্যবহার করা যেতে পারে:

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

৬০ ইউনিকোড কোড পয়েন্ট (অক্ষর) সীমা অতিক্রম করলে নামগুলি ছোট করে ফেলা হবে এবং কোনও ত্রুটি করা হবে না। ডেভেলপাররা দীর্ঘ নাম পরিচালনা করার জন্য দায়ী এবং উদাহরণস্বরূপ, তারা সিদ্ধান্ত নিতে পারে যে তারা ব্যবহারকারীদের নাম ছোট করে ফেলা হবে কিনা তা জানাতে চায় কিনা।

গুগল হোম ইকোসিস্টেমে, বেশিরভাগ ডিভাইসের ধরণের ক্ষেত্রে, ব্যবহারকারীরা একই ধরণের সমস্ত ডিভাইসের জন্য একবারে অনুমতি দিতে পারেন। লক, ক্যামেরা বা ডোরবেলের মতো সংবেদনশীল বা সীমাবদ্ধ ডিভাইসের ধরণের ক্ষেত্রে, ব্যবহারকারীদের অবশ্যই তাদের পৃথকভাবে অনুমতি দিতে হবে।

কোনও ব্যবহারকারী কোনও সংবেদনশীল বা সীমাবদ্ধ ডিভাইসের ধরণ অ্যাক্সেস করার অনুমতি দিয়েছেন কিনা তা নির্ধারণ করতে, Structure-level consentedDeviceTypes() ফাংশনটি ব্যবহার করুন:

import com.google.home.Structure
import com.google.home.DeviceType
import com.google.home.DeviceTypeFactory
import com.google.home.consentedDeviceTypes // Extension function from the SDK
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch

/**
 * Example of how an app may monitor which device types have been granted access by a user.
 */
fun monitorDeviceConsent(structure: Structure, myScope: CoroutineScope) {
    // Obtain the flow of consented device type factories
    val consentedTypesFlow: Flow<Set<DeviceTypeFactory<out DeviceType>>> =
        structure.consentedDeviceTypes()

    myScope.launch {
        consentedTypesFlow.collect { consentedSet ->
            // Check if the user has consented to share a specific restricted
            // type, such as a Doorbell or Camera.
            val hasCameraAccess = consentedSet.any {
                it.toString() == "matter.google.type.GoogleDoorbellDevice"
            }

            if (hasCameraAccess) {
                // Enable features that require camera access
            } else {
                // Inform the user or disable camera-specific features
            }
        }
    }
}

অটোমেশন

অটোমেশন API-তে প্রবেশের স্থান হল একটি কাঠামোর মাধ্যমে। হোম API-তে অটোমেশন সম্পর্কে আরও জানতে, অ্যান্ড্রয়েডে অটোমেশন API ওভারভিউ দেখুন।