क्लाउड-टू-क्लाउड इंटिग्रेशन के लिए, स्थानीय तौर पर ऑर्डर पूरा करने की सुविधा चालू करना

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

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

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

72ffb320986092c.png

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

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

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

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

  • Developer Console में, स्थानीय तौर पर ऑर्डर पूरा करने की सुविधा को चालू और कॉन्फ़िगर करने का तरीका.
  • लोकल फ़ुलफ़िलमेंट ऐप्लिकेशन लिखने के लिए, लोकल होम एसडीके का इस्तेमाल कैसे करें.
  • Google Home स्पीकर या Google Nest स्मार्ट डिसप्ले पर लोड किए गए लोकल फ़ुलफ़िलमेंट ऐप्लिकेशन को डीबग करने का तरीका.

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

  • Google Chrome का सबसे नया वर्शन
  • iOS या Android डिवाइस, जिस पर Google Home ऐप्लिकेशन मौजूद हो
  • Google Home स्मार्ट स्पीकर या Google Nest स्मार्ट डिसप्ले
  • Node.js का 10.16 या इसके बाद का वर्शन
  • एक Google खाता
  • Google Cloud बिलिंग खाता

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

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

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

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

5SVCzM8IZLi_9DV8M0nEklv16NXkpvM0bIzQK2hSyKyvnFHBxPOz90rbr72ayxzmxd5aNROOqC_Cp4outbdlwJdObDs0DIE_8vYzw6dovoVrP9IZWlWsZxDS7UHOi1jiRbDMG8MqUA

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

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

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

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

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

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

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

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

  • public—स्मार्ट वॉशर को कंट्रोल और मॉनिटर करने के लिए, फ़्रंटएंड वेब यूज़र इंटरफ़ेस (यूआई)
  • functions—Cloud-to-cloud इंटिग्रेशन के लिए, क्लाउड फ़ुलफ़िलमेंट लागू करने वाले Cloud फ़ंक्शन
  • local—स्थानीय फ़ुलफ़िलमेंट ऐप्लिकेशन प्रोजेक्ट का स्ट्रक्चर, जिसमें इंटेंट हैंडलर स्टब किए गए हैं index.ts

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

  • fakeauth—खाता लिंक करने के लिए ऑथराइज़ेशन एंडपॉइंट
  • faketoken—खाता लिंक करने के लिए टोकन एंडपॉइंट
  • smarthome—स्मार्ट होम इंटेंट फ़ुलफ़िलमेंट एंडपॉइंट
  • reportstate—डिवाइस की स्थिति में बदलाव होने पर, HomeGraph API को चालू करता है
  • updateDevice—इस एंडपॉइंट का इस्तेमाल वर्चुअल डिवाइस, Report State को ट्रिगर करने के लिए करता है

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

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

cd app-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.json फ़ाइल को washer-done डायरेक्ट्री से washer-start डायरेक्ट्री में कॉपी करें. इससे washer-start डायरेक्ट्री में मौजूद फ़ाइल बदल जाएगी.

washer-start डायरेक्ट्री में:

cp -vp ../washer-done/firebase.json .

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

L60eA7MOnPmbBMl2XMipT9MdnP-RaVjyjf0Y93Y1b7mEyIsqZrrwczE7D3RQISRs-iusL1g4XbNmGhuA6-5sLcWefnczwNJEPfNLtwBsO4Tb9YvcAZBI6_rX19z8rxbik9Vq8F2fwg

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

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

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

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

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

XcWmBVamBZtPfOFqtsr5I38stPWTqDcMfQwbBjetBgxt0FCjEs285pa9K3QXSASptw0KYN2G8yfkT0-xg664V4PjqMreDDs-HPegHjOc4EVtReYPu-WKZyygq9Xmkf8X8z9177nBjQ

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

अब अपने इंटिग्रेशन में, स्थानीय तौर पर खरीदार को सामान पहुंचाने की सुविधा जोड़ी जा सकती है.

4. क्लाउड फ़ुलफ़िलमेंट को अपडेट करना

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

SYNC रिस्पॉन्स में otherDeviceIds फ़ील्ड जोड़ें. इसके लिए, यहां दिया गया कोड स्निपेट देखें:

functions/index.js

