iOS पर डिवाइस की स्थिति पर नज़र रखना

iOS के लिए Home API में, घर की स्थिति में होने वाले बदलावों को देखने के लिए, Swift में Combine फ़्रेमवर्क का इस्तेमाल किया जाता है. होम एपीआई में स्ट्रक्चर, कमरों, डिवाइस के मेटाडेटा, और डिवाइस की स्थिति में होने वाले बदलावों को, HomeDevice का इस्तेमाल करके किसी भी एपीआई की मदद से देखा जा सकता है. इसके लिए, आपको एसिंक्रोनस इवेंट से वैल्यू दिखाने वाले पब्लिशर को सब्सक्राइब करना होगा.

संग्रह में किसी आइटम को जोड़ने, मिटाने या उसमें बदलाव करने पर, संग्रह का नया स्नैपशॉट दिखता है.

डेवलपर को इस स्नैपशॉट की तुलना पुरानी कॉपी से करके, खास बदलावों का पता लगाना होता है. इस काम के लिए, Home APIs में हर पैरंट ऑब्जेक्ट टाइप के लिए उपलब्ध 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 API में पब्लिशर के साथ काम करने के कुछ बुनियादी उदाहरण दिए गए हैं. नीचे दिए गए उदाहरणों के लिए, Home का एक इंस्टेंस बनाना ज़रूरी है.

var home: Home?

कलेक्शन ऐक्सेस करने से पहले, उन्हें अनरैप करना न भूलें. ऐसा करना ज़रूरी नहीं है:

guard let home else { return nil }

स्ट्रक्चर में किए गए बदलावों को ट्रैक करना

स्ट्रक्चर में इन बदलावों की वजह से, यह कलेक्शन ट्रिगर होता है:

  • स्ट्रक्चर name
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
    Logger.error("Error getting FanDeviceType: \(error)")
    return Empty<FanDeviceType, Never>().eraseToAnyPublisher()
  }
  .sink { [weak self] fanDeviceType in
    self?.fanDeviceType = fanDeviceType
    self?.updateTileInfo()
  }
}