स्मार्ट होम डिवाइसों को Google Assistant से कनेक्ट करना

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

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

79266e5f45e6ae20.gif

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

d009cef0f903d284.jpeg

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

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

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

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

  • स्मार्ट होम क्लाउड सेवा को कैसे डिप्लॉय करें
  • अपनी सेवा को Assistant से कनेक्ट करने का तरीका
  • डिवाइस की स्थिति में हुए बदलावों को Google पर पब्लिश करने का तरीका

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

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

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

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

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

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

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

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

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

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

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

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 प्रोजेक्ट के आईडी से मैच करेगा.

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

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://<project-id>.web.app) में होस्टिंग यूआरएल खोलें. आपको यह इंटरफ़ेस दिखेगा:

5845443e94705557.png

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

अब आपको Google Home 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

Cloud Functions का यूआरएल जोड़ना

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

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

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

4. वॉशर बनाना

इंटिग्रेशन कॉन्फ़िगर करने के बाद, अब डिवाइस जोड़े जा सकते हैं और डेटा भेजा जा सकता है. आपकी क्लाउड सेवा को इन इंटेंट को हैंडल करना होगा:

  • जब Assistant को यह जानना होता है कि उपयोगकर्ता ने कौनसे डिवाइस कनेक्ट किए हैं, तब SYNC इंटेंट ट्रिगर होता है. जब कोई उपयोगकर्ता खाता लिंक करता है, तब यह आपके सेवा खाते को भेजा जाता है. आपको उपयोगकर्ता के सभी डिवाइसों और उनकी क्षमताओं की जानकारी देने वाला JSON पेलोड भेजना चाहिए.
  • QUERY इंटेंट तब होता है, जब Assistant को किसी डिवाइस की मौजूदा स्थिति या स्टेटस के बारे में जानना होता है. आपको JSON पेलोड के साथ जवाब देना चाहिए. इसमें अनुरोध किए गए हर डिवाइस की स्थिति के बारे में जानकारी होनी चाहिए.
  • जब Assistant, उपयोगकर्ता की ओर से किसी डिवाइस को कंट्रोल करना चाहती है, तो EXECUTE इंटेंट ट्रिगर होता है. आपको JSON पेलोड के साथ जवाब देना चाहिए. इसमें, अनुरोध किए गए हर डिवाइस के लिए, कमांड के पूरा होने की स्थिति शामिल होनी चाहिए.
  • जब कोई उपयोगकर्ता अपने खाते को Assistant से अनलिंक करता है, तब DISCONNECT इंटेंट ट्रिगर होता है. आपको इस उपयोगकर्ता के डिवाइसों से Assistant को इवेंट भेजना बंद कर देना चाहिए.

इन इंटेंट को मैनेज करने के लिए, आपने जिन फ़ंक्शन को पहले डिप्लॉय किया था उन्हें अगले सेक्शन में अपडेट किया जाएगा.

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

functions/index.js खोलें. इसमें Assistant से मिले अनुरोधों का जवाब देने के लिए कोड होता है.

आपको डिवाइस के मेटाडेटा और क्षमताओं की जानकारी देकर, SYNC इंटेंट को हैंडल करना होगा. कपड़े धोने की मशीन के लिए, डिवाइस की जानकारी और सुझाई गई विशेषताएं शामिल करने के लिए, onSync ऐरे में JSON अपडेट करें.

index.js

app.onSync((body) => {
  return {
    requestId: body.requestId,
    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',
        ],
        name: {
          defaultNames: ['My Washer'],
          name: 'Washer',
          nicknames: ['Washer'],
        },
        deviceInfo: {
          manufacturer: 'Acme Co',
          model: 'acme-washer',
          hwVersion: '1.0',
          swVersion: '1.0.1',
        },
        willReportState: true,
        attributes: {
          pausable: true,
        },
      }],
    },
  };
});

Firebase पर डिप्लॉय करना

Firebase CLI का इस्तेमाल करके, अपडेट किए गए क्लाउड फ़ुलफ़िलमेंट को डिप्लॉय करें:

firebase deploy --only functions

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

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

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

ae252220753726f6.png

5. निर्देशों और क्वेरी को मैनेज करना

अब आपकी क्लाउड सेवा, वॉशर डिवाइस की जानकारी Google को सही तरीके से भेज रही है. इसलिए, आपको डिवाइस की स्थिति का अनुरोध करने और कमांड भेजने की सुविधा जोड़नी होगी.

