Kết nối các thiết bị nhà thông minh với Trợ lý Google

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

Là nhà phát triển Internet vạn vật (IoT), bạn có thể xây dựng các tính năng tích hợp đám mây với đám mây để 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à lệnh thoại thông qua Trợ lý.

79266e5f45e6ae20.gif

Các hoạt động tích hợp từ đám mây đến đám mây dựa vào Biểu đồ nhà để cung cấp dữ liệu theo bối cảnh về nhà và các thiết bị trong nhà, tạo bản đồ logic của nhà. Bối cảnh đó giúp Trợ lý hiểu rõ hơn về các yêu cầu của người dùng so với vị trí của họ trong nhà. Ví dụ: Biểu đồ nhà có thể lưu trữ khái niệm về một phòng khách chứa nhiều loại thiết bị của nhiều nhà sản xuất, chẳng hạn như máy điều nhiệt, đèn, quạt và máy hút bụi.

d009cef0f903d284.jpeg

Đ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ẽ phát hành một dịch vụ đám mây quản lý máy giặt thông minh ảo, sau đó xây dựng một dịch vụ tích hợp Cloud-to-cloud (Đám mây với đám mây) và kết nối dịch vụ đó với Trợ lý.

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

  • Cách triển khai dịch vụ đám mây cho nhà thông minh
  • Cách kết nối dịch vụ của bạn với Trợ lý
  • Cách phát hành các thay đổi về trạng thái thiết bị cho Google

Bạn cần có

2. Bắt đầu

Bật chế độ Kiểm soát hoạt động

Để sử dụng Trợ lý Google, bạn phải chia sẻ một số dữ liệu hoạt động nhất định với Google. Trợ lý Google cần dữ liệu này để hoạt động đúng cách; tuy nhiên, yêu cầu chia sẻ dữ liệu không dành riêng cho SDK. Để chia sẻ dữ liệu này, hãy tạo một Tài khoản Google nếu bạn chưa có. Bạn có thể sử dụng bất kỳ Tài khoản Google nào, không nhất thiết phải là tài khoản nhà phát triển của bạn.

Mở trang Kiểm soát hoạt động cho Tài khoản Google mà bạn muốn sử dụng với Trợ lý.

Đảm bảo bạn đã bật các nút bật/tắt sau:

  • Hoạt động trên web và ứng dụng – Ngoài ra, hãy nhớ chọn hộp đánh dấu Bao gồm cả nhật ký duyệt web trên Chrome cũng như hoạt động trên những trang web, ứng dụng và thiết bị sử dụng các dịch vụ của Google.
  • Thông tin thiết bị
  • Hoạt động âm thanh và giọng nói

Tạo dự án Tích hợp đám mây với đám mây

  1. Chuyển đến Developer Console (Bảng điều khiển dành cho nhà phát triển).
  2. Nhấp vào Create Project (Tạo dự án), nhập tên cho dự án rồi nhấp vào Create Project (Tạo dự án).

Đặt tên dự án

Chọn chế độ tích hợp đám mây với đám mây

Trên trang Trang chủ dự án trong Developer Console, hãy chọn Thêm chế độ tích hợp đám mây với đám mây trong phần Đám mây với đám mây.

Thêm tính năng tích hợp từ đám mây sang đám mây

Cài đặt Giao diện dòng lệnh (CLI) của Firebase

Giao diện dòng lệnh (CLI) của Firebase sẽ cho phép bạn phân phát ứng dụng web trên máy và triển khai ứng dụng web lên dịch vụ lưu trữ Firebase.

Để cài đặt CLI, hãy chạy lệnh npm sau đây từ dòng lệnh:

npm install -g firebase-tools

Để xác minh rằng bạn đã cài đặt CLI đúng cách, hãy chạy:

firebase --version

Uỷ quyền cho Firebase CLI bằng Tài khoản Google của bạn bằng cách chạy:

firebase login

3. Chạy ứng dụng khởi động

Giờ đây, khi đã thiết lập môi trường phát triển, bạn có thể triển khai dự án ban đầu để xác minh rằng mọi thứ đã được định cấu hình đúng cách.

Tải mã nguồn

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

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

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

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

Dự án khởi động chứa các thư mục con sau:

  • public: Giao diện người dùng phía trước để dễ dàng kiểm soát và theo dõi trạng thái của máy giặt thông minh.
  • functions: Một dịch vụ đám mây được triển khai đầy đủ để quản lý máy giặt thông minh bằng Cloud Functions cho Firebase và Cơ sở dữ liệu theo thời gian thực của Firebase.

