การแก้ไขข้อบกพร่องของหน้าแรก

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

การผสานรวมสมาร์ทโฮมช่วยให้ Google Assistant ควบคุมอุปกรณ์ที่เชื่อมต่อในของผู้ใช้ได้ บ้าน หากต้องการสร้างการดำเนินการสำหรับสมาร์ทโฮม คุณต้องมีปลายทางเว็บฮุคของระบบคลาวด์ที่สามารถจัดการ Intent ของสมาร์ทโฮมได้ เช่น เมื่อผู้ใช้พูดว่า "Ok Google เปิดไฟ" Assistant จะส่งคำสั่งไปยัง Fulfillment ระบบคลาวด์ของคุณเพื่ออัปเดตสถานะของอุปกรณ์

Local Home SDK เพิ่มประสิทธิภาพการผสานรวมสมาร์ทโฮมโดยการเพิ่มเส้นทางภายในสำหรับกำหนดเส้นทางความตั้งใจของสมาร์ทโฮมไปยังอุปกรณ์ Google Home โดยตรง ซึ่งช่วยเพิ่มความน่าเชื่อถือและลดเวลาในการตอบสนองในการประมวลผลของผู้ใช้ คำสั่ง ซึ่งช่วยให้คุณเขียนและทำให้แอป Fulfillment ในเครื่องใช้งานได้ใน TypeScript หรือ JavaScript ที่ระบุอุปกรณ์และเรียกใช้คำสั่งบนลำโพงอัจฉริยะ Google Home หรือ Google Nest Smart Display จากนั้นแอปของคุณจะสื่อสารกับผู้ใช้โดยตรง อุปกรณ์อัจฉริยะที่มีอยู่ผ่านเครือข่าย LAN โดยใช้โปรโตคอลมาตรฐานที่มีอยู่ในการทำตามคำสั่ง

72ffb320986092c.png

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

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

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

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

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

  • วิธีใช้เมตริก GCP และการบันทึกเพื่อระบุและแก้ไขปัญหาของเวอร์ชันที่ใช้งานจริง
  • วิธีใช้ชุดทดสอบเพื่อระบุปัญหาเกี่ยวกับการทำงานและ API
  • วิธีใช้เครื่องมือสำหรับนักพัฒนาเว็บใน Chrome ขณะพัฒนาแอป Home Home

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

2. เรียกใช้แอปเครื่องซักผ้า

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

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

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

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

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

แอปเริ่มต้นมีไดเรกทอรีย่อยและฟังก์ชันระบบคลาวด์คล้ายกับ Codelab ของเปิดใช้ Fulfillment ในเครื่องสำหรับการดำเนินการสมาร์ทโฮม แต่แทนที่จะเป็น app-start เรามี app-faulty ที่นี่ เราจะเริ่มจากแอป Home ในท้องถิ่นซึ่งใช้งานได้ดีนัก

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

เราจะใช้โปรเจ็กต์เดียวกันกับที่คุณสร้างไว้ใน Codelab ของเปิดใช้ Fulfillment ในเครื่องสำหรับ Smart Home Actions แต่เราจะทำให้ไฟล์ที่ดาวน์โหลดใน Codelab นี้ใช้งานได้

ไปที่ไดเรกทอรี app-faulty แล้วตั้งค่า Firebase CLI ด้วยโปรเจ็กต์การดำเนินการที่สร้างใน Codelab ของเปิดใช้ Fulfillment ในเครื่องสำหรับ Smart Home

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

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

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

$ cd functions
$ npm install

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

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

ไปที่ไดเรกทอรี app-faulty/local/ และเรียกใช้คำสั่งต่อไปนี้เพื่อดาวน์โหลดคอมไพเลอร์ TypeScript และคอมไพล์แอป

$ cd ../local
$ npm install
$ npm run build

การดำเนินการนี้จะรวบรวมแหล่งที่มา index.ts (TypeScript) และวางเนื้อหาต่อไปนี้ลงในไดเรกทอรี app-faulty/public/local-home/

  • bundle.js - เอาต์พุต JavaScript ที่คอมไพล์แล้ว ซึ่งมีแอปภายในเครื่องและทรัพยากร Dependency
  • index.html - หน้าโฮสติ้งในเครื่องที่ใช้เพื่อแสดงแอปสำหรับการทดสอบในอุปกรณ์

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

$ firebase deploy

