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

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

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

a4657871181b5ad2.gif

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

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

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

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

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

  • วิธีใช้เมตริกและการบันทึก GCP เพื่อระบุและแก้ไขปัญหาการใช้งานจริง
  • วิธีใช้ชุดทดสอบสำหรับสมาร์ทโฮมเพื่อระบุปัญหาด้านฟังก์ชันการทำงานและ 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 ด้วยโปรเจ็กต์การผสานรวมที่สร้างขึ้นใน Connect smart home devices to the Google Assistant codelab

$ cd washer-faulty
$ firebase use <firebase-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

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

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

6f2b1344179977cf.png

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

e357de6a7faff925.png

3. ทดสอบการผสานรวม

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

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

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

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

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

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

"Ok Google กลับมาใช้เครื่องซักผ้าต่อ"

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

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

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

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

แดชบอร์ดข้อมูลวิเคราะห์บ้านอัจฉริยะ

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

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

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

  1. ไปที่หน้าโปรเจ็กต์ใน Developer Console
  2. เลือกโปรเจ็กต์สมาร์ทโฮม
  3. คลิกแท็บข้อมูลวิเคราะห์ในเมนูด้านซ้าย

b1735bbe11a7aff8.png

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

5edd3751323176dd.png

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

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

แก้ไขข้อผิดพลาด

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

index.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

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

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

=>

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

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

=>

"รับทราบ กำลังกลับมาใช้เครื่องซักผ้าต่อ"

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

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

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

"Ok Google เครื่องซักผ้าของฉันกำลังทำงานในรอบใด"

4. ทดสอบการผสานรวมด้วยชุดทดสอบ

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

เรียกใช้ชุดทดสอบสำหรับสมาร์ทโฮม

ทำตามวิธีการต่อไปนี้เพื่อทดสอบการผสานรวมแบบคลาวด์ต่อคลาวด์โดยใช้ชุดทดสอบ

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

78ed6a1ebdb581bf.png

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

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

5838d10631c98ed2.png

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

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

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

สำหรับกรณีทดสอบแรกที่ล้มเหลวด้านบน

99e4e5d06965a8a7.png

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

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

fdb5124102e3a37.png

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

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

เปิด functions/index.js ซึ่งมีฟังก์ชัน reportstate ที่โพสต์การเปลี่ยนแปลงสถานะไปยังกราฟบ้านโดยใช้รายงานสถานะ ตรวจสอบเพย์โหลดสถานะรายงาน แล้วคุณจะพบว่าเพย์โหลดไม่มีisPaused 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: 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 ลงในเพย์โหลดสถานะรายงาน

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: 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

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

148837f85d377dd6.png

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

17d485868a6771bc.png

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

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

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

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