ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশনের জন্য স্থানীয় পূর্ণতা সক্ষম করুন

১. শুরু করার আগে

স্মার্ট হোম ইন্টিগ্রেশন ব্যবহারকারীদের বাড়িতে থাকা সংযুক্ত ডিভাইসগুলোকে গুগল অ্যাসিস্ট্যান্টের মাধ্যমে নিয়ন্ত্রণ করার সুযোগ দেয়। একটি ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশন তৈরি করতে, আপনাকে এমন একটি ক্লাউড ওয়েবহুক এন্ডপয়েন্ট প্রদান করতে হবে যা স্মার্ট হোম ইনটেন্টগুলো পরিচালনা করতে সক্ষম। উদাহরণস্বরূপ, যখন কোনো ব্যবহারকারী বলেন, "হে গুগল, লাইটগুলো জ্বালিয়ে দাও," তখন অ্যাসিস্ট্যান্ট ডিভাইসটির অবস্থা আপডেট করার জন্য আপনার ক্লাউড ফুলফিলমেন্টে কমান্ডটি পাঠায়।

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

72ffb320986092c.png

পূর্বশর্ত

আপনি যা তৈরি করবেন

এই কোডল্যাবে, আপনি Firebase ব্যবহার করে পূর্বে তৈরি করা একটি স্মার্ট হোম ইন্টিগ্রেশন ডেপ্লয় করবেন, তারপর ডেভেলপার কনসোলে একটি স্ক্যান কনফিগারেশন প্রয়োগ করবেন এবং Node.js-এ লেখা কমান্ড একটি ভার্চুয়াল ওয়াশার ডিভাইসে পাঠানোর জন্য TypeScript ব্যবহার করে একটি লোকাল অ্যাপ তৈরি করবেন।

আপনি যা শিখবেন

  • ডেভেলপার কনসোলে কীভাবে লোকাল ফুলফিলমেন্ট চালু এবং কনফিগার করবেন।
  • লোকাল হোম এসডিকে ব্যবহার করে কীভাবে একটি লোকাল ফুলফিলমেন্ট অ্যাপ তৈরি করবেন।
  • গুগল হোম স্পিকার বা গুগল নেস্ট স্মার্ট ডিসপ্লেতে লোড করা লোকাল ফুলফিলমেন্ট অ্যাপটি কীভাবে ডিবাগ করবেন

আপনার যা যা লাগবে

২. শুরু করা

কার্যকলাপ নিয়ন্ত্রণ সক্ষম করুন

গুগল অ্যাসিস্ট্যান্ট ব্যবহার করার জন্য, আপনাকে গুগলের সাথে নির্দিষ্ট কিছু অ্যাক্টিভিটি ডেটা শেয়ার করতে হবে। গুগল অ্যাসিস্ট্যান্টের সঠিকভাবে কাজ করার জন্য এই ডেটা প্রয়োজন; তবে, ডেটা শেয়ার করার এই আবশ্যকতাটি শুধুমাত্র এসডিকে-এর জন্য নির্দিষ্ট নয়। এই ডেটা শেয়ার করার জন্য, আপনার যদি আগে থেকে কোনো গুগল অ্যাকাউন্ট না থাকে, তবে একটি তৈরি করুন। আপনি যেকোনো গুগল অ্যাকাউন্ট ব্যবহার করতে পারেন—সেটি আপনার ডেভেলপার অ্যাকাউন্ট হওয়ার কোনো প্রয়োজন নেই।

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

নিম্নলিখিত টগল সুইচগুলি সক্রিয় আছে কিনা তা নিশ্চিত করুন:

  • ওয়েব ও অ্যাপ কার্যকলাপ - এছাড়াও, ‘ Include Chrome history and activity from sites, apps, and devices that use Google services’ চেকবক্সটি অবশ্যই নির্বাচন করুন।
  • ডিভাইসের তথ্য
  • ভয়েস এবং অডিও কার্যকলাপ

একটি ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশন প্রজেক্ট তৈরি করুন

  1. ডেভেলপার কনসোলে যান।
  2. Create Project-এ ক্লিক করুন, প্রজেক্টের জন্য একটি নাম লিখুন এবং Create Project-এ আবার ক্লিক করুন।

প্রকল্পের নাম

ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশন নির্বাচন করুন

ডেভেলপার কনসোলের প্রজেক্ট হোমে , ক্লাউড-টু-ক্লাউড-এর অধীনে অ্যাড ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশন নির্বাচন করুন।

ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশন যোগ করুন