นี่คือเอาต์พุตของคอนโซลที่คุณจะเห็น

...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/<project-id>/overview
Hosting URL: https://<projectcd -id>.web.app

คำสั่งนี้ทำให้เว็บแอปใช้งานได้ รวมถึง Cloud Functions for Firebase หลายรายการ

อัปเดต HomeGraph

เปิด URL ของโฮสติ้งในเบราว์เซอร์ (https://<project-id>.web.app) เพื่อดูเว็บแอป ใน UI ของเว็บ ให้คลิกปุ่มรีเฟรช ae8d3b25777a5e30.png เพื่ออัปเดต HomeGraph ผ่าน Request Sync ด้วยข้อมูลเมตาอุปกรณ์ล่าสุดจากแอปเครื่องซักผ้าที่มีข้อบกพร่อง ดังนี้

fa3c47f293cfe0b7.png

เปิดแอป Google Home แล้วตรวจสอบว่าคุณเห็นอุปกรณ์เครื่องซักผ้าที่ใช้ชื่อใหม่ว่า "เครื่องซักผ้าผิดพลาด" อย่าลืมกำหนดอุปกรณ์ให้กับห้องที่มีอุปกรณ์ Nest อยู่ด้วย

2a082ee11d47ad1a.png

3. เริ่มใช้เครื่องซักผ้าอัจฉริยะ

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

เปิดเครื่อง

ไปที่ไดเรกทอรี virtual-device/ และเรียกใช้สคริปต์อุปกรณ์โดยส่งพารามิเตอร์การกำหนดค่าเป็นอาร์กิวเมนต์

$ cd ../../virtual-device
$ npm install
$ npm start -- \
  --deviceId=deviceid123 --projectId=<project-id> \
  --discoveryPortOut=3311 --discoveryPacket=HelloLocalHomeSDK

ตรวจสอบว่าสคริปต์อุปกรณ์ทํางานด้วยพารามิเตอร์ที่คาดไว้ดังนี้

(...): UDP Server listening on 3311
(...): Device listening on port 3388
(...): Report State successful

4. ทดสอบแอป Home ในพื้นที่

ส่งคำสั่งไปยังอุปกรณ์ของคุณผ่านคำสั่งเสียงไปยังอุปกรณ์ Google Home เช่น

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

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

"Ok Google บังคับใช้ในท้องถิ่น"

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

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

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

เรามาลองใช้เครื่องมือที่เรามี ได้แก่ เมตริกของ Google Cloud Platform (GCP) และการบันทึก และเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Chrome เพื่อหาสาเหตุของปัญหา

5. แก้ไขข้อบกพร่องแอป Home ในพื้นที่

ในส่วนต่อไปนี้ คุณจะได้ใช้เครื่องมือที่ Google มีให้เพื่อค้นหาสาเหตุที่อุปกรณ์เข้าถึงผ่านเส้นทางภายในไม่ได้ คุณสามารถใช้เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Google Chrome เพื่อเชื่อมต่อกับอุปกรณ์ Google Home ดูบันทึกของคอนโซล และแก้ไขข้อบกพร่องของแอป Local Home นอกจากนี้ คุณยังส่งบันทึกที่กำหนดเองไปยัง Cloud Logging เพื่อให้ทราบข้อผิดพลาดที่สำคัญซึ่งผู้ใช้พบในแอป Home Home ในพื้นที่ได้อีกด้วย

เชื่อมต่อเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Chrome

หากต้องการเชื่อมต่อโปรแกรมแก้ไขข้อบกพร่องกับแอปการดำเนินการตามคำสั่งซื้อในพื้นที่ ให้ทำตามขั้นตอนต่อไปนี้

  1. ตรวจสอบว่าคุณได้ลิงก์อุปกรณ์ Google Home กับผู้ใช้ที่มีสิทธิ์เข้าถึงโปรเจ็กต์คอนโซล Actions
  2. รีบูตอุปกรณ์ Google Home ซึ่งจะช่วยให้อุปกรณ์รับ URL ของ HTML รวมถึงการกำหนดค่าการสแกนที่คุณใส่ไว้ในคอนโซล Actions
  3. เปิด Chrome บนเครื่องที่กำลังพัฒนา
  4. เปิดแท็บ Chrome ใหม่และป้อน chrome://inspect ในช่องที่อยู่เพื่อเปิดตัวเครื่องมือตรวจสอบ

คุณจะเห็นรายการอุปกรณ์ในหน้าและ URL ของแอปควรปรากฏใต้ชื่ออุปกรณ์ Google Home ของคุณ

567f97789a7d8846.png

เปิดเครื่องมือตรวจสอบ

คลิกตรวจสอบใต้ URL ของแอปเพื่อเปิดเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Chrome เลือกแท็บคอนโซลและตรวจสอบว่าคุณเห็นเนื้อหาของ Intent IDENTIFY ที่แอป TypeScript พิมพ์

774c460c59f9f84a.png

เอาต์พุตนี้หมายความว่าตัวแฮนเดิล IDENTIFY ทริกเกอร์สำเร็จแล้ว แต่ verificationId ที่แสดงผลใน IdentifyResponse ไม่ตรงกับอุปกรณ์ใดๆ ใน HomeGraph มาเพิ่มบันทึกที่กำหนดเองเพื่อหาสาเหตุกัน

เพิ่มบันทึกที่กำหนดเอง

แม้ว่าจะมีข้อผิดพลาด DEVICE_VERIFICATION_FAILED ที่พิมพ์โดย Local Home SDK แต่ก็ไม่ได้ช่วยหาสาเหตุของปัญหามากนัก ลองเพิ่มบันทึกที่กำหนดเองเพื่อตรวจสอบว่าเรากำลังอ่านและประมวลผลข้อมูลการสแกนอย่างถูกต้อง และโปรดทราบว่าหากเราปฏิเสธสัญญาเนื่องจากมีข้อผิดพลาด ระบบจะส่งข้อความแสดงข้อผิดพลาดไปยัง Cloud Logging ด้วยเช่นกัน

local/index.ts

identifyHandler(request: IntentFlow.IdentifyRequest):
    Promise<IntentFlow.IdentifyResponse> {
  console.log("IDENTIFY intent: " + JSON.stringify(request, null, 2));

  const scanData = request.inputs[0].payload.device.udpScanData;
  if (!scanData) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_request', 'Invalid scan data');
    return Promise.reject(err);
  }

  // In this codelab, the scan data contains only local device id.
  // Is there something wrong here?
  const localDeviceId = Buffer.from(scanData.data);
  console.log(`IDENTIFY handler: received local device id
      ${localDeviceId}`);

  // Add custom logs
  if (!localDeviceId.toString().match(/^deviceid[0-9]{3}$/gi)) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_device', 'Invalid device id from scan data ' +
        localDeviceId);
    return Promise.reject(err);
  }

  const response: IntentFlow.IdentifyResponse = {
    intent: Intents.IDENTIFY,
    requestId: request.requestId,
    payload: {
      device: {
        id: 'washer',
        verificationId: localDeviceId.toString(),
      }
    }
  };
  console.log("IDENTIFY response: " + JSON.stringify(response, null, 2));

  return Promise.resolve(response);
}