Tạo dự án Firebase

  1. Chuyển đến Firebase.
  2. Nhấp vào Tạo dự án rồi nhập tên dự án.
  3. Đánh dấu vào hộp đồng ý rồi nhấp vào Tiếp tục. Nếu không có hộp đánh dấu thoả thuận, bạn có thể bỏ qua bước này.
    Tạo dự án Firebase
  4. Sau khi tạo dự án Firebase, hãy tìm mã dự án. Chuyển đến phần Tổng quan về dự án rồi nhấp vào biểu tượng cài đặt > Cài đặt dự án.
    Mở phần cài đặt dự án
  5. Dự án của bạn được liệt kê trong thẻ Chung.
    Cài đặt chung của dự án

Kết nối với Firebase

Chuyển đến thư mục washer-start, sau đó thiết lập Firebase CLI với dự án tích hợp:

cd washer-start
firebase use <firebase-project-id>

Định cấu hình dự án Firebase

Khởi chạy dự án Firebase.

firebase init

Chọn các tính năng CLI, Cơ sở dữ liệu thời gian thực, Hàm và tính năng Lưu trữ bao gồm cả tính năng Lưu trữ Firebase.

? Which Firebase CLI features do you want to set up for this directory? Press Space to select features, then
 Enter to confirm your choices.
❯◉ Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision default instance
 ◯ Firestore: Configure security rules and indexes files for Firestore
 ◉ Functions: Configure a Cloud Functions directory and its files
 ◉ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys
 ◯ Hosting: Set up GitHub Action deploys
 ◯ Storage: Configure a security rules file for Cloud Storage
 ◯ Emulators: Set up local emulators for Firebase products
 ◯ Remote Config: Configure a template file for Remote Config
 ◯ Extensions: Set up an empty Extensions manifest

Thao tác này sẽ khởi chạy các API và tính năng cần thiết cho dự án của bạn.

Khi được nhắc, hãy khởi chạy Cơ sở dữ liệu theo thời gian thực. Bạn có thể sử dụng vị trí mặc định cho thực thể cơ sở dữ liệu.

? It seems like you haven't initialized Realtime Database in your project yet. Do you want to set it up?
Yes

? Please choose the location for your default Realtime Database instance:
us-central1

Vì bạn đang sử dụng mã dự án ban đầu, hãy chọn tệp mặc định cho Quy tắc bảo mật và đảm bảo bạn không ghi đè tệp quy tắc cơ sở dữ liệu hiện có.

? File database.rules.json already exists. Do you want to overwrite it with the Realtime Database Security Rules for <project-ID>-default-rtdb from the Firebase Console?
No

Nếu bạn đang khởi tạo lại dự án, hãy chọn Overwrite (Ghi đè) khi được hỏi xem bạn muốn khởi tạo hay ghi đè cơ sở mã.

? Would you like to initialize a new codebase, or overwrite an existing one?
Overwrite

Khi định cấu hình Hàm, bạn nên sử dụng các tệp mặc định và đảm bảo không ghi đè các tệp index.jspackage.json hiện có trong mẫu dự án.

? What language would you like to use to write Cloud Functions?
JavaScript

? Do you want to use ESLint to catch probable bugs and enforce style?
No

? File functions/package.json already exists. Overwrite?
No

? File functions/index.js already exists. Overwrite?
No

Nếu bạn đang khởi tạo lại dự án, hãy chọn No (Không) khi được hỏi xem bạn có muốn khởi tạo hay ghi đè các hàm/.gitignore hay không.

? File functions/.gitignore already exists. Overwrite?
No
? Do you want to install dependencies with npm now?
Yes

Cuối cùng, hãy định cấu hình chế độ thiết lập Lưu trữ để sử dụng thư mục public trong mã dự án và sử dụng tệp index.html hiện có. Chọn Không khi được yêu cầu sử dụng ESLint.

? What do you want to use as your public directory?
public

? Configure as a single-page app (rewrite all urls to /index.html)?
Yes

? Set up automatic builds and deploys with GitHub?
No

? File public/index.html already exists. Overwrite?
 No

Nếu ESLint vô tình được bật, bạn có thể tắt ESLint theo hai cách:

  1. Sử dụng giao diện người dùng, hãy chuyển đến thư mục ../functions trong dự án, chọn tệp .eslintrc.js ẩn rồi xoá tệp đó. Đừng nhầm lẫn với .eslintrc.json có tên tương tự.
  2. Sử dụng dòng lệnh:
    cd functions
    rm .eslintrc.js
    

