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

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

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

इस स्नैपशॉट की तुलना किसी पुरानी कॉपी से करके, डेवलपर यह तय करता है कि कौनसे बदलाव किए गए हैं. इस काम के लिए, 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 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
    Logger.error("Error getting FanDeviceType: \(error)")
    return Empty<FanDeviceType, Never>().eraseToAnyPublisher()
  }
  .sink { [weak self] fanDeviceType in
    self?.fanDeviceType = fanDeviceType
    self?.updateTileInfo()
  }
}