১. শুরু করার আগে
ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশন ডিভাইসের ধরণ ব্যবহার করে গুগল অ্যাসিস্ট্যান্টকে জানাতে পারে যে ডিভাইসের সাথে কোন ব্যাকরণ ব্যবহার করা উচিত। ডিভাইসের বৈশিষ্ট্যগুলি ডিভাইসের ধরণের ক্ষমতা নির্ধারণ করে। একটি ডিভাইস একটি ইন্টিগ্রেশনে যোগ করা প্রতিটি ডিভাইসের বৈশিষ্ট্যের অবস্থা উত্তরাধিকারসূত্রে পায়।

আপনার ব্যবহারকারীর ডিভাইসের কার্যকারিতা কাস্টমাইজ করার জন্য আপনি আপনার পছন্দের ডিভাইসের ধরণের সাথে যেকোনো সমর্থিত বৈশিষ্ট্য সংযুক্ত করতে পারেন। যদি আপনি আপনার অ্যাকশনে এমন কাস্টম বৈশিষ্ট্য প্রয়োগ করতে চান যা বর্তমানে ডিভাইস স্কিমায় উপলব্ধ নয়, তাহলে মোড এবং টগল বৈশিষ্ট্যগুলি আপনার সংজ্ঞায়িত একটি কাস্টম নামের মাধ্যমে নির্দিষ্ট সেটিংস নিয়ন্ত্রণের অনুমতি দেয়।
টাইপ এবং বৈশিষ্ট্য দ্বারা প্রদত্ত মৌলিক নিয়ন্ত্রণ ক্ষমতার বাইরে, স্মার্ট হোম API-তে ব্যবহারকারীর অভিজ্ঞতা উন্নত করার জন্য অতিরিক্ত বৈশিষ্ট্য রয়েছে। যখন উদ্দেশ্য সফল হয় না তখন ত্রুটির প্রতিক্রিয়াগুলি বিশদ ব্যবহারকারীর প্রতিক্রিয়া প্রদান করে। সেকেন্ডারি ব্যবহারকারী যাচাইকরণ সেই প্রতিক্রিয়াগুলিকে প্রসারিত করে এবং আপনার পছন্দের ডিভাইস বৈশিষ্ট্যে অতিরিক্ত সুরক্ষা যোগ করে। অ্যাসিস্ট্যান্ট থেকে জারি করা চ্যালেঞ্জ ব্লকগুলিতে নির্দিষ্ট ত্রুটির প্রতিক্রিয়া পাঠানোর মাধ্যমে, আপনার ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশনের জন্য একটি কমান্ড সম্পূর্ণ করার জন্য অতিরিক্ত অনুমোদনের প্রয়োজন হতে পারে।
পূর্বশর্ত
- ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশন তৈরি করুন ডেভেলপারের নির্দেশিকা
- স্মার্ট হোম ওয়াশার কোডল্যাব
- ডিভাইসের ধরণ এবং বৈশিষ্ট্য ডেভেলপারের নির্দেশিকা
তুমি কী তৈরি করবে
In this codelab, you'll deploy a prebuilt smart home integration with Firebase, then learn how to add nonstandard traits to the smart home washer for load size and turbo mode. You'll also implement error and exception reporting, and learn to enforce a verbal acknowledgement to turn on the washer using secondary user verification.
তুমি কি শিখবে
- আপনার ইন্টিগ্রেশনে মোড এবং টগল বৈশিষ্ট্যগুলি কীভাবে যুক্ত করবেন
- ত্রুটি এবং ব্যতিক্রমগুলি কীভাবে রিপোর্ট করবেন
- সেকেন্ডারি ইউজার ভেরিফিকেশন কীভাবে প্রয়োগ করবেন
তোমার যা লাগবে
- একটি ওয়েব ব্রাউজার, যেমন গুগল ক্রোম
- Google Home অ্যাপ ইনস্টল করা আছে এমন একটি iOS বা Android ডিভাইস
- Node.js সংস্করণ ১০.১৬ বা তার পরবর্তী
- একটি গুগল অ্যাকাউন্ট
- একটি গুগল ক্লাউড বিলিং অ্যাকাউন্ট
2. শুরু করা
অ্যাক্টিভিটি নিয়ন্ত্রণ সক্ষম করুন
গুগল অ্যাসিস্ট্যান্ট ব্যবহার করার জন্য, আপনাকে অবশ্যই গুগলের সাথে কিছু অ্যাক্টিভিটি ডেটা শেয়ার করতে হবে। গুগল অ্যাসিস্ট্যান্টের সঠিকভাবে কাজ করার জন্য এই ডেটার প্রয়োজন; তবে, ডেটা শেয়ার করার প্রয়োজনীয়তা SDK-এর সাথে নির্দিষ্ট নয়। এই ডেটা শেয়ার করার জন্য, যদি আপনার ইতিমধ্যে একটি Google অ্যাকাউন্ট না থাকে তবে একটি তৈরি করুন। আপনি যেকোনো Google অ্যাকাউন্ট ব্যবহার করতে পারেন—এটি আপনার ডেভেলপার অ্যাকাউন্ট হতে হবে না।
আপনি যে Google অ্যাকাউন্টটি Assistant-এর সাথে ব্যবহার করতে চান তার জন্য Activity Controls পৃষ্ঠাটি খুলুন।
Ensure the following toggle switches are enabled:
- ওয়েব এবং অ্যাপ অ্যাক্টিভিটি - এছাড়াও, " Include Chrome history and activity from sites, apps, and devices that use Google services" চেকবক্সটি নির্বাচন করতে ভুলবেন না।
- ডিভাইসের তথ্য
- ভয়েস এবং অডিও অ্যাক্টিভিটি
একটি ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশন প্রকল্প তৈরি করুন
- ডেভেলপার কনসোলে যান।
- প্রকল্প তৈরি করুন ক্লিক করুন, প্রকল্পের জন্য একটি নাম লিখুন এবং প্রকল্প তৈরি করুন ক্লিক করুন।

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

