Gỡ lỗi nhà thông minh

1. Trước khi bắt đầu

Là một nhà phát triển Internet của vạn vật (IoT), bạn có thể xây dựng các Hành động thông minh trong nhà giúp người dùng có thể điều khiển thiết bị của họ thông qua các nút điều khiển cảm ứng trong ứng dụng Google Home và dùng lệnh thoại với Trợ lý Google.

a4657871181b5ad2.gif

Việc tìm hiểu các công cụ gỡ lỗi cho các Hành động trong nhà thông minh là một bước quan trọng để tích hợp chất lượng sản xuất với Trợ lý Google. Để tạo điều kiện cho việc giám sát và gỡ lỗi dễ dàng, chúng tôi cung cấp Các chỉ số của Google Cloud Platform (GCP), Ghi nhật kýBộ thử nghiệm dành cho nhà thông minh để giúp bạn xác định và giải quyết các vấn đề cho Hành động của mình.

Điều kiện tiên quyết

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ triển khai một Hành động nhà thông minh có 2 lỗi và kết nối hành động đó với Trợ lý, sau đó gỡ lỗi của Hành động đó thông qua Bộ thử nghiệm dành cho nhà thông minh và Ghi nhật ký và chỉ số của Google Cloud Platform (GCP).

Kiến thức bạn sẽ học được

  • Cách sử dụng các chỉ số và tính năng ghi nhật ký của GCP để xác định và giải quyết các vấn đề liên quan đến bản phát hành công khai
  • Cách sử dụng Bộ thử nghiệm dành cho nhà thông minh để xác định các vấn đề về chức năng và API

Bạn cần có

2. Chạy ứng dụng bị lỗi

Lấy mã nguồn

Nhấp vào đường liên kết sau đây để tải mẫu xuống cho lớp học lập trình này trên máy phát triển của bạn:

...hoặc bạn có thể sao chép kho lưu trữ GitHub từ dòng lệnh:

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

Giới thiệu về dự án

Ứng dụng máy giặt chứa các thư mục con sau:

Kết nối với Firebase

Mở cửa sổ dòng lệnh trên máy phát triển. Chuyển đến thư mục washer-faulty, sau đó thiết lập Giao diện dòng lệnh (CLI) của Firebase bằng dự án Actions (Hành động) được tạo trong bài viết Kết nối các thiết bị nhà thông minh với lớp học lập trình Trợ lý Google:

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

Triển khai cho Firebase

Chuyển đến thư mục functions và cài đặt mọi phần phụ thuộc cần thiết bằng npm.

$ cd functions
$ npm install

Lưu ý:Nếu thấy thông báo dưới đây, bạn có thể bỏ qua và tiếp tục. Cảnh báo này xuất phát từ một số phần phụ thuộc cũ. Bạn có thể xem thêm thông tin chi tiết tại đây.

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

Bây giờ, sau khi đã cài đặt các phần phụ thuộc và định cấu hình dự án, bạn đã sẵn sàng triển khai ứng dụng máy giặt bị lỗi.

$ firebase deploy

Đây là kết quả trên bảng điều khiển mà bạn sẽ thấy:

...

✔ Deploy complete!

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

Cập nhật HomeGraph

