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

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

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

79266e5f45e6ae20.gif

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

d009cef0f903d284.jpeg

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

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

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

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

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

สิ่งที่ต้องมี

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

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

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

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

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

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

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

  1. ไปที่Actions on Google Developer Console
  2. คลิกโปรเจ็กต์ใหม่ จากนั้นป้อนชื่อโปรเจ็กต์ แล้วคลิกสร้างโปรเจ็กต์

3d6b68ca79afd54c.png

เลือกแอปสมาร์ทโฮม

ในหน้าจอภาพรวมในคอนโซล Actions ให้เลือกสมาร์ทโฮม

2fa4988f44f8914b.png

เลือกการ์ดประสบการณ์สมาร์ทโฮม แล้วคลิกเริ่มสร้าง จากนั้นระบบจะนําคุณไปยังคอนโซลโปรเจ็กต์

ติดตั้ง Firebase CLI

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

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

npm install -g firebase-tools

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

firebase --version

ให้สิทธิ์ Firebase CLI ด้วยบัญชี Google โดยเรียกใช้

firebase login

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

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

รับซอร์สโค้ด

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

...หรือโคลนที่เก็บ GitHub จากบรรทัดคำสั่งก็ได้

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

เกี่ยวกับโครงการ

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

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

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

ไปที่ไดเรกทอรี washer-start แล้วตั้งค่า Firebase CLI ด้วยโปรเจ็กต์การดำเนินการของคุณ ดังนี้

cd washer-start
firebase use <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

หากคุณกำลังเริ่มต้นโปรเจ็กต์อีกครั้ง ให้เลือกไม่ เมื่อระบบถามว่าคุณต้องการเริ่มต้นหรือเขียนทับฟังก์ชัน/.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
    

โปรดคัดลอกไฟล์ firebase.json จากไดเรกทอรี washer-done ไปยังไดเรกทอรี washer-start โดยเขียนทับไฟล์ใน washer-start เพื่อให้แน่ใจว่าการกำหนดค่า Firebase ถูกต้องและสมบูรณ์

ในไดเรกทอรี washer-start:

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

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

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

firebase deploy

นี่คือเอาต์พุตของคอนโซลที่คุณจะเห็น

...

✔ Deploy complete!

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

คำสั่งนี้ทำให้เว็บแอปใช้งานได้ รวมถึง Cloud Functions for Firebase หลายรายการ

เปิด URL ของโฮสติ้งในเบราว์เซอร์ (https://<project-id>.web.app) เพื่อดูเว็บแอป คุณจะเห็นอินเทอร์เฟซต่อไปนี้

5845443e94705557.png

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

ถึงเวลาเชื่อมต่อบริการระบบคลาวด์ที่คุณทำให้ใช้งานได้กับ Google Assistant โดยใช้คอนโซล Actions

กำหนดค่าโปรเจ็กต์คอนโซล Actions

ใต้ภาพรวม > สร้างการดำเนินการ เลือกเพิ่มการดำเนินการ ป้อน URL ของ Cloud Function ที่ดำเนินการตามคำสั่งซื้อสำหรับ Intent ของสมาร์ทโฮม แล้วคลิกบันทึก

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

9d7b223427f587ca.png

ในหน้า Develop > แท็บการเรียกใช้ ให้เพิ่มชื่อที่แสดงสำหรับการดำเนินการของคุณ แล้วคลิกบันทึก ชื่อนี้จะปรากฏในแอป Google Home

774d0c40c351c7da.png

a8c4673eb11d76ee.png

ในการเปิดใช้การลิงก์บัญชี ให้เลือกพัฒนา > ตัวเลือกการลิงก์บัญชีในแถบการนำทางด้านซ้าย ใช้การตั้งค่าการลิงก์บัญชีต่อไปนี้

Client-ID

ABC123

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

DEF456

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

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

URL ของโทเค็น

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

9730d20b90bcc038.png

คลิกบันทึกเพื่อบันทึกการกำหนดค่าการลิงก์บัญชี จากนั้นคลิกทดสอบเพื่อเปิดใช้การทดสอบในโปรเจ็กต์

ee0547f05b5efd98.png

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

d0495810dbadf059.png

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

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

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

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

ทำให้ Fulfillment ระบบคลาวด์ที่อัปเดตแล้วใช้งานได้โดยใช้ 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 อย่างถูกต้องแล้ว คุณต้องเพิ่มความสามารถในการขอสถานะของอุปกรณ์และส่งคำสั่ง

จัดการ Intent ของ 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,
  };
};

ตอบสนองต่อความตั้งใจของ EXECUTE

EXECUTE Intent จะจัดการคำสั่งเพื่ออัปเดตสถานะอุปกรณ์ การตอบกลับจะแสดงสถานะของคำสั่งแต่ละรายการ เช่น 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

ทำให้ Fulfillment ระบบคลาวด์ที่อัปเดตแล้วใช้งานได้โดยใช้ 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

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

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

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 กับบริการระบบคลาวด์ของอุปกรณ์โดยใช้การดำเนินการสำหรับสมาร์ทโฮมเรียบร้อยแล้ว

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

ตัวอย่างแนวคิดที่สามารถนำไปใช้เพื่อเจาะลึกรายละเอียดมีดังนี้

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