স্থানীয় পরিপূর্ণতা অ্যাপটি প্রয়োগ করুন

স্থানীয় পরিপূর্ণতা সমর্থন করার জন্য, আপনাকে এই স্মার্ট হোম ইন্টেন্টগুলি পরিচালনা করার জন্য একটি অ্যাপ তৈরি করতে হবে:

  • IDENTIFY : স্থানীয়ভাবে-নিয়ন্ত্রিত স্মার্ট ডিভাইসের আবিষ্কার সমর্থন করে। ইনটেন্ট হ্যান্ডলার আপনার স্মার্ট ডিভাইসটি আবিষ্কারের সময় যে ডেটা ফেরত দেয় তা বের করে এবং Google-কে একটি প্রতিক্রিয়া হিসাবে পাঠায়।
  • EXECUTE : কমান্ড কার্যকর করা সমর্থন করে।
  • QUERY : ডিভাইসের স্থিতি জিজ্ঞাসা সমর্থন করে।
  • REACHABLE_DEVICES : (ঐচ্ছিক) একটি হাব (বা সেতু) ডিভাইসের পিছনে স্থানীয়ভাবে-নিয়ন্ত্রিত শেষ ডিভাইসগুলির আবিষ্কারকে সমর্থন করে।

এই অ্যাপটি ব্যবহারকারীর Google Home বা Google Nest ডিভাইসে চলে এবং আপনার স্মার্ট ডিভাইসটিকে Assistant-এর সাথে কানেক্ট করে। আপনি টাইপস্ক্রিপ্ট (পছন্দের) বা জাভাস্ক্রিপ্ট ব্যবহার করে অ্যাপ তৈরি করতে পারেন।

TypeScript সুপারিশ করা হয়েছে কারণ আপনি স্ট্যাটিকভাবে নিশ্চিত করতে বাইন্ডিংগুলিকে লিভারেজ করতে পারেন যে আপনার অ্যাপটি যে ধরনের ডেটা প্ল্যাটফর্ম আশা করে তার সাথে মেলে।

API সম্পর্কে আরও বিশদ বিবরণের জন্য, স্থানীয় হোম 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");
  });

আপনার প্রকল্প তৈরি করুন

আপনার স্থানীয় পরিপূর্ণতা অ্যাপ্লিকেশন স্থাপন করার জন্য, আপনাকে আপনার কোড এবং এর সমস্ত নির্ভরতার জন্য একটি জাভাস্ক্রিপ্ট বান্ডেল তৈরি করতে হবে।

আপনার পছন্দের বান্ডলার কনফিগারেশনের সাথে উপযুক্ত প্রজেক্ট স্ট্রাকচার বুটস্ট্র্যাপ করতে স্থানীয় পূর্ণতা অ্যাপ প্রজেক্ট ইনিশিয়ালাইজার ব্যবহার করুন।

প্রকল্প টেমপ্লেট

আপনার বান্ডলার কনফিগারেশন নির্বাচন করতে, নিম্নলিখিত উদাহরণে দেখানো হিসাবে 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 প্রতিস্থাপন করুন যাতে স্থানীয় পূর্ণতা অ্যাপ প্রকল্প থাকবে।

ওয়েবপ্যাক

ওয়েবপ্যাক বান্ডলার কনফিগারেশন সহ টাইপস্ক্রিপ্ট:

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 প্রতিস্থাপন করুন যাতে স্থানীয় পূর্ণতা অ্যাপ প্রকল্প থাকবে।

রোলআপ

রোলআপ বান্ডলার কনফিগারেশন সহ টাইপস্ক্রিপ্ট:

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 প্রতিস্থাপন করুন যাতে স্থানীয় পূর্ণতা অ্যাপ প্রকল্প থাকবে।

পার্সেল

পার্সেল বান্ডলার কনফিগারেশন সহ টাইপস্ক্রিপ্ট:

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 রানটাইম পরিবেশের জন্য আপনার অ্যাপ বান্ডিলগুলি পরিবেশন করে৷

আইডেন্টিফাই হ্যান্ডলার প্রয়োগ করুন

Google Home বা Google Nest ডিভাইস রিবুট হলে এবং যাচাই না করা লোকাল ডিভাইস (হাবের সাথে কানেক্ট করা শেষ ডিভাইস সহ) দেখলে IDENTIFY হ্যান্ডলার ট্রিগার হবে। স্থানীয় হোম প্ল্যাটফর্ম আপনার পূর্বে নির্দিষ্ট করা স্ক্যান কনফিগার তথ্য ব্যবহার করে স্থানীয় ডিভাইসগুলির জন্য স্ক্যান করবে এবং স্ক্যান ফলাফলের সাথে আপনার IDENTIFY হ্যান্ডলারকে কল করবে।

