เชื่อมต่ออุปกรณ์ในบ้านอัจฉริยะกับ Google Assistant

1. ก่อนเริ่มต้น

ในฐานะนักพัฒนาแอปอินเทอร์เน็ตของสรรพสิ่ง (IoT) คุณสามารถทําการผสานรวมแบบระบบคลาวด์ต่อระบบคลาวด์เพื่อให้ผู้ใช้ควบคุมอุปกรณ์ผ่านการควบคุมด้วยการสัมผัสในแอป Google Home และคำสั่งเสียงด้วย Assistant ได้

79266e5f45e6ae20.gif

การผสานรวมระบบคลาวด์กับระบบคลาวด์ใช้ Home Graph เพื่อระบุข้อมูลตามบริบทเกี่ยวกับบ้านและอุปกรณ์ต่างๆ เพื่อสร้างแผนที่เชิงตรรกะของบ้าน บริบทดังกล่าวช่วยให้ Assistant เข้าใจคำขอของผู้ใช้เกี่ยวกับตำแหน่งในบ้านได้อย่างเป็นธรรมชาติมากขึ้น ตัวอย่างเช่น กราฟบ้านสามารถจัดเก็บแนวคิดของห้องนั่งเล่นที่มีอุปกรณ์หลายประเภทจากผู้ผลิตหลายราย เช่น ตัวควบคุมอุณหภูมิ หลอดไฟ พัดลม และเครื่องดูดฝุ่น

d009cef0f903d284.jpeg

ข้อกำหนดเบื้องต้น

สิ่งที่คุณจะสร้าง

ใน Codelab นี้ คุณจะเผยแพร่บริการระบบคลาวด์ที่จัดการเครื่องซักผ้าอัจฉริยะเสมือน จากนั้นสร้างการผสานรวมระบบคลาวด์กับระบบคลาวด์ และเชื่อมต่อกับ Assistant

สิ่งที่คุณจะได้เรียนรู้

  • วิธีทำให้บริการระบบคลาวด์สมาร์ทโฮมใช้งานได้
  • วิธีเชื่อมต่อบริการกับ Assistant
  • วิธีเผยแพร่การเปลี่ยนแปลงสถานะอุปกรณ์ไปยัง Google

สิ่งที่คุณต้องมี

2. เริ่มต้นใช้งาน

เปิดใช้ส่วนควบคุมกิจกรรม

หากต้องการใช้ Google Assistant คุณต้องแชร์ข้อมูลกิจกรรมบางอย่างกับ Google Google Assistant ต้องใช้ข้อมูลนี้จึงจะทำงานได้อย่างถูกต้อง แต่ข้อกำหนดในการแชร์ข้อมูลไม่ได้เจาะจงสำหรับ SDK เท่านั้น หากต้องการแชร์ข้อมูลนี้ ให้สร้างบัญชี Google หากยังไม่มี คุณใช้บัญชี Google บัญชีใดก็ได้ ไม่จำเป็นต้องเป็นบัญชีนักพัฒนาแอป

เปิดหน้าส่วนควบคุมกิจกรรมของบัญชี Google ที่ต้องการใช้กับ Assistant

ตรวจสอบว่าได้เปิดใช้สวิตช์เปิด/ปิดต่อไปนี้

  • กิจกรรมบนเว็บและแอป - นอกจากนี้ อย่าลืมเลือกช่องทําเครื่องหมายรวมประวัติการเข้าชมใน Chrome และกิจกรรมจากเว็บไซต์ แอป และอุปกรณ์ที่ใช้บริการต่างๆ ของ Google
  • ข้อมูลอุปกรณ์
  • กิจกรรมเสียงพูดและเสียง

สร้างโปรเจ็กต์การผสานรวมระบบคลาวด์กับระบบคลาวด์

  1. ไปที่คอนโซลนักพัฒนาแอป
  2. คลิกสร้างโปรเจ็กต์ ป้อนชื่อโปรเจ็กต์ แล้วคลิกสร้างโปรเจ็กต์

ตั้งชื่อโปรเจ็กต์

เลือกการผสานรวมระบบคลาวด์กับระบบคลาวด์

ในหน้าแรกของโปรเจ็กต์ในคอนโซลของนักพัฒนาซอฟต์แวร์ ให้เลือกเพิ่มการผสานรวมระบบคลาวด์กับระบบคลาวด์ในส่วนระบบคลาวด์กับระบบคลาวด์

