اشکال زدایی خانه هوشمند

۱. قبل از شروع

به عنوان یک توسعه‌دهنده اینترنت اشیا (IoT)، می‌توانید یکپارچه‌سازی‌های ابری-به-ابری ایجاد کنید که به کاربران شما این امکان را می‌دهد تا دستگاه‌های خود را از طریق کنترل‌های لمسی در برنامه Google Home و دستورات صوتی با دستیار گوگل کنترل کنند.

a4657871181b5ad2.gif

یادگیری ابزارهای اشکال‌زدایی برای ادغام‌های ابری به ابری، گامی مهم برای ایجاد ادغام با کیفیت در تولید با دستیار گوگل است. برای تسهیل نظارت و اشکال‌زدایی آسان، معیارهای Google Cloud Platform (GCP) و Logging و Test Suite برای خانه هوشمند در دسترس هستند تا به شما در شناسایی و حل مشکلات ادغام‌هایتان کمک کنند.

پیش‌نیازها

آنچه خواهید ساخت

در این آزمایشگاه کد، شما یک یکپارچه‌سازی ابر به ابر با دو نقص را پیاده‌سازی کرده و آن را به دستیار متصل می‌کنید، سپس با استفاده از Test Suite برای خانه هوشمند و معیارها و گزارش‌گیری پلتفرم ابری گوگل (GCP)، نقص‌های یکپارچه‌سازی را اشکال‌زدایی می‌کنید.

آنچه یاد خواهید گرفت

  • نحوه استفاده از معیارهای GCP و ثبت وقایع برای شناسایی و حل مشکلات تولید
  • نحوه استفاده از Test Suite برای خانه هوشمند جهت شناسایی مشکلات عملکردی و API

آنچه نیاز دارید

۲. برنامه‌ی معیوب را اجرا کنید

دریافت کد منبع

برای دانلود نمونه این codelab روی دستگاه توسعه‌دهنده خود، روی لینک زیر کلیک کنید:

... یا می‌توانید مخزن GitHub را از خط فرمان کلون کنید:

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

درباره پروژه

برنامه‌ی ماشین لباسشویی شامل زیرشاخه‌های زیر است:

  • public : یک رابط کاربری فرانت‌اند برای کنترل و نظارت آسان بر وضعیت ماشین لباسشویی هوشمند.
  • functions : A fully implemented cloud service that manages the smart washer with Cloud Functions for Firebase and Firebase Realtime Database

اتصال به فایربیس

ترمینال را روی دستگاه توسعه خود باز کنید. به پوشه washer-faulty بروید، سپس Firebase CLI را با پروژه ادغام خود که در آزمایشگاه کد Connect smart home devices to the Google Assistant ساخته شده است، تنظیم کنید:

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

استقرار در فایربیس

به پوشه functions بروید و تمام وابستگی‌های لازم را با استفاده از npm.

$ cd functions
$ npm install

توجه: اگر پیام زیر را مشاهده کردید، می‌توانید آن را نادیده بگیرید و ادامه دهید. این هشدار به دلیل برخی وابستگی‌های قدیمی‌تر است و می‌توانید جزئیات بیشتر را اینجا بیابید.

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

اکنون که وابستگی‌ها را نصب و پروژه خود را پیکربندی کرده‌اید، آماده‌اید تا برنامه ماشین لباسشویی معیوب را مستقر کنید.

$ firebase deploy

این خروجی کنسولی است که باید ببینید:

...

✔ Deploy complete!

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

به‌روزرسانی هوم‌گراف