Firebase CLI ইনস্টল করুন

ফায়ারবেস কমান্ড লাইন ইন্টারফেস (CLI) আপনাকে আপনার ওয়েব অ্যাপগুলো স্থানীয়ভাবে পরিবেশন করতে এবং ফায়ারবেস হোস্টিং-এ স্থাপন করতে দেবে।

CLI ইনস্টল করতে, টার্মিনাল থেকে নিম্নলিখিত npm কমান্ডটি চালান:

npm install -g firebase-tools

CLI সঠিকভাবে ইনস্টল হয়েছে কিনা তা যাচাই করতে, চালান:

firebase --version

নিম্নলিখিত কমান্ডটি চালিয়ে আপনার Google অ্যাকাউন্ট দিয়ে Firebase CLI-কে অনুমোদন দিন:

firebase login

HomeGraph API সক্রিয় করুন

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

Google Cloud কনসোলে, আপনার ইন্টিগ্রেশনের <project-id>. তারপর, HomeGraph API-এর জন্য API Library স্ক্রিনে, Enable-এ ক্লিক করুন।

ee198858a6eac112.png

৩. স্টার্টার অ্যাপটি চালান।

এখন যেহেতু আপনি আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করে ফেলেছেন, সবকিছু সঠিকভাবে কনফিগার করা হয়েছে কিনা তা যাচাই করার জন্য আপনি স্টার্টার প্রজেক্টটি ডিপ্লয় করতে পারেন।

সোর্স কোডটি নিন

আপনার ডেভেলপমেন্ট মেশিনে এই কোডল্যাবের নমুনাটি ডাউনলোড করতে নিচের লিঙ্কে ক্লিক করুন:

...অথবা আপনি কমান্ড লাইন থেকে গিটহাব রিপোজিটরিটি ক্লোন করতে পারেন:

git clone https://github.com/google-home/smarthome-local.git

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

স্টার্টার প্রজেক্টটিতে নিম্নলিখিত সাবডিরেক্টরিগুলো রয়েছে:

  • স্মার্ট ওয়াশার নিয়ন্ত্রণ ও নিরীক্ষণের জন্য public ওয়েব ইউআই।
  • functions — ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশনের জন্য ক্লাউড ফুলফিলমেন্ট বাস্তবায়নকারী ক্লাউড ফাংশনসমূহ
  • local index.ts এ ইন্টেন্ট হ্যান্ডলার স্টাব করা একটি স্কেলেটন লোকাল ফুলফিলমেন্ট অ্যাপ প্রজেক্ট।

প্রদত্ত ক্লাউড ফুলফিলমেন্টে index.js এ নিম্নলিখিত ফাংশনগুলো অন্তর্ভুক্ত রয়েছে:

  • fakeauth — অ্যাকাউন্ট লিঙ্ক করার জন্য অনুমোদন এন্ডপয়েন্ট
  • faketoken — অ্যাকাউন্ট লিঙ্ক করার জন্য টোকেন এন্ডপয়েন্ট
  • smarthome — স্মার্ট হোম অভিপ্রায় পূরণের শেষবিন্দু
  • reportstate —ডিভাইসের অবস্থার পরিবর্তনে HomeGraph API চালু করে।
  • updateDevice — ভার্চুয়াল ডিভাইস দ্বারা রিপোর্ট স্টেট ট্রিগার করতে ব্যবহৃত এন্ডপয়েন্ট।

ফায়ারবেসের সাথে সংযোগ করুন

app-start ডিরেক্টরিতে যান, তারপর আপনার ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশন প্রজেক্টটি দিয়ে Firebase CLI সেট আপ করুন:

cd app-start
firebase use <project-id>

ফায়ারবেস প্রজেক্ট কনফিগার করুন

একটি ফায়ারবেস প্রজেক্ট শুরু করুন।

firebase init

CLI ফিচার, রিয়েলটাইম ডেটাবেস এবং ফাংশন ফিচার নির্বাচন করুন।

? Which Firebase features do you want to set up for this directory? Press Space to select features, then Enter
 to confirm your choices. (Press <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to
 proceed)
