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

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

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

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

ঐচ্ছিক বস্তুগুলি কীভাবে খুলে ফেলা যায়

যখন কোন অবজেক্ট ঐচ্ছিক থাকে, তখন অবজেক্টটি নিরাপদে খুলতে 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 একটি উদাহরণ তৈরি করতে হবে।

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

একটি ডিভাইসে একটি নির্দিষ্ট বৈশিষ্ট্যের পরিবর্তনগুলি ট্র্যাক করুন

ডিভাইস এবং হোম 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)")
    }
  }

একটি ডিভাইসে একটি নির্দিষ্ট ধরণের পরিবর্তনগুলি ট্র্যাক করুন

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

হোম এপিআই দ্বারা সমর্থিত যেকোনো 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)")
    }
  }

ইভেন্টগুলিতে সাবস্ক্রাইব করুন

হোম এপিআই-তে, ইভেন্টগুলি ডিভাইসের অবস্থার পরিবর্তন সনাক্ত করতে ব্যবহৃত হয়।

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