ফায়ারবেস সিএলআই ইনস্টল করুন
ফায়ারবেস কমান্ড লাইন ইন্টারফেস (CLI) আপনাকে স্থানীয়ভাবে আপনার ওয়েব অ্যাপগুলি পরিবেশন করতে এবং ফায়ারবেস হোস্টিংয়ে আপনার ওয়েব অ্যাপ স্থাপন করতে দেবে।
CLI ইনস্টল করতে, টার্মিনাল থেকে নিম্নলিখিত npm কমান্ডটি চালান:
npm install -g firebase-tools
CLI সঠিকভাবে ইনস্টল করা হয়েছে কিনা তা যাচাই করতে, চালান:
firebase --version
আপনার গুগল অ্যাকাউন্টের সাথে ফায়ারবেস সিএলআই অনুমোদন করুন:
firebase login
আপনার গুগল হোম ডেভেলপার কনসোল প্রকল্পে ফায়ারবেস যোগ করুন
পদ্ধতি ১: ফায়ারবেস কনসোলের মাধ্যমে
- ফায়ারবেসে যান।
- একটি ফায়ারবেস প্রকল্প তৈরি করুন ক্লিক করুন।

- "একটি প্রকল্প তৈরি করুন " স্ক্রিনে, "গুগল ক্লাউড প্রকল্পে ফায়ারবেস যোগ করুন" এ ক্লিক করুন।

- শুরু করুন স্ক্রিনে, গুগল হোম ডেভেলপার কনসোলে আপনার তৈরি করা গুগল ক্লাউড প্রকল্পটি নির্বাচন করুন এবং তারপরে চালিয়ে যান ক্লিক করুন।

পদ্ধতি ২: ফায়ারবেস সিএলআই এর মাধ্যমে
firebase projects:addfirebase
Firebase যোগ করার জন্য আপনার তৈরি করা Google Home Developer Console প্রকল্পটি নির্বাচন করুন।
যখন আপনার Google Home Developer Console প্রকল্পে Firebase যোগ করা হবে, তখন এটি Firebase কনসোলে প্রদর্শিত হবে। Firebase প্রকল্পের প্রকল্প আইডি আপনার Google Home Developer Console প্রকল্প আইডির সাথে সারিবদ্ধ হবে।

হোমগ্রাফ এপিআই সক্ষম করুন
HomeGraph API ব্যবহারকারীর Home Graph এর মধ্যে ডিভাইস এবং তাদের অবস্থা সংরক্ষণ এবং অনুসন্ধান সক্ষম করে। এই API ব্যবহার করতে, আপনাকে প্রথমে Google Cloud কনসোল খুলতে হবে এবং HomeGraph API সক্ষম করতে হবে ।
গুগল ক্লাউড কনসোলে, আপনার Actions <firebase-project-id>. তারপর, HomeGraph API এর জন্য API Library স্ক্রিনে, Enable এ ক্লিক করুন।