Mở URL lưu trữ trong trình duyệt của bạn (https://<project-id>.firebaseapp.com) để xem ứng dụng web. Trên giao diện người dùng web, hãy nhấp vào nút Refresh (Làm mới) ae8d3b25777a5e30.png để cập nhật HomeGraph qua tính năng Request Sync (Yêu cầu đồng bộ hoá) với siêu dữ liệu mới nhất về thiết bị từ ứng dụng máy giặt bị lỗi:

6f2b1344179977cf.png.

Mở ứng dụng Google Home và xác nhận rằng bạn có thể nhìn thấy thiết bị máy giặt có tên là Faultywash (Máy giặt bị lỗi).

e357de6a7faff925.png

3. Kiểm thử Hành động

Sau khi bạn triển khai dự án, hãy kiểm tra để đảm bảo rằng Hành động của bạn điều khiển máy giặt.

Kiểm tra máy giặt

Kiểm tra sự thay đổi giá trị khi bạn thử bất kỳ lệnh thoại nào sau đây qua điện thoại:

"Ok Google, bật máy giặt cho tôi."

"Ok Google, bắt đầu máy giặt."

"Ok Google, tạm dừng máy giặt."

"Ok Google, tiếp tục máy giặt của tôi."

"Ok Google, dừng máy giặt."

Bạn sẽ thấy Trợ lý phản hồi rằng có vấn đề qua giọng nói khi bạn tạm dừng / tiếp tục máy giặt:

"Rất tiếc, tôi không kết nối được với <tên hiển thị dự án>."

Để gỡ lỗi vấn đề này, trước tiên bạn cần thêm thông tin về lỗi để thu hẹp và xác định nguyên nhân gốc.

Trang tổng quan Số liệu phân tích của Smarthome

Bạn nên kiểm tra lỗi trên trang tổng quan Smarthome Analytics. Trang tổng quan này tổng hợp các biểu đồ về Chỉ số mức sử dụng và sức khoẻ cho phương thức thực hiện của bạn trên đám mây:

  • Chỉ số Mức sử dụng phản ánh xu hướng sử dụng Hành động trong nhà thông minh, bao gồm cả số người dùng hoạt động hằng ngày và tổng số yêu cầu cho đến khi thực hiện thành công ứng dụng của bạn.
  • Các chỉ số về Sức khoẻ giúp bạn theo dõi những điểm bất thường đối với Hành động trên nhà thông minh, bao gồm độ trễ của yêu cầu, tỷ lệ phần trăm thành công và thông tin chi tiết về lỗi.

Để thu hẹp nguyên nhân gây ra lỗi, hãy làm theo các bước bên dưới để truy cập vào trang tổng quan về dự án.

  1. Trong Bảng điều khiển Actions, hãy chuyển đến trang Dự án.
  2. Chọn dự án nhà thông minh của bạn.
  3. Chọn thẻ Analytics rồi nhấp vào Chuyển đến Google Cloud Platform.

b1735bbe11a7aff8.png

  1. Thao tác này sẽ đưa bạn đến danh sách trang tổng quan cho dự án của bạn trên Google Cloud. Chọn trang tổng quan Google Home Analytics – Tích hợp đám mây.

5edd3751323176dd.pngS

  1. Di chuyển xuống biểu đồ Lỗi thực hiện đơn hàng trên đám mây – Bảng chi tiết trạng thái để xem mã lỗi trong phạm vi thời gian được đánh dấu.

c468743c20a11c15.png

Mã lỗi PARTNER_RESPONSE_MISSING_DEVICE cung cấp gợi ý về nguyên nhân gốc. Tiếp theo, hãy truy xuất nhật ký sự kiện dựa trên mã lỗi để biết thêm thông tin chi tiết.

Truy cập vào nhật ký sự kiện

Để biết thêm thông tin chi tiết về lỗi, hãy truy cập vào nhật ký sự kiện dành cho các Hành động trong nhà thông minh của bạn qua Cloud Logging.

Mở Trình đơn điều hướng trong Google Cloud Platform và trong phần Hoạt động, chọn Ghi nhật ký > Logs Explorer (Trình khám phá nhật ký) để truy cập vào nhật ký sự kiện của dự án. Ngoài ra, bạn có thể tìm Trình khám phá nhật ký trong hộp tìm kiếm.

Trong phần Truy vấn, hãy nhập truy vấn PARTNER_RESPONSE_MISSING_DEVICE rồi nhấp vào Chạy truy vấn. Các nhật ký phù hợp với truy vấn được hiển thị trong phần Kết quả truy vấn.

747cca0f1249a5a.pngS

Nhật ký lỗi cho thấy một sự kiện nhà thông minh kèm theo thông tin chi tiết về lỗi cho biết:

  • Hành động người dùng đã thực hiện là "tiếp tục máy giặt" (actionType: "STARTSTOP_UNPAUSE"), tương ứng với lệnh thoại không thực hiện được gần đây.
  • Thông báo gỡ lỗi được liên kết là "JSON response does not include device."

Dựa vào thông báo gỡ lỗi, bạn nên kiểm tra lý do ứng dụng máy giặt không đưa ra đúng thiết bị trong phản hồi EXECUTE.

Xác định nguyên nhân gốc của lỗi

Trong functions/index.js, hãy tìm trình xử lý EXECUTE (trong mảng onExecute) trả về trạng thái của mỗi lệnh và trạng thái mới của thiết bị. Việc chèn mã thiết bị vào phản hồi EXECUTE phụ thuộc vào việc phân giải hàm 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)));
     }
   }
 }