>( ) Data Connect: Set up a Firebase Data Connect service
 ( ) Firestore: Configure security rules and indexes files for Firestore
 ( ) Genkit: Setup a new Genkit project with Firebase
 (*) Functions: Configure a Cloud Functions directory and its files
 ( ) App Hosting: Configure an apphosting.yaml file for App Hosting
 ( ) Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys
 ( ) Storage: Configure a security rules file for Cloud Storage
 ( ) Emulators: Set up local emulators for Firebase products
 ( ) Remote Config: Configure a template file for Remote Config
 ( ) Extensions: Set up an empty Extensions manifest
 (*) Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision
default instance
 ( ) Data Connect: Set up a Firebase Data Connect service
 ( ) Firestore: Configure security rules and indexes files for Firestore

এটি আপনার প্রোজেক্টের জন্য প্রয়োজনীয় এপিআই এবং ফিচারগুলো চালু করবে।

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

? It seems like you haven't initialized Realtime Database in your project yet. Do you want to set it up?
Yes

? Please choose the location for your default Realtime Database instance:
us-central1

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

? File database.rules.json already exists. Do you want to overwrite it with the Realtime Database Security Rules for <project-ID>-default-rtdb from the Firebase Console?
No

আপনি যদি আপনার প্রজেক্টটি পুনরায় চালু করেন, তাহলে কোনো কোডবেস চালু বা ওভাররাইট করতে চান কিনা জানতে চাওয়া হলে 'ওভাররাইট' (Overwrite) নির্বাচন করুন।

? Would you like to initialize a new codebase, or overwrite an existing one?
Overwrite

আপনার ফাংশনগুলো কনফিগার করার সময় ডিফল্ট ফাইলগুলো ব্যবহার করুন এবং নিশ্চিত করুন যেন প্রজেক্ট স্যাম্পলে থাকা index.jspackage.json ফাইলগুলো ওভাররাইট না হয়ে যায়।

? What language would you like to use to write Cloud Functions?
JavaScript

? Do you want to use ESLint to catch probable bugs and enforce style?
No

? File functions/package.json already exists. Overwrite?
No

? File functions/index.js already exists. Overwrite?
No

আপনি যদি আপনার প্রজেক্টটি পুনরায় চালু করেন, তাহলে functions/.gitignore ফাইলটি ইনিশিয়ালাইজ বা ওভাররাইট করতে চান কিনা জানতে চাওয়া হলে ‘না’ নির্বাচন করুন।

? File functions/.gitignore already exists. Overwrite?
No
? Do you want to install dependencies with npm now?
Yes

যদি ভুলবশত ESLint চালু হয়ে যায়, তবে এটিকে বন্ধ করার জন্য দুটি পদ্ধতি রয়েছে:

  1. GUI ব্যবহার করে, প্রজেক্টের অধীনে থাকা ../functions ফোল্ডারে যান, লুকানো .eslintrc.js ফাইলটি নির্বাচন করুন এবং মুছে ফেলুন। এটিকে একই নামের .eslintrc.json ফাইলের সাথে গুলিয়ে ফেলবেন না।
  2. কমান্ড লাইন ব্যবহার করে:
    cd functions
    rm .eslintrc.js
    

আপনার ফায়ারবেস কনফিগারেশনটি সঠিক ও সম্পূর্ণ তা নিশ্চিত করতে, washer-done ডিরেক্টরি থেকে firebase.json ফাইলটি washer-start ডিরেক্টরিতে কপি করুন এবং washer-start এর ফাইলটিকে ওভাররাইট করুন।

washer-start ডিরেক্টরিতে:

cp -vp ../washer-done/firebase.json .

ফায়ারবেসে স্থাপন করুন

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

firebase deploy

কনসোল আউটপুটটি আপনি দেখতে পাবেন:

...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/<project-id>/overview
Hosting URL: https://<project-id>.web.app

এই কমান্ডটি একটি ওয়েব অ্যাপ এবং ফায়ারবেসের জন্য কয়েকটি ক্লাউড ফাংশন ডেপ্লয় করে।

