স্থানীয় ফুলফিলমেন্ট সমর্থন করার জন্য, আপনাকে এই স্মার্ট হোম ইন্টেন্টগুলো পরিচালনা করতে পারে এমন একটি অ্যাপ তৈরি করতে হবে:
-
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রেসপন্স হাবের সাথে সংযুক্ত লোকাল এন্ড ডিভাইসগুলোর আইডি রিপোর্ট করে, তাহলেIdentifyResponsePayloadএisProxytrueহিসেবে সেট করুন। - যদি আপনার
SYNCরেসপন্সে আপনার হাব ডিভাইসের উল্লেখ না থাকে, তাহলেIdentifyResponsePayloadএisLocalOnlytrueহিসেবে সেট করুন। -
device.idফিল্ডটিতে হাব ডিভাইসটির নিজস্ব লোকাল ডিভাইস আইডি থাকে।
REACHABLE_DEVICES হ্যান্ডলারটি প্রয়োগ করুন (শুধুমাত্র হাব ইন্টিগ্রেশনের জন্য)
কোন প্রান্তিক ডিভাইসগুলো স্থানীয়ভাবে নিয়ন্ত্রণ করা যায়, তা নিশ্চিত করতে গুগল REACHABLE_DEVICES ইন্টেন্টটি পাঠায়। হাবটি অনলাইন হিসেবে শনাক্ত হওয়া পর্যন্ত, গুগল যখনই একটি ডিসকভারি স্ক্যান চালায় (প্রায় প্রতি মিনিটে একবার), এই ইন্টেন্টটি ট্রিগার হয়।
আপনি IDENTIFY হ্যান্ডলারের মতোই REACHABLE_DEVICES হ্যান্ডলারটি প্রয়োগ করবেন, তবে এক্ষেত্রে আপনার হ্যান্ডলারকে লোকাল প্রক্সি (অর্থাৎ, হাব) ডিভাইসের নাগালের মধ্যে থাকা অতিরিক্ত ডিভাইস আইডিগুলো সংগ্রহ করতে হবে। device.verificationId ফিল্ডটিতে হাবের সাথে সংযুক্ত একটি এন্ড ডিভাইসের লোকাল ডিভাইস আইডি থাকে।
লোকাল হোম প্ল্যাটফর্মের ReachableDevicesRequest এ LocalIdentifiedDevice এর একটি ইনস্ট্যান্স থাকে। এই ইনস্ট্যান্সের মাধ্যমে আপনি প্রক্সি ডিভাইস আইডি এবং স্ক্যান ফলাফলের ডেটা পেতে পারেন।
আপনার 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 ফিল্ডের অংশ হিসেবে অন্তর্ভুক্ত করা উচিত।
আপনি যদি টাইপস্ক্রিপ্ট ব্যবহার করে আপনার অ্যাপ তৈরি করে থাকেন, তবে অ্যাপটিকে জাভাস্ক্রিপ্টে কম্পাইল করতে ভুলবেন না। আপনার কোড লেখার জন্য আপনি নিজের পছন্দমতো মডিউল সিস্টেম ব্যবহার করতে পারেন। নিশ্চিত করুন যে আপনার টার্গেটটি ক্রোম ব্রাউজার দ্বারা সমর্থিত।