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

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

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

79266e5f45e6ae20.gif

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

3d6b68ca79afd54c.png

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

เลือกบ้านอัจฉริยะในหน้าจอภาพรวมในคอนโซลการดําเนินการ

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 for Firebase และฐานข้อมูลเรียลไทม์ของ Firebase

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

ไปที่ไดเรกทอรี washer-start จากนั้นตั้งค่า Firebase CLI ด้วยโปรเจ็กต์ Actions ดังนี้

cd washer-start
firebase use <project-id>

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

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

firebase init

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

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

? What file should be used for Realtime Database Security Rules? Database.rules.json

? 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

? File functions/package.json already exists. Overwrite?
No

? File functions/index.js 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

? Do you want to use ESLint to catch probable bugs and enforce style?
No

? 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 ได้ถูกต้องและสมบูรณ์ ให้คัดลอกไฟล์ firebase.json จากไดเรกทอรี app-done ไปยังไดเรกทอรี app-start โดยเขียนทับไฟล์ใน app-start

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

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

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

ไปที่โฟลเดอร์ functions และติดตั้งทรัพยากร Dependency ที่จำเป็นทั้งหมดโดยใช้ npm.

cd functions
npm install

เมื่อติดตั้งทรัพยากร 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 หลายรายการ

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

5845443e94705557.png

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

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

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

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

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

9d7b223427f587ca.png

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

ทำให้ 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,
  };
});

สำหรับอุปกรณ์แต่ละเครื่องที่อยู่ในคำขอ ให้แสดงสถานะปัจจุบันที่เก็บไว้ใน Realtime Database อัปเดตฟังก์ชัน 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 จะจัดการคำสั่งเพื่ออัปเดตสถานะอุปกรณ์ การตอบกลับจะแสดงสถานะของคำสั่งแต่ละรายการ เช่น 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 = {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. ทดสอบการดำเนินการ

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

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

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

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