iOS पर डिवाइसों को कंट्रोल करना

यह गाइड, iOS पर डिवाइसों और डिवाइस के मेटाडेटा को ऐक्सेस करने के बारे में जानकारी देती है. साथ ही, इसमें डिवाइस को कंट्रोल करने और ऐक्सेस करने के कुछ और उदाहरण दिए गए हैं.

डिवाइस के खास टाइप या उसकी खास सुविधाओं का इस्तेमाल करने के लिए, उन्हें इंपोर्ट करना ज़रूरी है. जैसे, यहां दिए गए कई उदाहरणों में इस्तेमाल किया गया Matter OnOffTrait:

import GoogleHomeSDK
import GoogleHomeTypes

देखें कि कोई ट्रेट किसी निर्देश के साथ काम करता है या नहीं

यह देखने के लिए कि किसी डिवाइस के लिए कोई निर्देश काम करता है या नहीं, ट्रेट-लेवल के supports फ़ंक्शन का इस्तेमाल करें.

उदाहरण के लिए, यह देखने के लिए कि कोई डिवाइस, चालू/बंद करने वाले ट्रेट के toggle निर्देश के साथ काम करता है या नहीं:

// Check if the OnOff trait supports the toggle command.
if onOffTraitTest.supportsToggleCommand {
  print("onOffTrait supports toggle command")
} else {
  print("onOffTrait does not support stateful toggle command")
}

किसी डिवाइस को निर्देश भेजना

किसी ट्रेट से, स्टेट एट्रिब्यूट को पढ़ने जैसा ही होता है, निर्देश भेजना. डिवाइस को चालू या बंद करने के लिए, टॉगल निर्देश का इस्तेमाल करें. इसे Google Home इकोसिस्टम के डेटा मॉडल में toggle() के तौर पर तय किया गया है.OnOffTrait यह तरीका, onOff की वैल्यू को true होने पर false में बदल देता है. वहीं, false होने पर true में बदल देता है:

// Calling a command on a trait.
do {
  try await onOffTraitTest.toggle()
} catch let _ as HomeError {
  // Code for handling the exception
}

अगर एक्ज़ीक्यूशन फ़्लो में कोई समस्या पाई जाती है, तो निर्देश, अपवाद दिखा सकते हैं. डेवलपर के तौर पर, आपको इन अपवादों को ठीक से मैनेज करने के लिए, do-catch ब्लॉक का इस्तेमाल करना चाहिए. साथ ही, उन मामलों में उपयोगकर्ताओं को पूरी जानकारी देनी चाहिए जहां गड़बड़ियों को ठीक किया जा सकता है. मैनेज न किए गए अपवादों की वजह से, ऐप्लिकेशन का रनटाइम बंद हो जाएगा. साथ ही, आपका ऐप्लिकेशन क्रैश हो सकता है.

इसके अलावा, स्टेट को साफ़ तौर पर सेट करने के लिए, off() या on() निर्देशों का इस्तेमाल करें:

do {
  try await onOffTraitTest.off()
  try await onOffTraitTest.on()
} catch let _ as HomeError {
  // Code for handling the exception
}

स्टेट में बदलाव करने के लिए निर्देश भेजने के बाद, जब यह प्रोसेस पूरी हो जाती है, तब स्टेट को पढ़ा जा सकता है. इसके बारे में, अपने ऐप्लिकेशन में डिवाइस की स्टेट को मैनेज करने के लिए, डिवाइस की स्टेट पढ़ना लेख में बताया गया है.

पैरामीटर के साथ निर्देश भेजना

कुछ निर्देशों में पैरामीटर का इस्तेमाल किया जा सकता है. जैसे, उन पर मौजूद निर्देश OnOffTrait या LevelControlTrait:

offWithEffect

// Turn off the light using the DyingLight effect.
do {
  try await onOffTraitTest.offWithEffect(
    effectIdentifier: Matter.OnOffTrait.EffectIdentifierEnum.dyingLight,
    effectVariant: 0
  )
} catch let _ as HomeError {
  // Code for handling the exception
}

moveToLevel

// Change the brightness of the light to 50%
do {
  try await levelControlTraitTest.moveToLevel(
    level: UInt8(127),
    transitionTime: 0,
    optionsMask: Matter.LevelControlTrait.OptionsBitmap(),
    optionsOverride: Matter.LevelControlTrait.OptionsBitmap()
  )
} catch let _ as HomeError {
  // Code for handling the exception
}

देखें कि कोई ट्रेट किसी एट्रिब्यूट के साथ काम करता है या नहीं

ऐसा हो सकता है कि कुछ डिवाइस, Matter ट्रेट के साथ काम करें, लेकिन किसी खास एट्रिब्यूट के साथ नहीं. उदाहरण के लिए, Cloud-to-cloud डिवाइस को Matter पर मैप करने के बाद भी, हो सकता है कि वह Matter के हर एट्रिब्यूट के साथ काम न करे. ऐसे मामलों को मैनेज करने के लिए, ट्रेट-लेवल की isSupported प्रॉपर्टी का इस्तेमाल करके देखें कि कोई एट्रिब्यूट, किसी डिवाइस के साथ काम करता है या नहीं.

उदाहरण के लिए, यह देखने के लिए कि कोई डिवाइस, चालू/बंद करने वाले ट्रेट के onOff एट्रिब्यूट के साथ काम करता है या नहीं:

