Bật phương thức thực hiện đơn hàng tại địa phương cho các chế độ tích hợp đám mây với đám mây

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

Tính năng tích hợp nhà thông minh cho phép Trợ lý Google điều khiển các thiết bị đã kết nối trong nhà của người dùng. Để xây dựng một chế độ tích hợp Đám mây với đám mây, bạn cần cung cấp một điểm cuối webhook trên đám mây có thể xử lý ý định cho nhà thông minh. Ví dụ: khi người dùng nói "Ok Google, bật đèn", Trợ lý sẽ gửi lệnh đến dịch vụ thực hiện trên đám mây để cập nhật trạng thái của thiết bị.

SDK Local Home giúp nâng cao hiệu quả tích hợp nhà thông minh bằng cách thêm một đường dẫn cục bộ để định tuyến ý định cho nhà thông minh trực tiếp đến thiết bị Google Home. Điều này giúp tăng độ tin cậy và giảm độ trễ trong quá trình xử lý lệnh của người dùng. Thư viện này cho phép bạn viết và triển khai một ứng dụng thực hiện cục bộ bằng TypeScript hoặc JavaScript để xác định các thiết bị và thực thi các lệnh trên mọi loa thông minh Google Home hoặc màn hình thông minh Google Nest. Sau đó, ứng dụng của bạn sẽ giao tiếp trực tiếp với các thiết bị thông minh hiện có của người dùng qua mạng cục bộ bằng cách sử dụng các giao thức tiêu chuẩn hiện có để thực hiện các lệnh.

72ffb320986092c.png

Đ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 tính năng tích hợp nhà thông minh đã tạo trước đó với Firebase, sau đó áp dụng cấu hình quét trong Developer Console (Bảng điều khiển dành cho nhà phát triển) và tạo một ứng dụng cục bộ bằng TypeScript để gửi các lệnh được viết bằng Node.js đến một thiết bị máy giặt ảo.

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

  • Cách bật và định cấu hình phương thức thực hiện đơn hàng tại địa phương trong Play Console.
  • Cách sử dụng SDK Local Home để viết ứng dụng thực hiện đơn hàng tại địa phương.
  • Cách gỡ lỗi ứng dụng thực hiện đơn hàng cục bộ được tải trên loa Google Home hoặc màn hình thông minh Google Nest.

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

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 khớp với <project-id>. của chế độ tích hợp. Sau đó, trong màn hình Thư viện API cho API HomeGraph, hãy nhấp vào Bật.

5SVCzM8IZLi_9DV8M0nEklv16NXkpvM0bIzQK2hSyKyvnFHBxPOz90rbr72ayxzmxd5aNROOqC_Cp4outbdlwJdObDs0DIE_8vYzw6dovoVrP9IZWlWsZxDS7UHOi1jiRbDMG8MqUA

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 khởi động để xác minh 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:

...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-local.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 web phía trước để điều khiển và giám sát máy giặt thông minh
  • functions – Các hàm trên đám mây triển khai phương thức thực hiện trên đám mây cho hoạt động tích hợp Từ đám mây sang đám mây
  • local – Dự án ứng dụng thực hiện đơn hàng tại địa phương dạng khung có trình xử lý ý định được tạo bản nháp trong index.ts

Phương thức thực hiện trên đám mây được cung cấp bao gồm các hàm sau trong index.js:

  • fakeauth – Điểm cuối uỷ quyền để liên kết tài khoản
  • faketoken – Điểm cuối mã thông báo để liên kết tài khoản
  • smarthome – Điểm cuối thực hiện ý định cho nhà thông minh
  • reportstate – Gọi HomeGraph API khi trạng thái thiết bị thay đổi
  • updateDevice – Điểm cuối mà thiết bị ảo sử dụng để kích hoạt Trạng thái báo cáo

Kết nối với Firebase

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

cd app-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 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
    

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

Trong thư mục washer-start:

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

Triển khai lên Firebase

Giờ đây, bạn đã 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

Bạn sẽ thấy kết quả sau trên bảng điều khiển:

...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/<project-id>/overview
Hosting URL: https://<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://<project-id>.web.app) để xem ứng dụng web. Bạn sẽ thấy giao diện sau:

L60eA7MOnPmbBMl2XMipT9MdnP-RaVjyjf0Y93Y1b7mEyIsqZrrwczE7D3RQISRs-iusL1g4XbNmGhuA6-5sLcWefnczwNJEPfNLtwBsO4Tb9YvcAZBI6_rX19z8rxbik9Vq8F2fwg

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 Developer Console (Bảng điều khiển dành cho nhà phát triển).

Đị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 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ý.

Để 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.

XcWmBVamBZtPfOFqtsr5I38stPWTqDcMfQwbBjetBgxt0FCjEs285pa9K3QXSASptw0KYN2G8yfkT0-xg664V4PjqMreDDs-HPegHjOc4EVtReYPu-WKZyygq9Xmkf8X8z9177nBjQ

Xác minh rằng bạn có thể điều khiển máy giặt bằng lệnh thoại trong ứng dụng Google Home. Bạn cũng sẽ thấy trạng thái thiết bị thay đổi trong giao diện người dùng web giao diện người dùng phía trước của quy trình thực hiện trên đám mây.

Giờ đây, bạn có thể bắt đầu thêm phương thức thực hiện đơn hàng tại địa phương vào quy trình tích hợp.

4. Cập nhật phương thức thực hiện trên đám mây

Để hỗ trợ phương thức thực hiện đơn hàng tại địa phương, bạn cần thêm một trường mới cho mỗi thiết bị có tên là otherDeviceIds vào phản hồi SYNC trên đám mây, trong đó chứa giá trị nhận dạng duy nhất tại địa phương cho thiết bị. Trường này cũng cho biết khả năng kiểm soát thiết bị đó trên máy.

Thêm trường otherDeviceIds vào phản hồi SYNC như trong đoạn mã sau:

functions/index.js

app.onSync((body) => {
  return {
    requestId: body.requestId,
    payload: {
      agentUserId: '123',
      devices: [{
        id: 'washer',
        type: 'action.devices.types.WASHER',
        traits: [ ... ],
        name: { ... },
        deviceInfo: { ... },
        willReportState: true,
        attributes: {
          pausable: true,
        },
        otherDeviceIds: [{
          deviceId: 'deviceid123',
        }],
      }],
    },
  };
});

Triển khai dự án đã cập nhật lên Firebase:

firebase deploy --only functions

Sau khi triển khai xong, hãy chuyển đến giao diện người dùng web rồi nhấp vào nút Refresh (Làm mới) ae8d3b25777a5e30.png trên thanh công cụ. Thao tác này sẽ kích hoạt thao tác Yêu cầu đồng bộ hoá để Trợ lý nhận được dữ liệu phản hồi SYNC đã cập nhật.

bf4f6a866160a982.png

5. Định cấu hình phương thức thực hiện đơn hàng tại địa phương

Trong phần này, bạn sẽ thêm các tuỳ chọn cấu hình cần thiết cho phương thức thực hiện đơn hàng tại địa phương vào quy trình tích hợp từ đám mây đến đám mây. Trong quá trình phát triển, bạn sẽ phát hành ứng dụng thực hiện đơn hàng cục bộ lên Firebase Hosting để thiết bị Google Home có thể truy cập và tải ứng dụng đó xuống.

Trong Google Home Developer Console (Bảng điều khiển dành cho nhà phát triển Google Home), hãy chuyển đến Project > Cloud-to-cloud (Dự án > Đám mây với đám mây) ở bên trái màn hình, sau đó chọn Edit (Chỉnh sửa) để tích hợp. Trên trang Thiết lập và định cấu hình, hãy di chuyển đến mục Thực hiện đơn hàng tại địa phương rồi bật chế độ cài đặt này. Nhập URL sau vào từng trường URL kiểm thử, chèn mã dự án của bạn rồi nhấp vào Lưu:

https://<project-id>.web.app/local-home/index.html

local-fulfillment.png

Tiếp theo, chúng ta cần xác định cách thiết bị Google Home khám phá các thiết bị thông minh cục bộ. Nền tảng Nhà cục bộ hỗ trợ một số giao thức để khám phá thiết bị, bao gồm mDNS, UPnP và truyền tin UDP. Bạn sẽ sử dụng tính năng truyền tin UDP để khám phá máy giặt thông minh.