Để kiểm tra thêm cách hàm updateDevice xử lý việc tạm dừng / tiếp tục trên máy giặt, bạn sẽ thấy chuỗi cần khớp với lệnh tạm dừng / tiếp tục là không chính xác:

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

Sửa lỗi

Bây giờ, bạn đã xác định được nguyên nhân gốc của lỗi, bạn có thể sửa chuỗi cho lệnh tạm dừng / tiếp tục:

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

Kiểm thử kết quả sửa lỗi

Triển khai mã đã cập nhật bằng giao diện dòng lệnh (CLI) của Firebase:

firebase deploy --only functions

Hãy thử lại các lệnh thoại sau đây, bạn sẽ thấy Trợ lý phản hồi chính xác ngay bây giờ khi bạn tạm dừng / tiếp tục máy giặt.

"Ok Google, tạm dừng máy giặt."

=&gt;

"Vâng, tạm dừng máy giặt."

"Ok Google, tiếp tục máy giặt của tôi."

=&gt;

"Tôi hiểu rồi, tôi đang tiếp tục máy giặt."

Bạn cũng có thể kiểm tra tình trạng hiện tại của máy giặt bằng cách đặt câu hỏi.

"Ok Google, máy giặt của tôi có đang bật không?"

"Ok Google, máy giặt của tôi có đang chạy không?"

"Ok Google, máy giặt của tôi đang ở chu kỳ nào?"

4. Kiểm tra Hành động của bạn bằng Bộ kiểm thử

Ngoài việc kiểm tra theo cách thủ công, bạn có thể sử dụng Bộ kiểm tra dành cho nhà thông minh tự động để xác thực các trường hợp sử dụng dựa trên loại thiết bị và đặc điểm có liên quan đến Hành động của bạn. Bộ kiểm thử chạy một loạt các chương trình kiểm thử để phát hiện các vấn đề trong Hành động của bạn và hiển thị các thông báo cung cấp thông tin về các trường hợp kiểm thử không thành công để đẩy nhanh quá trình gỡ lỗi trước khi bạn tìm hiểu sâu về nhật ký sự kiện.

Chạy Bộ thử nghiệm cho nhà thông minh

Hãy làm theo các hướng dẫn sau để kiểm thử Hành động nhà thông minh bằng Bộ kiểm thử:

  1. Trong trình duyệt web, hãy mở Bộ thử nghiệm cho nhà thông minh.
  2. Đăng nhập vào Google bằng nút ở góc trên cùng bên phải. Việc này cho phép Bộ thử nghiệm gửi các lệnh trực tiếp đến Trợ lý Google.
  3. Trong trường Mã dự án, hãy nhập mã dự án của Hành động trong nhà thông minh. Sau đó, hãy nhấp vào TIẾP THEO để tiếp tục.
  4. Trong bước Test Settings (Cài đặt kiểm thử), bạn sẽ thấy Bộ kiểm thử liệt kê loại thiết bị và đặc điểm của máy giặt.