QUERY इंटेंट को हैंडल करना

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

functions/index.js में, QUERY हैंडलर में बदलाव करें, ताकि इंटेंट अनुरोध में शामिल टारगेट डिवाइसों की सूची को प्रोसेस किया जा सके.

index.js

app.onQuery(async (body) => {
  const {requestId} = body;
  const payload = {
    devices: {},
  };
  const queryPromises = [];
  const intent = body.inputs[0];
  for (const device of intent.payload.devices) {
    const deviceId = device.id;
    queryPromises.push(queryDevice(deviceId)
        .then((data) => {
        // Add response to device payload
          payload.devices[deviceId] = data;
        }
        ));
  }
  // Wait for all promises to resolve
  await Promise.all(queryPromises);
  return {
    requestId: requestId,
    payload: payload,
  };
});

अनुरोध में शामिल हर डिवाइस के लिए, Realtime Database में सेव की गई मौजूदा स्थिति दिखाओ. वॉशर की स्थिति से जुड़ा डेटा दिखाने के लिए, 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,
  };
};

const queryDevice = async (deviceId) => {
  const data = await queryFirebase(deviceId);
  return {
    on: data.on,
    isPaused: data.isPaused,
    isRunning: data.isRunning,
    currentRunCycle: [{
      currentCycle: 'rinse',
      nextCycle: 'spin',
      lang: 'en',
    }],
    currentTotalRemainingTime: 1212,
    currentCycleRemainingTime: 301,
  };
};

EXECUTE इंटेंट को हैंडल करना

EXECUTE इंटेंट, डिवाइस के स्टेट को अपडेट करने के लिए इस्तेमाल की जाने वाली कमांड को हैंडल करता है. जवाब में, हर कमांड की स्थिति दिखाई जाती है. उदाहरण के लिए, SUCCESS, ERROR या PENDING. साथ ही, डिवाइस की नई स्थिति भी दिखाई जाती है.

functions/index.js में, EXECUTE हैंडलर में बदलाव करें. इससे उन लक्षणों की सूची को प्रोसेस किया जा सकेगा जिन्हें अपडेट करने की ज़रूरत है. साथ ही, हर कमांड के लिए टारगेट डिवाइसों का सेट भी प्रोसेस किया जा सकेगा:

index.js

app.onExecute(async (body) => {
  const {requestId} = body;
  // Execution results are grouped by status
  const result = {
    ids: [],
    status: 'SUCCESS',
    states: {
      online: true,
    },
  };

  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) => {
                  result.ids.push(device.id);
                  Object.assign(result.states, data);
                })
                .catch(() => functions.logger.error('EXECUTE', device.id)));
      }
    }
  }

  await Promise.all(executePromises);
  return {
    requestId: requestId,
    payload: {
      commands: [result],
    },
  };
});

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

index.js

