تصحيح الأخطاء في المنزل المزوّد بأجهزة ذكية

1. قبل البدء

بصفتك مطوّرًا لتطبيقات إنترنت الأشياء (IoT)، يمكنك إنشاء عمليات دمج من السحابة الإلكترونية إلى السحابة الإلكترونية تتيح للمستخدمين التحكّم في أجهزتهم من خلال عناصر التحكّم باللمس في تطبيق Google Home والطلبات الصوتية باستخدام "مساعد Google".

a4657871181b5ad2.gif

إنّ التعرّف على أدوات تصحيح الأخطاء لعمليات الدمج من السحابة الإلكترونية إلى السحابة الإلكترونية هي خطوة مهمة لبناء عملية دمج بجودة الإنتاج مع "مساعد Google". لتسهيل عملية المراقبة وتصحيح الأخطاء، تتوفّر مقاييس Google Cloud Platform (GCP) والتسجّل ومجموعة الاختبار للمنزل الذكي لمساعدتك في تحديد مشاكل عمليات الدمج وحلّها.

المتطلبات الأساسية

التطبيق الذي ستصممه

في هذا الدليل التعليمي حول الرموز البرمجية، ستنشر عملية دمج من السحابة الإلكترونية إلى السحابة الإلكترونية تتضمّن عيوبَين وتربطها بخدمة "مساعد Google"، ثم تصحّح أخطاء الدمج من خلال مجموعة الاختبار للمنزل الذكي و"مقاييس Google Cloud Platform" و"التسجيل".

ما ستتعرّف عليه

  • كيفية استخدام مقاييس "سحابة Google‏ (GCP)" وميزة "التسجّل" لتحديد مشاكل مرحلة الإنتاج وحلّها
  • كيفية استخدام Test Suite للأجهزة الذكية لتحديد المشاكل المتعلقة بالوظائف وواجهة برمجة التطبيقات

المتطلبات

2. تشغيل التطبيق الذي يتضمّن عيوبًا

الحصول على رمز المصدر

انقر على الرابط التالي لتنزيل نموذج هذا الدليل التعليمي على جهاز التطوير:

...أو يمكنك استنساخ مستودع GitHub من سطر الأوامر:

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

لمحة عن المشروع

يحتوي تطبيق الغسالة على الأدلة الفرعية التالية:

الربط بمنصّة Firebase

افتح وحدة الطرفية على جهاز المطوّر. انتقِل إلى الدليل washer-faulty، ثمّ أعدّ واجهة Firebase CLI باستخدام مشروع الدمج الذي أنشأته في ربط الأجهزة المنزلية الذكية بخدمة "مساعد Google" في دورة تعليمية حول رموز Google:

$ cd washer-faulty
$ firebase use <firebase-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/<Firebase-project-id>/overview
Hosting URL: https://<Firebase-project-id>.firebaseapp.com

تعديل HomeGraph