برای مشاهده برنامه وب، آدرس میزبانی وب ( https://<firebase-project-id>.firebaseapp.com ) را در مرورگر خود باز کنید. در رابط کاربری وب، روی دکمه Refresh کلیک کنید. ae8d3b25777a5e30.png دکمه را فشار دهید تا HomeGraph با جدیدترین فراداده‌های دستگاه از برنامه ماشین لباسشویی معیوب با استفاده از درخواست همگام‌سازی به‌روزرسانی شود.

6f2b1344179977cf.png

برنامه Google Home را باز کنید و تأیید کنید که می‌توانید دستگاه ماشین لباسشویی با نام Faulty Washer را ببینید.

e357de6a7faff925.png

۳. یکپارچه‌سازی خود را آزمایش کنید

پس از استقرار پروژه، بررسی کنید که آیا یکپارچه‌سازی شما ماشین لباسشویی را کنترل می‌کند یا خیر.

واشر را آزمایش کنید

هنگام امتحان کردن هر یک از فرمان‌های صوتی زیر از طریق تلفن خود، تغییر مقدار را بررسی کنید:

«هی گوگل، ماشین لباسشویی من را روشن کن.»

«هی گوگل، ماشین لباسشویی من را روشن کن.»

«هی گوگل، ماشین لباسشویی من را متوقف کن.»

«هی گوگل، ماشین لباسشویی من را روشن کن.»

«هی گوگل، ماشین لباسشویی من را خاموش کن.»

متوجه خواهید شد که دستیار صوتی هنگام مکث/ادامه شستشو، از طریق صدا به شما اطلاع می‌دهد که مشکلی پیش آمده است:

«متاسفم، نتوانستم به <نام نمایشی پروژه> دسترسی پیدا کنم.»

برای رفع این مشکل، ابتدا به اطلاعات بیشتری در مورد خطا نیاز دارید تا بتوانید علت اصلی را شناسایی و بررسی کنید.

داشبورد تجزیه و تحلیل اسمارت هوم

یک جای خوب برای بررسی خطاها، داشبورد Smarthome Analytics است که نمودارهایی از معیارهای مصرف و سلامت را برای تحقق ابری شما جمع‌آوری می‌کند:

  • معیارهای استفاده ، روند استفاده از ادغام ابر به ابر شما را نشان می‌دهد، از جمله تعداد کاربران فعال روزانه و تعداد کل درخواست‌ها تا زمان انجام درخواست‌های شما.
  • The Health metrics helps you monitor anomaly occurrence on your Cloud-to-cloud integration, covering request latency, success percentage, and error breakdown.

برای محدود کردن علت خطا، مراحل زیر را برای دسترسی به داشبورد پروژه دنبال کنید.

  1. در کنسول توسعه‌دهندگان ، به صفحه پروژه‌ها بروید.
  2. پروژه خانه هوشمند خود را انتخاب کنید.
  3. روی برگه Analytics در منوی سمت چپ کلیک کنید.

b1735bbe11a7aff8.png

  1. این شما را به لیستی از داشبوردهای پروژه‌تان در گوگل کلود هدایت می‌کند. داشبورد گوگل هوم آنالیتیکس - ادغام با ابر (Google Home Analytics - Cloud Integration) را انتخاب کنید.

5edd3751323176dd.png

  1. برای مشاهده کدهای خطا برای محدوده زمانی مشخص شده، به نمودار خطاهای تکمیل سفارش در فضای ابری - تجزیه وضعیت ، به پایین اسکرول کنید.

c468743c20a11c15.png

کد خطای PARTNER_RESPONSE_MISSING_DEVICE به ریشه مشکل اشاره می‌کند. در مرحله بعد، برای جزئیات بیشتر، گزارش‌های رویداد را بر اساس کد خطا بازیابی کنید.

دسترسی به گزارش‌های رویداد

برای کسب جزئیات بیشتر در مورد خطا، با استفاده از Cloud Logging به گزارش‌های رویداد برای ادغام Cloud-to-cloud خود دسترسی پیدا کنید.

منوی ناوبری را در Google Cloud Platform باز کنید و در قسمت Operations ، گزینه Logging > Logs Explorer را انتخاب کنید تا به گزارش‌های رویداد پروژه خود دسترسی پیدا کنید. همچنین می‌توانید در کادر جستجو، Logs Explorer را جستجو کنید.

در فیلد ورودی «جستجوی همه فیلدها» ، عبارت PARTNER_RESPONSE_MISSING_DEVICE را وارد کنید و روی «اجرای جستجو» کلیک کنید. گزارش‌های منطبق با جستجو در بخش نتایج نمایش داده می‌شوند.

747cca0f1249a5a.png

گزارش خطا، یک رویداد خانه هوشمند را با جزئیات خطا نشان می‌دهد که موارد زیر را مشخص می‌کند:

  • اقدام انجام شده توسط کاربر «از سرگیری ماشین لباسشویی» ( actionType: « STARTSTOP_UNPAUSE ») است که مربوط به فرمان صوتی ناموفق اخیر است.
  • پیام اشکال‌زدایی مرتبط « JSON response does not include device.

بر اساس پیام اشکال‌زدایی، باید بررسی کنید که چرا برنامه ماشین لباسشویی، دستگاه صحیح را در پاسخ EXECUTE قرار نمی‌دهد.

علت اصلی خطا را شناسایی کنید

در functions/index.js ، هندلر EXECUTE (در آرایه onExecute ) را پیدا کنید که وضعیت هر دستور و وضعیت جدید دستگاه را برمی‌گرداند. درج شناسه‌های دستگاه در یک پاسخ EXECUTE به تابع updateDevice بستگی دارد:

ایندکس.js

app.onExecute(async (body) => {
 ...

 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((e) =>
                 functions.logger.error('EXECUTE',
                     device.id, e.message)));
     }
   }
 }

