การแก้ไขข้อบกพร่องของสมาร์ทโฮม

1. ก่อนเริ่มต้น

ในฐานะนักพัฒนาอินเทอร์เน็ตของสรรพสิ่ง (IoT) คุณสามารถสร้างการดำเนินการในสมาร์ทโฮมที่ช่วยให้ผู้ใช้ควบคุมอุปกรณ์ผ่านการควบคุมด้วยการสัมผัสในแอป Google Home และคำสั่งเสียงด้วย Google Assistant ได้

a4657871181b5ad2.gif

การเรียนรู้เครื่องมือแก้ไขข้อบกพร่องสำหรับการดำเนินการในสมาร์ทโฮมเป็นขั้นตอนสำคัญในการสร้างการผสานรวมคุณภาพการผลิตกับ Google Assistant เราได้เตรียมเมตริก Google Cloud Platform (GCP) รวมถึงการบันทึกและชุดทดสอบสำหรับสมาร์ทโฮมไว้เพื่อช่วยระบุและแก้ไขปัญหาสำหรับการดำเนินการของคุณ เพื่อช่วยให้การตรวจสอบและแก้ไขข้อบกพร่องเป็นเรื่องง่าย

ข้อกำหนดเบื้องต้น

สิ่งที่คุณจะสร้าง

ใน Codelab นี้ คุณจะติดตั้งใช้งาน Smart Home Action ที่มีข้อบกพร่อง 2 จุดและเชื่อมต่อกับ Assistant จากนั้นแก้ไขข้อบกพร่องของการดำเนินการผ่าน Test Suite สำหรับสมาร์ทโฮมและ เมตริกและการบันทึกของ Google Cloud Platform (GCP)

สิ่งที่คุณจะได้เรียนรู้

  • วิธีใช้เมตริก GCP และการบันทึกเพื่อระบุและแก้ไขปัญหาของเวอร์ชันที่ใช้งานจริง
  • วิธีใช้ Test Suite สำหรับสมาร์ทโฮมเพื่อระบุปัญหาเกี่ยวกับฟังก์ชันและ API

สิ่งที่คุณต้องมี

2. เรียกใช้แอปที่มีข้อบกพร่อง

รับซอร์สโค้ด

คลิกลิงก์ต่อไปนี้เพื่อดาวน์โหลดตัวอย่างสำหรับ Codelab นี้ในเครื่องพัฒนา

...หรือโคลนที่เก็บ GitHub จากบรรทัดคำสั่งก็ได้

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

เกี่ยวกับโครงการ

แอปเครื่องซักผ้ามีไดเรกทอรีย่อยต่อไปนี้

  • public: UI ฟรอนท์เอนด์สำหรับควบคุมและตรวจสอบสถานะของเครื่องซักผ้าอัจฉริยะได้อย่างง่ายดาย
  • functions: บริการระบบคลาวด์ที่ใช้งานอย่างเต็มรูปแบบที่จัดการเครื่องซักผ้าอัจฉริยะด้วย Cloud Functions for Firebase และฐานข้อมูลเรียลไทม์ของ Firebase

เชื่อมต่อกับ Firebase

เปิดเทอร์มินัลในเครื่องการพัฒนา ไปที่ไดเรกทอรี washer-faulty แล้วตั้งค่า Firebase CLI ด้วยโปรเจ็กต์การดำเนินการที่สร้างในการเชื่อมต่ออุปกรณ์ในบ้านอัจฉริยะกับ Codelab ของ Google Assistant

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

ทำให้ใช้งานได้ใน Firebase

ไปที่โฟลเดอร์ functions และติดตั้งการอ้างอิงที่จำเป็นทั้งหมดโดยใช้ npm.

$ cd functions
$ npm install

หมายเหตุ: หากคุณเห็นข้อความด้านล่าง คุณสามารถละเว้นและดำเนินการต่อ คำเตือนนี้เกิดจากทรัพยากร Dependency ที่เก่ากว่าบางรายการซึ่งดูรายละเอียดเพิ่มเติมได้ที่นี่

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

