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

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

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

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

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

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

এই স্ক্রিপ্টটি টাইপস্ক্রিপ্ট সোর্স কম্পাইল করে এবং dist/web সাবডিরেক্টরিতে ক্রোম রানটাইম এনভায়রনমেন্ট এবং dist/node ​​সাবডিরেক্টরিতে Node.js রানটাইম এনভায়রনমেন্টের জন্য আপনার অ্যাপের নির্ভরতার সাথে একত্রিত করে।

যাচাই করুন
cd project-directory/
npm run lint
npm run compile
npm test

এই স্ক্রিপ্টটি আপনার টাইপস্ক্রিপ্ট কোডের সিনট্যাক্স যাচাই করে, dist/ সাবডিরেক্টরিতে কোনও আউটপুট তৈরি না করেই এটি কম্পাইল করে এবং test.ts থেকে স্বয়ংক্রিয় পরীক্ষা চালায়।

পরিবেশন করুন
cd project-directory/
npm run start

ডেভেলপমেন্টের সময়, এই স্ক্রিপ্টটি স্থানীয়ভাবে Chrome এবং Node.js রানটাইম পরিবেশের জন্য আপনার অ্যাপ বান্ডেলগুলি পরিবেশন করে।

IDENTIFY হ্যান্ডলারটি বাস্তবায়ন করুন

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

লোকাল হোম প্ল্যাটফর্মের IdentifyRequestLocalIdentifiedDevice ইনস্ট্যান্সের স্ক্যান ডেটা থাকে। ডিভাইসটি আবিষ্কার করা স্ক্যান কনফিগারেশনের উপর ভিত্তি করে শুধুমাত্র একটি 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 প্রতিক্রিয়া হাবের সাথে সংযুক্ত স্থানীয় ডিভাইসগুলির আইডি রিপোর্ট করে, তাহলে IdentifyResponsePayloadisProxy true হিসেবে সেট করুন।
  • যদি আপনার SYNC প্রতিক্রিয়া আপনার হাব ডিভাইসের প্রতিবেদন না করে, তাহলে IdentifyResponsePayloadisLocalOnly true হিসেবে সেট করুন।
  • device.id ফিল্ডে হাব ডিভাইসের জন্য স্থানীয় ডিভাইস আইডি থাকে।

REACHABLE_DEVICES হ্যান্ডলারটি বাস্তবায়ন করুন (শুধুমাত্র হাব ইন্টিগ্রেশনের জন্য)

কোন ডিভাইসগুলি স্থানীয়ভাবে নিয়ন্ত্রণ করা যেতে পারে তা নিশ্চিত করার জন্য Google REACHABLE_DEVICES ইন্টেন্ট পাঠায়। হাবটি অনলাইনে থাকা অবস্থায় সনাক্ত করা গেলে, Google যখনই কোনও ডিসকভারি স্ক্যান চালায় (প্রায় প্রতি মিনিটে একবার) তখনই এই ইন্টেন্টটি ট্রিগার হয়।

আপনি IDENTIFY হ্যান্ডলারের মতোই REACHABLE_DEVICES হ্যান্ডলারটি বাস্তবায়ন করেন, তবে আপনার হ্যান্ডলারকে স্থানীয় প্রক্সি (অর্থাৎ, হাব) ডিভাইস দ্বারা পৌঁছানো যায় এমন অতিরিক্ত ডিভাইস আইডি সংগ্রহ করতে হবে। device.verificationId ফিল্ডে হাবের সাথে সংযুক্ত একটি শেষ ডিভাইসের জন্য স্থানীয় ডিভাইস আইডি থাকে।

লোকাল হোম প্ল্যাটফর্মের ReachableDevicesRequestLocalIdentifiedDevice এর একটি উদাহরণ রয়েছে। এই উদাহরণের মাধ্যমে, আপনি প্রক্সি ডিভাইস আইডি এবং স্ক্যান ফলাফল থেকে ডেটা পেতে পারেন।

আপনার 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 ইন্টেন্ট প্রক্রিয়াকরণের ফর্ম্যাটে আউটপুট ডেটা ফেরত দেয়। প্রতিক্রিয়া তৈরি সহজ করার জন্য, আপনি লোকাল হোম SDK প্রদান করে এমন Execute.Response.Builder ক্লাস ব্যবহার করতে পারেন।

আপনার অ্যাপের ডিভাইসের IP ঠিকানায় সরাসরি অ্যাক্সেস নেই। পরিবর্তে, CommandRequest ইন্টারফেস ব্যবহার করে UDP, TCP, অথবা HTTP প্রোটোকলের উপর ভিত্তি করে কমান্ড তৈরি করুন। তারপর, কমান্ডগুলি পাঠাতে 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 ব্যবহার করে।

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

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

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

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