بررسی بیشتر نحوه مدیریت مکث/ادامه توسط تابع updateDevice در ماشین لباسشویی، نشان می‌دهد که رشته‌ی مورد نظر برای دستور مکث/ادامه نادرست است:

ایندکس.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpausePause':
      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);
};

خطا را برطرف کنید

اکنون که علت اصلی خطا را شناسایی کرده‌اید، می‌توانید رشته‌ی مربوط به دستور pause / resume را اصلاح کنید:

ایندکس.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   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

دستورات صوتی زیر را دوباره امتحان کنید، و خواهید دید که دستیار اکنون هنگام مکث/از سرگیری شستشو به درستی پاسخ می‌دهد.

«هی گوگل، ماشین لباسشویی من را متوقف کن.»

=>

«البته، ماشین لباسشویی را متوقف می‌کنم.»

«هی گوگل، ماشین لباسشویی من را روشن کن.»

=>

«فهمیدم، ماشین لباسشویی را دوباره روشن می‌کنم.»

همچنین می‌توانید با پرسیدن سوال، وضعیت فعلی ماشین لباسشویی خود را آزمایش کنید.

«هی گوگل، ماشین لباسشویی من روشنه؟»

«هی گوگل، ماشین لباسشویی من روشنه؟»

«هی گوگل، ماشین لباسشویی من روی چه چرخه‌ای است؟»

۴. یکپارچه‌سازی خود را با Test Suite آزمایش کنید

علاوه بر آزمایش دستی، می‌توانید از مجموعه آزمایش خودکار برای خانه هوشمند برای اعتبارسنجی موارد استفاده بر اساس انواع دستگاه‌ها و ویژگی‌های مرتبط با ادغام خود استفاده کنید. مجموعه آزمایش مجموعه‌ای از آزمایش‌ها را برای شناسایی مشکلات در ادغام شما اجرا می‌کند و پیام‌های آموزنده‌ای را برای موارد آزمایش ناموفق نشان می‌دهد تا اشکال‌زدایی شما را قبل از ورود به گزارش‌های رویداد تسریع کند.

اجرای مجموعه تست برای خانه هوشمند

برای آزمایش ادغام ابر به ابر خود توسط Test Suite، این دستورالعمل‌ها را دنبال کنید:

  1. در مرورگر وب خود، مجموعه تست خانه هوشمند را باز کنید.
  2. با استفاده از دکمه‌ای که در گوشه بالا سمت راست قرار دارد، وارد گوگل شوید. این به مجموعه تست اجازه می‌دهد تا دستورات را مستقیماً به دستیار گوگل ارسال کند.
  3. در فیلد شناسه پروژه ، شناسه پروژه ادغام ابر به ابر خود را وارد کنید. و سپس برای ادامه روی بعدی کلیک کنید.
  4. در مرحله تنظیمات تست ، خواهید دید که Test Suite نوع دستگاه و ویژگی‌های ماشین لباسشویی را فهرست می‌کند.

78ed6a1ebdb581bf.png

  1. گزینه Test Request Sync را غیرفعال کنید زیرا برنامه ماشین لباسشویی نمونه هیچ رابط کاربری برای اضافه کردن/حذف کردن/تغییر نام ماشین لباسشویی ندارد. در یک سیستم عملیاتی، هر زمان که کاربر دستگاه‌ها را اضافه/حذف/تغییر نام می‌دهد، باید Request Sync را فعال کنید.
  2. برای شروع اجرای آزمون، روی NEXT کلیک کنید.

پس از اتمام اجرای Test Suite، نتایج موارد تست را مشاهده کنید. متوجه خواهید شد که دو مورد تست ناموفق با پیام خطای مربوطه ثبت شده‌اند:

5838d10631c98ed2.png

برای رفع اشکال ادغام ابر به ابر خود برای یافتن علت خطا، ابتدا باید با تجزیه و تحلیل پیام خطا، علت اصلی خطا را شناسایی کنید.

تحلیل پیام خطا