เมื่อคุณติดตั้งทรัพยากร Dependency และกำหนดค่าโปรเจ็กต์แล้ว คุณก็พร้อมที่จะทำให้แอปเครื่องซักผ้าที่มีข้อบกพร่องใช้งานได้

$ 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) เพื่อดูเว็บแอป ใน UI ของเว็บ ให้คลิกปุ่มรีเฟรช ae8d3b25777a5e30.png เพื่ออัปเดต HomeGraph ผ่าน Request Sync ด้วยข้อมูลเมตาอุปกรณ์ล่าสุดจากแอปเครื่องซักผ้าที่มีข้อบกพร่อง ดังนี้

6f2b1344179977cf.png

เปิดแอป Google Home แล้วตรวจสอบว่าคุณเห็นอุปกรณ์เครื่องซักผ้าชื่อ Faulty Washer

e357de6a7faff925.png

3. ทดสอบการดำเนินการ

หลังจากที่ทำให้โปรเจ็กต์ใช้งานได้แล้ว ให้ทดสอบว่าการดำเนินการของคุณควบคุมเครื่องซักผ้า

ทดสอบเครื่องซักผ้า

ตรวจสอบการเปลี่ยนแปลงค่าเมื่อคุณลองใช้คำสั่งเสียงต่อไปนี้บนโทรศัพท์

"Ok Google เปิดเครื่องซักผ้า"

"Ok Google เริ่มเครื่องซักผ้า"

"Ok Google หยุดเครื่องซักผ้าชั่วคราว"

"Ok Google เปิดเครื่องซักผ้าต่อ"

"Ok Google หยุดเครื่องซักผ้า"

คุณจะสังเกตเห็นว่า Assistant ตอบสนองด้วยเสียงที่มีบางอย่างผิดปกติเมื่อคุณหยุดเครื่องซักผ้าชั่วคราว / ให้เครื่องซักผ้ากลับมาทำงานอีกครั้ง

"ขออภัย ฉันเข้าถึง <ชื่อที่แสดงของโปรเจ็กต์> ไม่ได้"

หากต้องการแก้ไขข้อบกพร่องของปัญหานี้ ก่อนอื่นคุณต้องมีข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดเพื่อจำกัดให้แคบลงและระบุสาเหตุ

แดชบอร์ดข้อมูลวิเคราะห์สมาร์ทโฮม

ที่ที่ควรตรวจสอบข้อผิดพลาดคือแดชบอร์ดข้อมูลวิเคราะห์ Smarthome ซึ่งรวบรวมแผนภูมิเมตริกการใช้งานและสุขภาพสำหรับ Fulfillment ระบบคลาวด์ต่อไปนี้

  • เมตริกการใช้งานแสดงแนวโน้มการใช้งานของการดำเนินการในสมาร์ทโฮม รวมถึงจำนวนผู้ใช้ที่ใช้งานอยู่รายวันและจำนวนคำขอทั้งหมดที่จะดำเนินการตามคำสั่งซื้อ
  • เมตริกประสิทธิภาพการทำงานช่วยให้คุณตรวจสอบความผิดปกติของการดำเนินการในสมาร์ทโฮมได้ โดยครอบคลุมเวลาในการตอบสนองของคำขอ เปอร์เซ็นต์ความสำเร็จ และรายละเอียดข้อผิดพลาด

หากต้องการจำกัดสาเหตุของข้อผิดพลาดให้แคบลง ให้ทำตามขั้นตอนด้านล่างเพื่อเข้าถึงหน้าแดชบอร์ดของโปรเจ็กต์

  1. ไปที่หน้าโปรเจ็กต์ในคอนโซลการดำเนินการ
  2. เลือกโปรเจ็กต์สมาร์ทโฮม
  3. เลือกแท็บ Analytics แล้วคลิกไปที่ Google Cloud Platform

b1735bbe11a7aff8.png

  1. ซึ่งจะนำคุณไปยังรายการแดชบอร์ดสำหรับโปรเจ็กต์บน Google Cloud เลือกหน้าแดชบอร์ด Google Home Analytics - การผสานรวมระบบคลาวด์

5edd3751323176dd.png

  1. เลื่อนลงไปที่แผนภูมิข้อผิดพลาดใน Cloud Fulfillment - รายละเอียดสถานะ เพื่อดูรหัสข้อผิดพลาดสำหรับช่วงเวลาที่ไฮไลต์