Nhấp vào + Thêm cấu hình quét trong phần Khám phá thiết bị để thêm cấu hình quét mới. Chọn UDP làm giao thức và điền các thuộc tính sau:

Trường

Nội dung mô tả

Giá trị đề xuất

Địa chỉ khám phá

Địa chỉ khám phá UDP

255.255.255.255

Cổng truyền tin

Cổng mà Google Home gửi thông báo truyền tin UDP

3311

Cổng nghe

Cổng mà Google Home nghe để nhận phản hồi

3312

Gói khám phá

Tải trọng dữ liệu truyền tin UDP

48656c6c6f4c6f63616c486f6d6553444b

device-discovery.png

Cuối cùng, hãy nhấp vào Lưu ở cuối cửa sổ để xuất bản các thay đổi.

6. Triển khai phương thức thực hiện tại địa phương

Bạn sẽ phát triển ứng dụng thực hiện đơn hàng cục bộ trong TypeScript bằng cách sử dụng gói nhập liệu của SDK Nhà riêng cục bộ. Hãy xem khung được cung cấp trong dự án khởi động:

local/index.ts

/// <reference types="@google/local-home-sdk" />

import App = smarthome.App;
import Constants = smarthome.Constants;
import DataFlow = smarthome.DataFlow;
import Execute = smarthome.Execute;
import Intents = smarthome.Intents;
import IntentFlow = smarthome.IntentFlow;

...

class LocalExecutionApp {

  constructor(private readonly app: App) { }

  identifyHandler(request: IntentFlow.IdentifyRequest):
      Promise<IntentFlow.IdentifyResponse> {
    // TODO: Implement device identification
  }

  executeHandler(request: IntentFlow.ExecuteRequest):
      Promise<IntentFlow.ExecuteResponse> {
    // TODO: Implement local fulfillment
  }

  ...
}

const localHomeSdk = new App('1.0.0');
const localApp = new LocalExecutionApp(localHomeSdk);
localHomeSdk
  .onIdentify(localApp.identifyHandler.bind(localApp))
  .onExecute(localApp.executeHandler.bind(localApp))
  .listen()
  .then(() => console.log('Ready'))
  .catch((e: Error) => console.error(e));

Thành phần cốt lõi của phương thức thực hiện tại địa phương là lớp smarthome.App. Dự án khởi động đính kèm trình xử lý cho ý định IDENTIFYEXECUTE, sau đó gọi phương thức listen() để thông báo cho SDK Local Home rằng ứng dụng đã sẵn sàng.

Thêm trình xử lý IDENTIFY

SDK Home cục bộ kích hoạt trình xử lý IDENTIFY khi thiết bị Google Home phát hiện các thiết bị chưa xác minh trên mạng cục bộ dựa trên cấu hình quét được cung cấp trong Developer Console.

Trong khi đó, nền tảng này sẽ gọi identifyHandler bằng dữ liệu quét thu được khi Google phát hiện một thiết bị phù hợp. Trong ứng dụng, quá trình quét diễn ra bằng cách sử dụng thông báo truyền tin UDP và dữ liệu quét được cung cấp cho trình xử lý IDENTIFY bao gồm cả tải trọng phản hồi do thiết bị cục bộ gửi.

Trình xử lý trả về một thực thể IdentifyResponse chứa giá trị nhận dạng duy nhất cho thiết bị cục bộ. Thêm mã sau vào phương thức identifyHandler để xử lý phản hồi UDP đến từ thiết bị cục bộ và xác định mã thiết bị cục bộ thích hợp:

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

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

Xin lưu ý rằng trường verificationId phải khớp với một trong các giá trị otherDeviceIds trong phản hồi SYNC. Điều này sẽ gắn cờ thiết bị là có sẵn để thực hiện đơn hàng tại địa phương trong Biểu đồ trang chủ của người dùng. Sau khi Google tìm thấy một thiết bị trùng khớp, thiết bị đó được coi là đã được xác minh và sẵn sàng để thực hiện đơn hàng tại địa phương.

Thêm trình xử lý EXECUTE