const updateDevice = async (execution, deviceId) => {
  const {params, command} = execution;
  let state; let ref;
  switch (command) {
    case 'action.devices.commands.OnOff':
      state = {on: params.on};
      ref = getFirebaseRef().child(deviceId).child('OnOff');
      break;
    case 'action.devices.commands.StartStop':
      state = params.start
      ? {isRunning: true, isPaused: false}
      : {isRunning: false, isPaused: false};
      ref = getFirebaseRef().child(deviceId).child('StartStop');
      break;
    case 'action.devices.commands.PauseUnpause':
      const data = await queryDevice(deviceId);
      state = (data.isPaused === false && data.isRunning === false)
        ? {isRunning: false, isPaused: false}
        : {isRunning: !params.pause, isPaused: params.pause};
      ref = getFirebaseRef().child(deviceId).child('StartStop');
      break;
  }

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

6. अपने इंटिग्रेशन की जांच करना

तीनों इंटेंट लागू करने के बाद, यह जांच की जा सकती है कि आपका इंटिग्रेशन वॉशर को कंट्रोल कर रहा है या नहीं.

Firebase पर डिप्लॉय करना

Firebase CLI का इस्तेमाल करके, अपडेट किए गए क्लाउड फ़ुलफ़िलमेंट को डिप्लॉय करें:

firebase deploy --only functions

वॉशर की जांच करना

अब फ़ोन पर, बोले गए इन निर्देशों का इस्तेमाल करके वैल्यू में बदलाव देखा जा सकता है:

"Ok Google, मेरी वॉशिंग मशीन चालू करो."

"Ok Google, मेरी वॉशिंग मशीन को रोको."

"Ok Google, मेरी वॉशिंग मशीन बंद करो."

सवाल पूछकर, वॉशर की मौजूदा स्थिति के बारे में भी जाना जा सकता है.

"Ok Google, क्या मेरी वॉशिंग मशीन चालू है?"

"Ok Google, क्या मेरी वॉशिंग मशीन चल रही है?"

"Ok Google, मेरी वॉशिंग मशीन किस साइकल पर है?"

इन क्वेरी और कमांड को उन लॉग में देखा जा सकता है जो Firebase कंसोल के फ़ंक्शन सेक्शन में आपके फ़ंक्शन के नीचे दिखते हैं. लॉग लिखना और देखना लेख में, Firebase के लॉग के बारे में ज़्यादा जानें.

इन क्वेरी और कमांड को Google Cloud Console में भी देखा जा सकता है. इसके लिए, लॉगिंग > लॉग एक्सप्लोरर पर जाएं. Cloud Logging की मदद से ऐक्सेस इवेंट लॉग ऐक्सेस करना लेख में, Google Cloud में लॉगिंग के बारे में ज़्यादा जानें.

7. Google को अपडेट की शिकायत करना

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

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

इस सेक्शन में, फ़्रंटएंड वेब ऐप्लिकेशन से इन तरीकों को कॉल करने के लिए कोड जोड़ा जाएगा.

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

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

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

ee198858a6eac112.png

'रिपोर्ट की स्थिति' सुविधा चालू करना

रीयलटाइम डेटाबेस में डेटा लिखने से, स्टार्टर प्रोजेक्ट में मौजूद reportstate फ़ंक्शन ट्रिगर होता है. डेटाबेस में लिखे गए डेटा को कैप्चर करने के लिए, functions/index.js में reportstate फ़ंक्शन को अपडेट करें. इसके बाद, Report State का इस्तेमाल करके इसे Home Graph में पोस्ट करें.

index.js

exports.reportstate = functions.database.ref('{deviceId}').onWrite(
    async (change, context) => {
      functions.logger.info('Firebase write event triggered Report State');
      const snapshot = change.after.val();

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

      const res = await homegraph.devices.reportStateAndNotification({
        requestBody,
      });
      functions.logger.info('Report state response:', res.status, res.data);
    });

अनुरोध सिंक करने की सुविधा चालू करना

फ़्रंटएंड वेब यूज़र इंटरफ़ेस (यूआई) में आइकॉन को रीफ़्रेश करने पर, स्टार्टर प्रोजेक्ट में requestsync फ़ंक्शन ट्रिगर होता है. HomeGraph API को कॉल करने के लिए, functions/index.js में requestsync फ़ंक्शन लागू करें.

index.js

exports.requestsync = functions.https.onRequest(async (request, response) => {
  response.set('Access-Control-Allow-Origin', '*');
  functions.logger.info(`Request SYNC for user ${USER_ID}`);
  try {
    const res = await homegraph.devices.requestSync({
      requestBody: {
        agentUserId: USER_ID,
      },
    });
    functions.logger.info('Request sync response:', res.status, res.data);
    response.json(res.data);
  } catch (err) {
    functions.logger.error(err);
    response.status(500).send(`Error requesting sync: ${err}`);
  }
});

Firebase पर डिप्लॉय करना

Firebase CLI का इस्तेमाल करके, अपडेट किए गए कोड को डिप्लॉय करें:

firebase deploy --only functions

आपने जो लागू किया है उसकी जांच करना

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

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

8. बधाई हो

674c4f4392e98c1.png

बधाई हो! आपने क्लाउड-टू-क्लाउड इंटिग्रेशन का इस्तेमाल करके, Assistant को डिवाइस की क्लाउड सेवा के साथ इंटिग्रेट कर लिया है.

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

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

समीक्षा के लिए इंटिग्रेशन की जांच करने और उसे सबमिट करने के बारे में ज़्यादा जानें. साथ ही, उपयोगकर्ताओं के लिए इंटिग्रेशन पब्लिश करने की सर्टिफ़िकेशन प्रोसेस के बारे में भी जानें.