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

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

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

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

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

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

do {
  try await onOffTraitTest.off()
  try await onOffTraitTest.on()
} catch let error 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 error 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 error as HomeError {
  // Code for handling the exception
}

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

ऐसा हो सकता है कि कुछ डिवाइस, Matter की किसी खासियत के साथ काम करें, लेकिन किसी खास एट्रिब्यूट के साथ काम न करें. उदाहरण के लिए, Matter से मैप किए गए Cloud-to-cloud डिवाइस में, 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 है. इसके लिए, 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 \(onOffTrait.attributes.startUpOnOff)"
      )
    }
  }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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