1. शुरू करने से पहले
स्मार्ट होम इंटिग्रेशन की मदद से, Google Assistant उपयोगकर्ताओं के होम में कनेक्ट किए गए डिवाइसों को कंट्रोल कर सकती है. स्मार्ट होम ऐक्शन बनाने के लिए, आपको एक ऐसा क्लाउड वेबहुक एंडपॉइंट देना होगा जो स्मार्ट होम इंटेंट को हैंडल कर सके. उदाहरण के लिए, जब कोई व्यक्ति कहता है, "Ok Google, लाइटें चालू करो," तो Assistant आपके डिवाइस की स्थिति अपडेट करने के लिए, क्लाउड पर कुछ निर्देश भेजती है.
लोकल होम SDK टूल, आपके स्मार्ट होम इंटिग्रेशन को बेहतर बनाता है. इसकी मदद से, स्मार्ट होम इंटेंट को सीधे Google Home डिवाइस पर रूट करने के लिए लोकल पाथ जोड़ा जा सकता है. इससे ज़्यादा भरोसेमंद और उपयोगकर्ताओं के निर्देशों को प्रोसेस करने में लगने वाला समय कम होता है. यह आपको TypeScript या JavaScript में, स्थानीय फ़ुलफ़िलमेंट ऐप्लिकेशन में लिखने और डिप्लॉय करने की सुविधा देता है. यह ऐप्लिकेशन, डिवाइसों की पहचान करता है और किसी भी Google Home स्मार्ट स्पीकर या Google Nest स्मार्ट डिसप्ले पर निर्देश देता है. इसके बाद आपका ऐप्लिकेशन, निर्देशों को पूरा करने के लिए मौजूदा स्टैंडर्ड प्रोटोकॉल का इस्तेमाल करके, लोकल एरिया नेटवर्क पर लोगों के मौजूदा स्मार्ट डिवाइसों से सीधे संपर्क करता है.
ज़रूरी शर्तें
- स्मार्ट होम ऐक्शन बनाने की डेवलपर गाइड
- स्मार्ट होम वॉशर का कोडलैब
- स्थानीय फ़ुलफ़िलमेंट डेवलपर गाइड
क्या बनाएं
इस कोडलैब में, Firebase के साथ पहले बनाए गए स्मार्ट होम इंटिग्रेशन को डिप्लॉय किया जाएगा. इसके बाद, Actions कंसोल में स्कैन कॉन्फ़िगरेशन लागू किया जा सकेगा. साथ ही, Node.js में लिखे गए निर्देश वर्चुअल वॉशर डिवाइस पर भेजने के लिए, TypeScript का इस्तेमाल करके एक लोकल ऐप्लिकेशन बनाएं.
आपको इनके बारे में जानकारी मिलेगी
- Actions कंसोल में स्थानीय फ़ुलफ़िलमेंट को चालू और कॉन्फ़िगर करने का तरीका.
- स्थानीय फ़ुलफ़िलमेंट ऐप्लिकेशन लिखने के लिए, Local Home SDK टूल का इस्तेमाल कैसे करें.
- Google Home स्पीकर या Google Nest स्मार्ट डिसप्ले पर लोड किए गए, स्थानीय फ़ुलफ़िलमेंट ऐप्लिकेशन को डीबग करने का तरीका.
आपको इन चीज़ों की ज़रूरत होगी
- Google Chrome का सबसे नया वर्शन
- आपके पास Google Home ऐप्लिकेशन वाला iOS या Android डिवाइस हो
- Google Home स्मार्ट स्पीकर या Google Nest स्मार्ट डिसप्ले
- Node.js का 10.16 या उसके बाद का वर्शन
- एक Google खाता
- Google Cloud बिलिंग खाता होना चाहिए
2. YouTube TV का इस्तेमाल शुरू करना
गतिविधि कंट्रोल चालू करना
Google Assistant का इस्तेमाल करने के लिए, आपको Google के साथ गतिविधि का कुछ डेटा शेयर करना होगा. Google Assistant को ठीक से काम करने के लिए इस डेटा की ज़रूरत होती है. हालांकि, डेटा शेयर करने की ज़रूरी शर्त सिर्फ़ SDK टूल के लिए नहीं है. अगर आपके पास पहले से कोई Google खाता नहीं है, तो यह डेटा शेयर करने के लिए एक खाता बनाएं. किसी भी Google खाते का इस्तेमाल किया जा सकता है—ज़रूरी नहीं है कि वह आपका डेवलपर खाता ही हो.
उस Google खाते का गतिविधि कंट्रोल पेज खोलें जिसे Assistant के साथ इस्तेमाल करना है.
पक्का करें कि नीचे दिए गए टॉगल स्विच चालू हों:
- वेब और ऐप्लिकेशन गतिविधि - इसके अलावा, इसमें Google की सेवाएं इस्तेमाल करने वाले डिवाइसों, ऐप्लिकेशन, और साइटों पर की गई मेरी गतिविधि की जानकारी और Chrome इतिहास शामिल करें चेकबॉक्स को चुनना न भूलें.
- डिवाइस की जानकारी
- आवाज़ और ऑडियो गतिविधि
ऐक्शन प्रोजेक्ट बनाना
- Actions on Google कंसोल पर जाएं.
- नया प्रोजेक्ट पर क्लिक करें. इसके बाद, प्रोजेक्ट का नाम डालें और प्रोजेक्ट बनाएं पर क्लिक करें.
स्मार्ट होम ऐप्लिकेशन चुनें
Actions कंसोल में खास जानकारी वाली स्क्रीन पर, स्मार्ट होम चुनें.
स्मार्ट होम एक्सपीरियंस कार्ड चुनें. इसके बाद, आपको अपने प्रोजेक्ट कंसोल पर भेज दिया जाएगा.
Firebase सीएलआई इंस्टॉल करना
Firebase कमांड लाइन इंटरफ़ेस (सीएलआई) की मदद से, अपने वेब ऐप्लिकेशन को स्थानीय तौर पर इस्तेमाल किया जा सकता है. साथ ही, अपने वेब ऐप्लिकेशन को Firebase होस्टिंग पर डिप्लॉय किया जा सकता है.
सीएलआई इंस्टॉल करने के लिए, टर्मिनल से नीचे दिया गया npm कमांड चलाएं:
npm install -g firebase-tools
यह पुष्टि करने के लिए कि सीएलआई सही तरीके से इंस्टॉल किया गया है, इसे चलाएं:
firebase --version
यह चलाकर Firebase सीएलआई को अपने Google खाते से अनुमति दें:
firebase login
HomeGraph API चालू करें
HomeGraph API, उपयोगकर्ता के होम ग्राफ़ में डिवाइसों और उनकी स्थितियों को सेव करने और उनके बारे में क्वेरी करने की सुविधा चालू करता है. इस एपीआई का इस्तेमाल करने के लिए, आपको सबसे पहले Google Cloud कंसोल खोलना होगा और HomeGraph API चालू करना होगा.
Google Cloud कंसोल में, अपनी कार्रवाइयों से मेल खाने वाला प्रोजेक्ट चुनें <project-id>.
इसके बाद, HomeGraph API के लिए एपीआई लाइब्रेरी की स्क्रीन पर जाकर, चालू करें पर क्लिक करें.
3. स्टार्टर ऐप्लिकेशन चलाएं
अब अपना डेवलपमेंट एनवायरमेंट सेट अप करने के बाद, स्टार्टर प्रोजेक्ट डिप्लॉय किया जा सकता है. इससे यह पुष्टि की जा सकेगी कि सब कुछ सही तरीके से कॉन्फ़िगर किया गया है.
सोर्स कोड पाना
अपनी डेवलपमेंट मशीन पर इस कोडलैब का सैंपल डाउनलोड करने के लिए, इस लिंक पर क्लिक करें:
...या फिर कमांड लाइन से, GitHub रिपॉज़िटरी का क्लोन बनाया जा सकता है:
git clone https://github.com/google-home/smarthome-local.git
प्रोजेक्ट के बारे में जानकारी
स्टार्टर प्रोजेक्ट में ये सबडायरेक्ट्री शामिल हैं:
public
—स्मार्ट वॉशर को कंट्रोल और मॉनिटर करने के लिए, वेब यूआई को फ़्रंटएंड करेंfunctions
—Cloud फ़ंक्शन, स्मार्ट होम ऐक्शन के लिए क्लाउड फ़ुलफ़िलमेंट लागू करता हैlocal
—index.ts
में दिए गए इंटेंट हैंडलर के साथ Skeleton लोकल फ़ुलफ़िलमेंट ऐप्लिकेशन प्रोजेक्ट
index.js
में ये फ़ंक्शन शामिल किए गए हैं:
fakeauth
—खाता लिंक करने के लिए ऑथराइज़ेशन एंडपॉइंटfaketoken
—खाता लिंक करने के लिए टोकन एंडपॉइंटsmarthome
—स्मार्ट होम इंटेंट फ़ुलफ़िलमेंट एंडपॉइंटreportstate
—डिवाइस की स्थिति में बदलाव होने पर, HomeGraph API को शुरू करता हैupdateDevice
—रिपोर्ट की स्थिति को ट्रिगर करने के लिए, वर्चुअल डिवाइस पर इस्तेमाल किया गया एंडपॉइंट
Firebase से कनेक्ट करना
app-start
डायरेक्ट्री पर जाएं. इसके बाद, अपने ऐक्शन प्रोजेक्ट की मदद से Firebase सीएलआई सेट अप करें:
cd app-start firebase use <project-id>
Firebase प्रोजेक्ट को कॉन्फ़िगर करना
Firebase प्रोजेक्ट शुरू करें.
firebase init
सीएलआई सुविधाएं, रीयलटाइम डेटाबेस, फ़ंक्शन, और होस्टिंग सुविधा चुनें, जिसमें Firebase होस्टिंग शामिल है.
? Which Firebase CLI features do you want to set up for this directory? Press Space to select features, then Enter to confirm your choices. ❯◉ Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision default instance ◯ Firestore: Configure security rules and indexes files for Firestore ◉ Functions: Configure a Cloud Functions directory and its files ◉ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys ◯ Hosting: Set up GitHub Action deploys ◯ Storage: Configure a security rules file for Cloud Storage ◯ Emulators: Set up local emulators for Firebase products ◯ Remote Config: Configure a template file for Remote Config ◯ Extensions: Set up an empty Extensions manifest
इससे आपके प्रोजेक्ट के लिए ज़रूरी एपीआई और सुविधाएं शुरू हो जाएंगी.
जब कहा जाए, तब रीयल टाइम डेटाबेस को शुरू करें. आपके पास डेटाबेस इंस्टेंस के लिए, डिफ़ॉल्ट लोकेशन का इस्तेमाल करने का विकल्प होता है.
? It seems like you haven't initialized Realtime Database in your project yet. Do you want to set it up? Yes ? Please choose the location for your default Realtime Database instance: us-central1
स्टार्टर प्रोजेक्ट कोड का इस्तेमाल किया जा रहा है, इसलिए सुरक्षा के नियमों के लिए डिफ़ॉल्ट फ़ाइल चुनें. साथ ही, पक्का करें कि आपने मौजूदा डेटाबेस के नियमों वाली फ़ाइल को ओवरराइट न किया हो.
? File database.rules.json already exists. Do you want to overwrite it with the Realtime Database Security Rules for <project-ID>-default-rtdb from the Firebase Console? No
अगर प्रोजेक्ट को फिर से शुरू किया जा रहा है, तो कोड बेस को शुरू या ओवरराइट करने के बारे में पूछे जाने पर, ओवरराइट करें चुनें.
? Would you like to initialize a new codebase, or overwrite an existing one? Overwrite
अपने फ़ंक्शन कॉन्फ़िगर करते समय, आपको डिफ़ॉल्ट फ़ाइलों का इस्तेमाल करना चाहिए. साथ ही, यह भी पक्का करना चाहिए कि आपने प्रोजेक्ट सैंपल में मौजूद index.js और package.json की फ़ाइलों को ओवरराइट न किया हो.
? What language would you like to use to write Cloud Functions? JavaScript ? Do you want to use ESLint to catch probable bugs and enforce style? No ? File functions/package.json already exists. Overwrite? No ? File functions/index.js already exists. Overwrite? No
अगर प्रोजेक्ट को फिर से शुरू किया जा रहा है, तो जब आपसे पूछा जाए कि आपको फ़ंक्शन/.gitignore को शुरू करना है या उसे ओवरराइट करना है, तो नहीं चुनें.
? File functions/.gitignore already exists. Overwrite? No
? Do you want to install dependencies with npm now? Yes
आखिर में, प्रोजेक्ट कोड में public
डायरेक्ट्री का इस्तेमाल करने के लिए अपने होस्टिंग सेटअप को कॉन्फ़िगर करें और मौजूदा index.html फ़ाइल का इस्तेमाल करें. ESLint का इस्तेमाल करने के लिए पूछे जाने पर, नहीं चुनें.
? What do you want to use as your public directory? public ? Configure as a single-page app (rewrite all urls to /index.html)? Yes ? Set up automatic builds and deploys with GitHub? No ? File public/index.html already exists. Overwrite? No
अगर ESLint गलती से चालू हो गया था, तो उसे बंद करने के दो तरीके हैं:
- जीयूआई का इस्तेमाल करके, प्रोजेक्ट में
../functions
फ़ोल्डर पर जाएं और छिपी हुई फ़ाइल.eslintrc.js
चुनें और उसे मिटाएं. इसे मिलते-जुलते नाम वाले.eslintrc.json
के लिए गलती से न लिखें. - कमांड लाइन का इस्तेमाल करके:
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 फ़ंक्शन के साथ-साथ, एक वेब ऐप्लिकेशन डिप्लॉय करता है.
वेब ऐप्लिकेशन देखने के लिए, अपने ब्राउज़र (https://<project-id>.web.app
) में होस्टिंग यूआरएल खोलें. आपको नीचे दिया गया इंटरफ़ेस दिखेगा:
इस वेब यूज़र इंटरफ़ेस (यूआई) की मदद से, डिवाइस की स्थितियों को देखने या उनमें बदलाव करने के लिए, तीसरे पक्ष का प्लैटफ़ॉर्म दिखाया जाता है. अपने डेटाबेस में डिवाइस की जानकारी अपने-आप भरना शुरू करने के लिए, अपडेट करें पर क्लिक करें. आपको पेज पर कोई बदलाव नहीं दिखेगा. हालांकि, वॉशर की मौजूदा स्थिति डेटाबेस में सेव की जाएगी.
अब उस क्लाउड सेवा से कनेक्ट करने का समय आ गया है जिसे आपने Actions कंसोल का इस्तेमाल करके Google Assistant में डिप्लॉय किया है.
Actions कंसोल प्रोजेक्ट कॉन्फ़िगर करना
खास जानकारी > अपनी कार्रवाई बनाएं में जाकर, कार्रवाइयां जोड़ें चुनें. अपने उस क्लाउड फ़ंक्शन का यूआरएल डालें जो स्मार्ट होम इंटेंट के काम करता है. इसके बाद, सेव करें पर क्लिक करें.
https://us-central1-<project-id>.cloudfunctions.net/smarthome
डेवलप करें > शुरू करें टैब पर, अपनी कार्रवाई के लिए डिसप्ले नाम जोड़ें और सेव करें पर क्लिक करें. यह नाम Google Home ऐप्लिकेशन में दिखेगा.
खाता लिंक करने की सुविधा चालू करने के लिए, बाईं ओर दिए गए नेविगेशन पैनल में, डेवलप करें > खाता लिंक करें विकल्प चुनें. खाते जोड़ने से जुड़ी इन सेटिंग का इस्तेमाल करें:
Client ID |
|
क्लाइंट सीक्रेट |
|
प्राधिकरण URL |
|
टोकन यूआरएल |
|
लिंक करने वाले अपने खाते के कॉन्फ़िगरेशन को सेव करने के लिए, सेव करें पर क्लिक करें. इसके बाद, अपने प्रोजेक्ट पर टेस्टिंग की सुविधा चालू करने के लिए, जांच करें पर क्लिक करें.
आपको सिम्युलेटर पर रीडायरेक्ट कर दिया जाएगा. अपने माउस को डिवाइस पर की जा रही जांच ( ) आइकॉन पर ले जाकर, पुष्टि करें कि आपके प्रोजेक्ट के लिए टेस्टिंग की सुविधा चालू हो गई है.
Google Assistant से लिंक करें
अपने स्मार्ट होम ऐक्शन की जांच करने के लिए, आपको अपने प्रोजेक्ट को Google खाते से लिंक करना होगा. इससे Google Assistant के प्लैटफ़ॉर्म और Google Home ऐप्लिकेशन से जांच की जा सकती है, जिन पर उसी खाते से साइन इन किया गया हो.
- अपने फ़ोन पर, Google Assistant की सेटिंग खोलें. ध्यान दें कि आपको उसी खाते से लॉग इन करना होगा जिससे आपने कंसोल में लॉग इन किया है.
- Assistant में जाकर, Google Assistant > सेटिंग > होम कंट्रोल पर जाएं.
- ऊपर दाईं ओर खोजें आइकॉन पर क्लिक करें.
- अपना खास टेस्ट ऐप्लिकेशन ढूंढने के लिए, [test] प्रीफ़िक्स का इस्तेमाल करके अपना टेस्ट ऐप्लिकेशन खोजें.
- वह आइटम चुनें. इसके बाद, Google Assistant आपकी सेवा की पुष्टि करेगी और
SYNC
का अनुरोध करेगी. इसमें, आपकी सेवा को उपयोगकर्ता के डिवाइसों की सूची उपलब्ध कराने के लिए कहा जाएगा.
Google Home ऐप्लिकेशन खोलें और पुष्टि करें कि आपको वॉशर डिवाइस दिख रहा है.
पुष्टि करें कि 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
डिप्लॉयमेंट पूरा होने के बाद, वेब यूआई पर जाएं और टूलबार में रीफ़्रेश करें बटन पर क्लिक करें. इससे, सिंक करने का अनुरोध करने की कार्रवाई ट्रिगर होती है, ताकि Assistant को SYNC
का अपडेट किया गया रिस्पॉन्स डेटा मिल सके.
5. लोकल फ़ुलफ़िलमेंट कॉन्फ़िगर करें
इस सेक्शन में, आपको अपने स्मार्ट होम की कार्रवाई में, स्थानीय तौर पर ऑर्डर पूरा करने के लिए, कॉन्फ़िगरेशन के ज़रूरी विकल्प जोड़ने होंगे. डेवलपमेंट के दौरान, आपको स्थानीय फ़ुलफ़िलमेंट ऐप्लिकेशन को Firebase होस्टिंग में पब्लिश करना होगा. यहां Google Home डिवाइस, इसे ऐक्सेस और डाउनलोड कर सकेगा.
Actions कंसोल में, डेवलप करें > कार्रवाइयां चुनें और लोकल होम SDK टूल कॉन्फ़िगर करें सेक्शन ढूंढें. टेस्ट यूआरएल फ़ील्ड में यह यूआरएल डालें, अपना प्रोजेक्ट आईडी डालें, और सेव करें पर क्लिक करें:
https://<project-id>.web.app/local-home/index.html
इसके बाद, हमें यह तय करना होगा कि Google Home डिवाइस, लोकल स्मार्ट डिवाइसों की खोज कैसे करे. लोकल होम प्लैटफ़ॉर्म पर डिवाइस खोजने के कई प्रोटोकॉल काम करते हैं. इनमें mडीएनएस, UPnP, और यूडीपी ब्रॉडकास्ट शामिल हैं. स्मार्ट वॉशर खोजने के लिए आप यूडीपी ब्रॉडकास्ट का इस्तेमाल करेंगे.
नया स्कैन कॉन्फ़िगरेशन जोड़ने के लिए, डिवाइस स्कैन कॉन्फ़िगरेशन में जाकर, स्कैन कॉन्फ़िगरेशन पर क्लिक करें. प्रोटोकॉल के तौर पर यूडीपी चुनें और नीचे दिए गए एट्रिब्यूट भरें:
फ़ील्ड | जानकारी | सुझाई गई वैल्यू |
ब्रॉडकास्ट का पता | यूडीपी ब्रॉडकास्ट पता |
|
ब्रॉडकास्ट पोर्ट | वह पोर्ट जहां Google Home यूडीपी ब्रॉडकास्ट भेजता है |
|
सुनें पोर्ट | वह पोर्ट जहां Google Home आपके जवाब का जवाब देता है |
|
डिस्कवरी पैकेट | यूडीपी ब्रॉडकास्ट डेटा पेलोड |
|
आखिर में, अपने बदलावों को पब्लिश करने के लिए विंडो के सबसे ऊपर सेव करें पर क्लिक करें.
6. स्थानीय तौर पर वाहन बेचने की सुविधा लागू करना
आपको लोकल होम SDK टूल के टाइपिंग पैकेज का इस्तेमाल करके, 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()
तरीके को कॉल करके लोकल होम SDK टूल को यह जानकारी दी जाती है कि ऐप्लिकेशन तैयार है.
पहचान बताने वाला हैंडलर जोड़ें
जब Google Home डिवाइस, ऐक्शन कंसोल में दिए गए स्कैन कॉन्फ़िगरेशन के आधार पर, लोकल नेटवर्क पर बिना पुष्टि वाले डिवाइसों का पता लगाता है, तब लोकल होम SDK टूल आपके IDENTIFY
हैंडलर को ट्रिगर करता है.
इस दौरान, जब Google को मिलता-जुलता कोई डिवाइस मिलता है, तो प्लैटफ़ॉर्म, स्कैन से मिले डेटा के साथ identifyHandler
को शुरू करता है. आपके ऐप्लिकेशन में, यूडीपी ब्रॉडकास्ट का इस्तेमाल करके स्कैन किया जाता है. साथ ही, IDENTIFY
हैंडलर को दिए गए स्कैन से जुड़े डेटा में, स्थानीय डिवाइस से भेजे गए रिस्पॉन्स पेलोड शामिल होते हैं.
हैंडलर, लोकल डिवाइस के लिए यूनीक आइडेंटिफ़ायर वाला IdentifyResponse
इंस्टेंस दिखाता है. लोकल डिवाइस से मिलने वाले यूडीपी रिस्पॉन्स को प्रोसेस करने के लिए, अपने identifyHandler
तरीके में यहां दिया गया कोड जोड़ें और सही लोकल डिवाइस आईडी तय करें:
स्थानीय/इंडेक्स .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
के जवाब में दी गई otherDeviceIds
की किसी एक वैल्यू से मेल खानी चाहिए. इससे यह पता चलता है कि डिवाइस, उपयोगकर्ता के होम ग्राफ़ में, स्थानीय तौर पर बेचने के लिए उपलब्ध है या नहीं. जब Google को मिलता-जुलता कोई डिवाइस मिलता है, तो उस डिवाइस की पुष्टि हो चुकी होती है. इसके अलावा, यह भी मान लिया जाता है कि डिवाइस स्थानीय तौर पर ऑर्डर किया जा सकता है.
EXECUTE हैंडलर जोड़ें
जब लोकल फ़ुलफ़िलमेंट की सुविधा देने वाले किसी डिवाइस को कोई निर्देश मिलता है, तब लोकल होम SDK टूल आपके EXECUTE
हैंडलर को ट्रिगर करता है. लोकल इंटेंट का कॉन्टेंट, क्लाउड फ़ुलफ़िलमेंट के लिए भेजे गए EXECUTE
इंटेंट के जैसा ही होता है. इसलिए, इंटेंट को स्थानीय तौर पर प्रोसेस करने का लॉजिक, क्लाउड में उसे मैनेज करने के तरीके जैसा ही होता है.
ऐप्लिकेशन लोकल डिवाइसों से संपर्क करने के लिए, टीसीपी/यूडीपी सॉकेट या एचटीटीपी या एचटीटीपीएस अनुरोधों का इस्तेमाल कर सकता है. इस कोडलैब में, एचटीटीपी एक प्रोटोकॉल के तौर पर काम करता है. एचटीटीपी, वर्चुअल डिवाइस को कंट्रोल करने के लिए इस्तेमाल किया जाता है. पोर्ट नंबर को 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
(TypeScript) सोर्स को कंपाइल करता है और नीचे दिए गए कॉन्टेंट को public/local-home/
डायरेक्ट्री में रखता है:
bundle.js
— कंपाइल किया गया JavaScript आउटपुट, जिसमें लोकल ऐप्लिकेशन और डिपेंडेंसी शामिल हैं.index.html
—लोकल होस्टिंग पेज का इस्तेमाल, ऐप्लिकेशन को उपयोगकर्ता के डिवाइस पर टेस्ट करने के लिए किया जाता है.
टेस्ट प्रोजेक्ट को डिप्लॉय करना
अपडेट की गई प्रोजेक्ट फ़ाइलों को Firebase होस्टिंग में डिप्लॉय करें, ताकि आप उन्हें Google Home डिवाइस से ऐक्सेस कर सकें.
firebase deploy --only hosting
7. वॉशर चालू करें
अब समय आ गया है कि आप अपने स्थानीय फ़ुलफ़िलमेंट ऐप्लिकेशन और स्मार्ट वॉशर के बीच के कम्यूनिकेशन को टेस्ट करें! कोडलैब स्टार्टर प्रोजेक्ट में vएक अरचुअल स्मार्ट वॉशर शामिल है, जिसे Node.js में लिखा गया है. यह स्मार्ट वॉशर की नकल करता है, जिसे उपयोगकर्ता स्थानीय तौर पर कंट्रोल कर सकते हैं.
डिवाइस कॉन्फ़िगर करना
आपको वर्चुअल डिवाइस को कॉन्फ़िगर करना होगा, ताकि वे उन ही यूडीपी पैरामीटर का इस्तेमाल कर सकें जिन्हें आपने Actions Console में डिवाइस डिस्कवरी के लिए, स्कैन कॉन्फ़िगरेशन पर लागू किया था. इसके अलावा, आपको वर्चुअल डिवाइस को यह बताना होगा कि किस लोकल डिवाइस आईडी की शिकायत करनी है. साथ ही, आपको ऐक्शन प्रोजेक्ट आईडी का इस्तेमाल करना होगा, ताकि डिवाइस की स्थिति बदलने पर रिपोर्ट स्टेट इवेंट के लिए उसका इस्तेमाल किया जा सके.
पैरामीटर | सुझाई गई वैल्यू |
deviceId |
|
discoveryPortOut |
|
discoveryPacket |
|
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 डेवलपर टूल का इस्तेमाल करें.
Chrome डेवलपर टूल कनेक्ट करें
डीबगर को स्थानीय बिक्री ऐप्लिकेशन से कनेक्ट करने के लिए, यह तरीका अपनाएं:
- पक्का करें कि आपने अपने Google Home डिवाइस को किसी ऐसे उपयोगकर्ता से लिंक किया है जिसके पास Actions कंसोल प्रोजेक्ट ऐक्सेस करने की अनुमति है.
- अपना Google Home डिवाइस फिर से चालू करें. इससे डिवाइस को आपके एचटीएमएल के यूआरएल के साथ-साथ वह स्कैन कॉन्फ़िगरेशन भी मिल जाएगा जो आपने Actions Console में डाला है.
- अपनी डेवलपमेंट मशीन पर Chrome लॉन्च करें.
- Chrome में नया टैब खोलें और इंस्पेक्टर को लॉन्च करने के लिए, पता फ़ील्ड में
chrome://inspect
डालें.
आपको पेज पर डिवाइसों की एक सूची दिखेगी. साथ ही, Google Home डिवाइस के नाम के नीचे आपका ऐप्लिकेशन यूआरएल दिखेगा.
इंस्पेक्टर को लॉन्च करें
Chrome डेवलपर टूल लॉन्च करने के लिए, अपने ऐप्लिकेशन यूआरएल में जाकर जांच करें पर क्लिक करें. कंसोल टैब चुनें और पुष्टि करें कि आपको TypeScript ऐप्लिकेशन से प्रिंट किए गए IDENTIFY
इंटेंट का कॉन्टेंट दिख रहा है.
इस आउटपुट का मतलब है कि स्थानीय तौर पर ऑर्डर पूरा करने वाले आपके ऐप्लिकेशन ने, वर्चुअल डिवाइस का पता लगा लिया है और उसकी पहचान कर ली है.
स्थानीय तौर पर फ़ुलफ़िलमेंट की जांच करें
Google Home ऐप्लिकेशन में मौजूद टच कंट्रोल का इस्तेमाल करके या Google Home डिवाइस को बोलकर निर्देश देने की सुविधा का इस्तेमाल करके, अपने डिवाइस को निर्देश दें. जैसे:
"Ok Google, मेरी वॉशिंग मशीन चालू करो."
"Ok Google, मेरी वॉशिंग मशीन चालू करो."
"Ok Google, मेरी वॉशिंग मशीन बंद करो."
इससे आपके TypeScript ऐप्लिकेशन पर EXECUTE
इंटेंट भेजने के लिए प्लैटफ़ॉर्म ट्रिगर होना चाहिए.
पुष्टि करें कि आपको हर निर्देश से, लोकल स्मार्ट वॉशर की स्थिति में बदलाव दिख सकता है.
... ***** The washer is RUNNING ***** ... ***** The washer is STOPPED *****
9. बधाई हो
बधाई! स्थानीय तौर पर सामान बेचने के तरीके को स्मार्ट होम ऐक्शन में इंटिग्रेट करने के लिए, आपने लोकल होम SDK टूल का इस्तेमाल किया.
ज़्यादा जानें
यहां कुछ अतिरिक्त चीज़ें दी गई हैं, जिन्हें आप आज़मा सकते हैं:
- स्कैन कॉन्फ़िगरेशन बदलें और उसे चालू करें. उदाहरण के लिए, कोई दूसरा यूडीपी पोर्ट या डिस्कवरी पैकेट इस्तेमाल करें.
- एम्बेड किए गए डिवाइस (जैसे कि Raspबेरी Pi—) पर चलाने के लिए वर्चुअल स्मार्ट डिवाइस कोड बेस में बदलाव करें. साथ ही, मौजूदा स्थिति देखने के लिए एलईडी या डिसप्ले का इस्तेमाल करें.