स्थानीय नियमों का पालन करने के लिए, आपको एक ऐसा ऐप्लिकेशन बनाना होगा जो स्मार्ट होम के इन इंटेंट को मैनेज कर सके:
IDENTIFY
: स्थानीय रूप से नियंत्रित स्मार्ट डिवाइस खोजने में मदद करता है. इंटेंट हैंडलर, उस डेटा को निकालता है जो आपके स्मार्ट डिवाइस को खोज के दौरान लौटाता है और इसे Google के जवाब में भेजता है.EXECUTE
निर्देशों का पालन करता है.QUERY
, डिवाइस की स्थिति के बारे में क्वेरी करने की सुविधा देता है.REACHABLE_DEVICES
(ज़रूरी नहीं) हब (या ब्रिज) डिवाइस के पीछे मौजूद, लोकल कंट्रोल वाले एंड डिवाइसों की खोज करने की सुविधा देता है.
यह ऐप्लिकेशन, उपयोगकर्ता के Google Home या Google Nest डिवाइसों पर काम करता है. साथ ही, यह आपके स्मार्ट डिवाइस को Assistant से कनेक्ट करता है. आप TypeScript (पसंदीदा) या JavaScript का इस्तेमाल करके ऐप्लिकेशन बना सकते हैं.
TypeScript का सुझाव दिया जाता है, क्योंकि बाइंडिंग का इस्तेमाल करके, स्टैटिक तौर पर यह पक्का किया जा सकता है कि आपके ऐप्लिकेशन से मिलने वाला डेटा, प्लैटफ़ॉर्म की उम्मीद के मुताबिक है.
एपीआई के बारे में ज़्यादा जानने के लिए, लोकल होम SDK API का रेफ़रंस देखें.
नीचे दिए गए स्निपेट दिखाते हैं कि आप स्थानीय वाहन बेचने वाले ऐप्लिकेशन को कैसे शुरू कर सकते हैं. साथ ही, अपने हैंडलर कैसे जोड़ सकते हैं.
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
निर्देश चलाएं:
बंडलर कॉन्फ़िगरेशन के बिना टाइपस्क्रिप्ट:
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 को किसी नई डायरेक्ट्री से बदलें, जिसमें पूरे होने वाले ऐप्लिकेशन की लोकल प्रोजेक्ट इमेज शामिल होगी.
रोलअप बंडल कॉन्फ़िगरेशन के साथ 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
सबडायरेक्ट्री में और 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
हैंडलर ट्रिगर होगा. स्थानीय होम
प्लैटफ़ॉर्म, स्कैन कॉन्फ़िगरेशन की जानकारी का इस्तेमाल करके, लोकल डिवाइसों को स्कैन करता है.
इससे, आप अपने 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
जवाब, हब से कनेक्ट किए गए स्थानीय एंड डिवाइस के आईडी की रिपोर्ट करता है, इसलिएisProxy
कोIdentifyResponsePayload
मेंtrue
के तौर पर सेट करें.SYNC
के जवाब में, आपके हब डिवाइस की जानकारी नहीं मिलती है.IdentifyResponsePayload
मेंisLocalOnly
कोtrue
के तौर पर सेट करें.device.id
फ़ील्ड में हब डिवाइस का लोकल डिवाइस आईडी शामिल होता है.
REACHABLE_DEVICES हैंडलर लागू करें (सिर्फ़ हब इंटिग्रेशन)
REACHABLE_DEVICES
इंटेंट, Google की ओर से यह पुष्टि करने के लिए भेजा जाता है कि किन असली डिवाइसों
को स्थानीय तौर पर कंट्रोल किया जा सकता है. जब भी हब का पता चलता है, तो यह इंटेंट हर बार तब ट्रिगर होता है, जब Google, डिस्कवरी स्कैन करता है (करीब एक मिनट में एक बार)
REACHABLE_DEVICES
हैंडलर, IDENTIFY
हैंडल की तरह ही लागू होता है. हालांकि, यह ज़रूरी नहीं है कि आपके हैंडलर को लोकल प्रॉक्सी (जैसे, हब) डिवाइस से ऐक्सेस किए जा सकने वाले अन्य डिवाइस आईडी इकट्ठा करने हों. device.verificationId
फ़ील्ड में, हब से कनेक्ट किए गए एंड डिवाइस का लोकल डिवाइस आईडी होता है.
लोकल होम प्लैटफ़ॉर्म के
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 टूल का इस्तेमाल करता है.
लोकल होम प्लैटफ़ॉर्म, EXECUTE
हैंडलर फ़ंक्शन में वही इनपुट पेलोड पास करता है जो EXECUTE
क्लाउड की बिक्री को ध्यान में रखकर बनाया गया है. इसी तरह, EXECUTE
हैंडलर उसी फ़ॉर्मैट में आउटपुट डेटा दिखाता है जो EXECUTE
इंटेंट को प्रोसेस करने के दौरान मिलता है.
रिस्पॉन्स बनाने के काम को आसान बनाने के लिए, Execute.Response.Builder
क्लास का इस्तेमाल किया जा सकता है जो Local Home SDK टूल से मिलता है.
आपके ऐप्लिकेशन के पास डिवाइस के आईपी पते का सीधा ऐक्सेस नहीं है. इसके बजाय,
इन प्रोटोकॉल में से किसी एक के आधार पर निर्देश बनाने के लिए, CommandRequest
इंटरफ़ेस का इस्तेमाल करें: यूडीपी, टीसीपी या एचटीटीपी. इसके बाद, निर्देश भेजने के लिए
deviceManager.send()
फ़ंक्शन को कॉल करें.
जब डिवाइसों के लिए कमांड टारगेट करते हैं, तब डिवाइस के साथ बातचीत करने के लिए डिवाइस के आईडी और customData
(अगर शामिल हैं, तो उनके पैरामीटर) का SYNC
इस्तेमाल करें.
उदाहरण
यह कोड स्निपेट दिखाता है कि आप अपना 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
हैंडलर उपयोगकर्ता के अनुरोधों को प्रोसेस करता है और आपके स्मार्ट डिवाइसों की स्थिति की रिपोर्ट देने के लिए,
लोकल होम SDK टूल का इस्तेमाल करता है.
स्थानीय होम प्लैटफ़ॉर्म, 'क्वेरी' हैंडलर फ़ंक्शन को वही अनुरोध पेलोड भेजता है
जो आपने क्लाउड पूरा करने के लिए QUERY
के लिए किया है. इसी तरह, QUERY
हैंडलर डेटा को उसी फ़ॉर्मैट में दिखाता है जिस फ़ॉर्मैट में QUERY
इंटेंट को प्रोसेस किया जाता है.
हब के पीछे मौजूद डिवाइसों को निर्देश भेजना
हब के पीछे के डिवाइसों को कंट्रोल करने के लिए, आपको हब को भेजे गए प्रोटोकॉल से जुड़े कमांड पेलोड में अतिरिक्त जानकारी देनी पड़ सकती है. इससे हब की पहचान हो सकेगी कि यह निर्देश किस डिवाइस के लिए है. कुछ मामलों में, यह सीधे device.id
वैल्यू से निकाला जा सकता है. हालांकि, अगर ऐसा नहीं है, तो आपको इस अतिरिक्त डेटा को customData
फ़ील्ड के हिस्से के तौर पर शामिल करना चाहिए.
अगर आपने TypeScript का इस्तेमाल करके अपना ऐप्लिकेशन बनाया है, तो अपने ऐप्लिकेशन को JavaScript में जोड़ना न भूलें. अपना कोड लिखने के लिए, आप अपनी पसंद के मॉड्यूल सिस्टम का इस्तेमाल कर सकते हैं. पक्का करें कि आपका टारगेट Chrome ब्राउज़र पर काम करता हो.