ওয়েব অ্যাপটি দেখার জন্য আপনার ব্রাউজারে হোস্টিং ইউআরএলটি ( https://<project-id>.web.app ) খুলুন। আপনি নিম্নলিখিত ইন্টারফেসটি দেখতে পাবেন:

5845443e94705557.png

এই ওয়েব ইউআইটি ডিভাইসের অবস্থা দেখা বা পরিবর্তন করার জন্য একটি থার্ড-পার্টি প্ল্যাটফর্ম। ডিভাইসের তথ্য দিয়ে আপনার ডেটাবেস পূরণ করা শুরু করতে, ‘আপডেট’ (UPDATE) এ ক্লিক করুন। আপনি পেজে কোনো পরিবর্তন দেখতে পাবেন না, কিন্তু আপনার ওয়াশারের বর্তমান অবস্থা ডেটাবেসে সংরক্ষিত হয়ে যাবে।

এখন ডেভেলপার কনসোল ব্যবহার করে আপনার স্থাপন করা ক্লাউড পরিষেবাটিকে গুগল অ্যাসিস্ট্যান্টের সাথে সংযুক্ত করার সময় এসেছে।

আপনার ডেভেলপার কনসোল প্রজেক্ট কনফিগার করুন

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

একটি প্রদর্শনের নাম যোগ করুন

অ্যাপ ব্র্যান্ডিং-এর অধীনে, অ্যাপ আইকনের জন্য 144 x 144 পিক্সেল আকারের এবং একটি নামযুক্ত png ফাইল আপলোড করুন। .png .

একটি অ্যাপ আইকন যোগ করুন

অ্যাকাউন্ট লিঙ্কিং সক্রিয় করতে এই অ্যাকাউন্ট লিঙ্কিং সেটিংস ব্যবহার করুন:

ক্লায়েন্ট আইডি

ABC123

ক্লায়েন্টের গোপনীয়তা

DEF456

অনুমোদন ইউআরএল

https://us-central1-<project-id>.cloudfunctions.net/fakeauth

টোকেন ইউআরএল

https://us-central1-<project-id>.cloudfunctions.net/faketoken

অ্যাকাউন্ট লিঙ্কিং ইউআরএল আপডেট করুন

'Cloud fulfillment URL'-এর অধীনে, আপনার ক্লাউড ফাংশনের URL-টি লিখুন যা স্মার্ট হোম ইন্টেন্টগুলির ফুলফিলমেন্ট প্রদান করে।

https://us-central1-<project-id>.cloudfunctions.net/smarthome

ক্লাউড ফাংশন URL যোগ করুন

আপনার প্রোজেক্ট কনফিগারেশন সংরক্ষণ করতে সেভ-এ ক্লিক করুন, তারপর আপনার প্রোজেক্টে টেস্টিং চালু করতে নেক্সট: টেস্ট- এ ক্লিক করুন।

আপনার ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশন পরীক্ষা করুন

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

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

  1. আপনার ফোনে গুগল অ্যাসিস্ট্যান্ট সেটিংস খুলুন। মনে রাখবেন, আপনাকে কনসোলে ব্যবহৃত অ্যাকাউন্ট দিয়েই লগ ইন করতে হবে।
  2. Google Assistant > Settings > Home Control (Assistent-এর অধীনে)-এ যান।
  3. উপরের ডানদিকে থাকা সার্চ আইকনটিতে ক্লিক করুন।
  4. আপনার নির্দিষ্ট টেস্ট অ্যাপটি খুঁজে পেতে [test] প্রিফিক্স ব্যবহার করে অনুসন্ধান করুন।
  5. সেই আইটেমটি নির্বাচন করুন। এরপর গুগল অ্যাসিস্ট্যান্ট আপনার পরিষেবার সাথে প্রমাণীকরণ করবে এবং ব্যবহারকারীর জন্য ডিভাইসগুলির একটি তালিকা সরবরাহ করতে আপনার পরিষেবাকে অনুরোধ জানিয়ে একটি SYNC অনুরোধ পাঠাবে।

Google Home অ্যাপটি খুলুন এবং যাচাই করুন যে আপনি আপনার ওয়াশার ডিভাইসটি দেখতে পাচ্ছেন।

ae252220753726f6_856.png

গুগল হোম অ্যাপে ভয়েস কমান্ড ব্যবহার করে আপনি ওয়াশারটি নিয়ন্ত্রণ করতে পারছেন কিনা তা যাচাই করুন। এছাড়াও, আপনার ক্লাউড ফুলফিলমেন্টের ফ্রন্টএন্ড ওয়েব UI-তে ডিভাইসটির অবস্থার পরিবর্তন দেখতে পাবেন।

এখন আপনি আপনার ইন্টিগ্রেশনে লোকাল ফুলফিলমেন্ট যোগ করা শুরু করতে পারেন।

৪. ক্লাউড ফুলফিলমেন্ট আপডেট করুন

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

নিম্নলিখিত কোড স্নিপেটে দেখানো অনুযায়ী SYNC রেসপন্সে otherDeviceIds ফিল্ডটি যোগ করুন:

ফাংশন/ইনডেক্স.জেএস

app.onSync((body) => {
  return {
    requestId: body.requestId,
    payload: {
      agentUserId: '123',
      devices: [{
        id: 'washer',
        type: 'action.devices.types.WASHER',
        traits: [ ... ],
        name: { ... },
        deviceInfo: { ... },
        willReportState: true,
        attributes: {
          pausable: true,
        },
        otherDeviceIds: [{
          deviceId: 'deviceid123',
        }],
      }],
    },
  };
});

আপডেট করা প্রজেক্টটি ফায়ারবেসে ডিপ্লয় করুন:

firebase deploy --only functions

ডেপ্লয়মেন্ট সম্পন্ন হলে, ওয়েব UI-তে যান এবং রিফ্রেশ- এ ক্লিক করুন। ae8d3b25777a5e30.png টুলবারের বাটন। এটি একটি রিকোয়েস্ট সিঙ্ক অপারেশন চালু করে, যার ফলে অ্যাসিস্ট্যান্ট আপডেট হওয়া SYNC রেসপন্স ডেটা পায়।

bf4f6a866160a982.png

৫. স্থানীয় পরিপূর্ণতা কনফিগার করুন

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

Google Home Developer Console- এ, স্ক্রিনের বাম দিকে Project > Cloud-to-cloud- এ যান, তারপর ইন্টিগ্রেশনের জন্য Edit নির্বাচন করুন। Setup and configuration পৃষ্ঠায়, Local fulfillment পর্যন্ত স্ক্রোল করুন এবং সেটিংটি অন করুন। প্রতিটি test URL ফিল্ডে নিম্নলিখিত URL-টি প্রবেশ করান, আপনার প্রজেক্ট আইডি যোগ করুন এবং Save-এ ক্লিক করুন:

https://<project-id>.web.app/local-home/index.html

local-fulfillment.png

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

একটি নতুন স্ক্যান কনফিগারেশন যোগ করতে ডিভাইস ডিসকভারি-এর অধীনে + অ্যাড স্ক্যান কনফিগারেশন-এ ক্লিক করুন। প্রোটোকল হিসেবে UDP নির্বাচন করুন এবং নিম্নলিখিত অ্যাট্রিবিউটগুলি পূরণ করুন:

মাঠ

বর্ণনা

প্রস্তাবিত মান

আবিষ্কারের ঠিকানা

ইউডিপি আবিষ্কার ঠিকানা

255.255.255.255

সম্প্রচার বন্দর

যে পোর্টে গুগল হোম ইউডিপি ব্রডকাস্ট পাঠায়

3311

লিসেনিং পোর্ট

যে পোর্টে গুগল হোম প্রতিক্রিয়ার জন্য শোনে

3312

আবিষ্কার প্যাকেট

ইউডিপি সম্প্রচার ডেটা পেলোড

48656c6c6f4c6f63616c486f6d6553444b

ডিভাইস-আবিষ্কার.png

অবশেষে, আপনার পরিবর্তনগুলো প্রকাশ করতে উইন্ডোর নিচের দিকে থাকা সেভ (Save) বাটনে ক্লিক করুন।

৬. স্থানীয় পরিপূর্ণতা বাস্তবায়ন করুন

আপনি লোকাল হোম এসডিকে-এর টাইপিংস প্যাকেজ ব্যবহার করে টাইপস্ক্রিপ্টে আপনার লোকাল ফুলফিলমেন্ট অ্যাপটি তৈরি করবেন। স্টার্টার প্রজেক্টে দেওয়া কাঠামোটি দেখুন:

local/index.ts

/// <reference types="@google/local-home-sdk" />

import App = smarthome.App;
import Constants = smarthome.Constants;
import DataFlow = smarthome.DataFlow;
import Execute = smarthome.Execute;
import Intents = smarthome.Intents;
import IntentFlow = smarthome.IntentFlow;

...

class LocalExecutionApp {

  constructor(private readonly app: App) { }

  identifyHandler(request: IntentFlow.IdentifyRequest):
      Promise<IntentFlow.IdentifyResponse> {
    // TODO: Implement device identification
  }

  executeHandler(request: IntentFlow.ExecuteRequest):
      Promise<IntentFlow.ExecuteResponse> {
    // TODO: Implement local fulfillment
  }

  ...
}

const localHomeSdk = new App('1.0.0');
const localApp = new LocalExecutionApp(localHomeSdk);
localHomeSdk
  .onIdentify(localApp.identifyHandler.bind(localApp))
  .onExecute(localApp.executeHandler.bind(localApp))
  .listen()
  .then(() => console.log('Ready'))
  .catch((e: Error) => console.error(e));

লোকাল ফুলফিলমেন্টের মূল উপাদান হলো smarthome.App ক্লাস। স্টার্টার প্রজেক্টটি IDENTIFY এবং EXECUTE ইন্টেন্টগুলোর জন্য হ্যান্ডলার সংযুক্ত করে, তারপর অ্যাপটি প্রস্তুত হওয়ার কথা লোকাল হোম SDK-কে জানানোর জন্য listen() মেথডটি কল করে।

IDENTIFY হ্যান্ডলার যোগ করুন

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

এদিকে, গুগল যখন কোনো মিলে যাওয়া ডিভাইস খুঁজে পায়, তখন প্ল্যাটফর্মটি প্রাপ্ত স্ক্যান ডেটা সহ identifyHandler কল করে। আপনার অ্যাপে, একটি ইউডিপি ব্রডকাস্ট ব্যবহার করে স্ক্যানিং সম্পন্ন হয় এবং IDENTIFY হ্যান্ডলারকে দেওয়া স্ক্যান ডেটার মধ্যে স্থানীয় ডিভাইস থেকে পাঠানো রেসপন্স পেলোড অন্তর্ভুক্ত থাকে।

হ্যান্ডলারটি একটি IdentifyResponse ইনস্ট্যান্স রিটার্ন করে, যাতে স্থানীয় ডিভাইসের জন্য একটি অনন্য শনাক্তকারী থাকে। স্থানীয় ডিভাইস থেকে আসা UDP প্রতিক্রিয়া প্রক্রিয়া করতে এবং উপযুক্ত স্থানীয় ডিভাইস আইডি নির্ধারণ করতে আপনার identifyHandler মেথডে নিম্নলিখিত কোডটি যোগ করুন:

local/index .ts

identifyHandler(request: IntentFlow.IdentifyRequest):
    Promise<IntentFlow.IdentifyResponse> {
  console.log("IDENTIFY intent: " + JSON.stringify(request, null, 2));

  const scanData = request.inputs[0].payload.device.udpScanData;
  if (!scanData) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_request', 'Invalid scan data');
    return Promise.reject(err);
  }

  // In this codelab, the scan data contains only local device ID.
  const localDeviceId = Buffer.from(scanData.data, 'hex');

  const response: IntentFlow.IdentifyResponse = {
    intent: Intents.IDENTIFY,
    requestId: request.requestId,
    payload: {
      device: {
        id: 'washer',
        verificationId: localDeviceId.toString(),
      }
    }
  };
  console.log("IDENTIFY response: " + JSON.stringify(response, null, 2));

  return Promise.resolve(response);
}

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

