अपने स्मार्ट होम ऐक्शन को बेहतर बनाएं और सुरक्षित करें

1. शुरू करने से पहले

स्मार्ट होम कार्रवाइयों के लिए, डिवाइस के टाइप का इस्तेमाल किया जाता है. इससे Google Assistant को यह पता चलता है कि डिवाइस के साथ किस व्याकरण का इस्तेमाल किया जाना चाहिए. डिवाइस traits से यह पता चलता है कि कोई डिवाइस किस तरह का है. डिवाइस में, किसी कार्रवाई में जोड़े गए हर डिवाइस trait की स्थिति इनहेरिट होती है.

dc8dce0dea87cd5c.png

अपने उपयोगकर्ताओं के डिवाइसों के फ़ंक्शन को पसंद के मुताबिक बनाने के लिए, चुने गए डिवाइस टाइप के साथ काम करने वाली किसी भी विशेषता को जोड़ा जा सकता है. अगर आपको अपनी कार्रवाइयों में ऐसी कस्टम विशेषताएं लागू करनी हैं जो फ़िलहाल डिवाइस स्कीमा में उपलब्ध नहीं हैं, तो मोड और टॉगल विशेषता, आपके तय किए गए पसंद के नाम से खास सेटिंग को कंट्रोल करने की अनुमति देती हैं.

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

ज़रूरी शर्तें

आप क्या बनाएंगे

इस कोडलैब में, Firebase के साथ पहले से बने स्मार्ट होम इंटिग्रेशन को डिप्लॉय किया जाएगा. इसके बाद, लोड साइज़ और टर्बो मोड के लिए, स्मार्ट होम वॉशर में नॉन-स्टैंडर्ड विशेषताओं को जोड़ने का तरीका जानें. आपको गड़बड़ी और अपवाद की रिपोर्ट भी लागू करनी होगी. साथ ही, उपयोगकर्ता की पुष्टि दूसरे तरीके से करके, वॉशर चालू करना है. इसके लिए, बोलकर दी जाने वाली सहमति को लागू करना भी सीखें.

आप इन चीज़ों के बारे में जानेंगे

  • अपनी सेट की गई कार्रवाई में मोड और टॉगल traits जोड़ने का तरीका
  • गड़बड़ियों और अपवादों की शिकायत करने का तरीका
  • उपयोगकर्ता की पहचान की पुष्टि दूसरे तरीके से करने के लिए आवेदन करने का तरीका

आपको इनकी ज़रूरत होगी

2. YouTube TV का इस्तेमाल शुरू करना

गतिविधि कंट्रोल चालू करना

Google Assistant का इस्तेमाल करने के लिए, आपको Google के साथ गतिविधि का कुछ डेटा शेयर करना होगा. Google Assistant को ठीक से काम करने के लिए इस डेटा की ज़रूरत होती है. हालांकि, डेटा शेयर करने की ज़रूरी शर्त सिर्फ़ SDK टूल के लिए नहीं है. अगर आपके पास पहले से कोई Google खाता नहीं है, तो यह डेटा शेयर करने के लिए एक खाता बनाएं. किसी भी Google खाते का इस्तेमाल किया जा सकता है—ज़रूरी नहीं है कि वह आपका डेवलपर खाता ही हो.

उस Google खाते का गतिविधि कंट्रोल पेज खोलें जिसे Assistant के साथ इस्तेमाल करना है.

पक्का करें कि नीचे दिए गए टॉगल स्विच चालू हों:

  • वेब और ऐप्लिकेशन गतिविधि - इसके अलावा, इसमें Google की सेवाएं इस्तेमाल करने वाले डिवाइसों, ऐप्लिकेशन, और साइटों पर की गई मेरी गतिविधि की जानकारी और Chrome इतिहास शामिल करें चेकबॉक्स को चुनना न भूलें.
  • डिवाइस की जानकारी
  • आवाज़ और ऑडियो गतिविधि

ऐक्शन प्रोजेक्ट बनाना

  1. Actions on Google कंसोल पर जाएं.
  2. नया प्रोजेक्ट पर क्लिक करें. इसके बाद, प्रोजेक्ट का नाम डालें और प्रोजेक्ट बनाएं पर क्लिक करें.

3d6b68ca79afd54c.png

स्मार्ट होम ऐप्लिकेशन चुनें

Actions कंसोल में खास जानकारी वाली स्क्रीन पर, स्मार्ट होम चुनें.

2fa4988f44f8914b.png

स्मार्ट होम एक्सपीरियंस कार्ड चुनें और बिल्डिंग शुरू करें पर क्लिक करें. इसके बाद, आपको अपने प्रोजेक्ट कंसोल पर भेज दिया जाएगा.

Firebase सीएलआई इंस्टॉल करना