افتح عنوان URL للاستضافة في المتصفّح (https://<firebase-project-id>.firebaseapp.com) لعرض تطبيق الويب. في واجهة مستخدم الويب، انقر على الزر تحديث ae8d3b25777a5e30.png لتعديل HomeGraph من خلال طلب المزامنة باستخدام أحدث البيانات الوصفية للجهاز من تطبيق الغسالة الذي يتضمّن عيوبًا:

6f2b1344179977cf.png

افتح تطبيق Google Home وتأكَّد من ظهور جهاز الغسالة المُسمّى غسالة متعطّلة.

e357de6a7faff925.png

3- اختبار عملية الدمج

بعد نشر مشروعك، اختبِر ما إذا كان الدمج يتحكّم في الغسالة.

اختبار الغسالة

تحقَّق من تغيير القيمة عند تجربة أيٍّ من الطلبات الصوتية التالية من خلال هاتفك:

"Ok Google، أريد تشغيل غسّالتي".

"Ok Google، أريد تشغيل غسّالتي".

"Ok Google، أوقِف غسّالتي مؤقتًا".

"Ok Google، أريد استئناف تشغيل غسّالتي".

"Ok Google، أوقِف غسّالتي".

سيستجيب "مساعد Google" عبر الصوت عند إعلامك بحدوث خطأ عند إيقاف الغسالة مؤقتًا أو استئناف تشغيلها:

"عذرًا، تعذّر علينا الوصول إلى <project display name>."

لتصحيح أخطاء هذه المشكلة، تحتاج أولاً إلى مزيد من المعلومات عن الخطأ لتضييق نطاق البحث عن السبب الأساسي وتحديده.

لوحة بيانات "إحصاءات المنزل الذكي"

يمكنك فحص الأخطاء في لوحة بيانات "إحصاءات المنزل الذكي" التي تُجمِّع الرسوم البيانية لمقاييس الاستخدام والأداء لعمليات التنفيذ في السحابة الإلكترونية:

  • تعكس مقاييس الاستخدام مؤشر استخدام عملية الدمج من السحابة الإلكترونية إلى السحابة الإلكترونية، بما في ذلك عدد المستخدمين النشطين يوميًا وإجمالي عدد الطلبات التي تم إرسالها إلى عملية الإنجاز.
  • تساعدك مقاييس الأداء في رصد حدوث القيم الشاذة في عملية الدمج من السحابة الإلكترونية إلى السحابة الإلكترونية، بما في ذلك وقت استجابة الطلب ونسبة النجاح وتقسيم الأخطاء.

لتضييق نطاق سبب الخطأ، اتّبِع الخطوات التالية للوصول إلى لوحة بيانات المشروع.

  1. في Developer Console، انتقِل إلى صفحة "المشاريع".
  2. اختَر مشروع المنزل الذكي.
  3. انقر على علامة التبويب الإحصاءات في القائمة اليمنى.

b1735bbe11a7aff8.png

  1. سينقلك هذا الإجراء إلى قائمة لوحات البيانات لمشروعك على Google Cloud. اختَر لوحة البيانات إحصاءات Google Home - دمج السحابة الإلكترونية.

5edd3751323176dd.png

  1. انتقِل للأسفل إلى الرسم البياني Cloud Fulfillment Errors - Status Breakdown (أخطاء معالجة الطلبات في السحابة الإلكترونية - تقسيم حسب الحالة) لعرض رموز الأخطاء للنطاق الزمني المميّز.

c468743c20a11c15.png

يقدّم رمز الخطأ PARTNER_RESPONSE_MISSING_DEVICE تلميحًا للسبب الأساسي. بعد ذلك، يمكنك استرداد سجلّات الأحداث استنادًا إلى رمز الخطأ للحصول على مزيد من التفاصيل.

الوصول إلى سجلّات الأحداث

للحصول على مزيد من التفاصيل حول الخطأ، يمكنك الوصول إلى سجلّات الأحداث لعملية الدمج من السحابة الإلكترونية إلى السحابة الإلكترونية من خلال تسجيلات Cloud.

افتح قائمة التنقّل في Google Cloud Platform، وضمن العمليات، اختَر التسجّل > مستكشف السجلات للوصول إلى سجلّات الأحداث لمشروعك. بدلاً من ذلك، يمكنك البحث عن مستكشف السجلات في مربّع البحث.

في حقل الإدخال البحث في جميع الحقول، أدخِل طلب البحث PARTNER_RESPONSE_MISSING_DEVICE وانقر على تنفيذ طلب البحث. يتم عرض السجلات التي تتطابق مع طلب البحث في قسم النتائج.

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 مع إيقاف الغسيل مؤقتًا أو استئنافه، وستلاحظ أنّ السلسلة المراد مطابقتها مع أمر الإيقاف المؤقت أو الاستئناف غير صحيحة:

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

إصلاح الخطأ

بعد تحديد السبب الجذري للخطأ، يمكنك تصحيح سلسلة الأمر "إيقاف مؤقت / استئناف":

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:

firebase deploy --only functions

يُرجى إعادة تنفيذ الأوامر الصوتية التالية، وستلاحظ أنّ "مساعد Google" يستجيب بشكل صحيح الآن عند إيقاف الغسالة مؤقتًا أو استئناف تشغيلها.

"Ok Google، أوقِف غسّالتي مؤقتًا".

=>

"بالتأكيد، سأوقف الغسالة مؤقتًا".

"Ok Google، أريد استئناف تشغيل غسّالتي".

=>

"حسنًا، سنستأنف تشغيل الغسالة."

يمكنك أيضًا اختبار الحالة الحالية لغسالتك من خلال طرح أسئلة.

"Ok Google، هل الغسّالة مفعّلة؟"

"Ok Google، هل تعمل غسّالتي؟"

"Ok Google، ما هي دورة الغسيل التي تستخدمها غسّالتي؟"

4. اختبار عملية الدمج باستخدام "مجموعة الاختبار"

بالإضافة إلى الاختبار يدويًا، يمكنك استخدام مجموعة الاختبار للمنزل الذكي المبرمَجة للتحقّق من حالات الاستخدام استنادًا إلى أنواع الأجهزة والسمات المرتبطة بعملية الدمج. تُجري "مجموعة الاختبار" سلسلة من الاختبارات لرصد المشاكل في عملية الدمج، وتعرض رسائل معلوماتية لحالات الاختبار التي تعذّر إكمالها لتسريع عملية تصحيح الأخطاء قبل الاطّلاع على سجلّات الأحداث.

تشغيل مجموعة اختبارات للمنزل الذكي

اتّبِع التعليمات التالية لاختبار عملية الدمج من السحابة الإلكترونية إلى السحابة الإلكترونية باستخدام Test Suite:

  1. في متصفّح الويب، افتح مجموعة اختبارات الأجهزة المنزلية الذكية.
  2. سجِّل الدخول إلى Google باستخدام الزر في أعلى يسار الصفحة. يتيح ذلك لمجموعة الاختبار إرسال الطلبات مباشرةً إلى "مساعد Google".
  3. في حقل رقم تعريف المشروع، أدخِل رقم تعريف عملية الدمج من السحابة الإلكترونية إلى السحابة الإلكترونية. بعد ذلك، انقر على التالي للمتابعة.
  4. في خطوة إعدادات الاختبار، ستظهر لك مجموعة الاختبار التي تسرد نوع الجهاز وسمات الغسالة.

78ed6a1ebdb581bf.png

  1. أوقِف خيار مزامنة طلبات الاختبار لأنّ تطبيق غسّالة الملابس التجريبي لا يتضمّن واجهة مستخدم لإضافة غسّالة الملابس أو إزالتها أو تغيير اسمها. في نظام التشغيل، عليك بدء طلب المزامنة كلما أضاف المستخدم أجهزة أو أزالها أو أعاد تسميتها.
  2. انقر على التالي لبدء إجراء الاختبار.

بعد اكتمال تشغيل مجموعة الاختبار، اطّلِع على نتائج حالات الاختبار. ستلاحظ حالتَي اختبار تعذّر إكمالهما مع ظهور رسالة الخطأ ذات الصلة:

5838d10631c98ed2.png

لتصحيح أخطاء عملية الدمج من السحابة إلى السحابة في حال حدوث تعذّر، عليك تحديد السبب الأساسي للخطأ من خلال تحليل رسالة الخطأ أولاً.

تحليل رسالة الخطأ

لمساعدة المطوّرين في تحديد السبب الأساسي، تعرِض "مجموعة الاختبار" رسائل خطأ لكل حالة اختبار تعذّر إكمالها تشير إلى سبب التعذّر.

بالنسبة إلى أول حالة اختبار تعذّر إكمالها أعلاه،

99e4e5d06965a8a7.png

تشير رسالة الخطأ إلى أنّ "مجموعة الاختبار" تتوقّع "isPause": true في الحالات التي تم الإبلاغ عنها من عملية الدمج من السحابة الإلكترونية إلى السحابة الإلكترونية، ولكنّ الحالات الفعلية تتضمّن "isPause": false فقط.

بالإضافة إلى ذلك، تشير رسالة الخطأ لحالة الاختبار الثانية التي تعذّر إكمالها إلى أنّ الحالات الواردة في استجابة QUERY من عملية الدمج من السحابة إلى السحابة تشمل "isPause": true، والتي تختلف عن "isPause": false في الحالات التي تم الإبلاغ عنها من عملية الدمج من السحابة إلى السحابة:

fdb5124102e3a37.png

وفقًا لكلتا رسالتَي الخطأ، عليك التحقّق ممّا إذا كانت تقارير الدمج تشير إلى isPaused بالقيمة الصحيحة.

تحديد السبب الأساسي للخطأ

افتح functions/index.js التي تحتوي على الدالة reportstate التي تنشر تغييرات الحالة في الرسم البياني للمنزل من خلال حالة التقرير. تحقّق من حمولة Report State، وستلاحظ أنّ الحمولة لا تتضمّن الحالة 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,
      });
      ...
    });

إصلاح الخطأ

بعد تحديد السبب الأساسي للخطأ، عليك مراجعة functions/index.js عن طريق إضافة الحالة isPaused إلى الحمولة Report State:

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:

$ firebase deploy --only functions

أعِد تشغيل مجموعة الاختبار للمنزل الذكي، وستلاحظ أنّه تم اجتياز جميع حالات الاختبار.

148837f85d377dd6.png

5- تهانينا

17d485868a6771bc.png

تهانينا! لقد تعلّمت بنجاح كيفية تحديد مشاكل الدمج من السحابة الإلكترونية إلى السحابة الإلكترونية وحلّها من خلال "مجموعة الاختبار" للمنزل الذكي ومقاييس Google Cloud Platform وتسجيلها.

مزيد من المعلومات

استنادًا إلى هذا الدرس التطبيقي حول الترميز، جرِّب التمارين التالية واستكشِف مراجع إضافية:

يمكنك أيضًا الاطّلاع على مزيد من المعلومات حول اختبار عملية الدمج وإرسالها للمراجعة، بما في ذلك عملية الاعتماد لنشر عملية الدمج للمستخدمين.