เพิ่มการผสานรวมระบบคลาวด์สู่ระบบคลาวด์

ติดตั้ง Firebase CLI

อินเทอร์เฟซบรรทัดคำสั่ง (CLI) ของ Firebase จะช่วยให้คุณแสดงเว็บแอปในเครื่องและทำให้เว็บแอปใช้งานได้ในโฮสติ้งของ Firebase

หากต้องการติดตั้ง CLI ให้เรียกใช้คำสั่ง npm ต่อไปนี้จากเทอร์มินัล

npm install -g firebase-tools

หากต้องการยืนยันว่าติดตั้ง CLI อย่างถูกต้องแล้ว ให้เรียกใช้คำสั่งต่อไปนี้

firebase --version

ให้สิทธิ์ Firebase CLI ด้วยบัญชี Google โดยเรียกใช้คำสั่งต่อไปนี้

firebase login

3. เรียกใช้แอปเริ่มต้น

เมื่อตั้งค่าสภาพแวดล้อมการพัฒนาซอฟต์แวร์แล้ว คุณสามารถทําให้การเริ่มใช้งานโปรเจ็กต์เพื่อยืนยันว่าทุกอย่างได้รับการกําหนดค่าอย่างถูกต้อง

ดูซอร์สโค้ด

คลิกลิงก์ต่อไปนี้เพื่อดาวน์โหลดตัวอย่างสําหรับโค้ดแล็บนี้ในเครื่องพัฒนาซอฟต์แวร์

คุณยังโคลนที่เก็บ GitHub จากบรรทัดคำสั่งได้ด้วย โดยทำดังนี้

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

เกี่ยวกับโปรเจ็กต์

โปรเจ็กต์เริ่มต้นมีไดเรกทอรีย่อยต่อไปนี้

  • public: UI ด้านหน้าสำหรับควบคุมและตรวจสอบสถานะของเครื่องซักผ้าอัจฉริยะได้อย่างง่ายดาย
  • functions: บริการระบบคลาวด์ที่ติดตั้งใช้งานอย่างเต็มรูปแบบซึ่งจัดการเครื่องซักผ้าอัจฉริยะด้วย Cloud Functions for Firebase และ Firebase Realtime Database

สร้างโปรเจ็กต์ Firebase

  1. ไปที่ Firebase
  2. คลิกสร้างโปรเจ็กต์ แล้วป้อนชื่อโปรเจ็กต์
  3. เลือกช่องทำเครื่องหมายข้อตกลง แล้วคลิกต่อไป หากไม่มีช่องทำเครื่องหมายข้อตกลง คุณข้ามขั้นตอนนี้ได้
    สร้างโปรเจ็กต์ Firebase
  4. เมื่อสร้างโปรเจ็กต์ Firebase แล้ว ให้ค้นหารหัสโปรเจ็กต์ ไปที่ภาพรวมโปรเจ็กต์ แล้วคลิกไอคอนการตั้งค่า > การตั้งค่าโปรเจ็กต์
    เปิดการตั้งค่าโปรเจ็กต์
  5. โปรเจ็กต์จะแสดงอยู่ในแท็บทั่วไป
    การตั้งค่าทั่วไปของโปรเจ็กต์

เชื่อมต่อกับ Firebase

ไปที่ไดเรกทอรี washer-start แล้วตั้งค่า Firebase CLI กับโปรเจ็กต์การผสานรวมโดยทำดังนี้

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

กําหนดค่าโปรเจ็กต์ Firebase

เริ่มต้นโปรเจ็กต์ Firebase

firebase init

เลือกฟีเจอร์ CLI, ฐานข้อมูลเรียลไทม์, ฟังก์ชัน และฟีเจอร์โฮสติ้งที่มีโฮสติ้งของ 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

ซึ่งจะเริ่มต้น API และฟีเจอร์ที่จําเป็นสําหรับโปรเจ็กต์

เริ่มต้น Realtime Database เมื่อได้รับข้อความแจ้ง คุณใช้ตำแหน่งเริ่มต้นสำหรับอินสแตนซ์ฐานข้อมูลได้

? 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

เนื่องจากคุณใช้โค้ดโปรเจ็กต์เริ่มต้น ให้เลือกไฟล์เริ่มต้นสำหรับกฎความปลอดภัย และตรวจสอบว่าคุณไม่ได้เขียนทับไฟล์กฎฐานข้อมูลที่มีอยู่

? 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