SDK Local Home kích hoạt trình xử lý EXECUTE khi một thiết bị hỗ trợ phương thức thực hiện cục bộ nhận được lệnh. Nội dung của ý định cục bộ tương đương với ý định EXECUTE được gửi đến phương thức thực hiện trên đám mây, vì vậy, logic để xử lý ý định cục bộ tương tự như cách bạn xử lý ý định đó trên đám mây.Hành động

Ứng dụng có thể sử dụng ổ cắm TCP/UDP hoặc yêu cầu HTTP(S) để giao tiếp với các thiết bị cục bộ. Trong lớp học lập trình này, HTTP đóng vai trò là giao thức dùng để điều khiển thiết bị ảo. Số cổng được xác định trong index.ts dưới dạng biến SERVER_PORT.

Thêm mã sau vào phương thức executeHandler để xử lý các lệnh đến và gửi các lệnh đó đến thiết bị cục bộ qua HTTP:

local/index.ts

executeHandler(request: IntentFlow.ExecuteRequest):
    Promise<IntentFlow.ExecuteResponse> {
  console.log("EXECUTE intent: " + JSON.stringify(request, null, 2));

  const command = request.inputs[0].payload.commands[0];
  const execution = command.execution[0];
  const response = new Execute.Response.Builder()
    .setRequestId(request.requestId);

  const promises: Array<Promise<void>> = command.devices.map((device) => {
    console.log("Handling EXECUTE intent for device: " + JSON.stringify(device));

    // Convert execution params to a string for the local device
    const params = execution.params as IWasherParams;
    const payload = this.getDataForCommand(execution.command, params);

    // Create a command to send over the local network
    const radioCommand = new DataFlow.HttpRequestData();
    radioCommand.requestId = request.requestId;
    radioCommand.deviceId = device.id;
    radioCommand.data = JSON.stringify(payload);
    radioCommand.dataType = 'application/json';
    radioCommand.port = SERVER_PORT;
    radioCommand.method = Constants.HttpOperation.POST;
    radioCommand.isSecure = false;

    console.log("Sending request to the smart home device:", payload);

    return this.app.getDeviceManager()
      .send(radioCommand)
      .then(() => {
        const state = {online: true};
        response.setSuccessState(device.id, Object.assign(state, params));
        console.log(`Command successfully sent to ${device.id}`);
      })
      .catch((e: IntentFlow.HandlerError) => {
        e.errorCode = e.errorCode || 'invalid_request';
        response.setErrorState(device.id, e.errorCode);
        console.error('An error occurred sending the command', e.errorCode);
      });
  });

  return Promise.all(promises)
    .then(() => {
      return response.build();
    })
    .catch((e) => {
      const err = new IntentFlow.HandlerError(request.requestId,
          'invalid_request', e.message);
      return Promise.reject(err);
    });
}

Biên dịch ứng dụng TypeScript

Chuyển đến thư mục local/ và chạy các lệnh sau để tải trình biên dịch TypeScript xuống và biên dịch ứng dụng:

cd local
npm install
npm run build

Thao tác này sẽ biên dịch nguồn index.ts (TypeScript) và đặt các nội dung sau vào thư mục public/local-home/:

  • bundle.js – Đầu ra JavaScript đã biên dịch chứa ứng dụng và các phần phụ thuộc cục bộ.
  • index.html – Trang lưu trữ cục bộ dùng để phân phát ứng dụng cho hoạt động kiểm thử trên thiết bị.

Triển khai dự án kiểm thử

Triển khai các tệp dự án đã cập nhật lên Firebase Hosting để bạn có thể truy cập vào các tệp đó từ thiết bị Google Home.

firebase deploy --only hosting

7. Khởi động máy giặt thông minh

Bây giờ, đã đến lúc kiểm thử hoạt động giao tiếp giữa ứng dụng thực hiện đơn hàng cục bộ và máy giặt thông minh! Dự án khởi động của lớp học lập trình này bao gồm một máy giặt thông minh virtual (ảo) được viết bằng Node.js. Dự án này mô phỏng một máy giặt thông minh mà người dùng có thể kiểm soát cục bộ.

Định cấu hình thiết bị