นอกจากนี้ ให้เปลี่ยนเวอร์ชันแอป Home ในเครื่องเพื่อให้เราระบุได้ว่าเราใช้เวอร์ชันที่ถูกต้องหรือไม่

local/index.ts

const localHomeSdk = new App('1.0.1');

หลังจากเพิ่มบันทึกที่กำหนดเองแล้ว คุณต้องคอมไพล์แอปอีกครั้งและนำไปใช้งาน Firebase อีกครั้ง

$ cd ../app-faulty/local
$ npm run build
$ firebase deploy --only hosting

ตอนนี้ ให้รีบูตอุปกรณ์ Google Home เพื่อให้โหลดแอปบ้านในเครื่องที่อัปเดตแล้วได้ คุณสามารถดูได้ว่าอุปกรณ์ Google Home ใช้เวอร์ชันที่คาดไว้หรือไม่โดยดูที่บันทึกคอนโซลในเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Chrome

ecc56508ebcf9ab.png

เข้าถึง Cloud Logging

มาดูวิธีใช้ Cloud Logging เพื่อค้นหาข้อผิดพลาดกัน วิธีเข้าถึง Cloud Logging สำหรับโปรเจ็กต์ของคุณ

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

ผู้ใช้ของโปรเจ็กต์ Actions จะจัดการการเข้าถึงข้อมูลการบันทึกได้ผ่าน Identity and Access Management (IAM) ดูรายละเอียดเพิ่มเติมเกี่ยวกับบทบาทและสิทธิ์สำหรับการบันทึกข้อมูลได้ที่การควบคุมการเข้าถึงของ Cloud Logging

