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

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

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

dc8dce0dea87cd5c.png

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

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

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

आपको क्या बनाना होगा

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

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

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

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

2. शुरू करना

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

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

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

पक्का करें कि ये टॉगल स्विच चालू हैं:

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

कार्रवाइयां प्रोजेक्ट बनाना

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

3d6b68ca79afd54c.png

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

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

2fa4988f44f8914b.png

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

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

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

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

npm install -g firebase-tools

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

firebase --version

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

firebase login

HomeGraph एपीआई चालू करना

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

Google Cloud Console में, पक्का करें कि आपने वह प्रोजेक्ट चुना हो जो आपकी कार्रवाइयों से मेल खाता हो <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: डिवाइस की स्थिति में होने वाले बदलावों पर, Home ग्राफ़ एपीआई को चालू करता है
  • 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

अगर गलती से ईएसएलंट चालू हो जाता है, तो उसे बंद करने के दो तरीके हैं:

  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 Functions के साथ-साथ, एक वेब ऐप्लिकेशन को डिप्लॉय करता है.

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

5845443e94705557.png

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

अब ऐक्शन कंसोल का इस्तेमाल करके, 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. Google Assistant > सेटिंग > होम कंट्रोल (Assistant के तहत).
  3. ऊपर दाईं ओर मौजूद, खोजें आइकॉन पर क्लिक करें.
  4. टेस्ट ऐप्लिकेशन खोजने के लिए, [test] प्रीफ़िक्स का इस्तेमाल करके टेस्ट ऐप्लिकेशन खोजें.
  5. वह आइटम चुनें. इसके बाद, Google Assistant आपकी सेवा की पुष्टि करेगी और SYNC का अनुरोध भेजेगी. इस अनुरोध में, आपकी सेवा देने वाली कंपनी से, उपयोगकर्ता के लिए डिवाइसों की सूची देने के लिए कहा जाएगा.

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

ae252220753726f6.png

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

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

4. मोड जोड़ें

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

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

आपको functions/index.js में अपने 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',
          // 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 के जवाब में, डिवाइस की नई 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',
          '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 के जवाब काम नहीं करते. इन सूचनाओं की मदद से, उपयोगकर्ताओं को तब ज़्यादा बेहतर उपयोगकर्ता अनुभव मिलता है, जब वे आपके स्मार्ट डिवाइस और Action से इंटरैक्ट करते हैं.

जब भी 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. उपयोगकर्ता की पुष्टि करने का दूसरा तरीका जोड़ें

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

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

इन तीन तरह के चैलेंज का इस्तेमाल किया जा सकता है:

  • 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 Trait के ज़रिए, स्मार्ट होम कार्रवाइयों की सुविधाओं को बढ़ाया. साथ ही, दूसरे उपयोगकर्ता की पुष्टि करके, इस सुविधा को लागू किया.

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

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

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