আপনার ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশন উন্নত এবং সুরক্ষিত করুন

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

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

dc8dce0dea87cd5c.png

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

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

পূর্বশর্ত

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

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

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

  • আপনার ইন্টিগ্রেশনে মোড এবং টগল বৈশিষ্ট্যগুলি কীভাবে যুক্ত করবেন
  • ত্রুটি এবং ব্যতিক্রমগুলি কীভাবে রিপোর্ট করবেন
  • সেকেন্ডারি ইউজার ভেরিফিকেশন কীভাবে প্রয়োগ করবেন

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

২. শুরু করা

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

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

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

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

  • ওয়েব ও অ্যাপ কার্যকলাপ - এছাড়াও, ‘ 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

আপনার গুগল হোম ডেভেলপার কনসোল প্রকল্পে ফায়ারবেস যুক্ত করুন

পদ্ধতি ১: ফায়ারবেস কনসোলের মাধ্যমে

  1. ফায়ারবেসে যান।
  2. একটি Firebase প্রজেক্ট তৈরি করুন -এ ক্লিক করুন।
    ফায়ারবেস প্রজেক্ট তৈরি করুন
  3. প্রজেক্ট তৈরি করার স্ক্রিনে, ‘Add Firebase to Google Cloud project’-এ ক্লিক করুন।
    গুগল ক্লাউড প্রকল্পে ফায়ারবেস যুক্ত করুন
  4. 'Get started ' স্ক্রিনে, আপনি Google Home Developer console-এ এইমাত্র তৈরি করা Google Cloud প্রজেক্টটি নির্বাচন করুন এবং তারপর 'Continue'-তে ক্লিক করুন।
    গুগল ক্লাউড প্রকল্প নির্বাচন করুন

পদ্ধতি ২: ফায়ারবেস সিএলআই এর মাধ্যমে

firebase projects:addfirebase

Firebase যোগ করতে আপনার এইমাত্র তৈরি করা Google Home Developer Console প্রজেক্টটি নির্বাচন করুন।

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

ক্লাউড প্রকল্প যোগ করা হয়েছে

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

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

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

ee198858a6eac112.png

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

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

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

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

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

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

ডাউনলোড করা জিপ ফাইলটি আনপ্যাক করুন।

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

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

  • public: স্মার্ট ওয়াশারের অবস্থা সহজে নিয়ন্ত্রণ ও পর্যবেক্ষণ করার জন্য একটি ফ্রন্টএন্ড ইউআই।
  • functions: একটি সম্পূর্ণ বাস্তবায়িত ক্লাউড পরিষেবা যা ক্লাউড ফাংশনস ফর ফায়ারবেস এবং ফায়ারবেস রিয়েলটাইম ডেটাবেসের মাধ্যমে স্মার্ট ওয়াশারটি পরিচালনা করে।

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

  • fakeauth : অ্যাকাউন্ট লিঙ্ক করার জন্য অনুমোদন এন্ডপয়েন্ট
  • faketoken : অ্যাকাউন্ট লিঙ্ক করার জন্য টোকেন এন্ডপয়েন্ট
  • smarthome : স্মার্ট হোম ইন্টেন্ট ফুলফিলমেন্ট এন্ডপয়েন্ট
  • reportstate : ডিভাইসের অবস্থার পরিবর্তনে হোম গ্রাফ এপিআই চালু করে।
  • requestsync : অ্যাকাউন্ট পুনরায় লিঙ্ক করার প্রয়োজন ছাড়াই ব্যবহারকারীর ডিভাইস আপডেট করতে সক্ষম করে।

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

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

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

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

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

? 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
    

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

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

firebase deploy

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

...

✔ Deploy complete!

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

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