c468743c20a11c15.png

รหัสข้อผิดพลาด PARTNER_RESPONSE_MISSING_DEVICE บ่งบอกถึงสาเหตุของปัญหา ถัดไป ให้เรียกบันทึกเหตุการณ์ตามรหัสข้อผิดพลาดเพื่อดูรายละเอียดเพิ่มเติม

เข้าถึงบันทึกเหตุการณ์

เข้าถึงบันทึกเหตุการณ์สำหรับการดำเนินการของสมาร์ทโฮมผ่าน Cloud Logging เพื่อดูรายละเอียดเพิ่มเติมเกี่ยวกับข้อผิดพลาด

เปิดเมนูการนำทางใน Google Cloud Platform และในส่วนการดำเนินการ ให้เลือกการบันทึก > 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 ดังนี้

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 CLI ดังนี้

firebase deploy --only functions

ลองพูดตามคำสั่งเสียงต่อไปนี้อีกครั้ง แล้วคุณจะเห็นว่า Assistant ตอบสนองได้อย่างถูกต้องเมื่อคุณหยุดเครื่องซักผ้าชั่วคราว / ให้เครื่องซักผ้ากลับมาทำงานอีกครั้ง

"Ok Google หยุดเครื่องซักผ้าชั่วคราว"

=&gt;

"ได้เลย กำลังหยุดเครื่องซักผ้าชั่วคราว"

"Ok Google เปิดเครื่องซักผ้าต่อ"

=&gt;

"รับทราบ เปิดโหมดเครื่องซักผ้าต่อ"

คุณยังทดสอบสถานะปัจจุบันของเครื่องซักผ้าได้โดยถามคำถาม

"Ok Google เครื่องซักผ้าของฉันเปิดอยู่ไหม"

"Ok Google เครื่องซักผ้าของฉันทำงานอยู่ไหม"

"Ok Google เครื่องซักผ้าของฉันอยู่ในโหมดไหน"

4. ทดสอบการดำเนินการด้วยชุดทดสอบ

นอกจากการทดสอบด้วยตนเองแล้ว คุณยังสามารถใช้ชุดทดสอบอัตโนมัติสำหรับสมาร์ทโฮมเพื่อตรวจสอบกรณีการใช้งานโดยอิงตามประเภทอุปกรณ์และลักษณะที่เชื่อมโยงกับการดำเนินการของคุณ Test Suite จะเรียกใช้ชุดการทดสอบเพื่อตรวจหาปัญหาในการดำเนินการของคุณ และแสดงข้อความแจ้งข้อมูลสำหรับกรณีการทดสอบที่ล้มเหลวเพื่อให้การแก้ไขข้อบกพร่องรวดเร็วขึ้นก่อนเข้าสู่บันทึกเหตุการณ์

เรียกใช้ Test Suite สำหรับสมาร์ทโฮม

ทำตามวิธีการต่อไปนี้เพื่อทดสอบการดำเนินการสำหรับสมาร์ทโฮม Action by Test Suite

  1. เปิด Test Suite สำหรับสมาร์ทโฮมในเว็บเบราว์เซอร์
  2. ลงชื่อเข้าใช้ Google โดยใช้ปุ่มที่มุมขวาบน วิธีนี้ช่วยให้ Test Suite ส่งคำสั่งไปยัง Google Assistant ได้โดยตรง
  3. ในช่องรหัสโปรเจ็กต์ ให้ป้อนรหัสโปรเจ็กต์ของการดำเนินการสำหรับสมาร์ทโฮม แล้วคลิกถัดไปเพื่อดำเนินการต่อ
  4. ในขั้นตอนการตั้งค่าการทดสอบ คุณจะเห็นรายการประเภทอุปกรณ์และลักษณะของเครื่องซักผ้า

78ed6a1ebdb581bf.png

  1. ปิดใช้ตัวเลือก Test Request Sync เนื่องจากแอปเครื่องซักผ้าตัวอย่างไม่มี UI สำหรับเพิ่ม / นำออก / เปลี่ยนชื่อเครื่องซักผ้า ในระบบการใช้งานจริง คุณต้องเรียกใช้การซิงค์คำขอเมื่อใดก็ตามที่ผู้ใช้เพิ่ม / นำออก / เปลี่ยนชื่ออุปกรณ์
  2. คลิกถัดไปเพื่อเริ่มทำการทดสอบ

