অ্যান্ড্রয়েডের হোম এপিআই-এর মাধ্যমে স্ট্রাকচার এপিআই অ্যাক্সেস করা যেতে পারে। এই প্যাকেজগুলি আপনার অ্যাপে ইম্পোর্ট করুন:
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() মেথডটি কল করে ফলাফলটি যাচাই করুন।
যেকোনো অনিয়ন্ত্রিত ব্যতিক্রমের ফলে আপনার অ্যাপটি ক্র্যাশ করবে।
আরও তথ্যের জন্য, ত্রুটি পরিচালনা (Error handling ) দেখুন।
নমুনা কল
কাঠামোর একটি তালিকা পান
একবার ইনিশিয়ালাইজ করা হলে, একটি 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")
নাম ৬০ ইউনিকোড কোড পয়েন্ট (ক্যারেক্টার) সীমা অতিক্রম করলে তা সংক্ষিপ্ত করা হবে এবং কোনো ত্রুটি দেখানো হবে না। দীর্ঘ নাম পরিচালনার দায়িত্ব ডেভেলপারদের এবং উদাহরণস্বরূপ, তারা ব্যবহারকারীদের জানাতে চান কিনা যে নাম সংক্ষিপ্ত করা হবে, সেই সিদ্ধান্ত তারা নিতে পারেন।
একজন ব্যবহারকারী কোন কোন ডিভাইসের জন্য অনুমতি দিয়েছেন তা দেখুন
গুগল হোম ইকোসিস্টেমে, বেশিরভাগ ডিভাইসের ক্ষেত্রে ব্যবহারকারীরা একবারে সেই ধরনের সমস্ত ডিভাইসের জন্য অনুমতি দিতে পারেন। সংবেদনশীল বা সীমাবদ্ধ ডিভাইসের ক্ষেত্রে, যেমন লক, ক্যামেরা বা ডোরবেল, ব্যবহারকারীদের সেগুলিতে আলাদাভাবে অনুমতি দিতে হয়।
কোনো ব্যবহারকারী সংবেদনশীল বা সীমাবদ্ধ ডিভাইসের ধরণ অ্যাক্সেস করার অনুমতি দিয়েছেন কিনা তা নির্ধারণ করতে, স্ট্রাকচার-স্তরের 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
}
}
}
}
অটোমেশন
অটোমেশন এপিআই-তে প্রবেশের পথ হলো একটি স্ট্রাকচার। হোম এপিআই-এর অটোমেশন সম্পর্কে আরও জানতে, অ্যান্ড্রয়েডে অটোমেশন এপিআই ওভারভিউ দেখুন।