ওয়েব অ্যাপটি দেখার জন্য আপনার ব্রাউজারে হোস্টিং ইউআরএলটি ( https://<firebase-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.png

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

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

৪. মোড যোগ করুন

` action.devices.traits.Modes ট্রেইটটি একটি ডিভাইসকে কোনো একটি মোডের জন্য যথেচ্ছ সংখ্যক সেটিংস রাখার সুযোগ দেয়, যার মধ্যে একবারে কেবল একটিই সেট করা যায়। কাপড়ের পরিমাণ—ছোট, মাঝারি বা বড়—নির্ধারণ করার জন্য আপনি ওয়াশারে একটি মোড যোগ করবেন।

SYNC প্রতিক্রিয়া আপডেট করুন

আপনাকে functions/index.js ফাইলে আপনার SYNC রেসপন্সে নতুন ট্রেইটটি সম্পর্কে তথ্য যোগ করতে হবে। এই ডেটা traits অ্যারে এবং attributes অবজেক্টে প্রদর্শিত হয়, যেমনটি নিম্নলিখিত কোড স্নিপেটে দেখানো হয়েছে।

index.js

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,
          }],
        },
      }],
    },
  };
});

নতুন EXECUTE ইন্টেন্ট কমান্ড যোগ করুন

আপনার EXECUTE ইন্টেন্টে, নিম্নলিখিত কোড স্নিপেটে দেখানো অনুযায়ী action.devices.commands.SetModes কমান্ডটি যোগ করুন।

index.js

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 প্রতিক্রিয়াটি আপডেট করুন।

রিয়েলটাইম ডেটাবেসে সংরক্ষিত অবস্থাটি পাওয়ার জন্য queryFirebase এবং queryDevice ফাংশনগুলিতে হালনাগাদ করা পরিবর্তনগুলি যোগ করুন।

index.js

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 ফাংশনটি আপডেট করুন।

index.js

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-তে যান এবং রিফ্রেশ- এ ক্লিক করুন। ae8d3b25777a5e30.png টুলবারের বাটনটি। এটি একটি রিকোয়েস্ট সিঙ্ক চালু করে, যার ফলে অ্যাসিস্ট্যান্ট আপডেট হওয়া SYNC রেসপন্স ডেটা পেয়ে যায়।

bf4f6a866160a982.png

এখন আপনি ওয়াশারের মোড সেট করার জন্য কমান্ড দিতে পারেন, যেমন:

"হে গুগল, ওয়াশারের লোড বড় করে দাও।"

এছাড়াও, আপনি আপনার ওয়াশার সম্পর্কে প্রশ্ন করতে পারেন, যেমন:

হে গুগল, ওয়াশারের লোড কত?

৫. টগল যোগ করুন

action.devices.traits.Toggles ট্রেইটটি কোনো ডিভাইসের নামযুক্ত দিকগুলোকে উপস্থাপন করে, যেগুলোর একটি সত্য বা মিথ্যা অবস্থা থাকে, যেমন ওয়াশারটি টার্বো মোডে আছে কি না।

SYNC প্রতিক্রিয়া আপডেট করুন

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

index.js

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 কমান্ডটি যোগ করুন।

index.js

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 রেসপন্স আপডেট করতে হবে। রিয়েলটাইম ডেটাবেসে সংরক্ষিত টগল স্টেটটি পাওয়ার জন্য queryFirebase এবং queryDevice ফাংশনগুলোতে আপডেট করা পরিবর্তনগুলো যোগ করুন।

index.js

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 ফাংশনটি আপডেট করুন।

index.js

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

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

এখন আপনি নিম্নলিখিত কমান্ডটি বলে ওয়াশারটিকে টার্বো মোডে সেট করতে পারেন:

"হে গুগল, ওয়াশারটিকে টার্বো মোডে সেট করো।"

আপনার ওয়াশারটি ইতিমধ্যেই টার্বো মোডে আছে কিনা, তা জিজ্ঞাসা করেও জেনে নিতে পারেন:

গুগল, আমার ওয়াশারটি কি টার্বো মোডে আছে?

৬. ত্রুটি এবং ব্যতিক্রমের প্রতিবেদন

আপনার ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশনে এরর হ্যান্ডলিং ব্যবস্থা ব্যবহারকারীদেরকে রিপোর্ট করার সুযোগ দেয়, যখন কোনো সমস্যার কারণে 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 খুলুন এবং নিচের কোড স্নিপেটে দেখানো অনুযায়ী error ক্লাস ডেফিনিশনটি যোগ করুন:

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;
          }
        })
      );
    }
  }
}

অ্যাসিস্ট্যান্ট এখন আপনার রিপোর্ট করা যেকোনো এরর কোড সম্পর্কে আপনার ব্যবহারকারীদের জানাতে পারবে। পরবর্তী অংশে আপনি এর একটি নির্দিষ্ট উদাহরণ দেখতে পাবেন।

৭. দ্বিতীয় ব্যবহারকারী যাচাইকরণ যোগ করুন

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

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

তিনটি সমর্থিত চ্যালেঞ্জের ধরণ রয়েছে:

  • কোনো challenge No — এমন একটি অনুরোধ এবং প্রতিক্রিয়া যেখানে কোনো প্রমাণীকরণ চ্যালেঞ্জ ব্যবহার করা হয় না (এটিই ডিফল্ট আচরণ)।
  • ackNeeded —একটি দ্বিতীয় পর্যায়ের ব্যবহারকারী যাচাইকরণ যার জন্য সুস্পষ্ট স্বীকৃতি (হ্যাঁ বা না) প্রয়োজন।
  • pinNeeded — এটি একটি দ্বিতীয় ব্যবহারকারী যাচাইকরণ প্রক্রিয়া যার জন্য ব্যক্তিগত শনাক্তকরণ নম্বর (পিন) প্রয়োজন।

এই কোডল্যাবের জন্য, ওয়াশার চালু করার কমান্ডে একটি ackNeeded চ্যালেঞ্জ যোগ করুন এবং দ্বিতীয় যাচাইকরণ চ্যালেঞ্জটি ব্যর্থ হলে একটি ত্রুটি ফেরত দেওয়ার কার্যকারিতা যুক্ত করুন।

functions/index.js খুলুন এবং নিচের কোড স্নিপেটে দেখানো অনুযায়ী একটি error ক্লাস ডেফিনিশন যোগ করুন, যা এরর কোড এবং চ্যালেঞ্জ টাইপ রিটার্ন করবে:

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 এররটি রিটার্ন করে:

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) => {
          ...
        })
        .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 পরিবর্তন করুন।

index.js

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 deploy --only functions

আপডেট করা কোডটি স্থাপন করার পর, যখন আপনি অ্যাসিস্ট্যান্টকে আপনার ওয়াশার চালু বা বন্ধ করতে বলবেন, তখন আপনাকে অবশ্যই মৌখিকভাবে কাজটি স্বীকার করতে হবে, এইভাবে:

আপনি: "হে গুগল, ওয়াশারটা চালু করো।"

সহকারী: "আপনি কি ওয়াশারটি চালু করতে নিশ্চিত?"

তুমি: "হ্যাঁ।"

আপনার Firebase লগ খুলে আপনি সেকেন্ডারি ইউজার ভেরিফিকেশন ফ্লো-এর প্রতিটি ধাপের বিস্তারিত প্রতিক্রিয়াও দেখতে পারেন।

289dbe48f4bb8106.png

৮. অভিনন্দন

674c4f4392e98c1.png

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

আরও জানুন

আরও গভীরে যাওয়ার জন্য আপনি কিছু উপায় অবলম্বন করতে পারেন:

  • আপনার ডিভাইসগুলিতে স্থানীয়ভাবে কার্য সম্পাদনের ক্ষমতা যোগ করুন।
  • আপনার ডিভাইসের অবস্থা পরিবর্তন করতে একটি ভিন্ন ধরনের দ্বিতীয় ব্যবহারকারী যাচাইকরণ চ্যালেঞ্জ ব্যবহার করুন।
  • গতিশীলভাবে আপডেট করার জন্য RunCycle ট্রেইটের QUERY প্রতিক্রিয়াটি আপডেট করুন।
  • এই গিটহাব নমুনাটি অন্বেষণ করুন।