Firebase कमांड लाइन इंटरफ़ेस (सीएलआई) की मदद से, अपने वेब ऐप्लिकेशन को स्थानीय तौर पर इस्तेमाल किया जा सकता है. साथ ही, अपने वेब ऐप्लिकेशन को Firebase होस्टिंग पर डिप्लॉय किया जा सकता है.

सीएलआई इंस्टॉल करने के लिए, टर्मिनल से नीचे दिया गया npm कमांड चलाएं:

npm install -g firebase-tools

यह पुष्टि करने के लिए कि सीएलआई सही तरीके से इंस्टॉल किया गया है, इसे चलाएं:

firebase --version

यह चलाकर Firebase सीएलआई को अपने Google खाते से अनुमति दें:

firebase login

HomeGraph API चालू करें

HomeGraph API, उपयोगकर्ता के होम ग्राफ़ में डिवाइसों और उनकी स्थितियों को सेव करने और उनके बारे में क्वेरी करने की सुविधा चालू करता है. इस एपीआई का इस्तेमाल करने के लिए, आपको सबसे पहले Google Cloud कंसोल खोलना होगा और HomeGraph API चालू करना होगा.

Google Cloud कंसोल में, अपनी कार्रवाइयों से मेल खाने वाला प्रोजेक्ट चुनें <project-id>. इसके बाद, HomeGraph API के लिए एपीआई लाइब्रेरी की स्क्रीन पर जाकर, चालू करें पर क्लिक करें.

ee198858a6eac112.png

3. स्टार्टर ऐप्लिकेशन चलाएं

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

सोर्स कोड पाना

अपनी डेवलपमेंट मशीन पर इस कोडलैब का सैंपल डाउनलोड करने के लिए, इस लिंक पर क्लिक करें:

...या फिर कमांड लाइन से, GitHub रिपॉज़िटरी का क्लोन बनाया जा सकता है:

git clone https://github.com/google-home/smarthome-traits.git

डाउनलोड की गई ZIP फ़ाइल को अनपैक करें.

प्रोजेक्ट के बारे में जानकारी

स्टार्टर प्रोजेक्ट में ये सबडायरेक्ट्री शामिल हैं:

  • public: स्मार्ट वॉशर की स्थिति को आसानी से कंट्रोल करने और उस पर नज़र रखने के लिए, फ़्रंटएंड यूज़र इंटरफ़ेस (यूआई).
  • functions: पूरी तरह से लागू की गई क्लाउड सेवा, जो 'Firebase के लिए Cloud Functions' और Firebase रीयल टाइम डेटाबेस की मदद से स्मार्ट वॉशर को मैनेज करती है.

index.js में ये फ़ंक्शन शामिल किए गए हैं:

  • fakeauth: खाता लिंक करने के लिए ऑथराइज़ेशन एंडपॉइंट
  • faketoken: खाता लिंक करने के लिए टोकन एंडपॉइंट
  • smarthome: स्मार्ट होम इंटेंट फ़ुलफ़िलमेंट एंडपॉइंट
  • reportstate: डिवाइस की स्थिति बदलने पर, होम ग्राफ़ एपीआई को शुरू करता है
  • requestsync: इससे उपयोगकर्ता के डिवाइस को अपडेट करने की सुविधा मिलती है. इसके लिए, खाते को दोबारा लिंक करने की ज़रूरत नहीं होती

Firebase से कनेक्ट करना

washer-start डायरेक्ट्री पर जाएं. इसके बाद, अपने ऐक्शन प्रोजेक्ट की मदद से Firebase सीएलआई सेट अप करें:

cd washer-start
firebase use <project-id>

Firebase प्रोजेक्ट को कॉन्फ़िगर करना

Firebase प्रोजेक्ट शुरू करें.

firebase init

सीएलआई सुविधाएं, रीयलटाइम डेटाबेस, फ़ंक्शन, और होस्टिंग सुविधा चुनें, जिसमें Firebase होस्टिंग शामिल है.

? Which Firebase CLI features do you want to set up for this directory? Press Space to select features, then
 Enter to confirm your choices.
❯◉ Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision default instance
 ◯ Firestore: Configure security rules and indexes files for Firestore
 ◉ Functions: Configure a Cloud Functions directory and its files
 ◉ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys
 ◯ Hosting: Set up GitHub Action deploys
 ◯ Storage: Configure a security rules file for Cloud Storage
 ◯ Emulators: Set up local emulators for Firebase products
 ◯ Remote Config: Configure a template file for Remote Config
 ◯ Extensions: Set up an empty Extensions manifest

इससे आपके प्रोजेक्ट के लिए ज़रूरी एपीआई और सुविधाएं शुरू हो जाएंगी.

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

? It seems like you haven't initialized Realtime Database in your project yet. Do you want to set it up?
Yes

? Please choose the location for your default Realtime Database instance:
us-central1

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

