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

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

  • IDENTIFY : স্থানীয়ভাবে নিয়ন্ত্রণযোগ্য স্মার্ট ডিভাইস শনাক্তকরণে সহায়তা করে। ইন্টেন্ট হ্যান্ডলারটি শনাক্তকরণের সময় আপনার স্মার্ট ডিভাইস থেকে প্রাপ্ত ডেটা সংগ্রহ করে এবং একটি প্রতিক্রিয়া হিসাবে তা গুগলে পাঠায়।
  • EXECUTE : কমান্ড কার্যকর করা সমর্থন করে।
  • QUERY : ডিভাইসের অবস্থা জানতে চাওয়া সমর্থন করে।
  • REACHABLE_DEVICES : (ঐচ্ছিক) একটি হাব (বা ব্রিজ) ডিভাইসের পিছনে থাকা স্থানীয়ভাবে নিয়ন্ত্রণযোগ্য প্রান্তিক ডিভাইসগুলি খুঁজে বের করা সমর্থন করে।

এই অ্যাপটি ব্যবহারকারীর গুগল হোম বা গুগল নেস্ট ডিভাইসে চলে এবং আপনার স্মার্ট ডিভাইসকে অ্যাসিস্ট্যান্টের সাথে সংযুক্ত করে। আপনি টাইপস্ক্রিপ্ট (পছন্দনীয়) অথবা জাভাস্ক্রিপ্ট ব্যবহার করে অ্যাপটি তৈরি করতে পারেন।

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

এপিআই সম্পর্কে আরও বিস্তারিত জানতে, লোকাল হোম এসডিকে এপিআই রেফারেন্স দেখুন।

নিম্নলিখিত কোড স্নিপেটগুলিতে দেখানো হয়েছে, কীভাবে আপনি স্থানীয় ফুলফিলমেন্ট অ্যাপটি ইনিশিয়ালাইজ করতে এবং আপনার হ্যান্ডলারগুলি সংযুক্ত করতে পারেন।

স্বতন্ত্র
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 একটি নতুন ডিরেক্টরি দিয়ে প্রতিস্থাপন করুন, যেটিতে লোকাল ফুলফিলমেন্ট অ্যাপ প্রজেক্টটি থাকবে।

প্রকল্প-স্তরের সাধারণ কাজগুলো সম্পাদন করুন

তৈরি করা প্রজেক্টটি নিম্নলিখিত এনপিএম স্ক্রিপ্টগুলো সমর্থন করে:

বান্ডেল
cd project-directory/
npm run build

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

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

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

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

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

IDENTIFY হ্যান্ডলারটি প্রয়োগ করুন

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

লোকাল হোম প্ল্যাটফর্ম থেকে 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;
  };

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

যদি গুগল কোনো হাব ডিভাইস শনাক্ত করে, তবে এটি হাবটিকে তার সাথে সংযুক্ত প্রান্তিক ডিভাইসগুলোর মাধ্যম হিসেবে বিবেচনা করবে এবং সেই প্রান্তিক ডিভাইসগুলোকে যাচাই করার চেষ্টা করবে।

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

  • যদি আপনার SYNC রেসপন্স হাবের সাথে সংযুক্ত লোকাল এন্ড ডিভাইসগুলোর আইডি রিপোর্ট করে, তাহলে IdentifyResponsePayloadisProxy true হিসেবে সেট করুন।
  • যদি আপনার SYNC রেসপন্সে আপনার হাব ডিভাইসের উল্লেখ না থাকে, তাহলে IdentifyResponsePayloadisLocalOnly true হিসেবে সেট করুন।
  • device.id ফিল্ডটিতে হাব ডিভাইসটির নিজস্ব লোকাল ডিভাইস আইডি থাকে।

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

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

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

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

আপনার REACHABLE_DEVICES হ্যান্ডলারের একটি ReachableDevicesPayload অবজেক্ট রিটার্ন করা উচিত, যার মধ্যে একটি devices অবজেক্ট থাকবে। এই 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 হ্যান্ডলার ব্যবহারকারীর কমান্ডগুলো প্রসেস করে এবং একটি বিদ্যমান প্রোটোকলের মাধ্যমে আপনার স্মার্ট ডিভাইসগুলো অ্যাক্সেস করতে লোকাল হোম এসডিকে (Local Home SDK) ব্যবহার করে।

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

আপনার অ্যাপের ডিভাইসের আইপি অ্যাড্রেসে সরাসরি অ্যাক্সেস নেই। এর পরিবর্তে, UDP, TCP বা HTTP-এর মতো প্রোটোকলগুলোর যেকোনো একটির ওপর ভিত্তি করে কমান্ড তৈরি করতে 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 হ্যান্ডলার ব্যবহারকারীর অনুরোধগুলো প্রসেস করে এবং আপনার স্মার্ট ডিভাইসগুলোর অবস্থা জানানোর জন্য লোকাল হোম এসডিকে (Local Home SDK) ব্যবহার করে।

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

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

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

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