स्मार्ट होम ऐक्शन बनाने का तरीका सीखने के लिए, Google Home डेवलपर सेंटर में आपका स्वागत है. ध्यान दें: आप Actions कंसोल में कार्रवाइयां बनाना जारी रखेंगे.

वाहन बेचने का स्थानीय तरीका लागू करना

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

स्थानीय नियमों को पूरा करने के लिए, आपको एक ऐप्लिकेशन बनाना होगा. इससे, आप घर में इस्तेमाल की जाने वाली इन स्मार्ट इंटेंट को हैंडल कर पाएंगे:

  • IDENTIFY: इसमें लोकल लेवल पर कंट्रोल किए जा सकने वाले स्मार्ट डिवाइसों को खोजने की सुविधा है. इंटेंट हैंडलर, उस डेटा को निकालता है जो आपका स्मार्ट डिवाइस, खोज के दौरान लौटाता है. साथ ही, यह डेटा Google को जवाब में भेजता है.
  • EXECUTE: निर्देशों को लागू करने के साथ काम करता है.
  • QUERY: क्वेरी डिवाइस की स्थिति के साथ काम करती है.
  • REACHABLE_DEVICES (ज़रूरी नहीं) हब (या ब्रिज) डिवाइस के पीछे, लोकल रूप से कंट्रोल किए जा सकने वाले एंड डिवाइस को खोजने की सुविधा देता है.

यह ऐप्लिकेशन उपयोगकर्ता के Google Home या Google Nest डिवाइसों पर काम करता है. साथ ही, यह आपके स्मार्ट डिवाइस को Assistant से कनेक्ट करता है. आप टाइपस्क्रिप्ट (पसंदीदा) या JavaScript का इस्तेमाल करके ऐप्लिकेशन बना सकते हैं.

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

एपीआई के बारे में ज़्यादा जानने के लिए, Local Home 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 निर्देश चलाएं, जैसा कि इन उदाहरणों में दिखाया गया है:

कोई नहीं

बिना बंडल कॉन्फ़िगरेशन वाले 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 बंडलर कॉन्फ़िगरेशन के साथ टाइपस्क्रिप्ट:

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 को एक नई डायरेक्ट्री से बदलें, जिसमें लोकल फ़ुलफ़िलमेंट ऐप्लिकेशन प्रोजेक्ट शामिल होगा.

पार्सल

Parcell बंडलर कॉन्फ़िगरेशन वाली 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 के रनटाइम एनवायरमेंट के लिए उपलब्ध कराती है.

पहचान हैंडलर लागू करना

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

Local Home प्लैटफ़ॉर्म के IdentifyRequest में, LocalIdentifiedDevice इंस्टेंस का स्कैन डेटा शामिल है. डिवाइस का पता लगाने वाले स्कैन कॉन्फ़िगरेशन के आधार पर, सिर्फ़ एक device इंस्टेंस भरा जाता है.

अगर स्कैन के नतीजे आपके डिवाइस से मेल खाते हैं, तो आपके IDENTIFY हैंडलर को एक IdentifyResponsePayload ऑब्जेक्ट दिखाना चाहिए, जिसमें स्मार्ट होम मेटाडेटा के साथ एक device ऑब्जेक्ट शामिल हो. जैसे, टाइप, विशेषताएं, और रिपोर्ट की स्थिति.

Google, IDENTIFY से मिले रिस्पॉन्स के आधार पर डिवाइस असोसिएशन सेट करता है. यह रिस्पॉन्स, SYNC रिस्पॉन्स के रूप में मिली otherDeviceIds वैल्यू में से किसी एक से मेल खाता है.

उदाहरण

नीचे दिए गए स्निपेट, स्टैंडअलोन डिवाइस और हब इंटिग्रेशन के लिए 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 हैंडलर लागू करें (सिर्फ़ hub इंटिग्रेशन)

REACHABLE_DEVICES इंटेंट Google के ज़रिए भेजा जाता है, ताकि यह पुष्टि की जा सके कि किन असली डिवाइस को स्थानीय स्तर पर नियंत्रित किया जा सकता है. जब तक हब के ऑनलाइन होने का पता चलता है, तब तक Google हर बार एक डिस्कवरी स्कैन (करीब हर मिनट में एक बार) चलाता है. यह इंटेंट ट्रिगर हो जाता है.

आप IDENTIFY हैंडलर की तरह ही REACHABLE_DEVICES हैंडलर लागू करते हैं. हालांकि, आपके हैंडलर को डिवाइस के दूसरे प्रॉक्सी आईडी (जैसे, हब) से डिवाइस के दूसरे आईडी को इकट्ठा करना पड़ता है. 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 टूल का इस्तेमाल करता है.

स्थानीय होम प्लैटफ़ॉर्म वही इनपुट पेलोड पास करता है जो EXECUTE हैंडलर फ़ंक्शन को आपके क्लाउड पर भेजने के लिए EXECUTE इंटेट करता है. इसी तरह, आपका EXECUTE हैंडलर आउटपुट को उसी फ़ॉर्मैट में दिखाता है जिस फ़ॉर्मैट में EXECUTE इंटेंट प्रोसेस करता है. जवाब बनाने की प्रक्रिया को आसान बनाने के लिए, आप Execute.Response.Builder क्लास का इस्तेमाल कर सकते हैं जो लोकल होम SDK टूल मुहैया कराता है.

आपके ऐप्लिकेशन को इस डिवाइस के आईपी पते का सीधा ऐक्सेस नहीं है. इसके बजाय, 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 हैंडलर, उपयोगकर्ता के अनुरोधों को प्रोसेस करता है और आपके स्मार्ट डिवाइसों की स्थिति की जानकारी देने के लिए, लोकल होम SDK टूल का इस्तेमाल करता है.

Local Home प्लैटफ़ॉर्म, 'QUERY' हैंडलर फ़ंक्शन को वही अनुरोध पेलोड भेजता है जो आपने क्लाउड पूरा करने के लिए QUERY इंटेंट के लिए किया है. इसी तरह, आपका QUERY हैंडलर उसी फ़ॉर्मैट में डेटा दिखाएगा जिससे QUERY इंटेंट प्रोसेस किया जाता है.

हब के पीछे के डिवाइसों को निर्देश भेजना

हब के पीछे के असली डिवाइसों को कंट्रोल करने के लिए, आपको हब के लिए भेजे गए प्रोटोकॉल-विशिष्ट कमांड पेलोड में ज़्यादा जानकारी देनी पड़ सकती है, ताकि हब की पहचान कर सके कि कमांड किस डिवाइस पर भेजा गया है. कुछ मामलों में, इसका सीधे device.id वैल्यू से लिया जा सकता है. हालांकि, अगर ऐसा नहीं है, तो आपको customData फ़ील्ड के हिस्से के तौर पर यह अतिरिक्त डेटा शामिल करना चाहिए.

अगर आपने TypeScript का इस्तेमाल करके अपना ऐप्लिकेशन बनाया है, तो अपने ऐप्लिकेशन को JavaScript से कंपाइल करें. कोड लिखने के लिए, अपनी पसंद के मॉड्यूल सिस्टम का इस्तेमाल किया जा सकता है. पक्का करें कि आपका टारगेट, Chrome ब्राउज़र के साथ काम करता हो.