Google Assistant-এর সাথে স্মার্ট হোম ডিভাইসগুলি কানেক্ট করুন

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

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

79266e5f45e6ae20.gif

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

d009cef0f903d284.jpeg

পূর্বশর্ত

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

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

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

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

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

২. শুরু করা

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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 প্রজেক্টটি নির্বাচন করুন।

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

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

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

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://<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 যোগ করুন

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

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

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

৪. একটি ওয়াশার তৈরি করুন

এখন যেহেতু আপনি আপনার ইন্টিগ্রেশন কনফিগার করেছেন, আপনি ডিভাইস যোগ করতে এবং ডেটা পাঠাতে পারবেন। আপনার ক্লাউড পরিষেবাটিকে নিম্নলিখিত ইন্টেন্টগুলি পরিচালনা করতে হবে:

  • যখন অ্যাসিস্ট্যান্ট জানতে চায় যে ব্যবহারকারী কোন কোন ডিভাইস সংযুক্ত করেছেন, তখন একটি SYNC ইন্টেন্ট তৈরি হয়। ব্যবহারকারী যখন একটি অ্যাকাউন্ট লিঙ্ক করেন, তখন এটি আপনার সার্ভিসে পাঠানো হয়। এর জবাবে আপনার উচিত ব্যবহারকারীর সমস্ত ডিভাইস এবং সেগুলোর সক্ষমতার একটি JSON পেলোড পাঠানো।
  • যখন অ্যাসিস্ট্যান্ট কোনো ডিভাইসের বর্তমান অবস্থা বা স্ট্যাটাস জানতে চায়, তখন একটি QUERY ইন্টেন্ট সক্রিয় হয়। আপনাকে অনুরোধ করা প্রতিটি ডিভাইসের অবস্থা সহ একটি JSON পেলোড দিয়ে সাড়া দিতে হবে।
  • যখন অ্যাসিস্ট্যান্ট কোনো ব্যবহারকারীর পক্ষ থেকে একটি ডিভাইস নিয়ন্ত্রণ করতে চায়, তখন একটি EXECUTE ইন্টেন্ট সক্রিয় হয়। আপনাকে অনুরোধ করা প্রতিটি ডিভাইসের এক্সিকিউশন স্ট্যাটাস সহ একটি JSON পেলোড দিয়ে সাড়া দিতে হবে।
  • যখন ব্যবহারকারী অ্যাসিস্ট্যান্ট থেকে তার অ্যাকাউন্ট আনলিঙ্ক করেন, তখন একটি DISCONNECT ইন্টেন্ট তৈরি হয়। আপনার উচিত এই ব্যবহারকারীর ডিভাইসগুলোর জন্য অ্যাসিস্ট্যান্টে ইভেন্ট পাঠানো বন্ধ করা।

পরবর্তী বিভাগগুলিতে আপনি এই ইনটেন্টগুলি পরিচালনা করার জন্য পূর্বে স্থাপন করা ফাংশনগুলি আপডেট করবেন।

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

functions/index.js খুলুন, যেখানে অ্যাসিস্ট্যান্টের অনুরোধে সাড়া দেওয়ার কোড রয়েছে।

আপনাকে ডিভাইসের মেটাডেটা এবং সক্ষমতা ফেরত দিয়ে একটি SYNC ইন্টেন্ট পরিচালনা করতে হবে। একটি কাপড় ধোয়ার মেশিনের জন্য ডিভাইসের তথ্য এবং প্রস্তাবিত বৈশিষ্ট্যগুলো অন্তর্ভুক্ত করতে onSync অ্যারের JSON আপডেট করুন।

index.js

app.onSync((body) => {
  return {
    requestId: body.requestId,
    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',
        ],
        name: {
          defaultNames: ['My Washer'],
          name: 'Washer',
          nicknames: ['Washer'],
        },
        deviceInfo: {
          manufacturer: 'Acme Co',
          model: 'acme-washer',
          hwVersion: '1.0',
          swVersion: '1.0.1',
        },
        willReportState: true,
        attributes: {
          pausable: true,
        },
      }],
    },
  };
});

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

Firebase CLI ব্যবহার করে আপডেট করা ক্লাউড ফুলফিলমেন্ট স্থাপন করুন:

firebase deploy --only functions

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

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

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

ae252220753726f6.png

৫. কমান্ড এবং কোয়েরি পরিচালনা করা

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

QUERY intent পরিচালনা করুন

একটি QUERY ইন্টেন্টে একাধিক ডিভাইস অন্তর্ভুক্ত থাকে। প্রতিটি ডিভাইসের জন্য, আপনাকে তার বর্তমান অবস্থা জানিয়ে সাড়া দিতে হবে।

