क्लाउड-टू-क्लाउड इंटिग्रेशन को बेहतर और सुरक्षित बनाना

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

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

dc8dce0dea87cd5c.png

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

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

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

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

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

आपको क्या सीखने को मिलेगा

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

आपको किन चीज़ों की ज़रूरत होगी

2. शुरू करना

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

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

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

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

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

क्लाउड-टू-क्लाउड इंटिग्रेशन प्रोजेक्ट बनाना

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

प्रोजेक्ट का नाम

क्लाउड-टू-क्लाउड इंटिग्रेशन चुनना

Developer Console में प्रोजेक्ट होम पर जाकर, क्लाउड-टू-क्लाउड में मौजूद क्लाउड-टू-क्लाउड इंटिग्रेशन जोड़ें को चुनें.

क्लाउड-टू-क्लाउड इंटिग्रेशन जोड़ना

Firebase CLI इंस्टॉल करना

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

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

npm install -g firebase-tools

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

firebase --version

अपने Google खाते से Firebase CLI को अनुमति दें. इसके लिए, यह कमांड चलाएं:

firebase login

Firebase को Google Home Developer Console प्रोजेक्ट से जोड़ना

पहला तरीका: Firebase कंसोल के ज़रिए

  1. Firebase पर जाएं.
  2. Firebase प्रोजेक्ट बनाएं पर क्लिक करें.
    Firebase प्रोजेक्ट बनाएं
  3. प्रोजेक्ट बनाएं स्क्रीन पर, Google Cloud प्रोजेक्ट में Firebase जोड़ें पर क्लिक करें.
    Google Cloud प्रोजेक्ट में Firebase जोड़ना
  4. शुरू करें स्क्रीन पर, Google Home Developer console में अभी-अभी बनाया गया Google Cloud प्रोजेक्ट चुनें. इसके बाद, जारी रखें पर क्लिक करें.
    Google Cloud प्रोजेक्ट चुनें

दूसरा तरीका: Firebase CLI के ज़रिए

firebase projects:addfirebase

Firebase जोड़ने के लिए, Google Home Developer Console का वह प्रोजेक्ट चुनें जिसे आपने अभी बनाया है.

Firebase को Google Home Developer Console प्रोजेक्ट में जोड़ने पर, यह Firebase Console में दिखेगा. Firebase प्रोजेक्ट का आईडी, Google Home Developer Console प्रोजेक्ट के आईडी से मैच करेगा.

क्लाउड प्रोजेक्ट जोड़ा गया

HomeGraph API को चालू करना

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

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

ee198858a6eac112.png

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

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

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

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

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

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

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

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

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

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

क्लाउड फ़ुलफ़िलमेंट की सुविधा के साथ, index.js में ये फ़ंक्शन शामिल हैं:

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

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

washer-start डायरेक्ट्री पर जाएं. इसके बाद, इंटिग्रेशन प्रोजेक्ट के साथ Firebase CLI सेट अप करें:

cd washer-start
firebase use <project-id>

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

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

firebase init

सीएलआई की सुविधाएं, Realtime Database, और Functions सुविधा चुनें.

? Which Firebase features do you want to set up for this directory? Press Space to select features, then Enter
 to confirm your choices. (Press <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to
 proceed)
>( ) Data Connect: Set up a Firebase Data Connect service
 ( ) Firestore: Configure security rules and indexes files for Firestore
 ( ) Genkit: Setup a new Genkit project with Firebase
 (*) Functions: Configure a Cloud Functions directory and its files
 ( ) App Hosting: Configure an apphosting.yaml file for App Hosting
 ( ) Hosting: Configure files for Firebase Hosting and (optionally) 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
 (*) Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision
default instance
 ( ) Data Connect: Set up a Firebase Data Connect service
 ( ) Firestore: Configure security rules and indexes files for Firestore

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

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

? 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

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

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

5845443e94705557.png

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

अब आपको Developer Console का इस्तेमाल करके, डिप्लॉय की गई क्लाउड सेवा को Google Assistant से कनेक्ट करना होगा.

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

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

डिसप्ले नेम जोड़ना

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

ऐप्लिकेशन का आइकॉन जोड़ना

खाता लिंक करने की सुविधा चालू करने के लिए, खाता लिंक करने की इन सेटिंग का इस्तेमाल करें:

क्लाइंट आईडी

ABC123

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

DEF456

प्राधिकरण URL

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

टोकन यूआरएल

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

खाता जोड़ने के यूआरएल अपडेट करना

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

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

क्लाउड फ़ंक्शन का यूआरएल जोड़ना

अपने प्रोजेक्ट के कॉन्फ़िगरेशन को सेव करने के लिए, सेव करें पर क्लिक करें. इसके बाद, अपने प्रोजेक्ट पर टेस्टिंग चालू करने के लिए, आगे बढ़ें: टेस्ट करें पर क्लिक करें.

क्लाउड-टू-क्लाउड इंटिग्रेशन की जांच करना

अब डिवाइस की स्थिति को Assistant से कनेक्ट करने के लिए ज़रूरी वेबहुक लागू किए जा सकते हैं.

क्लाउड-टू-क्लाउड इंटिग्रेशन की जांच करने के लिए, आपको अपने प्रोजेक्ट को किसी 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 ट्रेट की मदद से, किसी डिवाइस के लिए एक मोड की कई सेटिंग सेट की जा सकती हैं. हालांकि, एक बार में सिर्फ़ एक सेटिंग सेट की जा सकती है. आपको वॉशर में एक मोड जोड़ना होगा, ताकि कपड़े धोने के लोड का साइज़ तय किया जा सके: छोटा, सामान्य या बड़ा.

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

आपको 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) => {
  ...
  switch (command) {
    ...
    // Add SetModes command
    case 'action.devices.commands.SetModes':
      state = {load: params.updateModeSettings.load};
      ref = getFirebaseRef().child(deviceId).child('Modes');
      break;
}

QUERY फ़ंक्शन के जवाब को अपडेट करना

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

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

index.js

const queryFirebase = async (deviceId) => {
  const snapshot = await getFirebaseRef().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 फ़ंक्शन को अपडेट करें, ताकि Home Graph को वॉशर की मौजूदा लोड सेटिंग की जानकारी मिल सके.

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 ट्रेट, डिवाइस के उन पहलुओं को दिखाता है जिनकी स्थिति सही या गलत होती है. जैसे, वॉशर टर्बो मोड में है या नहीं.

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

आपको 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) => {
  ...
  switch (command) {
\   ...
    // 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 getFirebaseRef().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 फ़ंक्शन को अपडेट करें, ताकि Home Graph को यह जानकारी मिल सके कि वॉशर को टर्बो मोड पर सेट किया गया है या नहीं.

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 ट्रेट का इस्तेमाल करके इससे जुड़ी जानकारी दे सकता है. जैसे, बैटरी का लेवल या हाल ही में हुए बदलाव की जानकारी. नॉन-ब्लॉकिंग अपवाद कोड, 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;
  }
}

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

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(
        updateDevice(execution, device.id)
        .then((data) => {
          ...
        })
        //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(

        updateDevice(execution, device.id)
        .then((data) => {
          ...
        })
        .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 = getFirebaseRef().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 ट्रेट के ज़रिए, क्लाउड-टू-क्लाउड इंटिग्रेशन की सुविधाओं को बढ़ाया है. साथ ही, सेकंडरी यूज़र की पुष्टि करके, उनके इस्तेमाल को सुरक्षित किया है.

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

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

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