app.onSync((body) => {
  return {
    requestId: body.requestId,
    payload: {
      agentUserId: '123',
      devices: [{
        id: 'washer',
        type: 'action.devices.types.WASHER',
        traits: [ ... ],
        name: { ... },
        deviceInfo: { ... },
        willReportState: true,
        attributes: {
          pausable: true,
        },
        otherDeviceIds: [{
          deviceId: 'deviceid123',
        }],
      }],
    },
  };
});

अपडेट किए गए प्रोजेक्ट को Firebase पर डिप्लॉय करें:

firebase deploy --only functions

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

bf4f6a866160a982.png

5. लोकल फ़ुलफ़िलमेंट की सुविधा कॉन्फ़िगर करना

इस सेक्शन में, आपको क्लाउड-टू-क्लाउड इंटिग्रेशन में स्थानीय फ़ुलफ़िलमेंट के लिए ज़रूरी कॉन्फ़िगरेशन विकल्प जोड़ने होंगे. डेवलपमेंट के दौरान, आपको लोकल फ़ुलफ़िलमेंट ऐप्लिकेशन को Firebase होस्टिंग पर पब्लिश करना होगा. इससे Google Home डिवाइस, इसे ऐक्सेस और डाउनलोड कर सकेगा.

Google Home Developer Console में, स्क्रीन की बाईं ओर मौजूद प्रोजेक्ट > क्लाउड-टू-क्लाउड पर जाएं. इसके बाद, इंटिग्रेशन के लिए बदलाव करें को चुनें. सेटअप और कॉन्फ़िगरेशन पेज पर, नीचे की ओर स्क्रोल करके स्थानीय फ़ुलफ़िलमेंट पर जाएं. इसके बाद, सेटिंग को टॉगल करके चालू करें. हर टेस्ट यूआरएल फ़ील्ड में यह यूआरएल डालें. इसके बाद, अपना प्रोजेक्ट आईडी डालें और सेव करें पर क्लिक करें:

https://<project-id>.web.app/local-home/index.html

local-fulfillment.png

इसके बाद, हमें यह तय करना होगा कि Google Home डिवाइस को स्थानीय स्मार्ट डिवाइसों का पता कैसे लगाना चाहिए. Local Home प्लैटफ़ॉर्म, डिवाइस खोजने के लिए कई प्रोटोकॉल के साथ काम करता है. जैसे, mDNS, UPnP, और यूडीपी ब्रॉडकास्ट. स्मार्ट वॉशर का पता लगाने के लिए, यूडीपी ब्रॉडकास्ट का इस्तेमाल करें.

नया स्कैन कॉन्फ़िगरेशन जोड़ने के लिए, डिवाइस ढूंढने की सुविधा में जाकर + स्कैन कॉन्फ़िगरेशन जोड़ें पर क्लिक करें. प्रोटोकॉल के तौर पर यूडीपी को चुनें और यहां दिए गए एट्रिब्यूट की वैल्यू डालें:

फ़ील्ड

ब्यौरा

सुझाई गई वैल्यू

डिस्कवरी पता

यूडीपी डिस्कवरी पता

255.255.255.255

ब्रॉडकास्टिंग पोर्ट

वह पोर्ट जहां Google Home, यूडीपी ब्रॉडकास्ट भेजता है

3311

लिसनिंग पोर्ट

वह पोर्ट जहाँ Google Home जवाब सुनने के लिए इंतज़ार करता है

3312

डिस्कवरी पैकेट

यूडीपी ब्रॉडकास्ट डेटा पेलोड

48656c6c6f4c6f63616c486f6d6553444b

device-discovery.png

बदलावों को पब्लिश करने के लिए, विंडो में सबसे नीचे मौजूद सेव करें पर क्लिक करें.

6. स्थानीय फ़ुलफ़िलमेंट की सुविधा लागू करना

आपको लोकल होम एसडीके के टाइपिंग पैकेज का इस्तेमाल करके, TypeScript में लोकल फ़ुलफ़िलमेंट ऐप्लिकेशन डेवलप करना होगा. स्टार्टर प्रोजेक्ट में दिए गए स्केलेटन को देखें:

local/index.ts

/// <reference types="@google/local-home-sdk" />

import App = smarthome.App;
import Constants = smarthome.Constants;
import DataFlow = smarthome.DataFlow;
import Execute = smarthome.Execute;
import Intents = smarthome.Intents;
import IntentFlow = smarthome.IntentFlow;

...

class LocalExecutionApp {