Trong tệp washer-done/firebase.json, hãy hoàn tất mã bằng:

{
  "database": {
    "rules": "database.rules.json"
  },
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  },
    "headers": [{
      "source" : "**/*.@(js|html)",
      "headers" : [ {
        "key" : "Cache-Control",
        "value" : "max-age=0"
      } ]
    }],
  "functions": [
    {
      "source": "functions",
      "codebase": "default",
      "ignore": [
        "node_modules",
        ".git",
        "firebase-debug.log",
        "firebase-debug.*.log",
        "*.local"
      ]
    }
  ]
}

Triển khai lên Firebase

Giờ đây, 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 chạy ứng dụng lần đầu tiên.

firebase deploy

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

...

✔ Deploy complete!

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

Lệnh này triển khai một ứng dụng web cùng với một số Cloud Functions cho Firebase.

Mở Hosting URL (URL lưu trữ) trong trình duyệt (https://.web.app) để xem ứng dụng web. Bạn sẽ thấy giao diện sau:

5845443e94705557.png

Giao diện người dùng web này đại diện cho một nền tảng bên thứ ba để xem hoặc sửa đổi trạng thái thiết bị. Để bắt đầu điền thông tin thiết bị vào cơ sở dữ liệu, hãy nhấp vào CẬP NHẬT. Bạn sẽ không thấy thay đổi nào trên trang này, nhưng trạng thái hiện tại của máy giặt sẽ được lưu trữ trong cơ sở dữ liệu.

Bây giờ, bạn có thể kết nối dịch vụ đám mây mà bạn đã triển khai với Trợ lý Google bằng Google Home Developer Console.

Định cấu hình dự án trong Developer Console

Trên thẻ Develop (Phát triển), hãy thêm Display Name (Tên hiển thị) cho hoạt động tương tác. Tên này sẽ xuất hiện trong ứng dụng Google Home.

Thêm tên hiển thị

Trong phần Xây dựng thương hiệu ứng dụng, hãy tải tệp png lên cho biểu tượng ứng dụng, có kích thước 144 x 144 px và tên là .png.

Thêm biểu tượng ứng dụng

Để bật tính năng Liên kết tài khoản, hãy sử dụng các chế độ cài đặt liên kết tài khoản sau:

ID khách hàng

ABC123

Mật khẩu ứng dụng khách

DEF456

URL Uỷ quyền

https://us-central1-
.cloudfunctions.net/fakeauth

URL mã thông báo

https://us-central1-
.cloudfunctions.net/faketoken

Cập nhật URL liên kết tài khoản

Trong mục URL thực hiện trên đám mây, hãy nhập URL cho hàm trên đám mây của bạn để thực hiện các ý định về nhà thông minh.

https://us-central1--cloudfunctions.net/smarthome

Thêm URL hàm trên đám mây

Nhấp vào Lưu để lưu cấu hình dự án, sau đó nhấp vào Tiếp theo: Kiểm thử để bật tính năng kiểm thử trên dự án.

Kiểm thử tính năng tích hợp đám mây với đám mây

Giờ đây, bạn có thể bắt đầu triển khai các webhook cần thiết để kết nối trạng thái thiết bị với Trợ lý.

4. Tạo một vòng đệm

Giờ đây, khi đã định cấu hình chế độ tích hợp, bạn có thể thêm thiết bị và gửi dữ liệu. Dịch vụ đám mây của bạn cần xử lý các ý định sau:

  • Ý định SYNC xảy ra khi Trợ lý muốn biết người dùng đã kết nối thiết bị nào. Thông báo này được gửi đến dịch vụ của bạn khi người dùng liên kết một tài khoản. Bạn nên phản hồi bằng một tải trọng JSON của tất cả thiết bị của người dùng và chức năng của các thiết bị đó.
  • Ý định QUERY xảy ra khi Trợ lý muốn biết trạng thái hiện tại của một thiết bị. Bạn nên phản hồi bằng một tải trọng JSON có trạng thái của từng thiết bị được yêu cầu.
  • Ý định EXECUTE xảy ra khi Trợ lý muốn thay mặt người dùng kiểm soát một thiết bị. Bạn nên phản hồi bằng một tải trọng JSON có trạng thái thực thi của từng thiết bị được yêu cầu.
  • Ý định DISCONNECT xảy ra khi người dùng huỷ liên kết tài khoản của họ với Trợ lý. Bạn nên ngừng gửi sự kiện cho các thiết bị của người dùng này đến Trợ lý.

Bạn sẽ cập nhật các hàm mà bạn đã triển khai trước đó để xử lý các ý định này trong các phần sau.

Cập nhật phản hồi SYNC

Mở functions/index.js, chứa mã để phản hồi các yêu cầu của Trợ lý.

Bạn sẽ cần xử lý ý định SYNC bằng cách trả về siêu dữ liệu và chức năng của thiết bị. Cập nhật JSON trong mảng onSync để thêm thông tin về thiết bị và các đặc điểm được đề xuất cho máy giặt.

index.js

app.onSync((body) => {
  return {
    requestId: body.requestId,
    payload: {
      agentUserId: USER_ID,
      devices: [{
        id: 'washer',
        type: 'action.devices.types.WASHER',
        traits: [
          'action.devices.traits.OnOff',
          'action.devices.traits.StartStop',
          'action.devices.traits.RunCycle',
        ],
        name: {
          defaultNames: ['My Washer'],
          name: 'Washer',
          nicknames: ['Washer'],
        },
        deviceInfo: {
          manufacturer: 'Acme Co',
          model: 'acme-washer',
          hwVersion: '1.0',
          swVersion: '1.0.1',
        },
        willReportState: true,
        attributes: {
          pausable: true,
        },
      }],
    },
  };
});

Triển khai lên Firebase

Triển khai phương thức thực hiện trên đám mây đã cập nhật bằng Firebase CLI:

firebase deploy --only functions

Để kiểm thử tính năng tích hợp giữa các đám mây, bạn cần liên kết dự án của mình với một Tài khoản Google. Việc này cho phép kiểm thử thông qua các nền tảng Trợ lý Google và ứng dụng Google Home đã đăng nhập vào cùng một tài khoản.

  1. Trên điện thoại, hãy mở phần cài đặt Trợ lý Google. Xin lưu ý rằng bạn phải đăng nhập bằng chính tài khoản mà bạn dùng trong Search Console.
  2. Chuyển đến phần Trợ lý Google > Cài đặt > Điều khiển nhà (trong phần Trợ lý).
  3. Nhấp vào biểu tượng tìm kiếm ở phía trên bên phải.
  4. Tìm ứng dụng kiểm thử bằng tiền tố [test] để tìm ứng dụng kiểm thử cụ thể.
  5. Chọn mục đó. Sau đó, Trợ lý Google sẽ xác thực bằng dịch vụ của bạn và gửi yêu cầu SYNC, yêu cầu dịch vụ của bạn cung cấp danh sách thiết bị cho người dùng.

Mở ứng dụng Google Home và xác minh rằng bạn có thể thấy thiết bị máy giặt.

ae252220753726f6.png

5. Xử lý các lệnh và truy vấn

Giờ đây, khi dịch vụ đám mây của bạn báo cáo chính xác thiết bị máy giặt cho Google, bạn cần thêm khả năng yêu cầu trạng thái thiết bị và gửi lệnh.

Xử lý ý định QUERY

Ý định QUERY bao gồm một nhóm thiết bị. Đối với mỗi thiết bị, bạn nên trả lời bằng trạng thái hiện tại của thiết bị đó.

Trong functions/index.js, hãy chỉnh sửa trình xử lý QUERY để xử lý danh sách thiết bị mục tiêu có trong yêu cầu ý định.

index.js

app.onQuery(async (body) => {
  const {requestId} = body;
  const payload = {
    devices: {},
  };
  const queryPromises = [];
  const intent = body.inputs[0];
  for (const device of intent.payload.devices) {
    const deviceId = device.id;
    queryPromises.push(queryDevice(deviceId)
        .then((data) => {
        // Add response to device payload
          payload.devices[deviceId] = data;
        }
        ));
  }
  // Wait for all promises to resolve
  await Promise.all(queryPromises);
  return {
    requestId: requestId,
    payload: payload,
  };
});

Đối với mỗi thiết bị có trong yêu cầu, hãy trả về trạng thái hiện tại được lưu trữ trong Cơ sở dữ liệu theo thời gian thực. Cập nhật hàm queryFirebasequeryDevice để trả về dữ liệu trạng thái của máy giặt.

index.js

const queryFirebase = async (deviceId) => {
  const snapshot = await firebaseRef.child(deviceId).once('value');
  const snapshotVal = snapshot.val();
  return {
    on: snapshotVal.OnOff.on,
    isPaused: snapshotVal.StartStop.isPaused,
    isRunning: snapshotVal.StartStop.isRunning,
  };
};

const queryDevice = async (deviceId) => {
  const data = await queryFirebase(deviceId);
  return {
    on: data.on,
    isPaused: data.isPaused,
    isRunning: data.isRunning,
    currentRunCycle: [{
      currentCycle: 'rinse',
      nextCycle: 'spin',
      lang: 'en',
    }],
    currentTotalRemainingTime: 1212,
    currentCycleRemainingTime: 301,
  };
};

Xử lý ý định EXECUTE

Ý định EXECUTE xử lý các lệnh để cập nhật trạng thái thiết bị. Phản hồi trả về trạng thái của từng lệnh (ví dụ: SUCCESS, ERROR hoặc PENDING) và trạng thái thiết bị mới.

Trong functions/index.js, hãy chỉnh sửa trình xử lý EXECUTE để xử lý danh sách các đặc điểm cần cập nhật và tập hợp thiết bị mục tiêu cho mỗi lệnh:

index.js

app.onExecute(async (body) => {
  const {requestId} = body;
  // Execution results are grouped by status
  const result = {
    ids: [],
    status: 'SUCCESS',
    states: {
      online: true,
    },
  };

  const executePromises = [];
  const intent = body.inputs[0];
  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(() => functions.logger.error('EXECUTE', device.id)));
      }
    }
  }

  await Promise.all(executePromises);
  return {
    requestId: requestId,
    payload: {
      commands: [result],
    },
  };
});

