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

1. قبل از شروع

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

a4657871181b5ad2.gif

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

پیش نیازها

چیزی که خواهی ساخت

در این کد، یک اقدام خانه هوشمند با 2 نقص اجرا می‌کنید و آن را به Assistant متصل می‌کنید، سپس نقص‌های Action را از طریق Test Suite برای معیارها و گزارش‌گیری خانه هوشمند و Google Cloud Platform (GCP) رفع اشکال می‌کنید.

چیزی که یاد خواهید گرفت

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

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

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

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

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

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

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

در مورد پروژه

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

به Firebase متصل شوید

ترمینال را در دستگاه توسعه خود باز کنید. به دایرکتوری washer-faulty بروید، سپس Firebase CLI را با پروژه Actions خود که در اتصال دستگاه‌های خانه هوشمند به لبه کد Google Assistant ساخته شده است، راه‌اندازی کنید:

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

در Firebase مستقر شوید

به پوشه 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/<project-id>/overview
Hosting URL: https://<project-id>.firebaseapp.com

HomeGraph را به روز کنید

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

6f2b1344179977cf.png

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

e357de6a7faff925.png

3. اکشن خود را آزمایش کنید

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

واشر را تست کنید

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

"Hey Google، ماشین لباسشویی من را روشن کن."

"Hey Google، ماشین لباسشویی من را روشن کن."

"Hey Google، واشر من را متوقف کن."

"Hey Google، ماشین لباسشویی من را از سر بگیر."

"Hey Google، ماشین لباسشویی من را متوقف کن."

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

"با عرض پوزش، من نتوانستم به <project display name> برسم."

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

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

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

  • معیارهای استفاده، روند استفاده از اقدام خانه هوشمند شما را منعکس می‌کند، از جمله تعداد کاربران فعال روزانه و تعداد کل درخواست‌ها تا انجام شما.
  • معیارهای Health به شما کمک می کند تا وقوع ناهنجاری را در Action خانه هوشمند خود نظارت کنید و تأخیر درخواست، درصد موفقیت و تفکیک خطا را پوشش می دهد.

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

  1. در کنسول Actions ، به صفحه Projects بروید.
  2. پروژه خانه هوشمند خود را انتخاب کنید.
  3. برگه Analytics را انتخاب کنید و روی Go to Google Cloud Platform کلیک کنید.

b1735bbe11a7aff8.png

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

5edd3751323176dd.png

  1. برای مشاهده کدهای خطا برای محدوده زمانی برجسته شده، به نمودار Cloud Fulfillment Errors - Status Breakdown بروید.

c468743c20a11c15.png

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

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

برای به دست آوردن جزئیات بیشتر در مورد خطا، از طریق Cloud Logging به گزارش رویدادها برای اقدامات خانه هوشمند خود دسترسی پیدا کنید.

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

در بخش Query ، عبارت PARTNER_RESPONSE_MISSING_DEVICE را وارد کنید و روی Run Query کلیک کنید. گزارش های مطابق با پرس و جو در بخش نتایج پرس و جو نمایش داده می شوند.

747cca0f1249a5a.png

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

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

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

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

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

index.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 چگونه pause / resume را در واشر کنترل می کند، و متوجه خواهید شد که رشته مطابق با دستور pause / resume نادرست است:

index.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpausePause':
     state = {isPaused: params.pause};
     if (params.pause) state.isRunning = false;
     ref = firebaseRef.child(deviceId).child('StartStop');
     break;
 }

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

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

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

index.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpause':
     state = {isPaused: params.pause};
     if (params.pause) state.isRunning = false;
     ref = firebaseRef.child(deviceId).child('StartStop');
     break;
 }

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

راه حل خود را تست کنید

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

firebase deploy --only functions

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

"Hey Google، واشر من را متوقف کن."

=>

"البته، واشر را مکث کرده است."

"Hey Google، ماشین لباسشویی من را از سر بگیر."

=>

فهمیدم، از سرگیری ماشین لباسشویی.

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

"Hey Google، ماشین لباسشویی من روشن است؟"

"Hey Google، آیا ماشین لباسشویی من کار می کند؟"

"Hey Google، ماشین لباسشویی من در چه چرخه ای است؟"

4. Action خود را با Test Suite تست کنید

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

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

برای آزمایش Action by Test Suite خانه هوشمند خود این دستورالعمل ها را دنبال کنید:

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

78ed6a1ebdb581bf.png

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

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

5838d10631c98ed2.png

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

تجزیه و تحلیل پیام خطا

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

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

99e4e5d06965a8a7.png

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

علاوه بر این، پیام خطای دومین مورد آزمایشی ناموفق نشان می‌دهد که وضعیت‌های موجود در پاسخ QUERY از اقدام خانه هوشمند شما شامل "isPause": true است که با "isPause": false در وضعیت‌های گزارش شده از اقدام خانه هوشمند شما متفاوت است:

fdb5124102e3a37.png

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

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

functions/index.js باز کنید، که حاوی تابع reportstate است که تغییرات وضعیت را از طریق گزارش وضعیت به نمودار اصلی ارسال می‌کند. بارگزاری وضعیت گزارش را بررسی کنید، متوجه خواهید شد که محموله دارای حالت isPaused است، که دقیقاً همان چیزی است که مجموعه تست در موارد آزمایش ناموفق بررسی کرده است.

index.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: true,
                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,
      });
      ...
    });

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

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

index.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: true,
                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

مجموعه تست برای خانه هوشمند را مجدداً اجرا کنید و متوجه خواهید شد که تمام موارد آزمایشی با موفقیت پشت سر گذاشته شده است.

148837f85d377dd6.png

5. تبریک می گویم

17d485868a6771bc.png

تبریک می گویم! شما با موفقیت یاد گرفتید که چگونه مشکلات مربوط به اقدام خانه هوشمند را از طریق Test Suite for smart home & GCP Metrics and Logging عیب یابی کنید.

بیشتر بدانید

با ایجاد این Codelab، تمرینات زیر را امتحان کنید و منابع اضافی را کشف کنید:

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