78ed6a1ebdb581bf.pngS

  1. Tắt tuỳ chọn Kiểm tra yêu cầu đồng bộ hoá vì ứng dụng máy giặt mẫu không có giao diện người dùng để thêm / xoá / đổi tên máy giặt. Trong hệ thống phát hành chính thức, bạn phải kích hoạt tính năng Yêu cầu đồng bộ hoá bất cứ khi nào người dùng thêm / xoá / đổi tên thiết bị.
  2. Nhấp vào TIẾP THEO để bắt đầu chạy kiểm thử.

Sau khi Bộ kiểm thử chạy xong, hãy xem kết quả của các trường hợp kiểm thử. Bạn sẽ thấy hai trường hợp kiểm thử không thành công được phát hiện kèm theo thông báo lỗi tương ứng:

5838d10631c98ed2.png.

Để gỡ lỗi cho Hành động nhà thông minh và tìm ra lỗi, trước tiên, bạn cần xác định nguyên nhân gốc của lỗi bằng cách phân tích thông báo lỗi.

Phân tích thông báo lỗi

Nhằm giúp nhà phát triển xác định nguyên nhân gốc rễ, Bộ kiểm thử sẽ hiện thông báo lỗi của từng trường hợp kiểm thử không thành công để cho biết nguyên nhân gây ra lỗi.

Đối với trường hợp kiểm thử không thành công đầu tiên ở trên,

99e4e5d06965a8a7.pngS

thông báo lỗi của bộ thử nghiệm cho biết Bộ thử nghiệm dự kiến có "isPause": true ở các trạng thái được báo cáo từ Hành động nhà thông minh của bạn, nhưng các trạng thái thực tế chỉ bao gồm "isPause": false.

Ngoài ra, thông báo lỗi thứ hai của trường hợp kiểm thử không thành công cho biết các trạng thái trong phản hồi của QUERY từ Hành động nhà thông minh của bạn bao gồm "isPause": true, khác với "isPause": false ở các trạng thái được báo cáo từ Hành động nhà thông minh:

fdb5124102e3a37.png

Theo cả hai thông báo lỗi, bạn nên kiểm tra xem báo cáo Hành động của bạn có nêu ra isPaused có giá trị chính xác hay không.

Xác định nguyên nhân gốc của lỗi

Mở functions/index.js, chứa hàm reportstate đăng các thay đổi về trạng thái lên Biểu đồ trên Home thông qua Trạng thái báo cáo. Kiểm tra tải trọng Trạng thái báo cáo và bạn sẽ thấy tải trọng thiếu trạng thái isPaused. Đây chính xác là những gì Bộ thử nghiệm đã kiểm tra trong các trường hợp kiểm thử không thành công.

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

Sửa lỗi

Bây giờ, bạn đã xác định được nguyên nhân gốc của lỗi, hãy sửa functions/index.js bằng cách thêm trạng thái isPaused vào tải trọng Trạng thái báo cáo:

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

Kiểm thử kết quả sửa lỗi

Triển khai mã đã cập nhật bằng giao diện dòng lệnh (CLI) của Firebase:

$ firebase deploy --only functions

Chạy lại Bộ thử nghiệm cho nhà thông minh và bạn sẽ thấy rằng tất cả các trường hợp thử nghiệm đều đã vượt qua.

148837f85d377dd6.pngS

5. Xin chúc mừng

17d485868a6771bc.png.

Xin chúc mừng! Bạn đã tìm hiểu thành công cách khắc phục các sự cố Hành động của nhà thông minh thông qua Bộ thử nghiệm dành cho nhà thông minh và Ghi nhật ký và chỉ số GCP.

Tìm hiểu thêm

Để xây dựng lớp học lập trình này, hãy thử thực hiện các bài tập sau và khám phá các tài nguyên khác:

Bạn cũng có thể tìm hiểu thêm về việc thử nghiệm và gửi một Hành động đi xem xét, bao gồm cả quy trình chứng nhận để xuất bản Hành động của bạn cho người dùng.