? File database.rules.json already exists. Do you want to overwrite it with the Realtime Database Security Rules for <project-ID>-default-rtdb from the Firebase Console?
No

अगर प्रोजेक्ट को फिर से शुरू किया जा रहा है, तो कोड बेस को शुरू या ओवरराइट करने के बारे में पूछे जाने पर, ओवरराइट करें चुनें.

? Would you like to initialize a new codebase, or overwrite an existing one?
Overwrite

अपने फ़ंक्शन कॉन्फ़िगर करते समय, आपको डिफ़ॉल्ट फ़ाइलों का इस्तेमाल करना चाहिए. साथ ही, यह भी पक्का करना चाहिए कि आपने प्रोजेक्ट सैंपल में मौजूद index.js और package.json की फ़ाइलों को ओवरराइट न किया हो.

? What language would you like to use to write Cloud Functions?
JavaScript

? Do you want to use ESLint to catch probable bugs and enforce style?
No

? File functions/package.json already exists. Overwrite?
No

? File functions/index.js already exists. Overwrite?
No

अगर प्रोजेक्ट को फिर से शुरू किया जा रहा है, तो जब आपसे पूछा जाए कि आपको फ़ंक्शन/.gitignore को शुरू करना है या उसे ओवरराइट करना है, तो नहीं चुनें.

? File functions/.gitignore already exists. Overwrite?
No
? Do you want to install dependencies with npm now?
Yes

आखिर में, प्रोजेक्ट कोड में public डायरेक्ट्री का इस्तेमाल करने के लिए अपने होस्टिंग सेटअप को कॉन्फ़िगर करें और मौजूदा index.html फ़ाइल का इस्तेमाल करें. ESLint का इस्तेमाल करने के लिए पूछे जाने पर, नहीं चुनें.

? What do you want to use as your public directory?
public

? Configure as a single-page app (rewrite all urls to /index.html)?
Yes

? Set up automatic builds and deploys with GitHub?
No

? File public/index.html already exists. Overwrite?
 No

अगर ESLint गलती से चालू हो गया था, तो उसे बंद करने के दो तरीके हैं:

  1. जीयूआई का इस्तेमाल करके, प्रोजेक्ट में ../functions फ़ोल्डर पर जाएं और छिपी हुई फ़ाइल .eslintrc.js चुनें और उसे मिटाएं. इसे मिलते-जुलते नाम वाले .eslintrc.json के लिए गलती से न लिखें.
  2. कमांड लाइन का इस्तेमाल करके:
    cd functions
    rm .eslintrc.js
    

Firebase पर डिप्लॉय करें

आपने डिपेंडेंसी इंस्टॉल कर ली है और अपना प्रोजेक्ट कॉन्फ़िगर कर लिया है. इसलिए, अब पहली बार ऐप्लिकेशन चलाया जा सकता है.

firebase deploy

आपको यह कंसोल आउटपुट देखना चाहिए:

...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/<project-id>/overview
Hosting URL: https://<project-id>.web.app

यह निर्देश, Firebase के लिए Cloud फ़ंक्शन के साथ-साथ, एक वेब ऐप्लिकेशन डिप्लॉय करता है.

