স্থানীয় হোম ডিবাগ করা হচ্ছে

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

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

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

72ffb320986092c.png

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

পূর্বশর্ত

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

এই কোডল্যাবে, আপনি ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশনের জন্য একটি লোকাল ফুলফিলমেন্ট তৈরি করবেন এবং এটিকে অ্যাসিস্ট্যান্টের সাথে সংযুক্ত করবেন, তারপর স্মার্ট হোম এবং গুগল ক্লাউড প্ল্যাটফর্ম (GCP) মেট্রিক্স ও লগিং-এর জন্য টেস্ট স্যুটের মাধ্যমে লোকাল হোম অ্যাপটি ডিবাগ করবেন।

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

  • প্রোডাকশনের সমস্যা শনাক্ত ও সমাধান করতে কীভাবে GCP মেট্রিক্স এবং লগিং ব্যবহার করবেন।
  • ফাংশনাল এবং এপিআই সমস্যা শনাক্ত করতে টেস্ট স্যুট কীভাবে ব্যবহার করবেন
  • আপনার লোকাল হোম অ্যাপ তৈরি করার সময় কীভাবে ক্রোম ডেভ টুলস ব্যবহার করবেন।

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

২. ওয়াশার অ্যাপটি চালান।

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

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

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

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

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

স্টার্টার অ্যাপটিতে ‘ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশনের জন্য লোকাল ফুলফিলমেন্ট সক্ষম করুন ’ কোডল্যাবের মতোই সাবডিরেক্টরি এবং ক্লাউড ফাংশন রয়েছে। কিন্তু এখানে app-start এর পরিবর্তে app-faulty আছে। আমরা একটি লোকাল হোম অ্যাপ দিয়ে শুরু করব যা কাজ করে, কিন্তু ততটা ভালোভাবে নয়।

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

আপনি 'Enable local fulfillment for Cloud-to-cloud integrations' কোডল্যাবে যে প্রজেক্টটি তৈরি করেছেন, আমরা সেই একই প্রজেক্টটি ব্যবহার করব, কিন্তু এই কোডল্যাবে ডাউনলোড করা ফাইলগুলো আমরা ডিপ্লয় করব।

app-faulty ডিরেক্টরিতে যান, তারপর "Enable local fulfillment for Cloud-to-cloud integrations" কোডল্যাবে তৈরি করা আপনার ইন্টিগ্রেশন প্রজেক্টটি দিয়ে Firebase CLI সেট আপ করুন:

$ cd app-faulty
$ firebase use <project-id>

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

app-faulty/functions ফোল্ডারে যান এবং npm ব্যবহার করে সমস্ত প্রয়োজনীয় ডিপেন্ডেন্সি ইনস্টল করুন:

$ cd functions
$ npm install

দ্রষ্টব্য: আপনি যদি নীচের বার্তাটি দেখতে পান, তবে আপনি এটি উপেক্ষা করে এগিয়ে যেতে পারেন। এই সতর্কতাটি কিছু পুরোনো নির্ভরতার কারণে দেখা দিয়েছে এবং আপনি এখানে আরও বিস্তারিত জানতে পারবেন।

found 5 high severity vulnerabilities
  run `npm audit fix` to fix them, or `npm audit` for details

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

$ cd ../local
$ npm install
$ npm run build

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

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

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

$ firebase deploy

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

...

✔ Deploy complete!

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

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

হোমগ্রাফ আপডেট করুন

