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 của vạn vật (IoT), bạn có thể tạo Hành động trong nhà thông minh để người dùng có thể điều khiển thiết bị của họ thông qua các tính năng điều khiển cảm ứng trong ứng dụng Google Home và ra lệnh thoại bằng Trợ lý.

79266e5f45e6ae20.gif

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 nhà, từ đó tạo ra bản đồ logic về ngôi nhà. Bối cảnh đó giúp Trợ lý hiểu rõ hơn các yêu cầu của người dùng liên quan đến 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 các nhà sản xuất khác nhau, 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 giúp quản lý máy giặt thông minh ảo, sau đó tạo một Hành động trong nhà thông minh và kết nối 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 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 các 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 có 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ỉ 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ể 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.

Mở trang Kiểm soát hoạt động của 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 sau đây đã được bật:

  • 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 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 rồi 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 Firebase (CLI) sẽ cho phép bạn phân phát các ứng dụng web trên máy tính và triển khai ứng dụng web để lưu trữ Firebase.

Để cài đặt CLI, hãy chạy lệnh npm sau đây từ 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:

firebase --version

Uỷ quyền 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 đầu

Bây giờ, sau 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 cho lớp học lập trình này xuống 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: Một giao diện người dùng giao diện người dùng giúp dễ dàng điều khiển 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 đủ giúp quản lý máy giặt thông minh bằng Chức năng đám mây 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 Hành động của bạn:

cd washer-start
firebase use <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 theo thời gian thực, Hàm và tính năng Lưu trữ bao gồm cả 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

Do 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 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 chạy lại dự án, hãy chọn Ghi đè khi được hỏi xem 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 tạo lại dự án, hãy chọn No (Không) khi được hỏi bạn muốn khởi chạy hay ghi đè hàm/.gitignore.

? 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 phần 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 để vô hiệu hoá ESLint:

  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 thuộc tính 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ó 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 app-done vào thư mục app-start, ghi đè tệp trong app-start.

Trong thư mục app-start:

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

Triển khai cho Firebase

Bây giờ, khi đã cài đặt các phần phụ thuộc và định cấu hình dự án, bạn có thể 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ố Chức năng đám mây 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 nền tảng của 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ị cho 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 bất kỳ thay đổi nào trên trang. Tuy nhiên, 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ờ là lúc kết nối dịch vụ đám mây mà 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 trên bảng điều khiển Actions

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

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

9d7b223427f587ca.png.

Trên thẻ Develop > Invocation (Phát triển > Gọi), thêm Display Name (Tên hiển thị) cho Hành động của bạn và nhấp vào Save (Lưu). Tên này sẽ xuất hiện trong ứng dụng Google Home.

774d0c40c351c7da.png.

a8c4673eb11d76ee.png

Để bật tính năng Liên kết tài khoản, hãy chọn tuỳ chọn Phát triển > Liên kết tài khoản trong bảng điều hướng bên trái. 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 Save (Lưu) để lưu cấu hình liên kết tài khoản, sau đó nhấp vào Test (Kiểm thử) để bật tính năng kiểm thử 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 "Thử nghiệm hiện đã được bật", hãy nhấp vào Đặt lại thử nghiệm để xác minh rằng hoạt động thử nghiệm đã được bật.

d0495810dbadf059.png

Bây giờ, 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

Bây giờ, bạn đã định cấu hình 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 đượ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 cách tải trọng JSON chứa tất cả thiết bị của người dùng và khả năng của họ.
  • Ý đị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 kèm theo 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 một 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 xuất hiện 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 ngừng gửi sự kiện trên thiết bị của người dùng này cho Trợ lý.

Bạn sẽ cập nhật các hàm mà mình đã triển khai trước đây để xử lý các ý định này trong những 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 thiết bị và các đặc điểm được đề xuất 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. Việc này cho phép thử nghiệm trên các nền tảng của Trợ lý Google và ứng dụng Google Home mà bạn đã đă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 như trong bảng điều khiển.
  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 thử nghiệm bằng tiền tố [test] để tìm ứng dụng thử nghiệm 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 rồi 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 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 tính 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 với 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 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 trait 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 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 cập nhật của thiết bị.

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 = {isRunning: params.start};
      ref = firebaseRef.child(deviceId).child('StartStop');
      break;
    case 'action.devices.commands.PauseUnpause':
      state = {isPaused: params.pause};
      ref = firebaseRef.child(deviceId).child('StartStop');
      break;
  }

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

6. Kiểm thử Hành động của bạn

Sau khi triển khai cả 3 ý định, bạn có thể kiểm tra để đả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ử bất kỳ lệnh thoại nào sau đây qua điện thoại:

"Ok Google, bật máy giặt của 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ể đặt câu hỏi để biết trạng thái hiện tại của máy giặt.

"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 thực hiện chu kỳ nào?"

Bạn có thể xem những truy vấn và lệnh này trong nhật ký xuất hiện trong hàm của bạn ở phần 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 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 > Logs Explorer (Trình khám phá nhật ký). Tìm hiểu thêm về cách ghi nhật ký 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 trong nhà thông minh, giú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, trong quá trình triển khai, dịch vụ của bạn vẫn chưa chủ động gửi thông tin về 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 chức 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ụ: 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 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 khớp với Hành động <project-id>. của bạn. Sau đó, trên 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

Việc 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 ban đầ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 Yêu cầu đồng bộ hoá

Việc làm mới biểu tượng trong giao diện người dùng web 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 HomeGraph API.

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 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 của Firebase.

Tiếp theo, hãy đ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 thay đổi về trạng thái được báo cáo cho Google trong nhật ký bảng điều khiển của 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 trên thiết bị bằng Hành động trong nhà thông minh.

Tìm hiểu thêm

Sau đây là một số ý tưởng mà bạn có thể triển khai để hiểu rõ 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 để Google xem xét, bao gồm cả quy trình chứng nhận để xuất bản Hành động đó cho người dùng.