वेब ऐप्लिकेशन देखने के लिए, अपने ब्राउज़र (https://<project-id>.web.app) में होस्टिंग यूआरएल खोलें. आपको नीचे दिया गया इंटरफ़ेस दिखेगा:

5845443e94705557.png

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

अब उस क्लाउड सेवा से कनेक्ट करने का समय आ गया है जिसे आपने Actions कंसोल का इस्तेमाल करके Google Assistant में डिप्लॉय किया है.

Actions कंसोल प्रोजेक्ट कॉन्फ़िगर करना

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

https://us-central1-<project-id>.cloudfunctions.net/smarthome

9d7b223427f587ca.png

डेवलप करें > शुरू करें टैब पर, अपनी कार्रवाई के लिए डिसप्ले नाम जोड़ें और सेव करें पर क्लिक करें. यह नाम Google Home ऐप्लिकेशन में दिखेगा.

774d0c40c351c7da.png

a8c4673eb11d76ee.png

खाता लिंक करने की सुविधा चालू करने के लिए, बाईं ओर दिए गए नेविगेशन पैनल में, डेवलप करें > खाता लिंक करें विकल्प चुनें. खाते जोड़ने से जुड़ी इन सेटिंग का इस्तेमाल करें:

Client ID

ABC123

क्लाइंट सीक्रेट

DEF456

प्राधिकरण URL

https://us-central1-<project-id>.cloudfunctions.net/fakeauth

टोकन यूआरएल

https://us-central1-<project-id>.cloudfunctions.net/faketoken

9730d20b90bcc038.png

लिंक करने वाले अपने खाते के कॉन्फ़िगरेशन को सेव करने के लिए, सेव करें पर क्लिक करें. इसके बाद, अपने प्रोजेक्ट पर टेस्टिंग की सुविधा चालू करने के लिए, जांच करें पर क्लिक करें.

ee0547f05b5efd98.png

आपको सिम्युलेटर पर रीडायरेक्ट कर दिया जाएगा. अगर आपको "टेस्ट अब चालू है" नहीं दिखता है, तो यह पुष्टि करने के लिए कि जांच चालू है, टेस्ट रीसेट करें पर क्लिक करें.

d0495810dbadf059.png

अपने स्मार्ट होम ऐक्शन की जांच करने के लिए, आपको अपने प्रोजेक्ट को Google खाते से लिंक करना होगा. इससे Google Assistant के प्लैटफ़ॉर्म और Google Home ऐप्लिकेशन से जांच की जा सकती है, जिन पर उसी खाते से साइन इन किया गया हो.

  1. अपने फ़ोन पर, Google Assistant की सेटिंग खोलें. ध्यान दें कि आपको उसी खाते से लॉग इन करना होगा जिससे आपने कंसोल में लॉग इन किया है.
  2. Assistant में जाकर, Google Assistant > सेटिंग > होम कंट्रोल पर जाएं.
  3. ऊपर दाईं ओर खोजें आइकॉन पर क्लिक करें.
  4. अपना खास टेस्ट ऐप्लिकेशन ढूंढने के लिए, [test] प्रीफ़िक्स का इस्तेमाल करके अपना टेस्ट ऐप्लिकेशन खोजें.
  5. वह आइटम चुनें. इसके बाद, Google Assistant आपकी सेवा की पुष्टि करेगी और SYNC का अनुरोध करेगी. इसमें, आपकी सेवा को उपयोगकर्ता के डिवाइसों की सूची उपलब्ध कराने के लिए कहा जाएगा.

Google Home ऐप्लिकेशन खोलें और पुष्टि करें कि आपको वॉशर डिवाइस दिख रहा है.

ae252220753726f6.png

पुष्टि करें कि Google Home ऐप्लिकेशन में, बोलकर दिए जाने वाले निर्देशों का इस्तेमाल करके वॉशर कंट्रोल किया जा सकता है. साथ ही, क्लाउड फ़ुलफ़िलमेंट के फ़्रंटएंड वेब यूज़र इंटरफ़ेस (यूआई) में आपको डिवाइस की स्थिति में बदलाव दिखेगा.

आपने वॉशर इंस्टॉल कर लिया है और अब आपके पास अपने डिवाइस के लिए उपलब्ध मोड को पसंद के मुताबिक बनाने का विकल्प है.

4. मोड जोड़ें

action.devices.traits.Modes trait की मदद से, डिवाइस में किसी मोड के लिए मनमुताबिक संख्या में सेटिंग तय की जा सकती हैं. इनमें से, एक बार में सिर्फ़ एक सेटिंग सेट की जा सकती है. आपको लॉन्ड्री के लोड का साइज़ तय करने के लिए, वॉशर में एक मोड जोड़ना होगा. जैसे, छोटा, मीडियम या बड़ा.

सिंक के जवाब को अपडेट करें

आपको functions/index.js में अपने SYNC जवाब में, नई Trait के बारे में जानकारी जोड़नी होगी. यह डेटा, traits कलेक्शन और attributes ऑब्जेक्ट में दिखता है, जैसा कि यहां दिए गए कोड स्निपेट में दिखाया गया है.

index.js

app.onSync(body => {
  return {
    requestId: 'ff36a3cc-ec34-11e6-b1a0-64510650abcf',
    payload: {
      agentUserId: USER_ID,
      devices: [{
        id: 'washer',
        type: 'action.devices.types.WASHER',
        traits: [
          'action.devices.traits.OnOff',
          'action.devices.traits.StartStop',
          'action.devices.traits.RunCycle',
          // Add Modes trait
          'action.devices.traits.Modes',
        ],
        name: { ... },
        deviceInfo: { ... },
        attributes: {
          pausable: true,
          //Add availableModes
          availableModes: [{
            name: 'load',
            name_values: [{
              name_synonym: ['load'],
              lang: 'en',
            }],
            settings: [{
              setting_name: 'small',
              setting_values: [{
                setting_synonym: ['small'],
                lang: 'en',
              }]
            }, {
              setting_name: 'medium',
              setting_values: [{
                setting_synonym: ['medium'],
                lang: 'en',
              }]
            }, {
              setting_name: 'large',
              setting_values: [{
                setting_synonym: ['large'],
                lang: 'en',
              }]
            }],
            ordered: true,
          }],
        },
      }],
    },
  };
});

नए EXECUTE इंटेंट के निर्देश जोड़ें

अपने EXECUTE इंटेंट में, action.devices.commands.SetModes कमांड जोड़ें, जैसा कि इस कोड स्निपेट में दिखाया गया है.

index.js

const updateDevice = async (execution,deviceId) => {
  const {params,command} = execution;
  let state, ref;
  switch (command) {
    case 'action.devices.commands.OnOff':
      state = {on: params.on};
      ref = firebaseRef.child(deviceId).child('OnOff');
      break;
    case 'action.devices.commands.StartStop':
      state = {isRunning: params.start};
      ref = firebaseRef.child(deviceId).child('StartStop');
      break;
    case 'action.devices.commands.PauseUnpause':
      state = {isPaused: params.pause};
      ref = firebaseRef.child(deviceId).child('StartStop');
      Break;
    // Add SetModes command
    case 'action.devices.commands.SetModes':
      state = {load: params.updateModeSettings.load};
      ref = firebaseRef.child(deviceId).child('Modes');
      break;
}

QUERY के लिए जवाब अपडेट करें

इसके बाद, वॉशर की मौजूदा स्थिति के बारे में बताने के लिए, QUERY के जवाब को अपडेट करें.

रीयलटाइम डेटाबेस में स्टोर किए गए स्टेटस को पाने के लिए, queryFirebase और queryDevice फ़ंक्शन में अपडेट किए गए बदलाव जोड़ें.

index.js

const queryFirebase = async (deviceId) => {
  const snapshot = await firebaseRef.child(deviceId).once('value');
  const snapshotVal = snapshot.val();
  return {
    on: snapshotVal.OnOff.on,
    isPaused: snapshotVal.StartStop.isPaused,
    isRunning: snapshotVal.StartStop.isRunning,
    // Add Modes snapshot
    load: snapshotVal.Modes.load,
  };
}

const queryDevice = async (deviceId) => {
  const data = await queryFirebase(deviceId);
  return {
    on: data.on,
    isPaused: data.isPaused,
    isRunning: data.isRunning,
    currentRunCycle: [{ ... }],
    currentTotalRemainingTime: 1212,
    currentCycleRemainingTime: 301,
    // Add currentModeSettings
    currentModeSettings: {
      load: data.load,
    },
  };
};

रिपोर्ट की स्थिति अपडेट करें

आखिर में, वॉशर की मौजूदा लोड सेटिंग को होम ग्राफ़ पर रिपोर्ट करने के लिए, अपना reportstate फ़ंक्शन अपडेट करें.

index.js

const requestBody = {
  requestId: 'ff36a3cc', /* Any unique ID */
  agentUserId: USER_ID,
  payload: {
    devices: {
      states: {
        /* Report the current state of your washer */
        [context.params.deviceId]: {
          on: snapshot.OnOff.on,
          isPaused: snapshot.StartStop.isPaused,
          isRunning: snapshot.StartStop.isRunning,
          // Add currentModeSettings
          currentModeSettings: {
            load: snapshot.Modes.load,
          },
        },
      },
    },
  },
};

Firebase पर डिप्लॉय करें

अपडेट की गई कार्रवाई को डिप्लॉय करने के लिए, नीचे दिया गया कमांड चलाएं:

firebase deploy --only functions

डिप्लॉयमेंट पूरा होने के बाद, वेब यूआई पर जाएं और टूलबार में रीफ़्रेश करें ae8d3b25777a5e30.png बटन पर क्लिक करें. इससे, सिंक करने का अनुरोध करें और Assistant को, SYNC के रिस्पॉन्स का अपडेट किया गया डेटा मिलता है.

bf4f6a866160a982.png

अब वॉशर का मोड सेट करने के लिए, कोई निर्देश दिया जा सकता है. जैसे:

"Ok Google, वॉशर लोड को बड़ा पर सेट करो."

इसके अलावा, वॉशर से जुड़े सवाल भी पूछे जा सकते हैं. जैसे:

"Ok Google, वॉशर कितना लोड होता है?"

5. टॉगल जोड़ें

action.devices.traits.Toggles trait किसी डिवाइस के नाम वाले पहलुओं के बारे में बताता है, जिनमें डिवाइस की सही या गलत स्थिति होती है. जैसे, क्या वॉशर टर्बो मोड में है.

सिंक के जवाब को अपडेट करें

SYNC के जवाब में, आपको डिवाइस की नई सुविधा के बारे में जानकारी जोड़नी होगी. यह traits कैटगरी और attributes ऑब्जेक्ट में दिखेगा, जैसा कि यहां दिए गए कोड स्निपेट में दिखाया गया है.

index.js

app.onSync(body => {
  return {
    requestId: 'ff36a3cc-ec34-11e6-b1a0-64510650abcf',
    payload: {
      agentUserId: USER_ID,
      devices: [{
        id: 'washer',
        type: 'action.devices.types.WASHER',
        traits: [
          'action.devices.traits.OnOff',
          'action.devices.traits.StartStop',
          'action.devices.traits.RunCycle',
          'action.devices.traits.Modes',
          // Add Toggles trait
          'action.devices.traits.Toggles',
        ],
        name: { ... },
        deviceInfo: { ... },
        attributes: {
          pausable: true,
          availableModes: [{
            name: 'load',
            name_values: [{
              name_synonym: ['load'],
              lang: 'en'
            }],
            settings: [{ ... }],
            ordered: true,
          }],
          //Add availableToggles
          availableToggles: [{
            name: 'Turbo',
            name_values: [{
              name_synonym: ['turbo'],
              lang: 'en',
            }],
          }],
        },
      }],
    },
  };
});

नए EXECUTE इंटेंट निर्देश जोड़ना

अपने EXECUTE इंटेंट में, action.devices.commands.SetToggles कमांड जोड़ें, जैसा कि इस कोड स्निपेट में दिखाया गया है.

index.js

const updateDevice = async (execution,deviceId) => {
  const {params,command} = execution;
  let state, ref;
  switch (command) {
    case 'action.devices.commands.OnOff':
      state = {on: params.on};
      ref = firebaseRef.child(deviceId).child('OnOff');
      break;
    case 'action.devices.commands.StartStop':
      state = {isRunning: params.start};
      ref = firebaseRef.child(deviceId).child('StartStop');
      break;
    case 'action.devices.commands.PauseUnpause':
      state = {isPaused: params.pause};
      ref = firebaseRef.child(deviceId).child('StartStop');
      break;
    case 'action.devices.commands.SetModes':
      state = {load: params.updateModeSettings.load};
      ref = firebaseRef.child(deviceId).child('Modes');
      break;
    // Add SetToggles command
    case 'action.devices.commands.SetToggles':
      state = {Turbo: params.updateToggleSettings.Turbo};
      ref = firebaseRef.child(deviceId).child('Toggles');
      break;
  }

QUERY के लिए जवाब अपडेट करें

आखिर में, वॉशर के टर्बो मोड की रिपोर्ट करने के लिए, आपको QUERY के जवाब को अपडेट करना होगा. रीयलटाइम डेटाबेस में सेव की गई टॉगल स्थिति पाने के लिए, queryFirebase और queryDevice फ़ंक्शन में अपडेट किए गए बदलाव जोड़ें.

index.js

const queryFirebase = async (deviceId) => {
  const snapshot = await firebaseRef.child(deviceId).once('value');
  const snapshotVal = snapshot.val();
  return {
    on: snapshotVal.OnOff.on,
    isPaused: snapshotVal.StartStop.isPaused,
    isRunning: snapshotVal.StartStop.isRunning,
    load: snapshotVal.Modes.load,
    // Add Toggles snapshot
    Turbo: snapshotVal.Toggles.Turbo,
  };
}

const queryDevice = async (deviceId) => {
  const data = queryFirebase(deviceId);
  return {
    on: data.on,
    isPaused: data.isPaused,
    isRunning: data.isRunning,
    currentRunCycle: [{ ... }],
    currentTotalRemainingTime: 1212,
    currentCycleRemainingTime: 301,
    currentModeSettings: {
      load: data.load,
    },
    // Add currentToggleSettings
    currentToggleSettings: {
      Turbo: data.Turbo,
    },
  };
};

रिपोर्ट की स्थिति अपडेट करें

आखिर में, होम ग्राफ़ को रिपोर्ट करने के लिए अपने reportstate फ़ंक्शन को अपडेट करें कि क्या वॉशर को टर्बो पर सेट किया गया है.

index.js

const requestBody = {
  requestId: 'ff36a3cc', /* Any unique ID */
  agentUserId: USER_ID,
  payload: {
    devices: {
      states: {
        /* Report the current state of your washer */
        [context.params.deviceId]: {
          on: snapshot.OnOff.on,
          isPaused: snapshot.StartStop.isPaused,
          isRunning: snapshot.StartStop.isRunning,
          currentModeSettings: {
            load: snapshot.Modes.load,
          },
          // Add currentToggleSettings
          currentToggleSettings: {
            Turbo: snapshot.Toggles.Turbo,
          },
        },
      },
    },
  },
};

Firebase पर डिप्लॉय करें

अपडेट किए गए फ़ंक्शन को डिप्लॉय करने के लिए, नीचे दिया गया कमांड चलाएं:

firebase deploy --only functions

डिप्लॉयमेंट पूरा होने के बाद, सिंक करने का अनुरोध करें को ट्रिगर करने के लिए, वेब यूज़र इंटरफ़ेस (यूआई) में रीफ़्रेश करें ae8d3b25777a5e30.png बटन पर क्लिक करें.

वॉशर को टर्बो मोड पर सेट करने का निर्देश देने के लिए, यह कहें:

"Ok Google, वॉशर के लिए टर्बो करने की सुविधा चालू करो."

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

"Ok Google, क्या मेरी वॉशिंग मशीन टर्बो मोड में है?"

6. गड़बड़ियों और अपवादों की रिपोर्ट करना

स्मार्ट होम ऐक्शन में गड़बड़ियों को ठीक करने से, उपयोगकर्ताओं को उन समस्याओं की शिकायत की जा सकती है जिनकी वजह से EXECUTE और QUERY के जवाब काम नहीं करते. जब आपके उपयोगकर्ता आपके स्मार्ट डिवाइस और कार्रवाई से इंटरैक्ट करते हैं, तब इन सूचनाओं से उन्हें एक बेहतर उपयोगकर्ता अनुभव मिलता है.

अगर कभी भी EXECUTE या QUERY का अनुरोध पूरा नहीं होता है, तो आपकी सेट की गई कार्रवाई से गड़बड़ी का कोड दिखेगा. उदाहरण के लिए, अगर आप किसी उपयोगकर्ता के लिड को खोलकर वॉशर चालू करने की कोशिश करते समय गड़बड़ी का मैसेज दिखाना चाहते हैं, तो EXECUTE रिस्पॉन्स कुछ कोड स्निपेट की तरह दिखेगा:

{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [
      {
        "ids": [
          "456"
        ],
        "status": "ERROR",
        "errorCode": "deviceLidOpen"
      }
    ]
  }
}

अब, जब कोई व्यक्ति वॉशिंग मशीन चालू करने के लिए कहता है, तब Assistant यह जवाब देती है:

"वॉशर का लिड खुला है. कृपया इसे बंद करें और फिर से कोशिश करें."

अपवाद गड़बड़ियों की तरह ही होते हैं. हालांकि, इनसे पता चलता है कि किसी निर्देश से जुड़ी सूचना को कब ट्रिगर किया जा सकता है. ऐसे में, हो सकता है कि कार्रवाई पूरी होने से रोके. एक अपवाद, StatusReport trait का इस्तेमाल करके मिलती-जुलती जानकारी दे सकता है. जैसे, बैटरी का लेवल या हाल ही में हुए बदलाव की जानकारी. नॉन-ब्लॉक करने वाले अपवाद कोड SUCCESS स्थिति के साथ दिखाए जाते हैं, जबकि ब्लॉक करने वाले अपवाद कोड EXCEPTIONS स्थिति के साथ दिए जाते हैं.

यहां दिए गए कोड स्निपेट में, अपवाद के साथ रिस्पॉन्स का एक उदाहरण दिया गया है:

{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [{
      "ids": ["123"],
      "status": "SUCCESS",
      "states": {
        "online": true,
        "isPaused": false,
        "isRunning": false,
        "exceptionCode": "runCycleFinished"
      }
    }]
  }
}

Assistant इन सवालों के जवाब देती है:

"वॉशर चल चुका है."

वॉशर के लिए गड़बड़ी की रिपोर्ट जोड़ने के लिए, functions/index.js खोलें और गड़बड़ी की कैटगरी वाली परिभाषा जोड़ें, जैसा कि इस कोड स्निपेट में दिखाया गया है:

index.js

app.onQuery(async (body) => {...});

// Add SmartHome error handling
class SmartHomeError extends Error {
  constructor(errorCode, message) {
    super(message);
    this.name = this.constructor.name;
    this.errorCode = errorCode;
  }
}

गड़बड़ी कोड और गड़बड़ी का स्टेटस दिखाने के लिए, एक्ज़ीक्यूट करने के रिस्पॉन्स को अपडेट करें:

index.js

const executePromises = [];
const intent = body.inputs[0];
for (const command of intent.payload.commands) {
  for (const device of command.devices) {
    for (const execution of command.execution) {
      executePromises.push( ... )
          //Add error response handling
          .catch((error) => {
            functions.logger.error('EXECUTE', device.id, error);
            result.ids.push(device.id);
            if(error instanceof SmartHomeError) {
              result.status = 'ERROR';
              result.errorCode = error.errorCode;
            }
          })
      );
    }
  }
}