৩. স্টার্টার অ্যাপটি চালান
এখন আপনি আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করার পর, সবকিছু সঠিকভাবে কনফিগার করা হয়েছে কিনা তা যাচাই করার জন্য আপনি স্টার্টার প্রজেক্টটি স্থাপন করতে পারেন।
সোর্স কোডটি পান
আপনার ডেভেলপমেন্ট মেশিনে এই কোডল্যাবের নমুনা ডাউনলোড করতে নিম্নলিখিত লিঙ্কে ক্লিক করুন:
...অথবা আপনি কমান্ড লাইন থেকে GitHub সংগ্রহস্থল ক্লোন করতে পারেন:
git clone https://github.com/google-home/smarthome-traits.git
ডাউনলোড করা জিপ ফাইলটি আনপ্যাক করুন।
প্রকল্প সম্পর্কে
স্টার্টার প্রজেক্টে নিম্নলিখিত সাবডিরেক্টরি রয়েছে:
-
public:স্মার্ট ওয়াশারের অবস্থা সহজেই নিয়ন্ত্রণ এবং নিরীক্ষণ করার জন্য একটি ফ্রন্টএন্ড UI। -
functions:একটি সম্পূর্ণরূপে বাস্তবায়িত ক্লাউড পরিষেবা যা ফায়ারবেস এবং ফায়ারবেস রিয়েলটাইম ডেটাবেসের জন্য ক্লাউড ফাংশন সহ স্মার্ট ওয়াশার পরিচালনা করে।
প্রদত্ত ক্লাউড পরিপূর্ণতা index.js এ নিম্নলিখিত ফাংশনগুলি অন্তর্ভুক্ত করে:
-
fakeauth: অ্যাকাউন্ট লিঙ্কিংয়ের জন্য অনুমোদনের শেষ বিন্দু -
faketoken: অ্যাকাউন্ট লিঙ্কিংয়ের জন্য টোকেন এন্ডপয়েন্ট -
smarthome: স্মার্ট হোমের উদ্দেশ্য পূরণের শেষ বিন্দু -
reportstate: ডিভাইসের অবস্থা পরিবর্তনের ক্ষেত্রে Home Graph API ব্যবহার করে। -
requestsync: অ্যাকাউন্ট পুনঃলিঙ্ক করার প্রয়োজন ছাড়াই ব্যবহারকারীর ডিভাইস আপডেট সক্ষম করে
Firebase-এর সাথে সংযোগ করুন
washer-start ডিরেক্টরিতে নেভিগেট করুন, তারপর আপনার ইন্টিগ্রেশন প্রকল্পের সাথে ফায়ারবেস সিএলআই সেট আপ করুন:
cd washer-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
এটি আপনার প্রকল্পের জন্য প্রয়োজনীয় API এবং বৈশিষ্ট্যগুলি শুরু করবে।
অনুরোধ করা হলে, রিয়েলটাইম ডেটাবেস আরম্ভ করুন। আপনি ডাটাবেস ইনস্ট্যান্সের জন্য ডিফল্ট অবস্থান ব্যবহার করতে পারেন।
? 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
যদি আপনি আপনার প্রকল্পটি পুনরায় চালু করেন, তাহলে কোডবেসটি চালু বা ওভাররাইট করতে চান কিনা জিজ্ঞাসা করা হলে "ওভাররাইট" নির্বাচন করুন।
? Would you like to initialize a new codebase, or overwrite an existing one? Overwrite
আপনার ফাংশন কনফিগার করার সময়, আপনার ডিফল্ট ফাইলগুলি ব্যবহার করা উচিত এবং নিশ্চিত করা উচিত যে আপনি প্রকল্পের নমুনায় বিদ্যমান index.js এবং package.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 ভুলবশত সক্রিয় হয়ে থাকে, তাহলে এটি নিষ্ক্রিয় করার দুটি পদ্ধতি রয়েছে:
- GUI ব্যবহার করে, প্রজেক্টের অধীনে
../functionsফোল্ডারে যান, লুকানো.eslintrc.jsফাইলটি নির্বাচন করুন এবং এটি মুছে ফেলুন। এটিকে একই নামের.eslintrc.jsonফাইল ভেবে ভুল করবেন না। - কমান্ড লাইন ব্যবহার করে:
cd functions rm .eslintrc.js
ফায়ারবেসে স্থাপন করুন
এখন আপনি নির্ভরতা ইনস্টল করেছেন এবং আপনার প্রকল্পটি কনফিগার করেছেন, আপনি প্রথমবারের মতো অ্যাপটি চালানোর জন্য প্রস্তুত।
firebase deploy
This is the console output you should see:
... ✔ Deploy complete! Project Console: https://console.firebase.google.com/project/<project-id>/overview Hosting URL: https://<project-id>.web.app
এই কমান্ডটি Firebase এর জন্য বেশ কয়েকটি ক্লাউড ফাংশন সহ একটি ওয়েব অ্যাপ স্থাপন করে।
ওয়েব অ্যাপটি দেখতে আপনার ব্রাউজারে ( https://<firebase-project-id>.web.app ) হোস্টিং URL খুলুন। আপনি নিম্নলিখিত ইন্টারফেসটি দেখতে পাবেন:

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

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

অ্যাকাউন্ট লিঙ্কিং সক্ষম করতে এই অ্যাকাউন্ট লিঙ্কিং সেটিংস ব্যবহার করুন:
ক্লায়েন্ট আইডি | |
ক্লায়েন্ট গোপনীয়তা | |
অনুমোদনের URL | |
টোকেন ইউআরএল | |

Under Cloud fulfillment URL , enter the URL for your cloud function that provides fulfillment for the smart home intents.
https://us-central1-<project-id>.cloudfunctions.net/smarthome

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

এখন আপনি অ্যাসিস্ট্যান্টের সাথে ডিভাইসের অবস্থা সংযোগ করার জন্য প্রয়োজনীয় ওয়েবহুকগুলি বাস্তবায়ন শুরু করতে পারেন।
গুগল অ্যাসিস্ট্যান্টের লিঙ্ক
আপনার ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশন পরীক্ষা করার জন্য, আপনাকে আপনার প্রোজেক্টটিকে একটি Google অ্যাকাউন্টের সাথে লিঙ্ক করতে হবে। এটি একই অ্যাকাউন্টে সাইন ইন করা Google Assistant সারফেস এবং Google Home অ্যাপের মাধ্যমে পরীক্ষা করার সুযোগ দেয়।
- আপনার ফোনে, Google Assistant সেটিংস খুলুন। মনে রাখবেন যে আপনাকে কনসোলের মতো একই অ্যাকাউন্ট দিয়ে লগ ইন করতে হবে।
- গুগল অ্যাসিস্ট্যান্ট > সেটিংস > হোম কন্ট্রোল (অ্যাসিস্ট্যান্টের অধীনে) এ নেভিগেট করুন।
- উপরের ডানদিকে অনুসন্ধান আইকনে ক্লিক করুন।
- আপনার নির্দিষ্ট পরীক্ষামূলক অ্যাপটি খুঁজে পেতে [test] উপসর্গ ব্যবহার করে আপনার পরীক্ষামূলক অ্যাপটি অনুসন্ধান করুন।
- সেই আইটেমটি নির্বাচন করুন। এরপর গুগল অ্যাসিস্ট্যান্ট আপনার পরিষেবার সাথে প্রমাণীকরণ করবে এবং একটি
SYNCঅনুরোধ পাঠাবে, যেখানে আপনার পরিষেবাকে ব্যবহারকারীর জন্য ডিভাইসের একটি তালিকা প্রদান করতে বলবে।
গুগল হোম অ্যাপটি খুলুন এবং যাচাই করুন যে আপনি আপনার ওয়াশিং মেশিনটি দেখতে পাচ্ছেন।

গুগল হোম অ্যাপে ভয়েস কমান্ড ব্যবহার করে আপনি ওয়াশার নিয়ন্ত্রণ করতে পারেন কিনা তা যাচাই করুন। আপনার ক্লাউড ফুলফিলমেন্টের ফ্রন্টএন্ড ওয়েব UI-তেও ডিভাইসের অবস্থার পরিবর্তন দেখতে পাবেন।
এখন যেহেতু আপনার একটি বেসিক ওয়াশার স্থাপন করা হয়েছে, আপনি আপনার ডিভাইসে উপলব্ধ মোডগুলি কাস্টমাইজ করতে পারেন।
৪. মোড যোগ করুন
action.devices.traits.Modes বৈশিষ্ট্যটি একটি ডিভাইসকে একটি মোডের জন্য ইচ্ছামত সংখ্যক সেটিংস রাখতে সক্ষম করে, যার মধ্যে একবারে কেবল একটি সেট করা যেতে পারে। লন্ড্রি লোডের আকার নির্ধারণ করার জন্য আপনি ওয়াশারে একটি মোড যুক্ত করবেন: ছোট, মাঝারি বা বড়।
SYNC প্রতিক্রিয়া আপডেট করুন
আপনার SYNC প্রতিক্রিয়াতে functions/index.js এ নতুন বৈশিষ্ট্য সম্পর্কে তথ্য যোগ করতে হবে। এই তথ্যটি নিম্নলিখিত কোড স্নিপেটে দেখানো traits অ্যারে এবং attributes বস্তুতে প্রদর্শিত হবে।
ইনডেক্স.জেএস
app.onSync(body => {
return {
requestId: 'ff36a3cc-ec34-11e6-b1a0-64510650abcf',
payload: {
agentUserId: USER_ID,
devices: [{
id: 'washer',
type: 'action.devices.types.WASHER',
traits: [
'action.devices.traits.OnOff',
'action.devices.traits.StartStop',
'action.devices.traits.RunCycle',
// Add Modes trait
'action.devices.traits.Modes',
],
name: { ... },
deviceInfo: { ... },
attributes: {
pausable: true,
//Add availableModes
availableModes: [{
name: 'load',
name_values: [{
name_synonym: ['load'],
lang: 'en',
}],
settings: [{
setting_name: 'small',
setting_values: [{
setting_synonym: ['small'],
lang: 'en',
}]
}, {
setting_name: 'medium',
setting_values: [{
setting_synonym: ['medium'],
lang: 'en',
}]
}, {
setting_name: 'large',
setting_values: [{
setting_synonym: ['large'],
lang: 'en',
}]
}],
ordered: true,
}],
},
}],
},
};
});
Add new EXECUTE intent commands
আপনার EXECUTE ইন্টেন্টে, নিম্নলিখিত কোড স্নিপেটে দেখানো action.devices.commands.SetModes কমান্ডটি যোগ করুন।
ইনডেক্স.জেএস
const updateDevice = async (execution,deviceId) => {
...
switch (command) {
...
// Add SetModes command
case 'action.devices.commands.SetModes':
state = {load: params.updateModeSettings.load};
ref = getFirebaseRef().child(deviceId).child('Modes');
break;
}
QUERY এর প্রতিক্রিয়া আপডেট করুন
এরপর, ওয়াশারের বর্তমান অবস্থা রিপোর্ট করার জন্য আপনার QUERY প্রতিক্রিয়া আপডেট করুন।
রিয়েলটাইম ডাটাবেসে সংরক্ষিত অবস্থা পেতে queryFirebase এবং queryDevice ফাংশনে আপডেট করা পরিবর্তনগুলি যোগ করুন।
ইনডেক্স.জেএস
const queryFirebase = async (deviceId) => {
const snapshot = await getFirebaseRef().child(deviceId).once('value');
const snapshotVal = snapshot.val();
return {
on: snapshotVal.OnOff.on,
isPaused: snapshotVal.StartStop.isPaused,
isRunning: snapshotVal.StartStop.isRunning,
// Add Modes snapshot
load: snapshotVal.Modes.load,
};
};
const queryDevice = async (deviceId) => {
const data = await queryFirebase(deviceId);
return {
on: data.on,
isPaused: data.isPaused,
isRunning: data.isRunning,
currentRunCycle: [{ ... }],
currentTotalRemainingTime: 1212,
currentCycleRemainingTime: 301,
// Add currentModeSettings
currentModeSettings: {
load: data.load,
},
};
};
রিপোর্টের অবস্থা আপডেট করুন
অবশেষে, ওয়াশারের বর্তমান লোড সেটিং হোম গ্রাফে রিপোর্ট করতে আপনার reportstate ফাংশন আপডেট করুন।
ইনডেক্স.জেএস
const requestBody = {
requestId: 'ff36a3cc', /* Any unique ID */
agentUserId: USER_ID,
payload: {
devices: {
states: {
/* Report the current state of your washer */
[context.params.deviceId]: {
on: snapshot.OnOff.on,
isPaused: snapshot.StartStop.isPaused,
isRunning: snapshot.StartStop.isRunning,
// Add currentModeSettings
currentModeSettings: {
load: snapshot.Modes.load,
},
},
},
},
},
};
ফায়ারবেসে স্থাপন করুন
আপডেট করা ইন্টিগ্রেশন স্থাপন করতে নিম্নলিখিত কমান্ডটি চালান:
firebase deploy --only functions
স্থাপনা সম্পন্ন হওয়ার পর, ওয়েব UI-তে নেভিগেট করুন এবং রিফ্রেশ বোতামে ক্লিক করুন।
টুলবারে বোতাম। এটি একটি অনুরোধ সিঙ্ক ট্রিগার করে যাতে সহকারী আপডেট করা SYNC প্রতিক্রিয়া ডেটা পায়।

এখন আপনি ওয়াশারের মোড সেট করার জন্য একটি কমান্ড দিতে পারেন, যেমন:
"হে গুগল, ওয়াশার লোড বড় করে সেট করো।"
অতিরিক্তভাবে, আপনি আপনার ওয়াশিং মেশিন সম্পর্কে প্রশ্ন জিজ্ঞাসা করতে পারেন, যেমন:
"হে গুগল, ওয়াশিং মেশিনের লোড কত?"
৫. টগল যোগ করুন
action.devices.traits.Toggles বৈশিষ্ট্যটি এমন একটি ডিভাইসের নামযুক্ত দিকগুলিকে প্রতিনিধিত্ব করে যার অবস্থা সত্য বা মিথ্যা, যেমন ওয়াশার টার্বো মোডে আছে কিনা।
SYNC প্রতিক্রিয়া আপডেট করুন
আপনার SYNC প্রতিক্রিয়াতে, আপনাকে নতুন ডিভাইস বৈশিষ্ট্য সম্পর্কে তথ্য যোগ করতে হবে। এটি নিম্নলিখিত কোড স্নিপেটে দেখানো traits অ্যারে এবং attributes বস্তুতে প্রদর্শিত হবে।
ইনডেক্স.জেএস
app.onSync(body => {
return {
requestId: 'ff36a3cc-ec34-11e6-b1a0-64510650abcf',
payload: {
agentUserId: USER_ID,
devices: [{
id: 'washer',
type: 'action.devices.types.WASHER',
traits: [
'action.devices.traits.OnOff',
'action.devices.traits.StartStop',
'action.devices.traits.RunCycle',
'action.devices.traits.Modes',
// Add Toggles trait
'action.devices.traits.Toggles',
],
name: { ... },
deviceInfo: { ... },
attributes: {
pausable: true,
availableModes: [{
name: 'load',
name_values: [{
name_synonym: ['load'],
lang: 'en'
}],
settings: [{ ... }],
ordered: true,
}],
//Add availableToggles
availableToggles: [{
name: 'Turbo',
name_values: [{
name_synonym: ['turbo'],
lang: 'en',
}],
}],
},
}],
},
};
});
নতুন EXECUTE ইন্টেন্ট কমান্ড যোগ করুন
আপনার EXECUTE ইন্টেন্টে, নিম্নলিখিত কোড স্নিপেটে দেখানো action.devices.commands.SetToggles কমান্ডটি যোগ করুন।
ইনডেক্স.জেএস
const updateDevice = async (execution,deviceId) => {
...
switch (command) {
\ ...
// Add SetToggles command
case 'action.devices.commands.SetToggles':
state = {Turbo: params.updateToggleSettings.Turbo};
ref = firebaseRef.child(deviceId).child('Toggles');
break;
}
QUERY এর প্রতিক্রিয়া আপডেট করুন
অবশেষে, ওয়াশারের টার্বো মোড রিপোর্ট করার জন্য আপনাকে আপনার QUERY প্রতিক্রিয়া আপডেট করতে হবে। রিয়েলটাইম ডেটাবেসে সংরক্ষিত টগল অবস্থা পেতে queryFirebase এবং queryDevice ফাংশনে আপডেট করা পরিবর্তনগুলি যোগ করুন।
ইনডেক্স.জেএস
const queryFirebase = async (deviceId) => {
const snapshot = await getFirebaseRef().child(deviceId).once('value');
const snapshotVal = snapshot.val();
return {
on: snapshotVal.OnOff.on,
isPaused: snapshotVal.StartStop.isPaused,
isRunning: snapshotVal.StartStop.isRunning,
load: snapshotVal.Modes.load,
// Add Toggles snapshot
Turbo: snapshotVal.Toggles.Turbo,
};
}
const queryDevice = async (deviceId) => {
const data = queryFirebase(deviceId);
return {
on: data.on,
isPaused: data.isPaused,
isRunning: data.isRunning,
currentRunCycle: [{ ... }],
currentTotalRemainingTime: 1212,
currentCycleRemainingTime: 301,
currentModeSettings: {
load: data.load,
},
// Add currentToggleSettings
currentToggleSettings: {
Turbo: data.Turbo,
},
};
};
রিপোর্টের অবস্থা আপডেট করুন
অবশেষে, ওয়াশারটি টার্বোতে সেট করা আছে কিনা তা হোম গ্রাফে রিপোর্ট করার জন্য আপনার reportstate ফাংশন আপডেট করুন।
ইনডেক্স.জেএস
const requestBody = {
requestId: 'ff36a3cc', /* Any unique ID */
agentUserId: USER_ID,
payload: {
devices: {
states: {
/* Report the current state of your washer */
[context.params.deviceId]: {
on: snapshot.OnOff.on,
isPaused: snapshot.StartStop.isPaused,
isRunning: snapshot.StartStop.isRunning,
currentModeSettings: {
load: snapshot.Modes.load,
},
// Add currentToggleSettings
currentToggleSettings: {
Turbo: snapshot.Toggles.Turbo,
},
},
},
},
},
};
ফায়ারবেসে স্থাপন করুন
আপডেট করা ফাংশনগুলি স্থাপন করতে নিম্নলিখিত কমান্ডটি চালান:
firebase deploy --only functions
রিফ্রেশ ক্লিক করুন।
button in the web UI to trigger a Request Sync after deployment completes.
আপনি এখন ওয়াশারটিকে টার্বো মোডে সেট করার জন্য একটি কমান্ড দিতে পারেন এই বলে:
"হে গুগল, ওয়াশার টার্বো মোডে সেট করো।"
আপনার ওয়াশারটি ইতিমধ্যেই টার্বো মোডে আছে কিনা তা জিজ্ঞাসা করেও আপনি পরীক্ষা করতে পারেন:
"হে গুগল, আমার ওয়াশিং মেশিন কি টার্বো মোডে আছে?"
৬. ত্রুটি এবং ব্যতিক্রম রিপোর্ট করা
আপনার ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশনে ত্রুটি পরিচালনার মাধ্যমে আপনি ব্যবহারকারীদের কাছে রিপোর্ট করতে পারবেন যখন সমস্যার কারণে EXECUTE এবং QUERY প্রতিক্রিয়া ব্যর্থ হয়। বিজ্ঞপ্তিগুলি আপনার ব্যবহারকারীদের জন্য আরও ইতিবাচক ব্যবহারকারীর অভিজ্ঞতা তৈরি করে যখন তারা আপনার স্মার্ট ডিভাইস এবং ইন্টিগ্রেশনের সাথে ইন্টারঅ্যাক্ট করে।
যেকোনো সময় যদি কোনও EXECUTE বা QUERY অনুরোধ ব্যর্থ হয়, তাহলে আপনার ইন্টিগ্রেশনে একটি ত্রুটি কোড ফেরত আসবে। উদাহরণস্বরূপ, যদি আপনি কোনও ব্যবহারকারীর ঢাকনা খোলা রেখে ওয়াশার চালু করার চেষ্টা করার সময় একটি ত্রুটি দিতে চান, তাহলে আপনার EXECUTE প্রতিক্রিয়াটি নিম্নলিখিত কোড স্নিপেটের মতো দেখাবে:
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"payload": {
"commands": [
{
"ids": [
"456"
],
"status": "ERROR",
"errorCode": "deviceLidOpen"
}
]
}
}
এখন, যখন কোনও ব্যবহারকারী ওয়াশার চালু করতে বলেন, তখন সহকারী এই বলে সাড়া দেন:
"ওয়াশারের ঢাকনা খোলা আছে। দয়া করে এটি বন্ধ করে আবার চেষ্টা করুন।"
ব্যতিক্রমগুলি ত্রুটির অনুরূপ, কিন্তু নির্দেশ করে যখন কোনও সতর্কতা কোনও কমান্ডের সাথে যুক্ত থাকে, যা সফল সম্পাদনকে ব্লক করতে পারে বা নাও করতে পারে। একটি ব্যতিক্রম StatusReport বৈশিষ্ট্য ব্যবহার করে সম্পর্কিত তথ্য প্রদান করতে পারে, যেমন ব্যাটারি স্তর বা সাম্প্রতিক অবস্থা পরিবর্তন। নন-ব্লকিং ব্যতিক্রম কোডগুলি একটি SUCCESS স্ট্যাটাসের সাথে ফেরত পাঠানো হয়, যখন ব্লকিং ব্যতিক্রম কোডগুলি একটি EXCEPTIONS স্ট্যাটাস সহ ফেরত পাঠানো হয়।
ব্যতিক্রম সহ একটি উদাহরণ প্রতিক্রিয়া নিম্নলিখিত কোড স্নিপেটে রয়েছে:
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"payload": {
"commands": [{
"ids": ["123"],
"status": "SUCCESS",
"states": {
"online": true,
"isPaused": false,
"isRunning": false,
"exceptionCode": "runCycleFinished"
}
}]
}
}
সহকারী উত্তরে বলেন:
"ওয়াশিং মেশিন চালানো শেষ হয়েছে।"
আপনার ওয়াশারের জন্য ত্রুটি প্রতিবেদন যোগ করতে, functions/index.js খুলুন এবং নিম্নলিখিত কোড স্নিপেটে দেখানো ত্রুটি শ্রেণীর সংজ্ঞা যোগ করুন:
ইনডেক্স.জেএস
app.onQuery(async (body) => {...});
// Add SmartHome error handling
class SmartHomeError extends Error {
constructor(errorCode, message) {
super(message);
this.name = this.constructor.name;
this.errorCode = errorCode;
}
}
ত্রুটি কোড এবং ত্রুটির অবস্থা ফেরত দিতে এক্সিকিউট প্রতিক্রিয়া আপডেট করুন:
index.js
const executePromises = [];
const intent = body.inputs[0];
for (const command of intent.payload.commands) {
for (const device of command.devices) {
for (const execution of command.execution) {
executePromises.push(
updateDevice(execution, device.id)
.then((data) => {
...
})
//Add error response handling
.catch((error) => {
functions.logger.error('EXECUTE', device.id, error);
result.ids.push(device.id);
if (error instanceof SmartHomeError) {
result.status = 'ERROR';
result.errorCode = error.errorCode;
}
})
);
}
}
}
অ্যাসিস্ট্যান্ট এখন আপনার ব্যবহারকারীদের আপনার রিপোর্ট করা যেকোনো ত্রুটি কোড সম্পর্কে বলতে পারবে। পরবর্তী বিভাগে আপনি একটি নির্দিষ্ট উদাহরণ দেখতে পাবেন।
৭. সেকেন্ডারি ব্যবহারকারী যাচাইকরণ যোগ করুন
আপনার ডিভাইসে যদি এমন কোনও মোড থাকে যা সুরক্ষিত করার প্রয়োজন হয় অথবা অনুমোদিত ব্যবহারকারীদের একটি নির্দিষ্ট গোষ্ঠীর মধ্যে সীমাবদ্ধ থাকে, যেমন সফ্টওয়্যার আপডেট বা লক ডিসএঙ্গেজ, তাহলে আপনার ইন্টিগ্রেশনে সেকেন্ডারি ইউজার ভেরিফিকেশন বাস্তবায়ন করা উচিত।
আপনি সকল ধরণের ডিভাইস এবং বৈশিষ্ট্যের উপর সেকেন্ডারি ব্যবহারকারী যাচাইকরণ বাস্তবায়ন করতে পারেন, প্রতিবার নিরাপত্তা চ্যালেঞ্জ দেখা দেয় কিনা বা নির্দিষ্ট মানদণ্ড পূরণ করা প্রয়োজন কিনা তা কাস্টমাইজ করে।
তিনটি সমর্থিত চ্যালেঞ্জ প্রকার রয়েছে:
-
Nochallenge—A request and response that doesn't use an authentication challenge (this is the default behavior) -
ackNeeded— একটি সেকেন্ডারি ব্যবহারকারী যাচাইকরণ যার স্পষ্ট স্বীকৃতি প্রয়োজন (হ্যাঁ বা না) -
pinNeeded— একটি সেকেন্ডারি ব্যবহারকারী যাচাইকরণ যার জন্য একটি ব্যক্তিগত শনাক্তকরণ নম্বর (পিন) প্রয়োজন।
এই কোডল্যাবের জন্য, ওয়াশার চালু করার জন্য কমান্ডে একটি ackNeeded চ্যালেঞ্জ যোগ করুন এবং সেকেন্ডারি ভেরিফিকেশন চ্যালেঞ্জ ব্যর্থ হলে ত্রুটি ফেরত দেওয়ার কার্যকারিতা যোগ করুন।
functions/index.js খুলুন, এবং একটি ত্রুটি শ্রেণীর সংজ্ঞা যোগ করুন যা নিম্নলিখিত কোড স্নিপেটে দেখানো ত্রুটি কোড এবং চ্যালেঞ্জের ধরণ ফেরত দেয়:
ইনডেক্স.জেএস
class SmartHomeError extends Error { ... }
// Add secondary user verification error handling
class ChallengeNeededError extends SmartHomeError {
/**
* Create a new ChallengeNeededError
* @param {string} suvType secondary user verification challenge type
*/
constructor(suvType) {
super('challengeNeeded', suvType);
this.suvType = suvType;
}
}
challengeNeeded ত্রুটিটি ফেরত দেওয়ার জন্য আপনাকে কার্যকর প্রতিক্রিয়াটিও আপডেট করতে হবে:
ইনডেক্স.জেএস
const executePromises = [];
const intent = body.inputs[0];
for (const command of intent.payload.commands) {
for (const device of command.devices) {
for (const execution of command.execution) {
executePromises.push(
updateDevice(execution, device.id)
.then((data) => {
...
})
.catch((error) => {
functions.logger.error('EXECUTE', device.id, error);
result.ids.push(device.id);
if (error instanceof SmartHomeError) {
result.status = 'ERROR';
result.errorCode = error.errorCode;
//Add error response handling
if (error instanceof ChallengeNeededError) {
result.challengeNeeded = {
type: error.suvType
};
}
}
})
);
}
}
}
অবশেষে, ওয়াশার চালু বা বন্ধ করার জন্য স্পষ্ট স্বীকৃতির প্রয়োজনে updateDevice পরিবর্তন করুন।
ইনডেক্স.জেএস
const updateDevice = async (execution,deviceId) => {
const {challenge,params,command} = execution; //Add secondary user challenge
let state, ref;
switch (command) {
case 'action.devices.commands.OnOff':
//Add secondary user verification challenge
if (!challenge || !challenge.ack) {
throw new ChallengeNeededError('ackNeeded');
}
state = {on: params.on};
ref = getFirebaseRef().child(deviceId).child('OnOff');
break;
...
}
return ref.update(state)
.then(() => state);
};
Firebase-এ স্থাপন করুন
আপডেট করা ফাংশনটি স্থাপন করতে নিম্নলিখিত কমান্ডটি চালান:
firebase deploy --only functions
আপডেট করা কোডটি ব্যবহার করার পর, যখন আপনি অ্যাসিস্ট্যান্টকে আপনার ওয়াশার চালু বা বন্ধ করতে বলবেন, তখন আপনাকে মৌখিকভাবে ক্রিয়াটি স্বীকার করতে হবে, যেমন:
তুমি: "হে গুগল, ওয়াশিং মেশিন চালু করো।"
সহকারী: "তুমি কি নিশ্চিত যে তুমি ওয়াশিং মেশিন চালু করতে চাও?"
তুমি: "হ্যাঁ।"
আপনার Firebase লগগুলি খুলে আপনি সেকেন্ডারি ব্যবহারকারী যাচাইকরণ প্রবাহের প্রতিটি ধাপের জন্য একটি বিস্তারিত প্রতিক্রিয়াও দেখতে পারেন।

৮. অভিনন্দন

অভিনন্দন! আপনি Modes এবং Toggles বৈশিষ্ট্যের মাধ্যমে ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশনের বৈশিষ্ট্যগুলি প্রসারিত করেছেন এবং সেকেন্ডারি ব্যবহারকারী যাচাইকরণের মাধ্যমে তাদের কার্যকরকরণ নিশ্চিত করেছেন।
আরও জানুন
আরও গভীরে যাওয়ার জন্য এখানে কিছু ধারণা দেওয়া হল যা আপনি বাস্তবায়ন করতে পারেন:
- আপনার ডিভাইসে স্থানীয় এক্সিকিউশন ক্ষমতা যোগ করুন।
- আপনার ডিভাইসের অবস্থা পরিবর্তন করতে একটি ভিন্ন সেকেন্ডারি ব্যবহারকারী যাচাইকরণ চ্যালেঞ্জ প্রকার ব্যবহার করুন।
- গতিশীলভাবে আপডেট করার জন্য
RunCycleবৈশিষ্ট্য QUERY প্রতিক্রিয়া আপডেট করুন। - এই GitHub নমুনাটি অন্বেষণ করুন।