ওয়েব অ্যাপটি দেখার জন্য আপনার ব্রাউজারে হোস্টিং ইউআরএল ( https://<project-id>.web.app ) খুলুন। ওয়েব ইউআই-তে, রিফ্রেশ- এ ক্লিক করুন। ae8d3b25777a5e30.png Request Sync ব্যবহার করে ত্রুটিপূর্ণ ওয়াশার অ্যাপ থেকে সর্বশেষ ডিভাইস মেটাডেটা দিয়ে HomeGraph আপডেট করার বাটন।

fa3c47f293cfe0b7.png

Google Home অ্যাপটি খুলুন এবং যাচাই করুন যে আপনি আপনার ওয়াশার ডিভাইসটি 'Faulty Washer' নামক একটি নতুন নামে দেখতে পাচ্ছেন। মনে রাখবেন, ডিভাইসটিকে এমন একটি রুমে যুক্ত করতে হবে যেখানে আগে থেকেই একটি Nest ডিভাইস রয়েছে।

2a082ee11d47ad1a.png

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

আপনি যদি ‘Enable local fulfillment for Cloud-to-cloud integrations’ কোডল্যাবটি চালিয়ে থাকেন, তাহলে আপনার ভার্চুয়াল স্মার্ট ওয়াশারটি ইতিমধ্যেই চালু হয়ে যাওয়ার কথা। যদি এটি বন্ধ থাকে, তবে ভার্চুয়াল ডিভাইসটি পুনরায় চালু করতে মনে রাখবেন।

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

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

৪. স্থানীয় হোম অ্যাপটি পরীক্ষা করুন

ভয়েস কমান্ডের মাধ্যমে গুগল হোম ডিভাইসে কমান্ড পাঠান, যেমন:

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

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

হে গুগল, স্থানীয়করণে বাধ্য করো।

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

আপনি লক্ষ্য করবেন, 'ফোর্স লোকাল' চাপার পর ওয়াশারটি নিয়ন্ত্রণ করার চেষ্টা করলে গুগল অ্যাসিস্ট্যান্ট উত্তর দেয়, "দুঃখিত, মনে হচ্ছে ত্রুটিপূর্ণ ওয়াশারটি এই মুহূর্তে উপলব্ধ নেই"।

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

সমস্যাটি কী তা খুঁজে বের করতে, আসুন আমাদের কাছে থাকা টুলগুলো ব্যবহার করি: গুগল ক্লাউড প্ল্যাটফর্ম (GCP) মেট্রিক্সলগিং এবং ক্রোম ডেভেলপার টুলস।

৫. লোকাল হোম অ্যাপ ডিবাগ করুন

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

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

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

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

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

567f97789a7d8846.png

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

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

774c460c59f9f84a.png

এই আউটপুটের অর্থ হলো IDENTIFY হ্যান্ডলারটি সফলভাবে ট্রিগার হয়েছে, কিন্তু IdentifyResponse এ ফেরত আসা verificationId আপনার HomeGraph-এর কোনো ডিভাইসের সাথে মিলছে না। এর কারণ খুঁজে বের করতে চলুন কিছু কাস্টম লগ যোগ করা যাক।

কাস্টম লগ যোগ করুন

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

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.
  // Is there something wrong here?
  const localDeviceId = Buffer.from(scanData.data);
  console.log(`IDENTIFY handler: received local device id
      ${localDeviceId}`);

  // Add custom logs
  if (!localDeviceId.toString().match(/^deviceid[0-9]{3}$/gi)) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_device', 'Invalid device id from scan data ' +
        localDeviceId);
    return Promise.reject(err);
  }

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

এছাড়াও, স্থানীয় হোম অ্যাপের সংস্করণটি পরিবর্তন করুন, যাতে আমরা সঠিক সংস্করণটি ব্যবহার করছি কিনা তা শনাক্ত করতে পারি।

local/index.ts

const localHomeSdk = new App('1.0.1');

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

$ cd ../app-faulty/local
$ npm run build
$ firebase deploy --only hosting

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

ecc56508ebcf9ab.png

ক্লাউড লগিং অ্যাক্সেস করুন

চলুন দেখে নেওয়া যাক, আপনার ত্রুটিগুলি খুঁজে বের করতে ক্লাউড লগিং কীভাবে ব্যবহার করবেন। আপনার প্রোজেক্টের জন্য ক্লাউড লগিং অ্যাক্সেস করতে:

  1. ক্লাউড প্ল্যাটফর্ম কনসোলে, প্রজেক্টস পৃষ্ঠায় যান।
  2. আপনার স্মার্ট হোম প্রকল্পটি নির্বাচন করুন।
  3. অপারেশনস-এর অধীনে, লগিং > লগস এক্সপ্লোরার নির্বাচন করুন।

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

উন্নত ফিল্টার ব্যবহার করুন

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

'Show query' টগলটিতে ক্লিক করুন, এটি একটি 'Query builder' বক্সে পরিণত হবে। 'Query builder' বক্সে jsonPayload.intent="IDENTIFY" লিখুন এবং ' Run query' বোতামে ক্লিক করুন।

4c0b9d2828ee2447.png