Assistant अब आपके उपयोगकर्ताओं को ऐसे किसी भी गड़बड़ी कोड के बारे में बता सकती है जिसकी आपने शिकायत की है. आपको अगले सेक्शन में इससे जुड़ा उदाहरण दिखेगा.

7. उपयोगकर्ता की जानकारी की पुष्टि करने का दूसरा तरीका जोड़ें

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

आपके पास सभी तरह के डिवाइसों और विशेषताओं पर, उपयोगकर्ता की जानकारी की पुष्टि दूसरे तरीके से पुष्टि करने का विकल्प है. इसमें यह कस्टमाइज़ किया जा सकता है कि सुरक्षा से जुड़ी हर चुनौती आती है या किसी खास शर्त को पूरा करना ज़रूरी है.

चुनौतियों के साथ काम करने वाले तीन तरह के चैलेंज टाइप होते हैं:

  • No challenge—ऐसा अनुरोध और जवाब जो पुष्टि करने के चैलेंज का इस्तेमाल नहीं करता है (यह डिफ़ॉल्ट तरीका है)
  • ackNeeded—उपयोगकर्ता की पुष्टि का दूसरा तरीका, जिसके लिए साफ़ तौर पर सहमति देना ज़रूरी है (हां या नहीं)
  • pinNeeded—उपयोगकर्ता की पहचान की पुष्टि का दूसरा तरीका, जिसके लिए व्यक्तिगत पहचान संख्या (पिन) ज़रूरी है

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

