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

আইওএস-এর জন্য হোম এপিআই-এ, সুইফট-এ কম্বাইন ফ্রেমওয়ার্ক ব্যবহারের মাধ্যমে বাড়িতে রাজ্যের পরিবর্তনগুলি পর্যবেক্ষণ করা সম্ভব হয়েছে। হোম এপিআই-এ কাঠামো, রুম, ডিভাইস মেটাডেটা এবং ডিভাইসের অবস্থার পরিবর্তন পর্যবেক্ষণ করা HomeDevice ব্যবহার করে যেকোনো 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 }
  }

প্রকাশকদের কিভাবে ব্যবহার করবেন

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

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

ডিভাইস এবং হোম এপিআই দ্বারা সমর্থিত যেকোনো বৈশিষ্ট্য ব্যবহার করুন। একটি সম্পূর্ণ তালিকার জন্য, 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)")
    }
  }

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

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

হোম 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)")
    }
  }

ইভেন্ট সদস্যতা

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

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()
  }
}