এর ফলে, IDENTIFY হ্যান্ডলারে থ্রো করা সমস্ত এরর লগ আপনি পেয়ে যাবেন। এরপর, শেষ এররটি এক্সপ্যান্ড করুন। সেখানে আপনি errorCode এবং debugString খুঁজে পাবেন, যা আপনি IDENTIFY হ্যান্ডলারে প্রমিসটি রিজেক্ট করার সময় সেট করেছিলেন।

71f2f156c6887496.png

debugString থেকে আমরা বুঝতে পারছি যে লোকাল ডিভাইস আইডিটি প্রত্যাশিত ফরম্যাটে নেই। লোকাল হোম অ্যাপটি আশা করে যে লোকাল ডিভাইস আইডিটি deviceid দিয়ে শুরু হয়ে ৩টি সংখ্যাযুক্ত একটি স্ট্রিং হিসেবে পাওয়া যাবে, কিন্তু এখানকার লোকাল ডিভাইস আইডিটি একটি হেক্স স্ট্রিং।

ত্রুটিটি সংশোধন করুন

সোর্স কোডে ফিরে গেলে, যেখানে আমরা স্ক্যান ডেটা থেকে লোকাল ডিভাইস আইডি পার্স করি, আমরা লক্ষ্য করি যে স্ট্রিংটিকে বাইটে রূপান্তর করার সময় আমরা এনকোডিং প্রদান করিনি। স্ক্যান ডেটা একটি হেক্স স্ট্রিং হিসাবে প্রাপ্ত হয়, তাই Buffer.from() কল করার সময় ক্যারেক্টার এনকোডিং হিসাবে hex পাস করুন।

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');
  console.log(`IDENTIFY handler: received local device id
      ${localDeviceId}`);

  if (!localDeviceId.toString().match(/^deviceid[0-9]{3}$/gi)) {
    const err = new IntentFlow.HandlerError(request.requestId,
      'invalid_device', 'Invalid device id from scan data ' +
      localDeviceId);
    return Promise.reject(err);
  }

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

এছাড়াও, স্থানীয় হোম অ্যাপের সংস্করণটি পরিবর্তন করুন, যাতে আমরা সঠিক সংস্করণটি ব্যবহার করছি কিনা তা শনাক্ত করতে পারি।

local/index.ts

const localHomeSdk = new App('1.0.2');

ত্রুটিটি ঠিক করার পর, অ্যাপটি কম্পাইল করুন এবং ফায়ারবেসে পুনরায় ডিপ্লয় করুন। app-faulty/local ফোল্ডারে, নিম্নলিখিত কমান্ডটি চালান:

$ npm run build
$ firebase deploy --only hosting

আপনার সমাধান পরীক্ষা করুন

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

c8456f7b5f77f894.png

এখন আপনি আপনার ডিভাইসে আবার কমান্ড পাঠানোর চেষ্টা করতে পারেন।

হে গুগল, স্থানীয়করণে বাধ্য করো।

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

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

...

হে গুগল, ডিফল্ট সেট করো।

৬. স্মার্ট হোমের জন্য টেস্ট স্যুট চালান

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

স্মার্ট হোমের জন্য টেস্ট স্যুট চালান

টেস্ট স্যুটের মাধ্যমে আপনার ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশন পরীক্ষা করতে এই নির্দেশাবলী অনুসরণ করুন:

  1. আপনার ওয়েব ব্রাউজারে স্মার্ট হোমের টেস্ট স্যুটটি খুলুন।
  2. উপরের ডান কোণায় থাকা বাটনটি ব্যবহার করে গুগলে সাইন ইন করুন। এর ফলে টেস্ট স্যুটটি সরাসরি গুগল অ্যাসিস্ট্যান্টের কাছে কমান্ডগুলো পাঠাতে পারবে।
  3. প্রজেক্ট আইডি ফিল্ডে আপনার ক্লাউড-টু-ক্লাউড ইন্টিগ্রেশনের প্রজেক্ট আইডিটি লিখুন। এরপর এগিয়ে যেতে NEXT বাটনে ক্লিক করুন।
  4. টেস্ট সেটিংস ধাপে, আপনি আপনার ত্রুটিপূর্ণ ওয়াশারটি ডিভাইসেস অ্যান্ড ট্রেইস বিভাগে দেখতে পাবেন।
  5. টেস্ট রিকোয়েস্ট সিঙ্ক অপশনটি নিষ্ক্রিয় করুন, কারণ স্যাম্পল ওয়াশার অ্যাপটিতে ওয়াশার যোগ করা / সরানো / নাম পরিবর্তন করার জন্য কোনো ইউজার ইন্টারফেস (UI) নেই। প্রোডাকশন সিস্টেমে, ব্যবহারকারী যখনই ডিভাইস যোগ করবে / সরাবে / নাম পরিবর্তন করবে, আপনাকে অবশ্যই রিকোয়েস্ট সিঙ্ক চালু করতে হবে।
  6. লোকাল হোম এসডিকে অপশনটি চালু রাখুন, কারণ আমরা লোকাল এবং ক্লাউড উভয় পথই পরীক্ষা করব।
  7. পরীক্ষাটি চালানো শুরু করতে পরবর্তী ধাপে যান: পরীক্ষার পরিবেশ