  constructor(private readonly app: App) { }

  identifyHandler(request: IntentFlow.IdentifyRequest):
      Promise<IntentFlow.IdentifyResponse> {
    // TODO: Implement device identification
  }

  executeHandler(request: IntentFlow.ExecuteRequest):
      Promise<IntentFlow.ExecuteResponse> {
    // TODO: Implement local fulfillment
  }

  ...
}

const localHomeSdk = new App('1.0.0');
const localApp = new LocalExecutionApp(localHomeSdk);
localHomeSdk
  .onIdentify(localApp.identifyHandler.bind(localApp))
  .onExecute(localApp.executeHandler.bind(localApp))
  .listen()
  .then(() => console.log('Ready'))
  .catch((e: Error) => console.error(e));

लोकल फ़ुलफ़िलमेंट का मुख्य कॉम्पोनेंट, smarthome.App क्लास है. स्टार्टर प्रोजेक्ट, IDENTIFY और EXECUTE इंटेंट के लिए हैंडलर अटैच करता है. इसके बाद, listen() तरीके को कॉल करके, Local Home SDK को यह सूचना देता है कि ऐप्लिकेशन तैयार है.

IDENTIFY हैंडलर जोड़ना

जब Google Home डिवाइस, लोकल नेटवर्क पर ऐसे डिवाइसों का पता लगाता है जिनकी पुष्टि नहीं हुई है, तब Local Home SDK आपके IDENTIFY हैंडलर को ट्रिगर करता है. ऐसा, Developer Console में दिए गए स्कैन कॉन्फ़िगरेशन के आधार पर होता है.

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

हैंडलर, IdentifyResponse इंस्टेंस दिखाता है. इसमें लोकल डिवाइस के लिए यूनीक आइडेंटिफ़ायर होता है. लोकल डिवाइस से मिलने वाले यूडीपी रिस्पॉन्स को प्रोसेस करने और लोकल डिवाइस का सही आईडी तय करने के लिए, अपने identifyHandler तरीके में यह कोड जोड़ें:

local/index .ts

identifyHandler(request: IntentFlow.IdentifyRequest):
    Promise<IntentFlow.IdentifyResponse> {
  console.log("IDENTIFY intent: " + JSON.stringify(request, null, 2));

  const scanData = request.inputs[0].payload.device.udpScanData;
  if (!scanData) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_request', 'Invalid scan data');
    return Promise.reject(err);
  }

  // In this codelab, the scan data contains only local device ID.
  const localDeviceId = Buffer.from(scanData.data, 'hex');

  const response: IntentFlow.IdentifyResponse = {
    intent: Intents.IDENTIFY,
    requestId: request.requestId,
    payload: {
      device: {
        id: 'washer',
        verificationId: localDeviceId.toString(),
      }
    }
  };
  console.log("IDENTIFY response: " + JSON.stringify(response, null, 2));

  return Promise.resolve(response);
}

ध्यान दें कि verificationId फ़ील्ड की वैल्यू, SYNC रिस्पॉन्स में मौजूद verificationId वैल्यू में से किसी एक से मेल खानी चाहिए. इससे डिवाइस को, उपयोगकर्ता के होम ग्राफ़ में स्थानीय तौर पर पूरा किए जाने के लिए उपलब्ध के तौर पर फ़्लैग किया जाता है.otherDeviceIds Google को डिवाइस का मिलान मिलने के बाद, उस डिवाइस की पुष्टि हो जाती है. इसके बाद, उसे स्थानीय तौर पर पूरा करने के लिए तैयार माना जाता है.

EXECUTE हैंडलर जोड़ना

लोकल होम एसडीके, EXECUTE हैंडलर को तब ट्रिगर करता है, जब लोकल फ़ुलफ़िलमेंट की सुविधा के साथ काम करने वाले डिवाइस को कोई कमांड मिलती है. लोकल इंटेंट का कॉन्टेंट, क्लाउड फ़ुलफ़िलमेंट को भेजे गए EXECUTE इंटेंट के बराबर होता है. इसलिए, इंटेंट को स्थानीय तौर पर प्रोसेस करने का लॉजिक, क्लाउड में इसे हैंडल करने के तरीके से मिलता-जुलता है.Actions