ใช้ตัวกรองขั้นสูง

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

คลิกปุ่มสลับแสดงคำค้นหา ซึ่งควรเปลี่ยนเป็นช่องเครื่องมือสร้างคำค้นหา ป้อน jsonPayload.intent="IDENTIFY" ในช่องเครื่องมือสร้างคำค้นหา แล้วคลิกปุ่มเรียกใช้คำค้นหา

4c0b9d2828ee2447.png

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

71f2f156c6887496.png

จาก debugString เราสามารถบอกได้ว่ารหัสอุปกรณ์ภายในไม่ได้อยู่ในรูปแบบที่คาดไว้ แอป Home Home คาดว่าจะได้รับรหัสอุปกรณ์ในเครื่องเป็นสตริงที่ขึ้นต้นด้วย deviceid ตามด้วยตัวเลข 3 หลัก แต่รหัสอุปกรณ์ในเครื่องจะเป็นสตริงเลขฐาน 16

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

ย้อนกลับไปที่ซอร์สโค้ดที่เราแยกวิเคราะห์รหัสอุปกรณ์ในตัวเครื่องจากข้อมูลการสแกน เราสังเกตเห็นว่าเราไม่ได้ให้การเข้ารหัสเมื่อแปลงสตริงเป็นไบต์ ระบบรับข้อมูลสแกนเป็นสตริงเลขฐาน 16 ดังนั้นให้ส่ง hex เป็นการเข้ารหัสอักขระเมื่อเรียกใช้ Buffer.from()

local/index.ts

identifyHandler(request: IntentFlow.IdentifyRequest):
    Promise<IntentFlow.IdentifyResponse> {
  console.log("IDENTIFY intent: " + JSON.stringify(request, null, 2));

  const scanData = request.inputs[0].payload.device.udpScanData;
  if (!scanData) {
    const err = new IntentFlow.HandlerError(request.requestId,
        'invalid_request', 'Invalid scan data');
    return Promise.reject(err);
  }

  // In this codelab, the scan data contains only local device id.
  const localDeviceId = Buffer.from(scanData.data, 'hex');
  console.log(`IDENTIFY handler: received local device id
      ${localDeviceId}`);

  if (!localDeviceId.toString().match(/^deviceid[0-9]{3}$/gi)) {
    const err = new IntentFlow.HandlerError(request.requestId,
      'invalid_device', 'Invalid device id from scan data ' +
      localDeviceId);
    return Promise.reject(err);
  }

  const response: IntentFlow.IdentifyResponse = {
    intent: Intents.IDENTIFY,
    requestId: request.requestId,
    payload: {
      device: {
        id: 'washer',
        verificationId: localDeviceId.toString(),
      }
    }
  };
  console.log("IDENTIFY response: " + JSON.stringify(response, null, 2));

  return Promise.resolve(response);
}

นอกจากนี้ ให้เปลี่ยนเวอร์ชันแอป Home ในเครื่องเพื่อให้เราระบุได้ว่าเราใช้เวอร์ชันที่ถูกต้องหรือไม่

local/index.ts

const localHomeSdk = new App('1.0.2');

หลังจากแก้ไขข้อผิดพลาดแล้ว ให้คอมไพล์แอปและทำให้ Firebase ใช้งานได้อีกครั้ง ใน app-faulty/local ให้เรียกใช้

$ npm run build
$ firebase deploy --only hosting

ทดสอบการแก้ไข

หลังจากติดตั้งใช้งานแล้ว ให้รีบูตอุปกรณ์ Google Home เพื่อให้โหลดแอปบ้านในเครื่องที่อัปเดตแล้วได้ ตรวจสอบว่าแอป Home ในเครื่องเป็นเวอร์ชัน 1.0.2 และครั้งนี้คุณไม่ควรพบข้อผิดพลาดใน Chrome Developers Console

c8456f7b5f77f894.png

ตอนนี้คุณจะลองส่งคำสั่งไปยังอุปกรณ์อีกครั้งได้

"Ok Google บังคับใช้ในท้องถิ่น"

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

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

...

