स्थानीय खरीदारी की सुविधा का इस्तेमाल करने के लिए, आपको एक ऐप्लिकेशन बनाना होगा. इस ऐप्लिकेशन से, स्मार्ट होम के इन इंटेंट को मैनेज किया जा सकेगा:
IDENTIFY
: स्थानीय तौर पर कंट्रोल किए जा सकने वाले स्मार्ट डिवाइसों को खोजने की सुविधा देता है. इंटेंट हैंडलर, डिवाइस खोजने के दौरान आपके स्मार्ट डिवाइस से मिलने वाले डेटा को निकालता है और उसे Google को भेजता है.EXECUTE
: निर्देशों को लागू करने की सुविधा.QUERY
: डिवाइस की स्थिति के बारे में क्वेरी करने की सुविधा.REACHABLE_DEVICES
: (ज़रूरी नहीं) यह एट्रिब्यूट, हब (या ब्रिज) डिवाइस के पीछे मौजूद, स्थानीय तौर पर कंट्रोल किए जा सकने वाले डिवाइसों को खोजने की सुविधा देता है.
यह ऐप्लिकेशन, उपयोगकर्ता के Google Home या Google Nest डिवाइसों पर चलता है. साथ ही, आपके स्मार्ट डिवाइस को Assistant से कनेक्ट करता है. TypeScript (इसका सुझाव दिया जाता है) या JavaScript का इस्तेमाल करके, ऐप्लिकेशन बनाया जा सकता है.
TypeScript का सुझाव इसलिए दिया जाता है, क्योंकि बाइंडिंग का इस्तेमाल करके, यह पक्का किया जा सकता है कि आपका ऐप्लिकेशन जिस डेटा को दिखाता है वह प्लैटफ़ॉर्म के हिसाब से सही हो.
एपीआई के बारे में ज़्यादा जानकारी के लिए, Local Home SDK टूल के एपीआई का रेफ़रंस देखें.
नीचे दिए गए स्निपेट से पता चलता है कि Local fulfillment ऐप्लिकेशन को शुरू करने और अपने हैंडलर को अटैच करने का क्या तरीका है.
import App = smarthome.App; const localHomeApp: App = new App("1.0.0"); localHomeApp .onIdentify(identifyHandler) .onExecute(executeHandler) .listen() .then(() => { console.log("Ready"); });
import App = smarthome.App; const localHomeApp: App = new App("1.0.0"); localHomeApp .onIdentify(identifyHandler) .onReachableDevices(reachableDevicesHandler) .onExecute(executeHandler) .listen() .then(() => { console.log("Ready"); });
अपना प्रोजेक्ट बनाएं
ऑर्डर पूरा करने के लिए अपने लोकल ऐप्लिकेशन को डिप्लॉय करने के लिए, आपको अपने कोड और उससे जुड़ी सभी डिपेंडेंसी के लिए एक JavaScript बंडल बनाना होगा.
अपने पसंदीदा बंडलर कॉन्फ़िगरेशन के साथ सही प्रोजेक्ट स्ट्रक्चर को बूटस्ट्रैप करने के लिए, लोकल फ़ुलफ़िलमेंट ऐप्लिकेशन प्रोजेक्ट शुरू करने वाले टूल का इस्तेमाल करें.
प्रोजेक्ट टेंप्लेट
बंडलर कॉन्फ़िगरेशन चुनने के लिए, यहां दिए गए उदाहरणों के मुताबिक npm init
कमांड चलाएं:
बिना बंडलर कॉन्फ़िगरेशन वाला TypeScript:
npm init @google/local-home-app project-directory/ --bundler none
प्रोजेक्ट का स्ट्रक्चर:
project-directory/ ├── node_modules/ ├── package.json ├── .gitignore ├── index.ts ├── test.ts ├── tsconfig.json ├── tslint.json └── serve.js
project-directory की जगह एक नई डायरेक्ट्री डालें. इसमें स्थानीय ऑर्डर पूरा करने वाला ऐप्लिकेशन प्रोजेक्ट शामिल होगा.
webpack बंडलर कॉन्फ़िगरेशन के साथ TypeScript:
npm init @google/local-home-app project-directory/ --bundler webpack
प्रोजेक्ट का स्ट्रक्चर:
project-directory/ ├── node_modules/ ├── package.json ├── .gitignore ├── index.ts ├── test.ts ├── tsconfig.json ├── tslint.json ├── webpack.config.web.js ├── webpack.config.node.js └── serve.js
project-directory की जगह एक नई डायरेक्ट्री डालें. इसमें स्थानीय ऑर्डर पूरा करने वाला ऐप्लिकेशन प्रोजेक्ट शामिल होगा.
Rollup के बंडलर कॉन्फ़िगरेशन के साथ TypeScript:
npm init @google/local-home-app project-directory/ --bundler rollup
प्रोजेक्ट का स्ट्रक्चर:
project-directory/ ├── node_modules/ ├── package.json ├── .gitignore ├── index.ts ├── test.ts ├── tsconfig.json ├── tslint.json ├── rollup.config.js └── serve.js
project-directory की जगह एक नई डायरेक्ट्री डालें. इसमें स्थानीय ऑर्डर पूरा करने वाला ऐप्लिकेशन प्रोजेक्ट शामिल होगा.
Parcel के बंडलर कॉन्फ़िगरेशन के साथ TypeScript:
npm init @google/local-home-app project-directory/ --bundler parcel
प्रोजेक्ट का स्ट्रक्चर:
project-directory/ ├── node_modules/ ├── package.json ├── .gitignore ├── index.ts ├── test.ts ├── tsconfig.json ├── tslint.json └── serve.js
project-directory की जगह एक नई डायरेक्ट्री डालें. इसमें स्थानीय ऑर्डर पूरा करने वाला ऐप्लिकेशन प्रोजेक्ट शामिल होगा.
प्रोजेक्ट-लेवल पर सामान्य टास्क करना
जनरेट किया गया प्रोजेक्ट, इन npm स्क्रिप्ट के साथ काम करता है:
cd project-directory/ npm run build
यह स्क्रिप्ट, TypeScript सोर्स को कंपाइल करती है. साथ ही, dist/web
सबडायरेक्ट्री में Chrome रनटाइम एनवायरमेंट और dist/node
सबडायरेक्ट्री में Node.js रनटाइम एनवायरमेंट के लिए, आपके ऐप्लिकेशन को उसकी डिपेंडेंसी के साथ बंडल करती है.
cd project-directory/ npm run lint npm run compile npm test
यह स्क्रिप्ट आपके TypeScript कोड के सिंटैक्स की पुष्टि करती है. साथ ही, dist/
सबडायरेक्ट्री में कोई आउटपुट जनरेट किए बिना, उसे कंपाइल करती है और test.ts
से अपने-आप होने वाले टेस्ट चलाती है.
cd project-directory/ npm run start
डेवलपमेंट के दौरान, यह स्क्रिप्ट Chrome और Node.js रनटाइम एनवायरमेंट के लिए, आपके ऐप्लिकेशन बंडल को लोकल तौर पर दिखाती है.
IDENTIFY हैंडलर लागू करना
जब Google Home या Google Nest डिवाइस फिर से चालू होगा और उसे ऐसे लोकल डिवाइस दिखेंगे जिनकी पुष्टि नहीं हुई है (इनमें हब से कनेक्ट किए गए असली डिवाइस भी शामिल हैं), तो IDENTIFY
हैंडलर ट्रिगर हो जाएगा. Local Home प्लैटफ़ॉर्म, आपके दिए गए स्कैन कॉन्फ़िगरेशन की जानकारी का इस्तेमाल करके, स्थानीय डिवाइसों को स्कैन करेगा. साथ ही, स्कैन के नतीजों के साथ आपके IDENTIFY
हैंडलर को कॉल करेगा.
Local Home प्लैटफ़ॉर्म के IdentifyRequest
में, LocalIdentifiedDevice
इंस्टेंस का स्कैन किया गया डेटा होता है. डिवाइस का पता लगाने वाले स्कैन कॉन्फ़िगरेशन के आधार पर, सिर्फ़ एक device
इंस्टेंस पॉप्युलेट किया जाता है.
अगर स्कैन के नतीजे आपके डिवाइस से मेल खाते हैं, तो आपके IDENTIFY
हैंडलर को एक IdentifyResponsePayload
ऑब्जेक्ट दिखाना चाहिए. इसमें स्मार्ट होम मेटाडेटा (जैसे, टाइप, विशेषताएं, और रिपोर्ट की स्थिति) वाला device
ऑब्जेक्ट शामिल होना चाहिए.
अगर IDENTIFY
रिस्पॉन्स में मौजूद verificationId
, SYNC
रिस्पॉन्स में दी गई otherDeviceIds
वैल्यू से मेल खाता है, तो Google डिवाइस असोसिएशन बनाता है.
उदाहरण
नीचे दिए गए स्निपेट में, स्टैंडअलोन डिवाइस और हब इंटिग्रेशन के लिए, IDENTIFY
हैंडलर बनाने का तरीका बताया गया है.
const identifyHandler = (request: IntentFlow.IdentifyRequest): IntentFlow.IdentifyResponse => { // Obtain scan data from protocol defined in your scan config const device = request.inputs[0].payload.device; if (device.udpScanData === undefined) { throw Error("Missing discovery response"); } const scanData = device.udpScanData.data; // Decode scan data to obtain metadata about local device const verificationId = "local-device-id"; // Return a response const response: IntentFlow.IdentifyResponse = { intent: Intents.IDENTIFY, requestId: request.requestId, payload: { device: { id: device.id || "", verificationId, // Must match otherDeviceIds in SYNC response }, }, }; return response; };
const identifyHandler = (request: IntentFlow.IdentifyRequest): IntentFlow.IdentifyResponse => { // Obtain scan data from protocol defined in your scan config const device = request.inputs[0].payload.device; if (device.udpScanData === undefined) { throw Error("Missing discovery response"); } const scanData = device.udpScanData.data; // Decode scan data to obtain metadata about local device const proxyDeviceId = "local-hub-id"; // Return a response const response: IntentFlow.IdentifyResponse = { intent: Intents.IDENTIFY, requestId: request.requestId, payload: { device: { id: proxyDeviceId, isProxy: true, // Device can control other local devices isLocalOnly: true, // Device not present in `SYNC` response }, }, }; return response; };
हब के पीछे मौजूद डिवाइसों की पहचान करना
अगर Google किसी हब डिवाइस की पहचान करता है, तो वह हब को हब से कनेक्ट किए गए आखिरी डिवाइसों के लिए, कंड्यूट के तौर पर इस्तेमाल करेगा और उन आखिरी डिवाइसों की पुष्टि करने की कोशिश करेगा.
Google को हब डिवाइस के मौजूद होने की पुष्टि करने की अनुमति देने के लिए, अपने IDENTIFY
हैंडलर के लिए इन निर्देशों का पालन करें:
- अगर आपका
SYNC
रिस्पॉन्स, हब से कनेक्ट किए गए लोकल एंड डिवाइसों के आईडी की रिपोर्ट करता है, तोIdentifyResponsePayload
मेंisProxy
कोtrue
के तौर पर सेट करें. - अगर आपके
SYNC
रिस्पॉन्स से आपके हब डिवाइस की जानकारी नहीं मिलती है, तोIdentifyResponsePayload
मेंisLocalOnly
कोtrue
के तौर पर सेट करें. device.id
फ़ील्ड में, हब डिवाइस का लोकल डिवाइस आईडी होता है.
ReachABLE_devices हैंडलर (सिर्फ़ हब इंटिग्रेशन) लागू करें
Google, REACHABLE_DEVICES
इंटेंट भेजता है, ताकि यह पुष्टि की जा सके कि किन एंड डिवाइसों को स्थानीय तौर पर कंट्रोल किया जा सकता है. जब तक हब ऑनलाइन रहता है, तब तक Google हर बार डिस्कवरी स्कैन (लगभग हर मिनट में एक बार) करने पर यह इंटेंट ट्रिगर होता है.
REACHABLE_DEVICES
हैंडलर को IDENTIFY
हैंडलर की तरह ही लागू किया जाता है. हालांकि, आपके हैंडलर को ऐसे अतिरिक्त डिवाइस आईडी इकट्ठा करने होंगे जिन तक लोकल प्रॉक्सी (यानी, हब) डिवाइस पहुंच सकता है. device.verificationId
फ़ील्ड में, हब से कनेक्ट किए गए एंड डिवाइस का लोकल डिवाइस आईडी होता है.
Local Home प्लैटफ़ॉर्म के ReachableDevicesRequest
में, LocalIdentifiedDevice
का एक इंस्टेंस शामिल है.
इस तरह, आपको प्रॉक्सी डिवाइस आईडी और स्कैन के नतीजों से
डेटा मिल सकता है.
आपका REACHABLE_DEVICES
हैंडलर, एक ऐसा ReachableDevicesPayload
ऑब्जेक्ट दिखाना चाहिए जिसमें एक devices
ऑब्जेक्ट शामिल हो. इस ऑब्जेक्ट में, उन एंड डिवाइसों की जानकारी देने वाली verificationId
वैल्यू का कलेक्शन शामिल होना चाहिए जिन्हें हब कंट्रोल करता है. verificationId
वैल्यू, SYNC
रिस्पॉन्स में मौजूद otherDeviceIds
में से किसी एक वैल्यू से मेल खानी चाहिए.
इस स्निपेट में बताया गया है कि REACHABLE_DEVICES
हैंडलर कैसे बनाया जा सकता है.
const reachableDevicesHandler = (request: IntentFlow.ReachableDevicesRequest): IntentFlow.ReachableDevicesResponse => { // Reference to the local proxy device const proxyDeviceId = request.inputs[0].payload.device.id; // Gather additional device ids reachable by local proxy device // ... const reachableDevices = [ // Each verificationId must match one of the otherDeviceIds // in the SYNC response { verificationId: "local-device-id-1" }, { verificationId: "local-device-id-2" }, ]; // Return a response const response: IntentFlow.ReachableDevicesResponse = { intent: Intents.REACHABLE_DEVICES, requestId: request.requestId, payload: { devices: reachableDevices, }, }; return response; };
EXECUTE हैंडलर लागू करना
ऐप्लिकेशन में मौजूद आपका EXECUTE
हैंडलर, उपयोगकर्ता के निर्देशों को प्रोसेस करता है. साथ ही, मौजूदा प्रोटोकॉल की मदद से आपके स्मार्ट डिवाइसों को ऐक्सेस करने के लिए, लोकल होम SDK टूल का इस्तेमाल करता है.
Local Home प्लैटफ़ॉर्म, EXECUTE
हैंडलर फ़ंक्शन में वही इनपुट पेलोड पास करता है जो आपके क्लाउड फ़ुलफ़िलमेंट के लिए, EXECUTE
इंटेंट में पास किया जाता है. इसी तरह, आपका EXECUTE
हैंडलर, EXECUTE
इंटेंट को प्रोसेस करने के बाद, आउटपुट डेटा को उसी फ़ॉर्मैट में दिखाता है.
जवाब आसानी से बनाने के लिए, Local Home SDK से मिलने वाली Execute.Response.Builder
क्लास का इस्तेमाल किया जा सकता है.
आपके ऐप्लिकेशन के पास, डिवाइस के आईपी पते का सीधा ऐक्सेस नहीं है. इसके बजाय, इनमें से किसी एक प्रोटोकॉल के आधार पर निर्देश बनाने के लिए, CommandRequest
इंटरफ़ेस का इस्तेमाल करें: यूडीपी, टीसीपी या एचटीटीपी. इसके बाद, निर्देश भेजने के लिए
deviceManager.send()
फ़ंक्शन को कॉल करें.
डिवाइसों पर निर्देशों को टारगेट करते समय, डिवाइस के साथ कम्यूनिकेट करने के लिए, SYNC
रिस्पॉन्स से डिवाइस आईडी (और customData
फ़ील्ड के पैरामीटर, अगर शामिल किए गए हैं) का इस्तेमाल करें.
उदाहरण
यह कोड स्निपेट दिखाता है कि आप अपना EXECUTE
हैंडलर कैसे बना सकते हैं.
const executeHandler = (request: IntentFlow.ExecuteRequest): Promise<IntentFlow.ExecuteResponse> => { // Extract command(s) and device target(s) from request const command = request.inputs[0].payload.commands[0]; const execution = command.execution[0]; const response = new Execute.Response.Builder() .setRequestId(request.requestId); const result = command.devices.map((device) => { // Target id of the device provided in the SYNC response const deviceId = device.id; // Metadata for the device provided in the SYNC response // Use customData to provide additional required execution parameters const customData: any = device.customData; // Convert execution command into payload for local device let devicePayload: string; // ... // Construct a local device command over TCP const deviceCommand = new DataFlow.TcpRequestData(); deviceCommand.requestId = request.requestId; deviceCommand.deviceId = deviceId; deviceCommand.data = devicePayload; deviceCommand.port = customData.port; deviceCommand.operation = Constants.TcpOperation.WRITE; // Send command to the local device return localHomeApp.getDeviceManager() .send(deviceCommand) .then((result) => { response.setSuccessState(result.deviceId, state); }) .catch((err: IntentFlow.HandlerError) => { err.errorCode = err.errorCode || IntentFlow.ErrorCode.INVALID_REQUEST; response.setErrorState(device.id, err.errorCode); }); }); // Respond once all commands complete return Promise.all(result) .then(() => response.build()); };
QUERY हैंडलर लागू करना
ऐप्लिकेशन में मौजूद आपका QUERY
हैंडलर, उपयोगकर्ता के अनुरोधों को प्रोसेस करता है. साथ ही, आपके स्मार्ट डिवाइसों की स्थिति की जानकारी देने के लिए, Local Home SDK टूल का इस्तेमाल करता है.
Local Home प्लैटफ़ॉर्म, 'QUERY' हैंडलर फ़ंक्शन को वही अनुरोध पेलोड पास करता है जो आपके क्लाउड फ़ुलफ़िलमेंट के लिए QUERY
इंटेंट के लिए पास किया जाता है. इसी तरह, आपका QUERY
हैंडलर और QUERY
इंटेंट को प्रोसेस करने पर मिलने वाले फ़ॉर्मैट में ही डेटा दिखाएगा.
हब की मदद से काम करने वाले डिवाइसों को निर्देश भेजना
हब के पीछे मौजूद आखिरी डिवाइसों को कंट्रोल करने के लिए, आपको हब पर भेजे गए प्रोटोकॉल के हिसाब से कमांड पेलोड में ज़्यादा जानकारी देनी पड़ सकती है. इससे हब को यह पता चल पाएगा कि कमांड किस डिवाइस के लिए है. कुछ मामलों में, device.id
वैल्यू से सीधे तौर पर यह पता लगाया जा सकता है. हालांकि, ऐसा न होने पर, आपको इस अतिरिक्त डेटा को customData
फ़ील्ड के हिस्से के तौर पर शामिल करना चाहिए.
अगर आपने TypeScript का इस्तेमाल करके अपना ऐप्लिकेशन बनाया है, तो अपने ऐप्लिकेशन को JavaScript में कंपाइल करना न भूलें. कोड लिखने के लिए, अपनी पसंद के मॉड्यूल सिस्टम का इस्तेमाल किया जा सकता है. पक्का करें कि आपके टारगेट के लिए, Chrome ब्राउज़र काम करता हो.