Đối với mỗi lệnh và thiết bị mục tiêu, hãy cập nhật các giá trị trong Cơ sở dữ liệu theo thời gian thực tương ứng với đặc điểm được yêu cầu. Sửa đổi hàm updateDevice để cập nhật tệp tham chiếu Firebase thích hợp và trả về trạng thái thiết bị đã cập nhật.

index.js

const updateDevice = async (execution, deviceId) => {
  const {params, command} = execution;
  let state; let ref;
  switch (command) {
    case 'action.devices.commands.OnOff':
      state = {on: params.on};
      ref = firebaseRef.child(deviceId).child('OnOff');
      break;
    case 'action.devices.commands.StartStop':
      state = params.start
      ? {isRunning: true, isPaused: false}
      : {isRunning: false, isPaused: false};
      ref = firebaseRef.child(deviceId).child('StartStop');
      break;
    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 = firebaseRef.child(deviceId).child('StartStop');
      break;
  }

  return ref.update(state)
      .then(() => state);
};

6. Kiểm thử quá trình tích hợp

Sau khi triển khai cả ba ý định, bạn có thể kiểm thử để đảm bảo rằng tính năng tích hợp của mình điều khiển được máy giặt.

Triển khai lên Firebase

Triển khai phương thức thực hiện trên đám mây đã cập nhật bằng Firebase CLI:

firebase deploy --only functions

Kiểm thử máy giặt

Bây giờ, bạn có thể thấy giá trị thay đổi khi thử bất kỳ lệnh thoại nào sau đây thông qua điện thoại:

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

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

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

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

"Này 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?"

Bạn có thể xem các truy vấn và lệnh này trong nhật ký xuất hiện trong hàm của bạn trong phần Hàm của Bảng điều khiển Firebase. Tìm hiểu thêm về nhật ký Firebase trong phần Viết và xem nhật ký.

Bạn cũng có thể tìm thấy các truy vấn và lệnh này trong Google Cloud Console bằng cách chuyển đến phần Logging (Ghi nhật ký) > Logs Explorer (Trình khám phá nhật ký). Tìm hiểu thêm về tính năng ghi nhật ký của Google Cloud trong bài viết Truy cập nhật ký sự kiện bằng tính năng Ghi nhật ký trên đám mây.

7. Báo cáo nội dung cập nhật cho Google

Bạn đã tích hợp đầy đủ dịch vụ đám mây với ý định nhà thông minh, cho phép người dùng kiểm soát và truy vấn trạng thái hiện tại của thiết bị. Tuy nhiên, cách triển khai này vẫn thiếu một cách để dịch vụ của bạn chủ động gửi thông tin sự kiện (chẳng hạn như thay đổi trạng thái hoặc trạng thái hiện diện của thiết bị) đến Trợ lý.