EXECUTE হ্যান্ডলার যোগ করুন

যখন লোকাল ফুলফিলমেন্ট সমর্থনকারী কোনো ডিভাইস একটি কমান্ড গ্রহণ করে, তখন লোকাল হোম SDK আপনার EXECUTE হ্যান্ডলারকে ট্রিগার করে। লোকাল ইন্টেন্টের বিষয়বস্তু আপনার ক্লাউড ফুলফিলমেন্টে পাঠানো EXECUTE ইন্টেন্টের সমতুল্য, তাই স্থানীয়ভাবে ইন্টেন্টটি প্রসেস করার লজিকটি ক্লাউডে আপনি যেভাবে এটি হ্যান্ডেল করেন তার অনুরূপ।

অ্যাপটি স্থানীয় ডিভাইসগুলোর সাথে যোগাযোগের জন্য TCP/UDP সকেট অথবা HTTP(S) রিকোয়েস্ট ব্যবহার করতে পারে। এই কোডল্যাবে, ভার্চুয়াল ডিভাইসটি নিয়ন্ত্রণের জন্য HTTP প্রোটোকল হিসেবে ব্যবহৃত হয়েছে। পোর্ট নম্বরটি index.ts ফাইলে SERVER_PORT ভেরিয়েবল হিসেবে সংজ্ঞায়িত করা আছে।