// Check if the OnOff trait supports the onOff attribute.
if onOffTrait.attributes.$onOff.isSupported {
  print("onOffTrait supports onOff state")
} else {
  print("onOffTrait is for a command only device!")
}

कुछ एट्रिब्यूट की वैल्यू को Matter खास जानकारी या Cloud-to-cloud smart home स्कीमा में खाली छोड़ा जा सकता है. इन एट्रिब्यूट के लिए, यह पता लगाया जा सकता है कि एट्रिब्यूट से मिली nil वैल्यू, डिवाइस के उस वैल्यू की रिपोर्ट न करने की वजह से मिली है या एट्रिब्यूट की वैल्यू असल में nil है. इसके लिए, isSupported के अलावा, isNullable का इस्तेमाल करें:

// Check if a nullable attribute is set or is not supported.
if let deviceType = await device.types.get(OnOffLightDeviceType.self) {
  if let onOffTrait = deviceType.traits[Matter.OnOffTrait.self] {
    if onOffTrait.attributes.startUpOnOff == nil {
      if onOffTrait.attributes.$startUpOnOff.isSupported {
        print(
          "onOffTrait supports startUpOnOff and it is nil. Check the spec for the contextual meaning."
        )
      } else {
        print("onOffTrait does not support startUpOnOff!")
      }
    } else {
      print(
        "onOffTrait supports startUpOnOff and it is set to \(String(describing: onOffTrait.attributes.startUpOnOff))"
      )
    }
  }
}

ट्रेट के एट्रिब्यूट अपडेट करना

अगर आपको किसी एट्रिब्यूट की वैल्यू बदलनी है और ट्रेट के किसी भी निर्देश से ऐसा नहीं किया जा सकता, तो हो सकता है कि एट्रिब्यूट की वैल्यू को साफ़ तौर पर सेट किया जा सके.

किसी एट्रिब्यूट की वैल्यू बदली जा सकती है या नहीं, यह दो फ़ैक्टर पर निर्भर करता है:

  • क्या एट्रिब्यूट को लिखा जा सकता है?
  • क्या ट्रेट का कोई निर्देश भेजने पर, एट्रिब्यूट की वैल्यू में बदलाव हो सकता है?

ट्रेट और उनके एट्रिब्यूट के रेफ़रंस दस्तावेज़ में यह जानकारी दी गई है.

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

  • सिर्फ़ पढ़ी जा सकती है और अन्य निर्देशों से असर नहीं पड़ता. इसका मतलब है कि एट्रिब्यूट की वैल्यू नहीं बदलती. उदाहरण के लिए, currentPosition एट्रिब्यूट SwitchTrait का.

  • सिर्फ़ पढ़ी जा सकती है और अन्य निर्देशों से असर पड़ता है. इसका मतलब है कि एट्रिब्यूट की वैल्यू में बदलाव सिर्फ़ निर्देश भेजने पर हो सकता है. उदाहरण के लिए, currentLevel एट्रिब्यूट सिर्फ़ पढ़ा जा सकता है. हालांकि, इसकी वैल्यू को LevelControlTrait जैसे निर्देशों से बदला जा सकता है moveToLevel.

  • लिखी जा सकती है और अन्य निर्देशों से असर नहीं पड़ता. इसका मतलब है कि ट्रेट के update फ़ंक्शन का इस्तेमाल करके, एट्रिब्यूट की वैल्यू को सीधे तौर पर बदला जा सकता है. हालांकि, ऐसे कोई निर्देश नहीं हैं जिनसे एट्रिब्यूट की वैल्यू पर असर पड़ेगा. उदाहरण के लिए, WrongCodeEntryLimit एट्रिब्यूट का DoorLockTrait.

  • लिखी जा सकती है और अन्य निर्देशों से असर पड़ता है. इसका मतलब है कि ट्रेट के update फ़ंक्शन का इस्तेमाल करके, एट्रिब्यूट की वैल्यू को सीधे तौर पर बदला जा सकता है. साथ ही, निर्देश भेजने पर एट्रिब्यूट की वैल्यू में बदलाव हो सकता है. उदाहरण के लिए, occupiedCoolingSetpoint एट्रिब्यूट को लिखा जा सकता है. साथ ही, इसे setpointRaiseLower निर्देश से अपडेट भी किया जा सकता है.ThermostatTrait

किसी एट्रिब्यूट की वैल्यू बदलने के लिए, अपडेट फ़ंक्शन का इस्तेमाल करने का उदाहरण

इस उदाहरण में, DoorLockTrait.wrongCodeEntryLimit एट्रिब्यूट की वैल्यू को साफ़ तौर पर सेट करने का तरीका बताया गया है.

किसी एट्रिब्यूट की वैल्यू सेट करने के लिए, ट्रेट के update फ़ंक्शन को कॉल करें. साथ ही, इसे एक ऐसा अपडेट फ़ंक्शन पास करें जो नई वैल्यू सेट करता है. सबसे पहले, यह पुष्टि करना ज़रूरी है कि ट्रेट, किसी एट्रिब्यूट के साथ काम करता है या नहीं.

उदाहरण के लिए:

if doorLockTraitTest.attributes.$wrongCodeEntryLimit.isSupported {
  let _ = try await doorLockTraitTest.update {
    $0.setWrongCodeEntryLimit(3)
  }
}