Bạn cần định cấu hình thiết bị ảo để sử dụng cùng các thông số UDP mà bạn đã áp dụng cho cấu hình quét để phát hiện thiết bị trong Developer Console. Ngoài ra, bạn cần cho thiết bị ảo biết mã thiết bị cục bộ cần báo cáo và mã dự án của tính năng tích hợp từ đám mây đến đám mây cần sử dụng cho các sự kiện Report State (Báo cáo trạng thái) khi trạng thái thiết bị thay đổi.

Tham số

Giá trị đề xuất

deviceId

deviceid123

discoveryPortOut

3311

discoveryPacket

HelloLocalHomeSDK

projectId

Mã dự án của chế độ tích hợp Cloud-to-cloud

Khởi động thiết bị

Chuyển đến thư mục virtual-device/ và chạy tập lệnh thiết bị, truyền các tham số cấu hình dưới dạng đối số:

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

Xác minh rằng tập lệnh thiết bị chạy với các tham số dự kiến:

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

8. Gỡ lỗi ứng dụng TypeScript

Trong phần sau, bạn sẽ xác minh rằng thiết bị Google Home có thể quét, xác định và gửi lệnh đến máy giặt thông minh ảo qua mạng cục bộ một cách chính xác. Bạn có thể sử dụng Công cụ dành cho nhà phát triển Google Chrome để kết nối với thiết bị Google Home, xem nhật ký bảng điều khiển và gỡ lỗi ứng dụng TypeScript.

Kết nối Công cụ cho nhà phát triển Chrome

Để kết nối trình gỡ lỗi với ứng dụng thực hiện đơn hàng cục bộ, hãy làm theo các bước sau:

  1. Đảm bảo rằng bạn đã liên kết thiết bị Google Home với một người dùng có quyền truy cập vào dự án Developer Console.
  2. Khởi động lại thiết bị Google Home để thiết bị này có thể lấy URL của HTML cũng như cấu hình quét mà bạn đã đặt trong Developer Console.
  3. Chạy Chrome trên máy phát triển.
  4. Mở một thẻ Chrome mới rồi nhập chrome://inspect vào trường địa chỉ để chạy trình kiểm tra.

Bạn sẽ thấy danh sách thiết bị trên trang và URL ứng dụng sẽ xuất hiện bên dưới tên thiết bị Google Home.

567f97789a7d8846.png

Chạy trình kiểm tra

Nhấp vào Kiểm tra trong URL ứng dụng để khởi chạy Công cụ dành cho nhà phát triển Chrome. Chọn thẻ Console (Bảng điều khiển) và xác minh rằng bạn có thể thấy nội dung của ý định IDENTIFY do ứng dụng TypeScript in ra.

6b67ded470a4c8be.png

Kết quả này có nghĩa là ứng dụng thực hiện đơn hàng cục bộ của bạn đã tìm thấy và xác định thành công thiết bị ảo.

Kiểm thử phương thức thực hiện đơn hàng tại địa phương

Gửi lệnh đến thiết bị bằng các nút điều khiển cảm ứng trong ứng dụng Google Home hoặc thông qua lệnh thoại đến thiết bị Google Home, chẳng hạn như:

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

"Ok Google, khởi động máy giặt."

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

Thao tác này sẽ kích hoạt nền tảng gửi ý định EXECUTE đến ứng dụng TypeScript.

bc030517dacc3ac9.png

Xác minh rằng bạn có thể thấy trạng thái của máy giặt thông minh cục bộ thay đổi theo từng lệnh.

...
***** The washer is RUNNING *****
...
***** The washer is STOPPED *****

9. Xin chúc mừng

764dbc83b95782a.png

Xin chúc mừng! Bạn đã sử dụng SDK Local Home để tích hợp phương thức thực hiện đơn hàng tại địa phương vào một quy trình tích hợp từ đám mây đến đám mây.

Tìm hiểu thêm

Bạn có thể thử một số cách khác sau đây:

  • Thay đổi cấu hình quét và làm cho cấu hình đó hoạt động. Ví dụ: hãy thử sử dụng một cổng UDP hoặc gói khám phá khác.
  • Sửa đổi cơ sở mã thiết bị thông minh ảo để chạy trên một thiết bị nhúng (chẳng hạn như Raspberry Pi) và sử dụng đèn LED hoặc màn hình để trực quan hoá trạng thái hiện tại.