functions/index.js खोलें और गड़बड़ी की क्लास के लिए ऐसी परिभाषा जोड़ें जो गड़बड़ी का कोड और चैलेंज टाइप दिखाती हो. ये कोड स्निपेट इस तरह से दिखते हैं:

index.js

class SmartHomeError extends Error { ... }

// Add secondary user verification error handling
class ChallengeNeededError extends SmartHomeError {
  /**
   * Create a new ChallengeNeededError
   * @param {string} suvType secondary user verification challenge type
   */
  constructor(suvType) {
    super('challengeNeeded', suvType);
    this.suvType = suvType;
  }
}

challengeNeeded गड़बड़ी दिखाने के लिए, आपको इस तरह से एक्ज़ीक्यूशन रिस्पॉन्स को भी अपडेट करना होगा:

index.js

const executePromises = [];
const intent = body.inputs[0];
for (const command of intent.payload.commands) {
  for (const device of command.devices) {
    for (const execution of command.execution) {
      executePromises.push( ... )
          .catch((error) => {
            functions.logger.error('EXECUTE', device.id, error);
            result.ids.push(device.id);
            if(error instanceof SmartHomeError) {
              result.status = 'ERROR';
              result.errorCode = error.errorCode;
              //Add error response handling
              if(error instanceof ChallengeNeededError) {
                result.challengeNeeded = {
                  type: error.suvType
                };
              }
            }
          })
      );
    }
  }
}