ऐप्लिकेशन, लोकल डिवाइसों से कम्यूनिकेट करने के लिए टीसीपी/यूडीपी सॉकेट या एचटीटीपी/एचटीटीपीएस अनुरोधों का इस्तेमाल कर सकता है. इस कोडलैब में, वर्चुअल डिवाइस को कंट्रोल करने के लिए एचटीटीपी प्रोटोकॉल का इस्तेमाल किया जाता है. पोर्ट नंबर को index.ts में SERVER_PORT वैरिएबल के तौर पर तय किया जाता है.

आने वाले निर्देशों को प्रोसेस करने और उन्हें एचटीटीपी के ज़रिए लोकल डिवाइस पर भेजने के लिए, अपने executeHandler तरीके में यह कोड जोड़ें:

local/index.ts

executeHandler(request: IntentFlow.ExecuteRequest):
    Promise<IntentFlow.ExecuteResponse> {
  console.log("EXECUTE intent: " + JSON.stringify(request, null, 2));

  const command = request.inputs[0].payload.commands[0];
  const execution = command.execution[0];
  const response = new Execute.Response.Builder()
    .setRequestId(request.requestId);

  const promises: Array<Promise<void>> = command.devices.map((device) => {
    console.log("Handling EXECUTE intent for device: " + JSON.stringify(device));

    // Convert execution params to a string for the local device
    const params = execution.params as IWasherParams;
    const payload = this.getDataForCommand(execution.command, params);

    // Create a command to send over the local network
    const radioCommand = new DataFlow.HttpRequestData();
    radioCommand.requestId = request.requestId;
    radioCommand.deviceId = device.id;
    radioCommand.data = JSON.stringify(payload);
    radioCommand.dataType = 'application/json';
    radioCommand.port = SERVER_PORT;
    radioCommand.method = Constants.HttpOperation.POST;
    radioCommand.isSecure = false;

    console.log("Sending request to the smart home device:", payload);

    return this.app.getDeviceManager()
      .send(radioCommand)
      .then(() => {
        const state = {online: true};
        response.setSuccessState(device.id, Object.assign(state, params));
        console.log(`Command successfully sent to ${device.id}`);
      })
      .catch((e: IntentFlow.HandlerError) => {
        e.errorCode = e.errorCode || 'invalid_request';
        response.setErrorState(device.id, e.errorCode);
        console.error('An error occurred sending the command', e.errorCode);
      });
  });

  return Promise.all(promises)
    .then(() => {
      return response.build();
    })
    .catch((e) => {
      const err = new IntentFlow.HandlerError(request.requestId,
          'invalid_request', e.message);
      return Promise.reject(err);
    });
}

TypeScript ऐप्लिकेशन को कंपाइल करना

local/ डायरेक्ट्री पर जाएं. इसके बाद, TypeScript कंपाइलर डाउनलोड करने और ऐप्लिकेशन को कंपाइल करने के लिए, यहां दिए गए निर्देश चलाएं:

cd local
npm install
npm run build

यह index.ts (टाइपस्क्रिप्ट) सोर्स को कंपाइल करता है और public/local-home/ डायरेक्ट्री में यह कॉन्टेंट डालता है:

  • bundle.js—कंपाइल किया गया JavaScript आउटपुट, जिसमें लोकल ऐप्लिकेशन और डिपेंडेंसी शामिल होती हैं.
  • index.html—लोकल होस्टिंग पेज का इस्तेमाल, डिवाइस पर ऐप्लिकेशन की टेस्टिंग के लिए किया जाता है.

टेस्ट प्रोजेक्ट को डिप्लॉय करना

अपडेट की गई प्रोजेक्ट फ़ाइलों को Firebase Hosting पर डिप्लॉय करें, ताकि उन्हें Google Home डिवाइस से ऐक्सेस किया जा सके.

firebase deploy --only hosting

7. स्मार्ट वॉशर चालू करो

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

डिवाइस को कॉन्फ़िगर करना

आपको वर्चुअल डिवाइस को कॉन्फ़िगर करना होगा, ताकि वह उन यूडीपी पैरामीटर का इस्तेमाल कर सके जिन्हें आपने Developer Console में डिवाइस ढूंढने के लिए स्कैन कॉन्फ़िगरेशन पर लागू किया था. इसके अलावा, आपको वर्चुअल डिवाइस को यह बताना होगा कि कौनसे लोकल डिवाइस आईडी की रिपोर्ट करनी है. साथ ही, डिवाइस की स्थिति बदलने पर, Report State इवेंट के लिए, Cloud-to-cloud इंटिग्रेशन के प्रोजेक्ट आईडी का इस्तेमाल करना है.