67433d9190fa770e.png

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

d1ebd5cfae2a2a47.png

ত্রুটির বার্তা বিশ্লেষণ করুন

ব্যর্থ হওয়া টেস্ট কেসগুলোর এরর মেসেজগুলো ভালোভাবে দেখুন। এগুলো আপনাকে বলে দেবে যে ওই টেস্টটির জন্য প্রত্যাশিত অবস্থা কী ছিল এবং প্রকৃত অবস্থা কী ছিল। এই ক্ষেত্রে, 'Pause the Washer'-এর জন্য প্রত্যাশিত অবস্থা হলো isPaused: true , কিন্তু প্রকৃত অবস্থায় আমরা পেয়েছি isPaused: false । একইভাবে, 'Pause the Washer'-এর জন্য প্রত্যাশিত অবস্থা হলো isPaused: true , কিন্তু প্রকৃত অবস্থায় আমরা পেয়েছি isPaused: false

6bfd3acef9c16b84.png

এরর মেসেজগুলো থেকে মনে হচ্ছে, লোকাল পাথে আমরা isPaused স্টেটটি উল্টোভাবে সেট করছি।

ত্রুটি শনাক্ত করুন এবং সমাধান করুন

চলুন সেই সোর্স কোডটি খুঁজে বের করি যেখানে লোকাল হোম অ্যাপটি ডিভাইসে এক্সিকিউশন কমান্ড পাঠায়। getDataCommand() হলো সেই ফাংশন যা executeHandler() ফাংশন দ্বারা ডিভাইসে পাঠানো এক্সিকিউশন কমান্ডের payload সেট করার জন্য কল করা হয়।

local/index.ts

getDataForCommand(command: string, params: IWasherParams): unknown {
    switch (command) {
        case 'action.devices.commands.OnOff':
            return {
                on: params.on ? true : false
            };
        case 'action.devices.commands.StartStop':
            return {
                isRunning: params.start ? true : false
            };
        case 'action.devices.commands.PauseUnpause':
            return {
                // Is there something wrong here?
                isPaused: params.pause ? false : true
            };
        default:
            console.error('Unknown command', command);
            return {};
    }
}

আমরা আসলে isPause উল্টোভাবে সেট করছি; params.pause যখন true হবে, তখন এটির মান true হওয়া উচিত এবং অন্যথায় false । সুতরাং, চলুন এটা ঠিক করা যাক।

local/index.ts

getDataForCommand(command: string, params: IWasherParams): unknown {
    switch (command) {
        case 'action.devices.commands.OnOff':
            return {
                on: params.on ? true : false
            };
        case 'action.devices.commands.StartStop':
            return {
                isRunning: params.start ? true : false
            };
        case 'action.devices.commands.PauseUnpause':
            return {
                isPaused: params.pause ? true : false
            };
        default:
            console.error('Unknown command', command);
            return {};
    }
}

স্থানীয় হোম অ্যাপের সংস্করণটি পরিবর্তন করুন, যাতে আমরা সঠিক সংস্করণটি ব্যবহার করছি কিনা তা শনাক্ত করতে পারি।

local/index.ts

const localHomeSdk = new App('1.0.3');

অ্যাপটি আবার কম্পাইল করে ফায়ারবেসে পুনরায় ডিপ্লয় করতে মনে রাখবেন। app-faulty/local এ, চালান:

$ npm run build
$ firebase deploy --only hosting

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

আপনার সমাধান পরীক্ষা করুন

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

b7fc8c5d3c727d8d.png

৭. অভিনন্দন

764dbc83b95782a.png

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

আরও জানুন

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

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