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à 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ý.

79266e5f45e6ae20.gif

Các Hành động trong nhà thông minh dựa vào Home Graph để cung cấp dữ liệu theo bối cảnh về nhà và các thiết bị trong đó, từ đó tạo ra bản đồ hợp lý về nhà. Bối cảnh đó giúp Trợ lý hiểu được yêu cầu của người dùng một cách tự nhiên hơn so với vị trí của họ trong nhà. Ví dụ: Home Graph có thể lưu trữ khái niệm về 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ẽ xuất bản một dịch vụ đám mây giúp quản lý máy giặt thông minh ảo, sau đó tạo một Hành động nhà thông minh và kết nối thiết bị đó 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 nhà thông minh
  • Cách kết nối dịch vụ của bạn với Trợ lý
  • Cách xuất bản các thay đổi về trạng thái thiết bị lên 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 với Google. Trợ lý Google cần dữ liệu này để hoạt động bình thường; tuy nhiên, yêu cầu chia sẻ dữ liệu không chỉ áp dụ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ó tài khoản. Bạn có thể 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 các nút chuyển bật/tắt sau đang bật:

  • Web và Hoạt động ứ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ị
  • Giọng nói và Hoạt động âm thanh

Tạo một dự án Actions

  1. Truy cập vào Actions on Google Developer Console.
  2. Nhấp vào New Project (Dự án mới), nhập tên cho dự án rồi nhấp vào TẠO DỰ ÁN.

3d6b68ca79afd54c.png.

Chọn ứng dụng Nhà thông minh

Trên màn hình Tổng quan trong Bảng điều khiển Actions, hãy chọn Nhà thông minh.

2fa4988f44f8914b.png.

Chọn thẻ trải nghiệm Nhà thông minh, nhấp vào Bắt đầu xây dựng. Sau đó, bạn sẽ được chuyển đến bảng điều khiển dự án.

Cài đặt Firebase CLI

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

Để cài đặt CLI, hãy chạy lệnh npm sau đây trên cửa sổ dòng lệnh:

npm install -g firebase-tools

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

firebase --version

Uỷ quyền giao diện dòng lệnh (CLI) của Firebase 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 đầu

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

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-washer.git

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

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

  • public: Giao diện người dùng từ giao diện người dùng giúp bạn 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 hoàn chỉnh, giúp quản lý hệ thống rửa thông minh bằng Cloud Functions cho Firebase và Cơ sở dữ liệu theo thời gian thực của Firebase.

Kết nối với Firebase

Chuyển đến thư mục washer-start, sau đó thiết lập Giao diện dòng lệnh (CLI) của Firebase bằng dự án Actions:

cd washer-start
firebase use <project-id>

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

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

firebase init

Chọn các tính năng CLI, Cơ sở dữ liệu theo thời gian thực, Hàm và tính năng Lưu trữ bao gồm 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 khởi đầu, hãy chọn tệp mặc định cho các quy tắc bảo mật và đảm bảo rằng 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 động lại dự án, hãy chọn Ghi đè khi được hỏi bạn muốn khởi chạy 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 bạn 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 động lại dự án, hãy chọn No (Không) khi được hỏi bạn có muốn khởi chạy 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, có hai phương pháp có sẵn để tắt:

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

Để đảm bảo rằng bạn có một cấu hình Firebase chính xác và hoàn chỉnh, hãy sao chép tệp firebase.json từ thư mục washer-done vào thư mục washer-start, ghi đè lên tệp đó trong washer-start.

Trong thư mục washer-start:

cp -vp ../washer-done/firebase.json .

Triển khai cho Firebase

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

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>.web.app

Lệnh này sẽ triển khai một ứng dụng web cùng với một số Cloud Functions for Firebase (Chức năng đám mây dành cho Firebase).

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

5845443e94705557.pngS

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 của bạn, 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.

Giờ đã đến lúc kết nối dịch vụ đám mây bạn đã triển khai với Trợ lý Google bằng bảng điều khiển Actions.

Định cấu hình dự án Bảng điều khiển Actions

Trong Tổng quan > Xây dựng hành động của bạn, chọn Add Action(s) (Thêm hành động). Nhập URL của hàm trên đám mây cung cấp phương thức thực hiện cho các ý định trong nhà thông minh, rồi nhấp vào Lưu.

https://us-central1-<project-id>.cloudfunctions.net/smarthome

9d7b223427f587ca.png.

Trên trang Phát triển > Thẻ Lời gọi, thêm Tên hiển thị cho Hành động của bạn rồi nhấp vào Lưu. Tên này sẽ xuất hiện trong ứng dụng Google Home.

774d0c40c351c7da.pngS

a8c4673eb11d76ee.png

Để bật tính năng Liên kết tài khoản, hãy chọn phần Phát triển > Liên kết tài khoản trong bảng điều hướng bên trái. Hãy sử dụng các chế độ cài đặt liên kết tài khoản sau:

Client ID

ABC123

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

DEF456

URL Uỷ quyền

https://us-central1-<project-id>.cloudfunctions.net/fakeauth