पैरामीटर

सुझाई गई वैल्यू

deviceId

deviceid123

discoveryPortOut

3311

discoveryPacket

HelloLocalHomeSDK

projectId

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

डिवाइस को चालू करें

virtual-device/ डायरेक्ट्री पर जाएं और डिवाइस स्क्रिप्ट चलाएं. इसके लिए, कॉन्फ़िगरेशन पैरामीटर को आर्ग्युमेंट के तौर पर पास करें:

cd virtual-device
npm install
npm start -- \
  --deviceId=deviceid123 --projectId=<project-id> \
  --discoveryPortOut=3311 --discoveryPacket=HelloLocalHomeSDK

पुष्टि करें कि डिवाइस स्क्रिप्ट, अनुमानित पैरामीटर के साथ काम करती है:

(...): UDP Server listening on 3311
(...): Device listening on port 3388
(...): Report State successful

8. TypeScript ऐप्लिकेशन को डीबग करना

इस सेक्शन में, आपको यह पुष्टि करनी होगी कि Google Home डिवाइस, लोकल नेटवर्क पर वर्चुअल स्मार्ट वॉशर को सही तरीके से स्कैन कर सकता है, उसकी पहचान कर सकता है, और उसे निर्देश भेज सकता है. Google Home डिवाइस से कनेक्ट करने, कंसोल लॉग देखने, और TypeScript ऐप्लिकेशन को डीबग करने के लिए, Google Chrome Developer Tools का इस्तेमाल किया जा सकता है.

Chrome डेवलपर टूल कनेक्ट करना

डीबगर को अपने लोकल फ़ुलफ़िलमेंट ऐप्लिकेशन से कनेक्ट करने के लिए, यह तरीका अपनाएं:

  1. पक्का करें कि आपने अपने Google Home डिवाइस को ऐसे उपयोगकर्ता से लिंक किया हो जिसके पास Developer Console प्रोजेक्ट को ऐक्सेस करने की अनुमति हो.
  2. अपने Google Home डिवाइस को रीबूट करें. इससे उसे आपके एचटीएमएल का यूआरएल और Developer Console में डाला गया स्कैन कॉन्फ़िगरेशन मिल जाता है.
  3. अपनी डेवलपमेंट मशीन पर Chrome लॉन्च करें.
  4. Chrome में नया टैब खोलें और इंस्पेक्टर लॉन्च करने के लिए, पता फ़ील्ड में chrome://inspect डालें.

आपको पेज पर डिवाइसों की सूची दिखेगी. साथ ही, Google Home डिवाइस के नाम के नीचे, आपके ऐप्लिकेशन का यूआरएल दिखेगा.

567f97789a7d8846.png

इंस्पेक्टर लॉन्च करना

Chrome डेवलपर टूल लॉन्च करने के लिए, अपने ऐप्लिकेशन के यूआरएल में जाकर जांच करें पर क्लिक करें. Console टैब चुनें और पुष्टि करें कि आपको अपने TypeScript ऐप्लिकेशन से प्रिंट किया गया IDENTIFY इंटेंट का कॉन्टेंट दिख रहा है.

6b67ded470a4c8be.png

इस आउटपुट का मतलब है कि स्थानीय तौर पर ऑर्डर पूरा करने वाले ऐप्लिकेशन ने वर्चुअल डिवाइस का पता लगा लिया है और उसकी पहचान कर ली है.

स्थानीय तौर पर ऑर्डर पूरा करने की सुविधा को टेस्ट करना

Google Home ऐप्लिकेशन में टच कंट्रोल का इस्तेमाल करके या Google Home डिवाइस को बोलकर निर्देश दें. जैसे:

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

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

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

इससे प्लैटफ़ॉर्म, आपके TypeScript ऐप्लिकेशन को EXECUTE इंटेंट भेजने के लिए ट्रिगर हो जाएगा.

bc030517dacc3ac9.png

पुष्टि करें कि हर निर्देश के साथ, आपको स्मार्ट वॉशर की स्थिति में बदलाव दिख रहा हो.

...
***** The washer is RUNNING *****
...
***** The washer is STOPPED *****

9. बधाई हो

764dbc83b95782a.png

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

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

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

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