functions/index.js ফাইলে, ইন্টেন্ট রিকোয়েস্টে থাকা টার্গেট ডিভাইসগুলোর তালিকা প্রসেস করার জন্য QUERY হ্যান্ডলারটি এডিট করুন।

index.js

app.onQuery(async (body) => {
  const {requestId} = body;
  const payload = {
    devices: {},
  };
  const queryPromises = [];
  const intent = body.inputs[0];
  for (const device of intent.payload.devices) {
    const deviceId = device.id;
    queryPromises.push(queryDevice(deviceId)
        .then((data) => {
        // Add response to device payload
          payload.devices[deviceId] = data;
        }
        ));
  }
  // Wait for all promises to resolve
  await Promise.all(queryPromises);
  return {
    requestId: requestId,
    payload: payload,
  };
});

অনুরোধে অন্তর্ভুক্ত প্রতিটি ডিভাইসের জন্য, রিয়েলটাইম ডেটাবেসে সংরক্ষিত বর্তমান অবস্থা ফেরত দিন। ওয়াশারের অবস্থার ডেটা ফেরত দেওয়ার জন্য 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,
  };
};

const queryDevice = async (deviceId) => {
  const data = await queryFirebase(deviceId);
  return {
    on: data.on,
    isPaused: data.isPaused,
    isRunning: data.isRunning,
    currentRunCycle: [{
      currentCycle: 'rinse',
      nextCycle: 'spin',
      lang: 'en',
    }],
    currentTotalRemainingTime: 1212,
    currentCycleRemainingTime: 301,
  };
};

EXECUTE ইন্টেন্ট পরিচালনা করুন

EXECUTE ইন্টেন্টটি ডিভাইসের অবস্থা আপডেট করার কমান্ডগুলো পরিচালনা করে। এর প্রতিক্রিয়ায় প্রতিটি কমান্ডের স্ট্যাটাস—যেমন, SUCCESS , ERROR , বা PENDING এবং ডিভাইসের নতুন অবস্থা ফেরত দেওয়া হয়।

functions/index.js ফাইলে, যে ট্রেইটগুলো আপডেট করা প্রয়োজন তার তালিকা এবং প্রতিটি কমান্ডের জন্য টার্গেট ডিভাইসগুলোর সেট প্রসেস করতে EXECUTE হ্যান্ডলারটি সম্পাদনা করুন:

index.js

app.onExecute(async (body) => {
  const {requestId} = body;
  // Execution results are grouped by status
  const result = {
    ids: [],
    status: 'SUCCESS',
    states: {
      online: true,
    },
  };

  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) => {
                  result.ids.push(device.id);
                  Object.assign(result.states, data);
                })
                .catch(() => functions.logger.error('EXECUTE', device.id)));
      }
    }
  }

  await Promise.all(executePromises);
  return {
    requestId: requestId,
    payload: {
      commands: [result],
    },
  };
});

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

index.js

const updateDevice = async (execution, deviceId) => {
  const {params, command} = execution;
  let state; let ref;
  switch (command) {
    case 'action.devices.commands.OnOff':
      state = {on: params.on};
      ref = getFirebaseRef().child(deviceId).child('OnOff');
      break;
    case 'action.devices.commands.StartStop':
      state = params.start
      ? {isRunning: true, isPaused: false}
      : {isRunning: false, isPaused: false};
      ref = getFirebaseRef().child(deviceId).child('StartStop');
      break;
    case 'action.devices.commands.PauseUnpause':
      const data = await queryDevice(deviceId);
      state = (data.isPaused === false && data.isRunning === false)
        ? {isRunning: false, isPaused: false}
        : {isRunning: !params.pause, isPaused: params.pause};
      ref = getFirebaseRef().child(deviceId).child('StartStop');
      break;
  }

  return ref.update(state)
      .then(() => state);
};

৬. আপনার ইন্টিগ্রেশন পরীক্ষা করুন

তিনটি ইন্টেন্টই ইমপ্লিমেন্ট করার পর, আপনি পরীক্ষা করে দেখতে পারেন যে আপনার ইন্টিগ্রেশনটি ওয়াশারটিকে নিয়ন্ত্রণ করছে কিনা।

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

Firebase CLI ব্যবহার করে আপডেট করা ক্লাউড ফুলফিলমেন্ট স্থাপন করুন:

firebase deploy --only functions

ওয়াশারটি পরীক্ষা করুন

এখন আপনি আপনার ফোনের মাধ্যমে নিম্নলিখিত যেকোনো ভয়েস কমান্ড ব্যবহার করলে মানটির পরিবর্তন দেখতে পাবেন:

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

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

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