URL mã thông báo

https://us-central1-<project-id>.cloudfunctions.net/faketoken

9730d20b90bcc038.pngS

Nhấp vào Lưu để lưu cấu hình liên kết tài khoản, sau đó nhấp vào Thử nghiệm để bật tính năng thử nghiệm trên dự án.

ee0547f05b5efd98.png

Bạn sẽ được chuyển hướng đến Trình mô phỏng. Nếu bạn không thấy thông báo "Kiểm thử ngay đã bật", hãy nhấp vào Đặt lại quy trình kiểm tra để xác minh rằng tính năng kiểm thử đã được bật.

d0495810dbadf059.png

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áy giặt

Sau khi đã định cấu hình cho Hành động của mình, 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 với những thiết bị nào. Thông tin này sẽ đượ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 tải trọng JSON của tất cả thiết bị của người dùng và khả 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 tải trọng JSON cho biết 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 điều khiển một thiết bị. Bạn nên phản hồi bằng tải trọng JSON kèm theo 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ọ khỏi Trợ lý. Bạn nên dừng gửi sự kiện trên thiết bị của người dùng này tới Trợ lý.

Bạn sẽ cập nhật các hàm mà mình đã triển khai trước đó để xử lý những ý đị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ý một ý định SYNC bằng cách trả về siêu dữ liệu và các chức năng của thiết bị. Cập nhật JSON trong mảng onSync để thêm thông tin thiết bị và các đặc điểm nên dùng cho máy giặt quần áo.

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 cho Firebase

Triển khai phương thức thực hiện đã cập nhật trên đám mây bằng giao diện dòng lệnh (CLI) của Firebase:

firebase deploy --only functions

Để thử nghiệm Hành động trong nhà thông minh, bạn cần liên kết dự án của mình với một Tài khoản Google. Điều này cho phép kiểm tra thông qua các nền tảng của 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 cần đăng nhập bằng chính tài khoản như trong bảng điều khiển.
  2. Chuyển đến Trợ lý Google > Cài đặt > Điều khiển nhà (trong 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 kiếm ứng dụng kiểm thử của bạn 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 với dịch vụ của bạn và gửi một yêu cầu SYNC, đề nghị 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 nhận rằng bạn có thể nhìn thấy thiết bị máy giặt của mình.

ae252220753726f6.png

5. Xử lý 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 tập hợp thiết bị. Đối với mỗi thiết bị, bạn nên phản hồ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 các 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 các 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 mới của thiết bị.

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 các 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 trait đượ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ử Hành động

Sau khi triển khai cả 3 ý định, bạn có thể kiểm thử để đảm bảo rằng Hành động của mình điều khiển máy giặt.

Triển khai cho Firebase

Triển khai phương thức thực hiện đã cập nhật trên đám mây bằng giao diện dòng lệnh (CLI) của Firebase:

firebase deploy --only functions

Kiểm tra máy giặt

Giờ đây, bạn có thể thấy giá trị thay đổi khi thử dùng bất kỳ lệnh thoại nào sau đây qua điện thoại của mình:

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

"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 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?"

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 tại mục Hàm trên Bảng điều khiển của Firebase. Tìm hiểu thêm về nhật ký Firebase trong bài viết Ghi 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 Ghi nhật ký > Trình khám phá nhật ký. Tìm hiểu thêm về tính năng ghi nhật ký trên 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 của mình với các ý định nhà thông minh, cho phép người dùng kiểm soát và truy vấn về trạng thái hiện tại của thiết bị của họ. Tuy nhiên, trong quy trình triển khai, dịch vụ của bạn vẫn chưa có cách để chủ động gửi thông tin sự kiện (chẳng hạn như các thay đổi về sự hiện diện hoặc trạng thái của thiết bị) cho 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 khả năng của thiết bị thay đổi. Với Trạng thái báo cáo, 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 Home Graph khi người dùng thay đổi trạng thái thiết bị (ví dụ như 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 API HomeGraph

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 Home Graph của người dùng. Để sử dụng API này, trước tiên bạn phải mở bảng điều khiển Google Cloud và bật API HomeGraph.

Trong bảng điều khiển Google Cloud, hãy nhớ chọn dự án phù hợp với Actions <project-id>. của bạn. Sau đó, trên màn hình Thư viện API cho HomeGraph API, nhấp vào Enable (Bật).

ee198858a6eac112.png

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

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 đầu. Cập nhật hàm reportstate trong functions/index.js để thu thập dữ liệu được ghi vào cơ sở dữ liệu và đăng dữ liệu đó lên Home Graph 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

Làm mới biểu tượng trong giao diện người dùng web của giao diện người dùng sẽ kích hoạt hàm requestsync trong dự án khởi đầu. 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 cho 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 Refresh (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ý của bảng điều khiển của Firebase.

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

8. Xin chúc mừng

674c4f4392e98c1.pngS

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 trên thiết bị bằng các Hành động trong nhà thông minh.

Tìm hiểu thêm

Dưới đây là một số ý tưởng 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ề 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.