iOS-এ ডিভাইসের অবস্থা মনিটর করা

iOS-এর জন্য Home API-তে, হোমের স্ট্যাটাসে হওয়া পরিবর্তনগুলি Swift-এ Combine ফ্রেমওয়ার্ক ব্যবহার করে দেখা সম্ভব। Home API-তে স্ট্রাকচার, রুম, ডিভাইস মেটাডেটা এবং ডিভাইস স্টেটে হওয়া পরিবর্তনগুলি যেকোনও API-এর সাহায্যে HomeDevice ব্যবহার করে পর্যবেক্ষণ করা যেতে পারে। অ্যাসিঙ্ক্রোনাস ইভেন্ট থেকে ভ্যালু এক্সপোজ করা প্রকাশকদের সাবস্ক্রাইব করে এটি করা হয়।

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

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

ঐচ্ছিক অবজেক্ট কীভাবে আনর‍্যাপ করতে হয়

কোনও অবজেক্ট ঐচ্ছিক হলে, অবজেক্টটি নিরাপদে আনর‍্যাপ করতে if let বা guard ব্যবহার করুন। ! ব্যবহার করবেন না কারণ ডেভেলপার যদি নিশ্চিতভাবে না জানেন যে অবজেক্টটি শূন্য হতে পারে না, তাহলে ! কখনই ব্যবহার করা উচিত নয়।

উদাহরণে ইনপুট প্যারামিটার structureID-কে String? হিসেবে সংজ্ঞায়িত করা হয়েছে, যার অর্থ হল এটি একটি স্ট্রিং যা ঐচ্ছিক এবং এর মান শূন্য হতে পারে। এই ফাংশন structureID-এ দেওয়া ইনপুটের উপর ভিত্তি করে Structure অবজেক্ট খোঁজে।

ঐচ্ছিক অবজেক্ট কীভাবে ম্যানেজ করবেন সেই বিষয়ে আমাদের সাজেশন এখানে দেওয়া হল:

func structure(structureID: String?) -> Structure? {
    guard let structureID else { return nil }
    return structures.first { $0.id == structureID }
  }

প্রকাশককে কীভাবে ব্যবহার করতে হয়

নিচে Home API-তে প্রকাশকদের সাথে কাজ করার কিছু প্রাথমিক উদাহরণ দেওয়া হল। নিচের উদাহরণগুলির জন্য, Home -এর একটি ইনস্ট্যান্স তৈরি করতে হবে।

var home: Home?

সংগ্রহ অ্যাক্সেস করার আগে, সেগুলি আনর‍্যাপ করতে ভুলবেন না, কারণ সেগুলি ঐচ্ছিক:

guard let home else { return nil }

স্ট্রাকচারে হওয়া পরিবর্তন ট্র্যাক করা

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

home.structures().batched()
  .compactMap { $0.first(where: { $0.id = myStructureID} }
  .removeDuplicates()
  .sink { structure in
    if let structure = structure {
      print("Structure \(structure.id) updated to \(structure.name)")
    }
  }

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

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

home.devices().batched()
  .compactMap { deviceList -> HomeDevice? in
    deviceList.filter { $0.name == "Bedroom Lamp"}.first
  }
  .removeDuplicates()
  .sink { lampDevice in
    if lampDevice != nil {
      print("The bedroom lamp has changed!")
    }
  }

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

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

device.types.subscribe(OnOffLightDeviceType.self)
  .compactMap { $0.matterTraits.onOffTrait }
  .removeDuplicates()
  .sink { onOffState in
    if let onOffState = onOffState {
      print("Got new state update: \(onOffState.onOff)")
    }
  }

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

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

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

device.types.subscribe(DimmableLightDeviceType.self)
  .compactMap { $0.matterTraits.levelControlTrait }
  .removeDuplicates()
  .sink { dimmableLightDevice in
    if let dimmableLightDevice = dimmableLightDevice
      print("Got new state update! \(levelControlTrait.currentLevel)")
    }
  }

স্ট্রাকচারে কোনও রুমের পরিবর্তন ট্র্যাক করা

কোনও রুমে নিম্নলিখিত পরিবর্তন করা হলে এই সংগ্রহ ট্রিগার হয়:

কোনও রুমে ডিভাইস কখন যোগ করা হয়েছে বা সরানো হয়েছে তা ট্র্যাক করতে, devices() কোয়েরি ব্যবহার করুন।

home.rooms().batched()
  .sink { rooms in
    print("Got a new updated set of rooms!")
    for room in rooms {
      print("Got room #\(room.name)")
    }
  }

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

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

self.cancellable = self.device.types.subscribe(FanDeviceType.self)
  .receive(on: DispatchQueue.main)
  .catch { error in
    // Error getting FanDeviceType
    return Empty<FanDeviceType, Never>().eraseToAnyPublisher()
  }
  .sink { [weak self] fanDeviceType in
    self?.fanDeviceType = fanDeviceType
    self?.updateTileInfo()
  }
}