iOS डीएसएल गाइड

ऑटोमेशन बनाने के लिए, अलग-अलग ऑटोमेशन डीएसएल नोड का इस्तेमाल कैसे किया जा सकता है, यह समझने के लिए नीचे दी गई गाइड का इस्तेमाल करें.

ऑटोमेशन डीएसएल को एक ही automation नोड में रखा जाता है. automation नोड, बाहरी Swift भाषा के कॉन्टेक्स्ट और एम्बेड किए गए DSL कॉन्टेक्स्ट के बीच की सीमा बनाता है.

क्रम में चलने वाला फ़्लो

क्रम से चलने वाला फ़्लो, ऑटोमेशन फ़्लो का डिफ़ॉल्ट टाइप होता है.

सीक्वेंशल डीएसएल का उदाहरण

यहां एक बहुत ही बुनियादी ऑटोमेशन डीएसएल टेंप्लेट दिया गया है. इसमें स्टार्टर, शर्त, और कार्रवाई वाले क्रमिक फ़्लो का इस्तेमाल किया गया है:

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {
  starter(...)
  condition {...}
  action {...}
}

इसमें अतिरिक्त नोड जोड़कर, इसे बेहतर बनाया जा सकता है.

नए

स्टार्टर नोड, ऑटोमेशन को चालू करने वाली शुरुआती स्थितियों के बारे में बताते हैं. उदाहरण के लिए, स्थिति या वैल्यू में बदलाव. ऑटोमेशन में कम से कम एक स्टार्टर होना चाहिए. ऐसा न होने पर, पुष्टि नहीं हो पाएगी. किसी ऑटोमेशन में एक से ज़्यादा स्टार्टर जोड़ने के लिए, आपको select नोड का इस्तेमाल करना होगा.

ट्रेट एट्रिब्यूट के आधार पर स्टार्टर

किसी ट्रेट एट्रिब्यूट पर आधारित स्टार्टर नोड का एलान करते समय, यह जानकारी दें:

  • डिवाइस
  • वह डिवाइस टाइप जिससे ट्रैट जुड़ा है
  • विशेषता
starter(
  thermostat,
  Matter.TemperatureSensorDeviceType.self,
  Matter.TemperatureMeasurementTrait.self
)

डिवाइस टाइप पैरामीटर ज़रूरी है, क्योंकि इससे यह तय किया जा सकता है कि ऑटोमेशन किसी डिवाइस में किस डिवाइस टाइप को ऐड्रेस करता है. उदाहरण के लिए, हो सकता है कि किसी डिवाइस में एक FanDeviceType और एक HeatingCoolingUnitDeviceType एलिमेंट शामिल हों. दोनों में OnOffTrait ट्रैट मौजूद हो. डिवाइस टाइप की जानकारी देने से, यह साफ़ तौर पर पता चल जाता है कि डिवाइस के किस हिस्से से ऑटोमेशन ट्रिगर होता है.

इवेंट के आधार पर स्टार्टर

किसी इवेंट पर आधारित स्टार्टर नोड का एलान करते समय, यह जानकारी दें:

  • डिवाइस
  • वह डिवाइस टाइप जिससे ट्रैट जुड़ा है
  • इवेंट
starter(
  doorbell,
  Google.GoogleDoorbellDeviceType.self,
  Google.DoorbellPressTrait.DoorbellPressedEvent
)

पैरामीटर के साथ, स्ट्रक्चर और इवेंट के आधार पर स्टार्टर

कुछ इवेंट में पैरामीटर हो सकते हैं. इसलिए, इन पैरामीटर को स्टार्टर में भी शामिल करना ज़रूरी है.

उदाहरण के लिए, यह स्टार्टर सुबह 7:00 बजे ऑटोमेशन चालू करने के लिए, TimeTrait के ScheduledEvent का इस्तेमाल करता है:

typealias TimeTrait = Google.TimeTrait

let earlyMorning = starter(
  structure,
  TimeTrait.ScheduledEvent.self
) {
  TimeTrait.ScheduledEvent.clockTime(TimeOfDay(hours: 7, minutes: 0))
}

मैन्युअल स्टार्टर

मैन्युअल स्टार्टर एक खास तरह का स्टार्टर है. इसकी मदद से, उपयोगकर्ता ऑटोमेशन को मैन्युअल तरीके से चला सकता है.

मैन्युअल स्टार्टर का एलान करते समय:

  • किसी खास तरह की जानकारी या डिवाइस टाइप की जानकारी न दें.
  • ऐसा यूज़र इंटरफ़ेस (यूआई) एलिमेंट दें जो Automation.execute() को कॉल करता हो.

किसी दूसरे स्टार्टर के साथ select फ़्लो में मैन्युअल स्टार्टर डालने पर, मैन्युअल स्टार्टर दूसरे स्टार्टर की जगह ले लेता है:

select {
  manualStarter()
  starter(
    thermostat,
    Matter.TemperatureSensorDeviceType.self,
    Matter.TemperatureMeasurementTrait.self
  )
}

ध्यान दें कि मैन्युअल स्टार्टर के बाद मौजूद किसी भी condition नोड का आकलन किया जाएगा. साथ ही, condition एक्सप्रेशन के आधार पर, ऑटोमेशन को लागू होने से रोका जा सकता है.

मैन्युअल स्टार्टर को कंडीशनल स्टार्टर से अलग करना

अपने ऑटोमेशन को इस तरह से स्ट्रक्चर करें कि condition नोड, मैन्युअल स्टार्टर से चालू किए गए ऑटोमेशन को ब्लॉक न करें. इसके लिए, दूसरे स्टार्टर को उसके condition के साथ अलग से क्रम में लगाएं:

import GoogleHomeSDK
import GoogleHomeTypes

automation (
...
) {

  select {
    sequential {
      starter(...)
      condition {...}
    }
    sequential {
      manualStarter()
    }
  }
  action {...}

}

किसी एट्रिब्यूट की वैल्यू का रेफ़रंस देना

किसी एक्सप्रेशन में एट्रिब्यूट की वैल्यू का इस्तेमाल करने के लिए, नीचे दिए गए सिंटैक्स का इस्तेमाल करें.

stateReader के साथ:

typealias TimeTrait = Google.TimeTrait

let time = stateReader(structure, TimeTrait.self)
time
let currTime = time.currentTime

starter के साथ:

typealias LaundryWasherDeviceType = Matter.LaundryWasherDeviceType
typealias OnOffTrait = Google.OnOffTrait

let starterNode = starter(device1, LaundryWasherDeviceType.self, OnOffTrait.self)
starterNode
condition {
  starterNode.onOff.equals(true)
}

शर्त वाले नोड और एक्सप्रेशन

शर्त वाला नोड, फ़ैसले के उस पॉइंट को दिखाता है जिससे यह तय होता है कि ऑटोमेशन जारी रहेगा या नहीं. किसी ऑटोमेशन में कई condition नोड हो सकते हैं. अगर किसी condition नोड के एक्सप्रेशन का आकलन false के तौर पर किया जाता है, तो पूरे ऑटोमेशन का रन होना बंद हो जाता है.

condition नोड में, अलग-अलग ऑपरेटर का इस्तेमाल करके, कई शर्तों को जोड़ा जा सकता है. हालांकि, ऐसा तब ही किया जा सकता है, जब एक्सप्रेशन की वैल्यू एक ही बूलियन वैल्यू हो. अगर नतीजा true है, तो शर्त पूरी हो जाती है और ऑटोमेशन अगले नोड को लागू करना जारी रखता है. अगर यह false है, तो ऑटोमेशन उसी समय बंद हो जाता है.

एक्सप्रेशन, Swift में एक्सप्रेशन की तरह ही बनाए जाते हैं. इनमें संख्याएं, वर्ण, स्ट्रिंग, और बूलियन जैसी प्राइमटिव वैल्यू के साथ-साथ, Enum वैल्यू भी हो सकती हैं. ब्रैकेट की मदद से सब-एक्सप्रेशन को ग्रुप करने पर, यह कंट्रोल किया जा सकता है कि उनका आकलन किस क्रम में किया जाए.

यहां condition का एक उदाहरण दिया गया है, जो एक से ज़्यादा सब-एक्सप्रेशन को एक एक्सप्रेशन में जोड़ता है:

condition {
  let exp1 = starterNode.lockState.equals(.unlocked)
  let exp2 = stateReaderNode.lockState.equals(true)
  let exp3 = occupancySensingDevice.occupied.notEquals(0)
  (exp1.and(exp2)).or(exp3)
}

स्टार्टर के ज़रिए ऐक्सेस किए गए ट्रैट की वैल्यू का रेफ़रंस दिया जा सकता है:

typealias OnOffTrait = Matter.OnOffTrait

let starterNode = starter(device, OnOffTrait.self)
starterNode
condition {
  starterNode.onOff.equals(true)
}
val starterNode = starter<_>(device, OnOff)
condition() { expression = starterNode.onOff equals true }

stateReader

condition नोड में ट्रैट एट्रिब्यूट की वैल्यू का रेफ़रंस देने का दूसरा तरीका, stateReader नोड का इस्तेमाल करना है.

ऐसा करने के लिए, पहले stateReader नोड में ट्रैट एट्रिब्यूट की वैल्यू कैप्चर करें. stateReader, structure और ट्रैट को आर्ग्युमेंट के तौर पर लेता है:

typealias ActivatedCarbonFilterMonitoringTrait = Matter.ActivatedCarbonFilterMonitoringTrait

let filterMonitoringState = stateReader(structure, ActivatedCarbonFilterMonitoringTrait.self)

इसके बाद, condition नोड में stateReader का रेफ़रंस दें:

condition {
filterMonitoringState.changeIndication.equals(.warning)
}

तुलना और लॉजिकल ऑपरेटर का इस्तेमाल करके, condition नोड में एक से ज़्यादा stateReaders का इस्तेमाल किया जा सकता है:

typealias ArmDisarm = Google.ArmDisarmTrait
typealias DoorLockDevice = Matter.DoorLockDeviceType
typealias DoorLock = Matter.DoorLockTrait

let armState = stateReader(doorLock, DoorLockDevice.self, ArmDisarm )
let doorLockState = stateReader(doorLock, DoorLockDevice.self, DoorLock)
armState
doorLockState
condition {
  let exp1 = armState.armState
  let exp2 = doorLockState.lockState
  exp1.and(exp2)
}

शर्त की अवधि

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

condition(for: .seconds(600)) {
lightStateReader.onOff.equals(true)
}

इसकी अवधि एक से 30 मिनट तक की हो सकती है.

ऐक्शन नोड

ऐक्शन नोड में ऑटोमेशन की प्रोसेस होती है. इस उदाहरण में, कार्रवाई AssistantBroadcastTrait के broadcast() निर्देश को लागू करती है:

action(speaker, SpeakerDeviceType.self) {
  Google.AssistantBroadcastTrait.broadcast(msg: "Oven Cycle Complete")
}