"Ok Google บังคับใช้ค่าเริ่มต้น"

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

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

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

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

  1. เปิด Test Suite สำหรับสมาร์ทโฮมในเว็บเบราว์เซอร์
  2. ลงชื่อเข้าใช้ Google โดยใช้ปุ่มที่มุมขวาบน วิธีนี้ช่วยให้ Test Suite ส่งคำสั่งไปยัง Google Assistant ได้โดยตรง
  3. ในช่องรหัสโปรเจ็กต์ ให้ป้อนรหัสโปรเจ็กต์ของการดำเนินการสำหรับสมาร์ทโฮม แล้วคลิกถัดไปเพื่อดำเนินการต่อ
  4. ในขั้นตอนการตั้งค่าการทดสอบ คุณควรเห็นเครื่องซักผ้าที่มีข้อบกพร่องในส่วนอุปกรณ์และรถไฟ
  5. ปิดใช้ตัวเลือก Test Request Sync เนื่องจากแอปเครื่องซักผ้าตัวอย่างไม่มี UI สำหรับเพิ่ม / นำออก / เปลี่ยนชื่อเครื่องซักผ้า ในระบบการใช้งานจริง คุณต้องเรียกใช้การซิงค์คำขอเมื่อใดก็ตามที่ผู้ใช้เพิ่ม / นำออก / เปลี่ยนชื่ออุปกรณ์
  6. เปิดใช้ตัวเลือก Local Home SDK ไว้เนื่องจากเราจะทดสอบทั้งเส้นทางในเครื่องและเส้นทางระบบคลาวด์
  7. คลิกถัดไป: สภาพแวดล้อมการทดสอบเพื่อเริ่มทำการทดสอบ

67433d9190fa770e.png

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

d1ebd5cfae2a2a47.png

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

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

6bfd3acef9c16b84.png

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

ระบุและแก้ไขข้อผิดพลาด

เรามาหาซอร์สโค้ดที่แอป Local Home ส่งคำสั่งการดำเนินการไปยังอุปกรณ์กัน getDataCommand() คือฟังก์ชันที่ executeHandler() เรียกใช้เพื่อตั้งค่า payload ในคำสั่งการดำเนินการที่ส่งไปยังอุปกรณ์

local/index.ts

getDataForCommand(command: string, params: IWasherParams): unknown {
    switch (command) {
        case 'action.devices.commands.OnOff':
            return {
                on: params.on ? true : false
            };
        case 'action.devices.commands.StartStop':
            return {
                isRunning: params.start ? true : false
            };
        case 'action.devices.commands.PauseUnpause':
            return {
                // Is there something wrong here?
                isPaused: params.pause ? false : true
            };
        default:
            console.error('Unknown command', command);
            return {};
    }
}

จริงๆ แล้วเรากำลังตั้งค่า isPause ในสถานะย้อนกลับ ซึ่งควรตั้งค่าเป็น true เมื่อ params.pause เป็น true และ false หากไม่เป็นเช่นนั้น เรามาแก้ปัญหานั้นกัน

local/index.ts

getDataForCommand(command: string, params: IWasherParams): unknown {
    switch (command) {
        case 'action.devices.commands.OnOff':
            return {
                on: params.on ? true : false
            };
        case 'action.devices.commands.StartStop':
            return {
                isRunning: params.start ? true : false
            };
        case 'action.devices.commands.PauseUnpause':
            return {
                isPaused: params.pause ? true : false
            };
        default:
            console.error('Unknown command', command);
            return {};
    }
}

เปลี่ยนเวอร์ชันแอป Home ในเครื่องเพื่อให้เราระบุได้ว่าใช้เวอร์ชันที่ถูกต้องหรือไม่

local/index.ts

const localHomeSdk = new App('1.0.3');

อย่าลืมคอมไพล์แอปอีกครั้งและทำให้ใช้งานได้กับ Firebase อีกครั้ง ใน app-faulty/local ให้เรียกใช้

$ npm run build
$ firebase deploy --only hosting

ตอนนี้ ให้รีบูตอุปกรณ์ Google Home เพื่อให้โหลดแอปบ้านในเครื่องที่อัปเดตแล้วได้ ตรวจสอบว่าแอป Home ในเครือข่ายเดียวกันเป็นเวอร์ชัน 1.0.3

ทดสอบการแก้ไข

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

b7fc8c5d3c727d8d.png

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

764dbc83b95782a.png

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

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

คุณสามารถลองดำเนินการเพิ่มเติมต่อไปนี้

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