หากจะเริ่มต้นโปรเจ็กต์ใหม่ ให้เลือกเขียนทับเมื่อระบบถามว่าคุณต้องการเริ่มต้นหรือเขียนทับโค้ดเบส

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

เมื่อกําหนดค่าฟังก์ชัน คุณควรใช้ไฟล์เริ่มต้น และตรวจสอบว่าคุณไม่ได้เขียนทับไฟล์ index.js และ package.json ที่มีอยู่เดิมในตัวอย่างโปรเจ็กต์

? 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

หากจะเริ่มต้นโปรเจ็กต์ใหม่ ให้เลือกไม่เมื่อระบบถามว่าคุณต้องการเริ่มต้นหรือเขียนทับ functions/.gitignore

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

สุดท้าย ให้กําหนดค่าการตั้งค่าโฮสติ้งให้ใช้ไดเรกทอรี public ในโค้ดโปรเจ็กต์ และใช้ไฟล์ index.html ที่มีอยู่ เลือกไม่เมื่อระบบขอให้ใช้ 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

หากเปิดใช้ ESLint โดยไม่ได้ตั้งใจ คุณปิดใช้ได้ 2 วิธีดังนี้

  1. ใช้ GUI ไปที่โฟลเดอร์ ../functions ใต้โปรเจ็กต์ เลือกไฟล์ .eslintrc.js ที่ซ่อนอยู่ แล้วลบออก อย่าสับสนกับ .eslintrc.json ที่มีชื่อคล้ายกัน
  2. การใช้บรรทัดคำสั่ง
    cd functions
    rm .eslintrc.js
    

ในไฟล์ washer-done/firebase.json ให้เขียนโค้ดให้เสร็จสมบูรณ์ด้วยข้อมูลต่อไปนี้

{
  "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"
      ]
    }
  ]
}

ทำให้ใช้งานได้กับ Firebase

เมื่อติดตั้งไลบรารีที่ต้องพึ่งพาและกำหนดค่าโปรเจ็กต์แล้ว คุณก็พร้อมเรียกใช้แอปเป็นครั้งแรก

firebase deploy

คุณควรเห็นเอาต์พุตคอนโซลดังต่อไปนี้

...

✔ Deploy complete!

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

คำสั่งนี้จะทําให้เว็บแอปพร้อมใช้งานพร้อมกับ Cloud Functions for Firebase หลายรายการ