আগত কমান্ডগুলো প্রসেস করতে এবং HTTP-এর মাধ্যমে সেগুলোকে স্থানীয় ডিভাইসে পাঠাতে আপনার executeHandler মেথডে নিম্নলিখিত কোডটি যোগ করুন:

local/index.ts

executeHandler(request: IntentFlow.ExecuteRequest):
    Promise<IntentFlow.ExecuteResponse> {
  console.log("EXECUTE intent: " + JSON.stringify(request, null, 2));

  const command = request.inputs[0].payload.commands[0];
  const execution = command.execution[0];
  const response = new Execute.Response.Builder()
    .setRequestId(request.requestId);

  const promises: Array<Promise<void>> = command.devices.map((device) => {
    console.log("Handling EXECUTE intent for device: " + JSON.stringify(device));

    // Convert execution params to a string for the local device
    const params = execution.params as IWasherParams;
    const payload = this.getDataForCommand(execution.command, params);

    // Create a command to send over the local network
    const radioCommand = new DataFlow.HttpRequestData();
    radioCommand.requestId = request.requestId;
    radioCommand.deviceId = device.id;
    radioCommand.data = JSON.stringify(payload);
    radioCommand.dataType = 'application/json';
    radioCommand.port = SERVER_PORT;
    radioCommand.method = Constants.HttpOperation.POST;
    radioCommand.isSecure = false;

    console.log("Sending request to the smart home device:", payload);

    return this.app.getDeviceManager()
      .send(radioCommand)
      .then(() => {
        const state = {online: true};
        response.setSuccessState(device.id, Object.assign(state, params));
        console.log(`Command successfully sent to ${device.id}`);
      })
      .catch((e: IntentFlow.HandlerError) => {
        e.errorCode = e.errorCode || 'invalid_request';
        response.setErrorState(device.id, e.errorCode);
        console.error('An error occurred sending the command', e.errorCode);
      });
  });

  return Promise.all(promises)
    .then(() => {
      return response.build();
    })
    .catch((e) => {
      const err = new IntentFlow.HandlerError(request.requestId,
          'invalid_request', e.message);
      return Promise.reject(err);
    });
}