লোকাল হোম প্ল্যাটফর্মের IdentifyRequest একটি LocalIdentifiedDevice ইন্সট্যান্সের স্ক্যান ডেটা থাকে। ডিভাইসটি আবিষ্কার করা স্ক্যান কনফিগারের উপর ভিত্তি করে শুধুমাত্র একটি device উদাহরণ পপুলেট করা হয়েছে।

যদি স্ক্যানের ফলাফলগুলি আপনার ডিভাইসের সাথে মেলে, তাহলে আপনার IDENTIFY হ্যান্ডলারকে একটি IdentifyResponsePayload অবজেক্ট ফেরত দেওয়া উচিত, যাতে স্মার্ট হোম মেটাডেটা (যেমন প্রকার, বৈশিষ্ট্য এবং প্রতিবেদনের অবস্থা) সহ একটি device অবজেক্ট অন্তর্ভুক্ত থাকে।

Google একটি ডিভাইস অ্যাসোসিয়েশন প্রতিষ্ঠা করে যদি IDENTIFY প্রতিক্রিয়া থেকে verificationId 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 প্রতিক্রিয়া হাবের সাথে সংযুক্ত স্থানীয় শেষ ডিভাইসগুলির আইডি রিপোর্ট করে, তাহলে IdentifyResponsePayloadisProxy true হিসাবে সেট করুন।
  • যদি আপনার SYNC প্রতিক্রিয়া আপনার হাব ডিভাইসের প্রতিবেদন না করে, তাহলে IdentifyResponsePayloadisLocalOnly 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 ব্যবহার করে।

স্থানীয় হোম প্ল্যাটফর্মটি আপনার ক্লাউড পরিপূর্ণতার জন্য EXECUTE উদ্দেশ্যের মতো EXECUTE হ্যান্ডলার ফাংশনে একই ইনপুট পেলোড পাস করে। একইভাবে, আপনার EXECUTE হ্যান্ডলার EXECUTE উদ্দেশ্য প্রক্রিয়াকরণের মতো একই বিন্যাসে আউটপুট ডেটা প্রদান করে। প্রতিক্রিয়া তৈরিকে সহজ করার জন্য, আপনি Execute.Response.Builder ক্লাস ব্যবহার করতে পারেন যা Local Home SDK প্রদান করে।

আপনার অ্যাপের ডিভাইসের IP ঠিকানায় সরাসরি অ্যাক্সেস নেই। পরিবর্তে, এই প্রোটোকলগুলির একটির উপর ভিত্তি করে কমান্ড তৈরি করতে CommandRequest ইন্টারফেস ব্যবহার করুন: UDP, TCP, বা HTTP। তারপর, কমান্ড পাঠাতে deviceManager.send() ফাংশনটিতে কল করুন।

ডিভাইসগুলিতে কমান্ড টার্গেট করার সময়, ডিভাইসের সাথে যোগাযোগ করতে SYNC প্রতিক্রিয়া থেকে ডিভাইস ID (এবং 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 ব্যবহার করে৷

স্থানীয় হোম প্ল্যাটফর্ম 'QUERY' হ্যান্ডলার ফাংশনে আপনার ক্লাউড পূরণের জন্য QUERY উদ্দেশ্যের মতো একই অনুরোধ পেলোড পাস করে। একইভাবে, আপনার QUERY হ্যান্ডলার QUERY উদ্দেশ্য প্রক্রিয়াকরণের মতো একই বিন্যাসে ডেটা প্রদান করে৷

একটি হাবের পিছনে ডিভাইসগুলিতে কমান্ড পাঠানো হচ্ছে

একটি হাবের পিছনের শেষ ডিভাইসগুলি নিয়ন্ত্রণ করতে, আপনাকে হাবে পাঠানো প্রোটোকল-নির্দিষ্ট কমান্ড পেলোডে অতিরিক্ত তথ্য সরবরাহ করতে হতে পারে যাতে হাবটি নির্দেশ করে কোন ডিভাইসের জন্য নির্দেশিত তা সনাক্ত করতে। কিছু ক্ষেত্রে, এটি সরাসরি device.id মান থেকে অনুমান করা যেতে পারে, কিন্তু যখন এটি হয় না, তখন আপনাকে customData ক্ষেত্রের অংশ হিসাবে এই অতিরিক্ত ডেটা অন্তর্ভুক্ত করা উচিত।

আপনি যদি TypeScript ব্যবহার করে আপনার অ্যাপ তৈরি করেন, তাহলে আপনার অ্যাপটিকে JavaScript-এ কম্পাইল করতে ভুলবেন না। আপনি আপনার কোড লিখতে আপনার পছন্দের মডিউল সিস্টেম ব্যবহার করতে পারেন। নিশ্চিত করুন যে আপনার লক্ষ্য Chrome ব্রাউজার দ্বারা সমর্থিত।