เปิด Hosting URL ในเบราว์เซอร์ (https://.web.app) เพื่อดูเว็บแอป คุณจะเห็นอินเทอร์เฟซต่อไปนี้

5845443e94705557.png

เว็บ UI นี้แสดงแพลตฟอร์มของบุคคลที่สามเพื่อดูหรือแก้ไขสถานะของอุปกรณ์ หากต้องการเริ่มป้อนข้อมูลอุปกรณ์ลงในฐานข้อมูล ให้คลิกอัปเดต คุณจะไม่เห็นว่าหน้าเว็บมีการเปลี่ยนแปลงใดๆ แต่ระบบจะจัดเก็บสถานะปัจจุบันของเครื่องซักผ้าไว้ในฐานข้อมูล

ตอนนี้ถึงเวลาเชื่อมต่อบริการระบบคลาวด์ที่คุณติดตั้งใช้งานกับ Google Assistant โดยใช้คอนโซลนักพัฒนาแอป Google Home

กำหนดค่าโปรเจ็กต์ใน Developer Console

ในแท็บพัฒนา ให้เพิ่มชื่อที่แสดงสำหรับการโต้ตอบ ชื่อนี้จะปรากฏในแอป Google Home

เพิ่มชื่อที่แสดง

ในส่วนการสร้างแบรนด์แอป ให้อัปโหลดไฟล์ png สำหรับไอคอนแอปขนาด 144 x 144 พิกเซล และตั้งชื่อว่า .png

เพิ่มไอคอนแอป

หากต้องการเปิดใช้การลิงก์บัญชี ให้ใช้การตั้งค่าการลิงก์บัญชีต่อไปนี้

รหัสลูกค้า

ABC123

รหัสลับไคลเอ็นต์

DEF456

URL สำหรับการอนุญาต

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

URL โทเค็น

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

อัปเดต URL การลิงก์บัญชี

ในส่วน Cloud fulfillment URL ให้ป้อน URL ของ Cloud Functions ที่ดำเนินการตามคำสั่งสำหรับสมาร์ทโฮม

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

เพิ่ม URL ของ Cloud Function

คลิกบันทึกเพื่อบันทึกการกําหนดค่าโปรเจ็กต์ แล้วคลิกถัดไป: ทดสอบเพื่อเปิดใช้การทดสอบในโปรเจ็กต์

ทดสอบการผสานรวมระบบคลาวด์กับระบบคลาวด์

ตอนนี้คุณจะเริ่มใช้ Webhooks ที่จําเป็นต่อการเชื่อมต่อสถานะของอุปกรณ์กับ Assistant ได้แล้ว

4. สร้างเครื่องซัก

เมื่อกําหนดค่าการผสานรวมแล้ว คุณจะเพิ่มอุปกรณ์และส่งข้อมูลได้ บริการระบบคลาวด์ต้องจัดการ Intent ต่อไปนี้

  • Intent SYNC จะเกิดขึ้นเมื่อ Assistant ต้องการทราบว่าผู้ใช้เชื่อมต่ออุปกรณ์ใดอยู่ ระบบจะส่งข้อมูลนี้ไปยังบริการของคุณเมื่อผู้ใช้ลิงก์บัญชี คุณควรตอบกลับด้วยเพย์โหลด JSON ของอุปกรณ์ทั้งหมดของผู้ใช้และความสามารถของอุปกรณ์เหล่านั้น
  • Intent QUERY เกิดขึ้นเมื่อ Assistant ต้องการทราบสถานะปัจจุบันของอุปกรณ์ คุณควรตอบกลับด้วยเพย์โหลด JSON ที่มีสถานะของอุปกรณ์แต่ละเครื่องที่ขอ
  • Intent EXECUTE เกิดขึ้นเมื่อ Assistant ต้องการควบคุมอุปกรณ์ในนามของผู้ใช้ คุณควรตอบกลับด้วยเพย์โหลด JSON ที่มีสถานะการดำเนินการของอุปกรณ์แต่ละเครื่องที่ขอ
  • Intent DISCONNECT จะเกิดขึ้นเมื่อผู้ใช้ยกเลิกการลิงก์บัญชีจาก Assistant คุณควรหยุดส่งเหตุการณ์ของอุปกรณ์ของผู้ใช้รายนี้ไปยัง Assistant

คุณจะอัปเดตฟังก์ชันที่ติดตั้งใช้งานก่อนหน้านี้เพื่อจัดการกับ Intent เหล่านี้ได้ในส่วนต่อไปนี้

อัปเดตการตอบสนองการซิงค์

เปิด functions/index.js ซึ่งมีโค้ดสําหรับตอบคําขอจาก Assistant

คุณจะต้องจัดการ SYNC Intent ด้วยการแสดงผลข้อมูลเมตาและความสามารถของอุปกรณ์ อัปเดต JSON ในอาร์เรย์ onSync ให้รวมข้อมูลอุปกรณ์และลักษณะที่แนะนำสำหรับเครื่องซักผ้า

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

ทำให้ใช้งานได้กับ Firebase

ทำให้การจำหน่ายสินค้าบนระบบคลาวด์ที่อัปเดตแล้วใช้งานได้โดยใช้ Firebase CLI โดยทำดังนี้

firebase deploy --only functions

หากต้องการทดสอบการผสานรวมระบบคลาวด์กับระบบคลาวด์ คุณต้องลิงก์โปรเจ็กต์กับบัญชี Google ซึ่งจะช่วยให้ทดสอบผ่านแพลตฟอร์มต่างๆ ของ Google Assistant และแอป Google Home ที่ลงชื่อเข้าใช้บัญชีเดียวกันได้

  1. เปิดการตั้งค่า Google Assistant ในโทรศัพท์ โปรดทราบว่าคุณควรลงชื่อเข้าใช้ด้วยบัญชีเดียวกับในคอนโซล
  2. ไปที่ Google Assistant > การตั้งค่า > การควบคุมอุปกรณ์สมาร์ทโฮม (ในส่วน Assistant)
  3. คลิกไอคอนค้นหาที่ด้านขวาบน
  4. ค้นหาแอปทดสอบโดยใช้คำนำหน้า [test] เพื่อค้นหาแอปทดสอบที่ต้องการ
  5. เลือกรายการนั้น จากนั้น Google Assistant จะตรวจสอบสิทธิ์กับบริการของคุณและส่งคําขอ SYNC โดยขอให้บริการของคุณระบุรายการอุปกรณ์สําหรับผู้ใช้

เปิดแอป Google Home และตรวจสอบว่าคุณเห็นอุปกรณ์เครื่องซักผ้า

ae252220753726f6.png

5. จัดการคําสั่งและการค้นหา

เมื่อบริการระบบคลาวด์รายงานอุปกรณ์เครื่องซักผ้าไปยัง Google อย่างถูกต้องแล้ว คุณจะต้องเพิ่มความสามารถในการขอสถานะอุปกรณ์และส่งคําสั่ง

จัดการความตั้งใจ QUERY

QUERY Intent มีชุดอุปกรณ์ คุณควรตอบกลับพร้อมสถานะปัจจุบันของอุปกรณ์แต่ละเครื่อง

ใน functions/index.js ให้แก้ไขตัวแฮนเดิล QUERY เพื่อประมวลผลรายการอุปกรณ์เป้าหมายที่อยู่ในคําขอ Intent

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

สำหรับอุปกรณ์แต่ละเครื่องที่อยู่ในคำขอ ให้แสดงสถานะปัจจุบันที่จัดเก็บไว้ในฐานข้อมูลเรียลไทม์ อัปเดตฟังก์ชัน queryFirebase และ queryDevice เพื่อแสดงผลข้อมูลสถานะของเครื่องซักผ้า

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

จัดการ Intent EXECUTE

Intent EXECUTE จะจัดการคําสั่งเพื่ออัปเดตสถานะอุปกรณ์ การตอบกลับจะแสดงสถานะของคําสั่งแต่ละรายการ เช่น SUCCESS, ERROR หรือ PENDING และสถานะอุปกรณ์ใหม่

ใน functions/index.js ให้แก้ไขตัวแฮนเดิล EXECUTE เพื่อประมวลผลรายการลักษณะที่ต้องอัปเดตและชุดอุปกรณ์เป้าหมายสำหรับแต่ละคําสั่ง ดังนี้

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

สําหรับคําสั่งและอุปกรณ์เป้าหมายแต่ละรายการ ให้อัปเดตค่าใน Realtime Database ที่สอดคล้องกับลักษณะที่ขอ แก้ไขฟังก์ชัน updateDevice เพื่ออัปเดตข้อมูลอ้างอิง Firebase ที่เหมาะสมและแสดงผลสถานะอุปกรณ์ที่อัปเดต

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. ทดสอบการผสานรวม

หลังจากติดตั้งใช้งาน Intent ทั้ง 3 รายการแล้ว คุณสามารถทดสอบว่าการผสานรวมควบคุมเครื่องซักผ้าได้

ทำให้ใช้งานได้กับ Firebase

ทำให้การจำหน่ายสินค้าบนระบบคลาวด์ที่อัปเดตแล้วใช้งานได้โดยใช้ Firebase CLI โดยทำดังนี้

firebase deploy --only functions

ทดสอบเครื่องซักผ้า

ตอนนี้คุณจะเห็นค่าเปลี่ยนแปลงเมื่อลองใช้คําสั่งเสียงต่อไปนี้ผ่านโทรศัพท์

"Ok Google เปิดเครื่องซักผ้า"

"Ok Google หยุดเครื่องซักผ้าชั่วคราว"

"Ok Google หยุดเครื่องซักผ้า"

นอกจากนี้ คุณยังดูสถานะปัจจุบันของเครื่องซักผ้าได้โดยถามคำถาม

"Ok Google เครื่องซักผ้าเปิดอยู่ไหม"

"Ok Google เครื่องซักผ้าทำงานอยู่ไหม"

"Ok Google เครื่องซักผ้าทำงานอยู่ใช่ไหม"

คุณดูการค้นหาและคำสั่งเหล่านี้ได้ในบันทึกที่ปรากฏในส่วนฟังก์ชันของคุณในส่วนฟังก์ชันของคอนโซล Firebase ดูข้อมูลเพิ่มเติมเกี่ยวกับบันทึก Firebase ได้ในเขียนและดูบันทึก

นอกจากนี้ คุณยังดูการค้นหาและคำสั่งเหล่านี้ในคอนโซล Google Cloud ได้โดยไปที่การบันทึก > Logs Explorer ดูข้อมูลเพิ่มเติมเกี่ยวกับการบันทึกของ Google Cloud ในเข้าถึงบันทึกเหตุการณ์ด้วย Cloud Logging

7. รายงานข้อมูลอัปเดตให้ Google ทราบ

คุณได้ผสานรวมบริการระบบคลาวด์กับ Intent สมาร์ทโฮมอย่างเต็มรูปแบบแล้ว ซึ่งช่วยให้ผู้ใช้ควบคุมและค้นหาสถานะปัจจุบันของอุปกรณ์ได้ อย่างไรก็ตาม การใช้งานยังคงไม่มีวิธีให้บริการส่งข้อมูลเหตุการณ์ เช่น การเปลี่ยนแปลงสถานะหรือการแสดงข้อมูลของอุปกรณ์ ไปยัง Assistant โดยอัตโนมัติ

ขอการซิงค์ช่วยให้คุณเรียกใช้คําขอซิงค์ใหม่ได้เมื่อผู้ใช้เพิ่มหรือนําอุปกรณ์ออก หรือเมื่อความสามารถของอุปกรณ์เปลี่ยนแปลง เมื่อใช้รายงานสถานะ บริการระบบคลาวด์จะส่งสถานะของอุปกรณ์ไปยัง Home Graph ล่วงหน้าได้เมื่อผู้ใช้เปลี่ยนสถานะของอุปกรณ์ เช่น เปิดสวิตช์ไฟ หรือเปลี่ยนสถานะโดยใช้บริการอื่น

ในส่วนนี้ คุณจะเพิ่มโค้ดเพื่อเรียกใช้เมธอดเหล่านี้จากเว็บแอปฟรอนต์เอนด์

เปิดใช้ HomeGraph API

HomeGraph API ช่วยให้สามารถจัดเก็บและค้นหาอุปกรณ์และสถานะของอุปกรณ์ภายใน Home Graph ของผู้ใช้ หากต้องการใช้ API นี้ คุณต้องเปิดคอนโซล Google Cloud ก่อนแล้วเปิดใช้ HomeGraph API

ในคอนโซล Google Cloud ให้เลือกโปรเจ็กต์ที่ตรงกับการผสานรวม <project-id>. จากนั้นคลิกเปิดใช้ในหน้าจอไลบรารี API สำหรับ HomeGraph API

ee198858a6eac112.png

เปิดใช้สถานะรายงาน

การเขียนลงในฐานข้อมูลแบบเรียลไทม์จะทริกเกอร์ฟังก์ชัน reportstate ในโปรเจ็กต์เริ่มต้น อัปเดตฟังก์ชัน reportstate ใน functions/index.js เพื่อบันทึกข้อมูลที่เขียนลงในฐานข้อมูลและโพสต์ไปยังกราฟในบ้านผ่านสถานะรายงาน

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

เปิดใช้การซิงค์คำขอ

การรีเฟรชไอคอนใน UI ของเว็บส่วนหน้าจะทริกเกอร์ฟังก์ชัน requestsync ในโปรเจ็กต์เริ่มต้น ใช้ฟังก์ชัน requestsync ใน functions/index.js เพื่อเรียก 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}`);
  }
});

ทำให้ใช้งานได้กับ Firebase

ติดตั้งใช้งานโค้ดที่อัปเดตแล้วโดยใช้ Firebase CLI โดยทำดังนี้

firebase deploy --only functions

ทดสอบการใช้งาน

คลิกปุ่มรีเฟรช ae8d3b25777a5e30.png ใน UI ของเว็บ และตรวจสอบว่าคุณเห็นคําขอซิงค์ในบันทึกของคอนโซล Firebase

จากนั้นปรับแอตทริบิวต์ของอุปกรณ์เครื่องซักผ้าใน UI ของเว็บส่วนหน้า แล้วคลิกอัปเดต ตรวจสอบว่าคุณเห็นการเปลี่ยนแปลงสถานะที่รายงานไปยัง Google ในบันทึกของคอนโซล Firebase

8. ขอแสดงความยินดี

674c4f4392e98c1.png

ยินดีด้วย คุณผสานรวม Assistant กับบริการระบบคลาวด์ของอุปกรณ์โดยใช้การผสานรวมระบบคลาวด์กับระบบคลาวด์เรียบร้อยแล้ว

ดูข้อมูลเพิ่มเติม

ต่อไปนี้คือแนวคิดบางส่วนที่คุณนำไปใช้เพื่อเจาะลึกได้

นอกจากนี้ คุณยังดูข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบและส่งการผสานรวมเพื่อรับการตรวจสอบ รวมถึงกระบวนการรับรองเพื่อเผยแพร่การผสานรวมให้ผู้ใช้ทราบได้ด้วย