টাইপস্ক্রিপ্ট অ্যাপটি কম্পাইল করুন

TypeScript কম্পাইলার ডাউনলোড করতে এবং অ্যাপটি কম্পাইল করতে local/ ডিরেক্টরিতে যান এবং নিম্নলিখিত কমান্ডগুলো চালান:

cd local
npm install
npm run build

এটি index.ts (টাইপস্ক্রিপ্ট) সোর্স কম্পাইল করে এবং নিম্নলিখিত বিষয়বস্তু public/local-home/ ডিরেক্টরিতে রাখে:

  • bundle.js — কম্পাইল করা জাভাস্ক্রিপ্ট আউটপুট, যাতে স্থানীয় অ্যাপ এবং এর নির্ভরতাগুলো থাকে।
  • index.html — ডিভাইসে পরীক্ষার জন্য অ্যাপটি পরিবেশন করতে ব্যবহৃত স্থানীয় হোস্টিং পৃষ্ঠা।

টেস্ট প্রজেক্টটি ডিপ্লয় করুন

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

firebase deploy --only hosting

৭. স্মার্ট ওয়াশারটি চালু করুন।

এখন আপনার স্থানীয় ফুলফিলমেন্ট অ্যাপ এবং স্মার্ট ওয়াশারের মধ্যেকার যোগাযোগ পরীক্ষা করার সময়! কোডল্যাব স্টার্টার প্রজেক্টটিতে Node.js-এ লেখা একটি ভার্চুয়াল স্মার্ট ওয়াশার রয়েছে, যা এমন একটি স্মার্ট ওয়াশারের অনুকরণ করে যাকে ব্যবহারকারীরা স্থানীয়ভাবে নিয়ন্ত্রণ করতে পারেন।

ডিভাইসটি কনফিগার করুন

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

প্যারামিটার

প্রস্তাবিত মান

ডিভাইস আইডি

deviceid123

ডিসকভারি পোর্ট আউট

3311

আবিষ্কার প্যাকেট

HelloLocalHomeSDK

প্রজেক্ট আইডি

আপনার ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশনের প্রজেক্ট আইডি

ডিভাইসটি চালু করুন

virtual-device/ ডিরেক্টরিতে যান এবং কনফিগারেশন প্যারামিটারগুলো আর্গুমেন্ট হিসেবে পাস করে ডিভাইস স্ক্রিপ্টটি চালান:

cd virtual-device
npm install
npm start -- \
  --deviceId=deviceid123 --projectId=<project-id> \
  --discoveryPortOut=3311 --discoveryPacket=HelloLocalHomeSDK

