Android-এ ডিভাইস স্টেট মনিটর করা

Android-এর জন্য Home API-তে, হোমের স্ট্যাটাসে হওয়া পরিবর্তনগুলি পর্যবেক্ষণ করা Kotlin-এ ফ্লো ব্যবহার করে সম্ভব হয়। Home API-তে স্ট্রাকচার, রুম, ডিভাইস মেটাডেটা এবং ডিভাইস স্টেটে হওয়া পরিবর্তনগুলি HomeObjectsFlow ইন্টারফেস থেকে ইনহেরিট করা যেকোনও API-এর মাধ্যমে পর্যবেক্ষণ করা যেতে পারে। ফ্লো থেকে সংগ্রহ করে এটি করা হয়।

সংগ্রহের কোনও আইটেম যোগ, মুছে বা পরিবর্তন করা হলে, সংগ্রহের লেটেস্ট স্ন্যাপশট রিটার্ন করা হয়।

পুরনো কপির সাথে এই স্ন্যাপশট তুলনা করে নির্দিষ্ট পরিবর্তনগুলি খুঁজে বের করার দায়িত্ব ডেভেলপারের। হোম API-তে প্রতিটি পেরেন্ট অবজেক্ট টাইপের জন্য দেওয়া id ফিল্ড এই উদ্দেশ্যে ব্যবহার করা যেতে পারে।

ফ্লো কীভাবে ব্যবহার করতে হয়

নিচে Home API-তে ফ্লো থেকে ডেটা সংগ্রহ করার কিছু প্রাথমিক উদাহরণ দেওয়া হল। নিম্নলিখিত উদাহরণের জন্য, হোমে সংগ্রহ অ্যাক্সেস করার আগে 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" }!!

ডিভাইসে নির্দিষ্ট কোনও ট্রেটের পরিবর্তন ট্র্যাক করা

ডিভাইস ও Home API-এর সাথে মানানসই যেকোনও ট্রেড ব্যবহার করুন। সম্পূর্ণ তালিকা দেখতে, এখানে যান: Trait

    val trait = device.type(DimmableLightDevice)?.map { it.trait(OnOff)}.first()

    trait?.collect {
      if (it != null) {
        println("Got new state update! ${it.onOff}")
      }
    }

ডিভাইসে নির্দিষ্ট ধরনের পরিবর্তন ট্র্যাক করা

ডিভাইসের ধরনের নিম্নলিখিত পরিবর্তনগুলি এই সংগ্রহকে ট্রিগার করে:

Home API-এর সাথে কাজ করে এমন যেকোনও 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")
  }
}

ইভেন্টে সাবস্ক্রাইব করা

Home API-তে, কোনও ডিভাইসের স্ট্যাটাসে পরিবর্তন শনাক্ত করতে ইভেন্ট ব্যবহার করা হয়।

নির্দিষ্ট ডিভাইসে ইভেন্টে সাবস্ক্রাইব করতে, তিনটি HomeDeviceর মধ্যে একটিতে কল করুন।events ফাংশন, যার প্রত্যেকটি একটিFlow<Event> রিটার্ন করে:

  1. events(event: EventFactory<T>) নির্দিষ্ট ধরনের ইভেন্টের জন্য একটি ফ্লো রিটার্ন করে:

    val eventFlow = homeDevice.type(DoorLockDevice).first().events(DoorLock.DoorLockAlarmEvent)
    
  2. events(trait: TraitFactory<T>) কোনও ট্রেটের পাঠানো সব ইভেন্টের ফ্লো রিটার্ন করে:

    val eventflow = homeDevice.type(DoorLockDevice).first().events(DoorLock)
    
  3. 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 মেথডের stream() মেথড HomeObjectsFlow<T> কল করুন:

টেবিল: ইভেন্ট স্ট্রিম
এন্টিটি ইন্টারফেস ফ্লো পদ্ধতি
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 -> {}
  }
}