Với tính năng Yêu cầu đồng bộ hoá, bạn có thể kích hoạt một yêu cầu đồng bộ hoá mới khi người dùng thêm hoặc xoá thiết bị hoặc khi chức năng của thiết bị thay đổi. Với tính năng Báo cáo trạng thái, dịch vụ đám mây của bạn có thể chủ động gửi trạng thái của thiết bị đến Biểu đồ nhà khi người dùng thay đổi trạng thái thiết bị theo cách thủ công (ví dụ: bật công tắc đèn) hoặc thay đổi trạng thái bằng một dịch vụ khác.

Trong phần này, bạn sẽ thêm mã để gọi các phương thức này từ ứng dụng web giao diện người dùng.

Bật HomeGraph API

HomeGraph API cho phép lưu trữ và truy vấn các thiết bị cũng như trạng thái của các thiết bị đó trong Biểu đồ nhà của người dùng. Để sử dụng API này, trước tiên, bạn phải mở Google Cloud Console và bật HomeGraph API.

Trong Google Cloud Console, hãy nhớ chọn dự án phù hợp với hoạt động tích hợp của bạn <project-id>.. Sau đó, trong màn hình Thư viện API cho API HomeGraph, hãy nhấp vào Bật.

ee198858a6eac112.png

Bật Trạng thái báo cáo

Các hoạt động ghi vào Cơ sở dữ liệu theo thời gian thực sẽ kích hoạt hàm reportstate trong dự án khởi động. Cập nhật hàm reportstate trong functions/index.js để ghi lại dữ liệu được ghi vào cơ sở dữ liệu và đăng dữ liệu đó lên Biểu đồ trang chủ thông qua Trạng thái báo cáo.

index.js

exports.reportstate = functions.database.ref('{deviceId}').onWrite(
    async (change, context) => {
      functions.logger.info('Firebase write event triggered Report State');
      const snapshot = change.after.val();

      const requestBody = {
        requestId: 'ff36a3cc', /* Any unique ID */
        agentUserId: USER_ID,
        payload: {
          devices: {
            states: {
              /* Report the current state of our washer */
              [context.params.deviceId]: {
                on: snapshot.OnOff.on,
                isPaused: snapshot.StartStop.isPaused,
                isRunning: snapshot.StartStop.isRunning,
              },
            },
          },
        },
      };

      const res = await homegraph.devices.reportStateAndNotification({
        requestBody,
      });
      functions.logger.info('Report state response:', res.status, res.data);
    });

Bật tính năng Đồng bộ hoá yêu cầu

Thao tác làm mới biểu tượng trong giao diện người dùng web phía trước sẽ kích hoạt hàm requestsync trong dự án khởi động. Triển khai hàm requestsync trong functions/index.js để gọi API HomeGraph.

index.js

exports.requestsync = functions.https.onRequest(async (request, response) => {
  response.set('Access-Control-Allow-Origin', '*');
  functions.logger.info(`Request SYNC for user ${USER_ID}`);
  try {
    const res = await homegraph.devices.requestSync({
      requestBody: {
        agentUserId: USER_ID,
      },
    });
    functions.logger.info('Request sync response:', res.status, res.data);
    response.json(res.data);
  } catch (err) {
    functions.logger.error(err);
    response.status(500).send(`Error requesting sync: ${err}`);
  }
});

Triển khai lên Firebase

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

Kiểm tra kết quả triển khai

Nhấp vào nút Làm mới ae8d3b25777a5e30.png trong giao diện người dùng web và xác minh rằng bạn thấy yêu cầu đồng bộ hoá trong nhật ký bảng điều khiển Firebase.

Tiếp theo, hãy điều chỉnh các thuộc tính của thiết bị máy giặt trong giao diện người dùng web phía trước rồi nhấp vào Cập nhật. Xác minh rằng bạn có thể thấy thay đổi trạng thái được báo cáo cho Google trong nhật ký bảng điều khiển Firebase.

8. Xin chúc mừng

674c4f4392e98c1.png

Xin chúc mừng! Bạn đã tích hợp thành công Trợ lý với một dịch vụ đám mây của thiết bị bằng cách sử dụng tính năng tích hợp đám mây với đám mây.

Tìm hiểu thêm

Sau đây là một số ý tưởng mà bạn có thể triển khai để tìm hiểu sâu hơn:

Bạn cũng có thể tìm hiểu thêm về cách kiểm thử và gửi một công cụ tích hợp để xem xét, bao gồm cả quy trình chứng nhận để phát hành công cụ tích hợp cho người dùng.