অ্যান্ড্রয়েডের হোম এপিআই-তে, কোটলিনে ফ্লো ব্যবহারের মাধ্যমে হোমের স্টেটের পরিবর্তন পর্যবেক্ষণ করা সম্ভব হয়। HomeObjectsFlow ইন্টারফেস থেকে HomeObjectsFlow করা যেকোনো এপিআই দিয়ে হোম এপিআই-এর স্ট্রাকচার, রুম, ডিভাইস মেটাডেটা এবং ডিভাইস স্টেটের পরিবর্তন পর্যবেক্ষণ করা যায়। এটি ফ্লো থেকে ডেটা সংগ্রহের মাধ্যমে করা হয়।
যখন কোনো কালেকশনের কোনো আইটেম যোগ, মুছে ফেলা বা পরিবর্তন করা হয়, তখন কালেকশনটির সর্বশেষ স্ন্যাপশটটি ফেরত দেওয়া হয়।
এই স্ন্যাপশটটিকে একটি পুরোনো কপির সাথে তুলনা করে নির্দিষ্ট পরিবর্তনগুলো বের করার দায়িত্ব ডেভেলপারের। এই উদ্দেশ্যে হোম এপিআই-তে প্রতিটি প্যারেন্ট অবজেক্ট টাইপের জন্য প্রদত্ত id ফিল্ডটি ব্যবহার করা যেতে পারে।
ফ্লো কীভাবে ব্যবহার করবেন
নিচে হোম এপিআই-এর ফ্লো থেকে ডেটা সংগ্রহের কিছু প্রাথমিক উদাহরণ দেওয়া হলো। নিম্নলিখিত উদাহরণগুলোর জন্য, হোমের কালেকশনগুলো অ্যাক্সেস করার আগে অবশ্যই Home একটি ইনস্ট্যান্স তৈরি করতে হবে:
val context = LocalContext.current
val homeManager = Home.getClient(context)
একটি কাঠামোর পরিবর্তনগুলি ট্র্যাক করুন
একটি কাঠামোতে নিম্নলিখিত পরিবর্তনগুলি এই সংগ্রহকে সক্রিয় করে:
- কাঠামোর নাম
homeManager.structures().map { it.firstOrNull() }.collect {
println("Structure ${it.id} updated to ${it}")
}
val structure = homeManager.structures().list().firstOrNull()!!
একটি নির্দিষ্ট ডিভাইসের পরিবর্তনগুলি ট্র্যাক করুন
ডিভাইসে নিম্নলিখিত পরিবর্তনগুলি এই সংগ্রহকে সক্রিয় করে:
- সংযোগ অবস্থা
- ডিভাইসের নাম
- রুম সদস্যপদ
- সমর্থিত বৈশিষ্ট্যগুলির সেট
- সমর্থিত প্রকারের সেট
structure
.devices()
.map { devices -> device.filter { it.name == "Bedroom Lamp" }.single() }
.collect {
println("The bedroom lamp has changed!")
}
val device = structure.devices().list().firstOrNull { it.name == "Bedroom Lamp" }!!
ডিভাইসে একটি নির্দিষ্ট বৈশিষ্ট্যের পরিবর্তনগুলি ট্র্যাক করুন
ডিভাইস এবং হোম এপিআই দ্বারা সমর্থিত যেকোনো ট্রেইট ব্যবহার করুন। সম্পূর্ণ তালিকার জন্য, Trait দেখুন।
val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()
trait?.collect {
if (it != null) {
println("Got new state update! ${it.onOff}")
}
}
ডিভাইসে একটি নির্দিষ্ট ধরণের পরিবর্তনগুলি ট্র্যাক করুন
ডিভাইসের ধরনে নিম্নলিখিত পরিবর্তনগুলো এই সংগ্রহকে সক্রিয় করে:
- তৈরি করা ডিভাইস টাইপের মধ্যে যেকোনো বৈশিষ্ট্যের পরিবর্তন
হোম এপিআই দ্বারা সমর্থিত যেকোনো Matter ডিভাইস টাইপ ব্যবহার করুন। সম্পূর্ণ তালিকার জন্য, DeviceType ) দেখুন।
device.type(DimmableLightDevice).collect { type ->
println("Got new state update! ${type.trait(LevelControl)?.currentLevel}")
}
একটি কাঠামোর একটি কক্ষে পরিবর্তনগুলি ট্র্যাক করুন
একটি কক্ষে নিম্নলিখিত পরিবর্তনগুলি এই সংগ্রহটি সক্রিয় করে:
কোনো রুমে কখন ডিভাইস যোগ করা বা সরানো হচ্ছে তা ট্র্যাক করতে, devices() ফ্লো ব্যবহার করুন।
structure.rooms().collect {
println("Got a new updated set of rooms!")
for (room in it) {
println("Got room $room")
}
}
ইভেন্টগুলিতে সাবস্ক্রাইব করুন
হোম এপিআই-গুলোতে কোনো ডিভাইসের অবস্থার পরিবর্তন শনাক্ত করতে ইভেন্ট ব্যবহার করা হয়।
কোনো নির্দিষ্ট ডিভাইসের ইভেন্টগুলিতে সাবস্ক্রাইব করতে, তিনটি HomeDevice events মধ্যে একটিকে কল করুন, যার প্রত্যেকটি একটি Flow<Event> রিটার্ন করে:
events(event: EventFactory<T>)একটি নির্দিষ্ট ধরনের ইভেন্টের জন্য একটি ফ্লো রিটার্ন করে:val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)events(trait: TraitFactory<T>)একটি ট্রেইট দ্বারা প্রেরিত সমস্ত ইভেন্টের প্রবাহ ফেরত দেয়:val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)events()অবজেক্টটির জন্য উপলব্ধ ইভেন্টগুলোর প্রবাহ ফেরত দেয়:val eventflow = homeDevice.type(DoorLockDevice).first().events()
একটি ফ্লো থেকে ইভেন্ট গ্রহণ করতে, flow.collect() ফাংশনটি ব্যবহার করুন:
eventflow.collect { event ->
if (event != null) {
logger.atInfo().log("Received event %s", event)
// do something
}
}
সত্তা সম্পর্ক ইভেন্টগুলিতে সাবস্ক্রাইব করুন
যখনই কোনো এনটিটি (যেমন একটি কাঠামো, ঘর, ডিভাইস বা অটোমেশন) যোগ করা, সরানো বা আপডেট করা হয়, তখন নির্গত হওয়া ইভেন্টগুলো আপনি শুনতে পারেন। এই ইভেন্টগুলো HomeObjectChangeEvent এর ইনস্ট্যান্স এবং এগুলো পরিবর্তিত এনটিটির আইডি বহন করে।
আপনার কাঙ্ক্ষিত ইভেন্টগুলো তৈরি করে এমন একটি স্ট্রিম পেতে, সংশ্লিষ্ট Flow মেথড দ্বারা উৎপাদিত HomeObjectsFlow<T> এর উপর stream() মেথডটি কল করুন:
| সত্তা | ইন্টারফেস | প্রবাহ পদ্ধতি |
|---|---|---|
Structure | HasStructures | structures() |
Room | HasRooms | rooms() |
HomeDevice | HasHomeDevices | devices() |
Automation | HasAutomations | automations() |
উদাহরণস্বরূপ, আপনি ডিভাইসগুলির পরিবর্তনগুলি এভাবে পরিচালনা করতে পারেন:
val devicesStream = home.devices().stream() // Collect and react to device changes. devicesStream.collect { deviceEvent -> when (deviceEvent) { is HomeObjectAddedEvent -> println("New device now available with id: ${deviceEvent.id}") is HomeObjectUpdatedEvent -> println("Device ${deviceEvent.id} has been updated") is HomeObjectRemovedEvent -> println("Device is removed from your account") else -> {} } }