প্রশ্ন করার মাধ্যমেও আপনি আপনার ওয়াশারের বর্তমান অবস্থা দেখতে পারেন।

"হে গুগল, আমার ওয়াশারটা কি চালু আছে?"

গুগল, আমার ওয়াশারটা কি চলছে?

"হে গুগল, আমার ওয়াশারটি কোন সাইকেলে চলছে?"

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

আপনি Google Cloud Console-Logging > Logs Explorer- এ গিয়েও এই কোয়েরি এবং কমান্ডগুলো খুঁজে পেতে পারেন। Cloud Logging-এর মাধ্যমে ইভেন্ট লগ অ্যাক্সেস করুন -এ Google Cloud লগিং সম্পর্কে আরও জানুন।

৭. গুগলকে আপডেট সম্পর্কে জানান।

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

রিকোয়েস্ট সিঙ্ক (Request Sync) -এর মাধ্যমে, ব্যবহারকারীরা যখন ডিভাইস যোগ বা অপসারণ করেন, অথবা যখন তাদের ডিভাইসের সক্ষমতা পরিবর্তিত হয়, তখন আপনি একটি নতুন সিঙ্ক অনুরোধ চালু করতে পারেন। রিপোর্ট স্টেট (Report State)-এর মাধ্যমে, ব্যবহারকারীরা যখন কোনো ডিভাইসের অবস্থা সশরীরে পরিবর্তন করেন—যেমন, লাইটের সুইচ অন করা—অথবা অন্য কোনো পরিষেবা ব্যবহার করে অবস্থা পরিবর্তন করেন, তখন আপনার ক্লাউড পরিষেবা সক্রিয়ভাবে সেই ডিভাইসের অবস্থা হোম গ্রাফ (Home Graph)-এ পাঠাতে পারে।

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

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

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

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

ee198858a6eac112.png

রিপোর্ট অবস্থা সক্ষম করুন

রিয়েলটাইম ডেটাবেসে ডেটা লেখার ফলে টার্টার প্রজেক্টের reportstate ফাংশনটি ট্রিগার হয়। ডেটাবেসে লেখা ডেটা ক্যাপচার করতে এবং রিপোর্ট স্টেট ব্যবহার করে হোম গ্রাফে পোস্ট করতে functions/index.jsreportstate ফাংশনটি আপডেট করুন।

index.js

exports.reportstate = functions.database.ref('{deviceId}').onWrite(
    async (change, context) => {
      functions.logger.info('Firebase write event triggered Report State');
      const snapshot = change.after.val();

      const requestBody = {
        requestId: 'ff36a3cc', /* Any unique ID */
        agentUserId: USER_ID,
        payload: {
          devices: {
            states: {
              /* Report the current state of our washer */
              [context.params.deviceId]: {
                on: snapshot.OnOff.on,
                isPaused: snapshot.StartStop.isPaused,
                isRunning: snapshot.StartStop.isRunning,
              },
            },
          },
        },
      };

      const res = await homegraph.devices.reportStateAndNotification({
        requestBody,
      });
      functions.logger.info('Report state response:', res.status, res.data);
    });

অনুরোধ সিঙ্ক সক্ষম করুন

ফ্রন্টএন্ড ওয়েব UI-তে আইকন রিফ্রেশ করলে স্টার্টার প্রজেক্টের requestsync ফাংশনটি ট্রিগার হয়। HomeGraph API কল করার জন্য functions/index.jsrequestsync ফাংশনটি ইমপ্লিমেন্ট করুন।

index.js

exports.requestsync = functions.https.onRequest(async (request, response) => {
  response.set('Access-Control-Allow-Origin', '*');
  functions.logger.info(`Request SYNC for user ${USER_ID}`);
  try {
    const res = await homegraph.devices.requestSync({
      requestBody: {
        agentUserId: USER_ID,
      },
    });
    functions.logger.info('Request sync response:', res.status, res.data);
    response.json(res.data);
  } catch (err) {
    functions.logger.error(err);
    response.status(500).send(`Error requesting sync: ${err}`);
  }
});

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

Firebase CLI ব্যবহার করে আপডেট করা কোডটি ডিপ্লয় করুন:

firebase deploy --only functions

আপনার বাস্তবায়ন পরীক্ষা করুন

রিফ্রেশ- এ ক্লিক করুন ae8d3b25777a5e30.png ওয়েব UI-তে থাকা বোতামটি চাপুন এবং ফায়ারবেস কনসোল লগে একটি সিঙ্ক রিকোয়েস্ট দেখতে পাচ্ছেন কিনা তা যাচাই করুন।

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

৮. অভিনন্দন

674c4f4392e98c1.png

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

আরও জানুন

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

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