برای کمک به توسعه‌دهندگان در شناسایی علت اصلی، Test Suite پیام‌های خطایی را برای هر مورد آزمایشی ناموفق نشان می‌دهد که دلیل شکست را نشان می‌دهد.

برای اولین مورد آزمون ناموفق در بالا،

99e4e5d06965a8a7.png

پیام خطای آن نشان می‌دهد که Test Suite در حالت‌های گزارش‌شده از ادغام Cloud-to-cloud شما، انتظار "isPause": true دارد، اما حالت‌های واقعی فقط شامل "isPause": false .

علاوه بر این، پیام خطای مورد آزمایشی دوم که با شکست مواجه شد، نشان می‌دهد که حالت‌های موجود در پاسخ QUERY از ادغام Cloud-to-cloud شما شامل "isPause": true است که با "isPause": false در حالت‌های گزارش شده از ادغام Cloud-to-cloud شما متفاوت است:

fdb5124102e3a37.png

طبق هر دو پیام خطا، باید بررسی کنید که آیا گزارش‌های ادغام شما مقدار صحیحی برای isPaused دارند یا خیر.

علت اصلی خطا را شناسایی کنید

functions/index.js را باز کنید، که شامل تابع reportstate است که تغییرات وضعیت را با استفاده از Report State به Home Graph ارسال می‌کند. payload مربوط به Report State را بررسی کنید، متوجه خواهید شد که payload فاقد وضعیت isPaused است، که دقیقاً همان چیزی است که Test Suite در موارد تست ناموفق بررسی کرده است.

ایندکس.js

exports.reportstate = functions.database.ref('{deviceId}').onWrite(
    async (change, context) => {
      ...

      const requestBody = {
        requestId: 'ff36a3cc', /* Any unique ID */
        agentUserId: USER_ID,
        payload: {
          devices: {
            states: {
              /* Report the current state of our washer */
             [context.params.deviceId]: {
                online: snapshot.online,
                on: snapshot.OnOff.on,
                isRunning: snapshot.StartStop.isRunning,
                currentRunCycle: [{
                  currentCycle: 'rinse',
                  nextCycle: 'spin',
                  lang: 'en',
                }],
                currentTotalRemainingTime: 1212,
                currentCycleRemainingTime: 301,
              },
            },
          },
        },
      };

      const res = await homegraph.devices.reportStateAndNotification({
        requestBody,
      });
      ...
    });

خطا را برطرف کنید

حالا که علت اصلی خطا را شناسایی کرده‌اید، functions/index.js را با اضافه کردن حالت isPaused به payload گزارش حالت (Report State) اصلاح کنید:

ایندکس.js

exports.reportstate = functions.database.ref('{deviceId}').onWrite(
    async (change, context) => {
      ...

      const requestBody = {
        requestId: 'ff36a3cc', /* Any unique ID */
        agentUserId: USER_ID,
        payload: {
          devices: {
            states: {
              /* Report the current state of our washer */
             [context.params.deviceId]: {
                online: snapshot.online,
                on: snapshot.OnOff.on,
                isPaused: snapshot.StartStop.isPaused,
                isRunning: snapshot.StartStop.isRunning,
                currentRunCycle: [{
                  currentCycle: 'rinse',
                  nextCycle: 'spin',
                  lang: 'en',
                }],
                currentTotalRemainingTime: 1212,
                currentCycleRemainingTime: 301,
              },
            },
          },
        },
      };
      ...
    });

راه حل خود را آزمایش کنید

کد به‌روزرسانی‌شده را با استفاده از Firebase CLI مستقر کنید:

$ firebase deploy --only functions

Re-run the Test Suite for smart home, and you will find that all test cases have passed.

۱۴۸۸۳۷f۸۵d۳۷۷dd۶.png

۵. تبریک

17d485868a6771bc.png

تبریک! شما با موفقیت یاد گرفتید که چگونه مشکلات ادغام ابر به ابر را با استفاده از Test Suite برای خانه هوشمند و GCP Metrics and Logging عیب‌یابی کنید.

بیشتر بدانید

با تکیه بر این Codelab، تمرین‌های زیر را امتحان کنید و منابع اضافی را بررسی کنید:

همچنین می‌توانید درباره آزمایش و ارسال یکپارچه‌سازی برای بررسی، از جمله فرآیند صدور گواهینامه برای انتشار یکپارچه‌سازی خود به کاربران، اطلاعات بیشتری کسب کنید.