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