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 को false में बदला जाता है, अगर यह true है. इसके अलावा, false को true में बदला जाता है, अगर यह false है:

// 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 ट्रीट काम करे, लेकिन कोई खास एट्रिब्यूट काम न करे. उदाहरण के लिए, हो सकता है कि 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 \(onOffTrait.attributes.startUpOnOff)"
      )
    }
  }
}

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

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

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

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

इस जानकारी के लिए, ट्रेट और उनके एट्रिब्यूट के रेफ़रंस दस्तावेज़ देखें.

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

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

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

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

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

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