आखिर में, वॉशर को चालू या बंद करने के लिए, साफ़ तौर पर आपकी अनुमति मांगने के लिए, updateDevice में बदलाव करें.

index.js

const updateDevice = async (execution,deviceId) => {
  const {challenge,params,command} = execution; //Add secondary user challenge
  let state, ref;
  switch (command) {
    case 'action.devices.commands.OnOff':
      //Add secondary user verification challenge
      if (!challenge || !challenge.ack) {
        throw new ChallengeNeededError('ackNeeded');
      }
      state = {on: params.on};
      ref = firebaseRef.child(deviceId).child('OnOff');
      break;
    ...
  }

  return ref.update(state)
      .then(() => state);
};

Firebase पर डिप्लॉय करें

अपडेट किए गए फ़ंक्शन को डिप्लॉय करने के लिए, नीचे दिया गया कमांड चलाएं:

firebase deploy --only functions

अपडेट किया गया कोड लागू करने के बाद, जब Assistant से वॉशर चालू या बंद करने के लिए कहा जाए, तब आपको बोलकर कार्रवाई की अनुमति देनी होगी. जैसे:

आप: "Ok Google, वॉशर चालू करो."

Assistant: "क्या आपको वाकई वॉशर चालू करना है?"

आप: "हां."

Firebase लॉग में, उपयोगकर्ता की पहचान की पुष्टि करने के दूसरे चरण के हर चरण के बारे में ज़्यादा जानकारी देखी जा सकती है.

289dbe48f4bb8106.png

8. बधाई हो

674c4f4392e98c1.png

बधाई! आपने Modes और Toggles traits की मदद से, स्मार्ट होम कार्रवाइयों की सुविधाओं को बेहतर बनाया है. साथ ही, उपयोगकर्ता की पुष्टि दूसरे तरीके से करके, इन्हें इस्तेमाल करने की सुविधा चालू की है.

ज़्यादा जानें

यहां कुछ आइडिया दिए गए हैं जिन्हें लागू करके, ज़्यादा जानकारी दी जा सकती है:

  • अपने डिवाइसों में, लोकल एक्ज़ीक्यूशन की क्षमताएं जोड़ें.
  • अपने डिवाइस की स्थिति बदलने के लिए, उपयोगकर्ता की पहचान की पुष्टि करने का कोई दूसरा तरीका इस्तेमाल करें.
  • डाइनैमिक तौर पर अपडेट करने के लिए, RunCycle trait QUERY के जवाब को अपडेट करें.
  • यह GitHub सैंपल एक्सप्लोर करें.