หลังจากชุดทดสอบทำงานเสร็จสิ้นแล้ว ให้ดูผลลัพธ์ของกรอบการทดสอบ คุณจะสังเกตเห็นกรอบการทดสอบที่ไม่สำเร็จ 2 กรณีพร้อมข้อความแสดงข้อผิดพลาดที่เกี่ยวข้อง

5838d10631c98ed2.png

หากต้องการแก้ไขข้อบกพร่องของการดำเนินการในสมาร์ทโฮมสำหรับการดำเนินการที่ล้มเหลว คุณจะต้องระบุสาเหตุที่แท้จริงของข้อผิดพลาดโดยการวิเคราะห์ข้อความแสดงข้อผิดพลาดก่อน

วิเคราะห์ข้อความแสดงข้อผิดพลาด

Test Suite จะแสดงข้อความแสดงข้อผิดพลาดสำหรับกรอบการทดสอบที่ไม่สำเร็จแต่ละกรณีเพื่อระบุสาเหตุของความล้มเหลว เพื่อช่วยให้นักพัฒนาซอฟต์แวร์ระบุสาเหตุของปัญหาได้

สำหรับกรอบการทดสอบที่ไม่สำเร็จครั้งแรกข้างต้น

99e4e5d06965a8a7.png

ข้อความแสดงข้อผิดพลาดระบุว่า Test Suite คาดหวัง "isPause": true ในรัฐที่รายงานจากการดำเนินการของสมาร์ทโฮม แต่สถานะจริงมีเพียง "isPause": false เท่านั้น

นอกจากนี้ ข้อความแสดงข้อผิดพลาดของกรอบการทดสอบที่ 2 ที่ไม่สำเร็จจะระบุสถานะในการตอบสนองของ QUERY จากการดำเนินการของสมาร์ทโฮม ได้แก่ "isPause": true ซึ่งแตกต่างจาก "isPause": false ในสถานะที่รายงานจากการดำเนินการของสมาร์ทโฮมดังนี้

fdb5124102e3a37.png

ตามข้อความแสดงข้อผิดพลาดทั้ง 2 รายการ คุณควรตรวจสอบว่ารายงานการดำเนินการระบุ isPaused ด้วยค่าที่ถูกต้องหรือไม่

ระบุสาเหตุของข้อผิดพลาด

เปิด functions/index.js ซึ่งมีฟังก์ชัน reportstate ที่โพสต์สถานะโพสต์จะเปลี่ยนเป็น Home Graph ผ่านสถานะรายงาน ตรวจสอบเพย์โหลดสถานะของรายงาน แล้วคุณจะพบว่าเพย์โหลดขาดสถานะ isPaused ซึ่งก็คือสิ่งที่ Test Suite ตรวจสอบในกรอบการทดสอบที่ล้มเหลว

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 ลงในเพย์โหลดสถานะรายงาน ดังนี้

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

เรียกใช้ Test Suite สำหรับสมาร์ทโฮมอีกครั้ง แล้วจะพบว่ากรอบการทดสอบทั้งหมดได้ผ่านแล้ว

148837f85d377dd6.png

5. ขอแสดงความยินดี

17d485868a6771bc.png

ยินดีด้วย คุณได้เรียนรู้วิธีแก้ปัญหาการทำงานของสมาร์ทโฮมผ่าน Test Suite สำหรับสมาร์ทโฮมและ เมตริก GCP และการบันทึก

ดูข้อมูลเพิ่มเติม

จาก Codelab นี้ ลองแบบฝึกหัดต่อไปนี้และสำรวจแหล่งข้อมูลเพิ่มเติม

นอกจากนี้ คุณยังดูข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบและการส่งการดำเนินการเพื่อรับการตรวจสอบ รวมถึงขั้นตอนการรับรองเพื่อเผยแพร่การดำเนินการให้ผู้ใช้ทราบได้ด้วย