ডিভাইস স্ক্রিপ্টটি প্রত্যাশিত প্যারামিটার অনুযায়ী চলছে কিনা তা যাচাই করুন:

(...): UDP Server listening on 3311
(...): Device listening on port 3388
(...): Report State successful

৮. টাইপস্ক্রিপ্ট অ্যাপটি ডিবাগ করুন

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

ক্রোম ডেভেলপার টুলস সংযুক্ত করুন

আপনার স্থানীয় ফুলফিলমেন্ট অ্যাপের সাথে ডিবাগারটি সংযোগ করতে, এই ধাপগুলো অনুসরণ করুন:

  1. নিশ্চিত করুন যে আপনি আপনার গুগল হোম ডিভাইসটি এমন একজন ব্যবহারকারীর সাথে লিঙ্ক করেছেন, যার ডেভেলপার কনসোল প্রজেক্ট অ্যাক্সেস করার অনুমতি রয়েছে।
  2. আপনার গুগল হোম ডিভাইসটি রিবুট করুন, যা এটিকে আপনার HTML-এর URL এবং সেইসাথে ডেভেলপার কনসোলে দেওয়া স্ক্যান কনফিগারেশনটি পেতে সক্ষম করবে।
  3. আপনার ডেভেলপমেন্ট মেশিনে ক্রোম চালু করুন।
  4. একটি নতুন ক্রোম ট্যাব খুলুন এবং ইন্সপেক্টর চালু করতে অ্যাড্রেস ফিল্ডে chrome://inspect লিখুন।

আপনি পৃষ্ঠাটিতে ডিভাইসগুলির একটি তালিকা দেখতে পাবেন এবং আপনার গুগল হোম ডিভাইসের নামের নিচে আপনার অ্যাপের ইউআরএলটি দেখা যাবে।

567f97789a7d8846.png

পরিদর্শককে চালু করুন

ক্রোম ডেভেলপার টুলস চালু করতে আপনার অ্যাপ URL-এর নিচে থাকা 'Inspect'-এ ক্লিক করুন। 'Console' ট্যাবটি নির্বাচন করুন এবং যাচাই করুন যে আপনি আপনার TypeScript অ্যাপ দ্বারা প্রিন্ট করা IDENTIFY intent-এর বিষয়বস্তু দেখতে পাচ্ছেন।

6b67ded470a4c8be.png

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

স্থানীয় পরিপূর্ণতা পরীক্ষা করুন

Google Home অ্যাপের টাচ কন্ট্রোল ব্যবহার করে অথবা Google Home ডিভাইসে ভয়েস কমান্ডের মাধ্যমে আপনার ডিভাইসে কমান্ড পাঠান, যেমন:

"হে গুগল, আমার ওয়াশারটা চালু করো।"

"হে গুগল, আমার ওয়াশারটা চালু করো।"

"হে গুগল, আমার ওয়াশারটা বন্ধ করো।"

এর ফলে প্ল্যাটফর্মটি আপনার টাইপস্ক্রিপ্ট অ্যাপে একটি EXECUTE ইন্টেন্ট পাঠাবে।

bc030517dacc3ac9.png

প্রতিটি কমান্ডের সাথে স্থানীয় স্মার্ট ওয়াশারের অবস্থার পরিবর্তন দেখতে পাচ্ছেন কিনা তা যাচাই করুন।

...
***** The washer is RUNNING *****
...
***** The washer is STOPPED *****

৯. অভিনন্দন

764dbc83b95782a.png

অভিনন্দন! আপনি লোকাল হোম এসডিকে ব্যবহার করে একটি ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশনে লোকাল ফুলফিলমেন্ট অন্তর্ভুক্ত করেছেন।

আরও জানুন

এখানে আরও কিছু বিষয় রয়েছে যা আপনি চেষ্টা করে দেখতে পারেন:

  • স্ক্যান কনফিগারেশন পরিবর্তন করে এটিকে কার্যকর করুন। উদাহরণস্বরূপ, একটি ভিন্ন UDP পোর্ট বা ডিসকভারি প্যাকেট ব্যবহার করে দেখুন।
  • ভার্চুয়াল স্মার্ট ডিভাইসের কোডবেসটি একটি এমবেডেড ডিভাইসে—যেমন রাস্পবেরি পাই—চালানোর জন্য পরিবর্তন করুন এবং বর্তমান অবস্থা দেখানোর জন্য এলইডি বা একটি ডিসপ্লে ব্যবহার করুন।