1. ก่อนเริ่มต้น
ในฐานะนักพัฒนาแอปอินเทอร์เน็ตของสรรพสิ่ง (IoT) คุณสามารถทําการผสานรวมแบบระบบคลาวด์ต่อระบบคลาวด์เพื่อให้ผู้ใช้ควบคุมอุปกรณ์ผ่านการควบคุมด้วยการสัมผัสในแอป Google Home และคำสั่งเสียงด้วย Assistant ได้
การผสานรวมระบบคลาวด์กับระบบคลาวด์ใช้ Home Graph เพื่อระบุข้อมูลตามบริบทเกี่ยวกับบ้านและอุปกรณ์ต่างๆ เพื่อสร้างแผนที่เชิงตรรกะของบ้าน บริบทดังกล่าวช่วยให้ Assistant เข้าใจคำขอของผู้ใช้เกี่ยวกับตำแหน่งในบ้านได้อย่างเป็นธรรมชาติมากขึ้น ตัวอย่างเช่น กราฟบ้านสามารถจัดเก็บแนวคิดของห้องนั่งเล่นที่มีอุปกรณ์หลายประเภทจากผู้ผลิตหลายราย เช่น ตัวควบคุมอุณหภูมิ หลอดไฟ พัดลม และเครื่องดูดฝุ่น
ข้อกำหนดเบื้องต้น
- คู่มือนักพัฒนาซอฟต์แวร์สำหรับสร้างการผสานรวมระบบคลาวด์กับระบบคลาวด์
สิ่งที่คุณจะสร้าง
ใน Codelab นี้ คุณจะเผยแพร่บริการระบบคลาวด์ที่จัดการเครื่องซักผ้าอัจฉริยะเสมือน จากนั้นสร้างการผสานรวมระบบคลาวด์กับระบบคลาวด์ และเชื่อมต่อกับ Assistant
สิ่งที่คุณจะได้เรียนรู้
- วิธีทำให้บริการระบบคลาวด์สมาร์ทโฮมใช้งานได้
- วิธีเชื่อมต่อบริการกับ Assistant
- วิธีเผยแพร่การเปลี่ยนแปลงสถานะอุปกรณ์ไปยัง Google
สิ่งที่คุณต้องมี
- เว็บเบราว์เซอร์ เช่น Google Chrome
- อุปกรณ์ iOS หรือ Android ที่มีแอป Google Home ติดตั้งไว้
- Node.js เวอร์ชัน 10.16 ขึ้นไป
- บัญชีสำหรับการเรียกเก็บเงินของ Google Cloud
2. เริ่มต้นใช้งาน
เปิดใช้ส่วนควบคุมกิจกรรม
หากต้องการใช้ Google Assistant คุณต้องแชร์ข้อมูลกิจกรรมบางอย่างกับ Google Google Assistant ต้องใช้ข้อมูลนี้จึงจะทำงานได้อย่างถูกต้อง แต่ข้อกำหนดในการแชร์ข้อมูลไม่ได้เจาะจงสำหรับ SDK เท่านั้น หากต้องการแชร์ข้อมูลนี้ ให้สร้างบัญชี Google หากยังไม่มี คุณใช้บัญชี Google บัญชีใดก็ได้ ไม่จำเป็นต้องเป็นบัญชีนักพัฒนาแอป
เปิดหน้าส่วนควบคุมกิจกรรมของบัญชี Google ที่ต้องการใช้กับ Assistant
ตรวจสอบว่าได้เปิดใช้สวิตช์เปิด/ปิดต่อไปนี้
- กิจกรรมบนเว็บและแอป - นอกจากนี้ อย่าลืมเลือกช่องทําเครื่องหมายรวมประวัติการเข้าชมใน Chrome และกิจกรรมจากเว็บไซต์ แอป และอุปกรณ์ที่ใช้บริการต่างๆ ของ Google
- ข้อมูลอุปกรณ์
- กิจกรรมเสียงพูดและเสียง
สร้างโปรเจ็กต์การผสานรวมระบบคลาวด์กับระบบคลาวด์
- ไปที่คอนโซลนักพัฒนาแอป
- คลิกสร้างโปรเจ็กต์ ป้อนชื่อโปรเจ็กต์ แล้วคลิกสร้างโปรเจ็กต์
เลือกการผสานรวมระบบคลาวด์กับระบบคลาวด์
ในหน้าแรกของโปรเจ็กต์ในคอนโซลของนักพัฒนาซอฟต์แวร์ ให้เลือกเพิ่มการผสานรวมระบบคลาวด์กับระบบคลาวด์ในส่วนระบบคลาวด์กับระบบคลาวด์
ติดตั้ง 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
- ไปที่ Firebase
- คลิกสร้างโปรเจ็กต์ แล้วป้อนชื่อโปรเจ็กต์
- เลือกช่องทำเครื่องหมายข้อตกลง แล้วคลิกต่อไป หากไม่มีช่องทำเครื่องหมายข้อตกลง คุณข้ามขั้นตอนนี้ได้
- เมื่อสร้างโปรเจ็กต์ Firebase แล้ว ให้ค้นหารหัสโปรเจ็กต์ ไปที่ภาพรวมโปรเจ็กต์ แล้วคลิกไอคอนการตั้งค่า > การตั้งค่าโปรเจ็กต์
- โปรเจ็กต์จะแสดงอยู่ในแท็บทั่วไป
เชื่อมต่อกับ 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 วิธีดังนี้
- ใช้ GUI ไปที่โฟลเดอร์
../functions
ใต้โปรเจ็กต์ เลือกไฟล์.eslintrc.js
ที่ซ่อนอยู่ แล้วลบออก อย่าสับสนกับ.eslintrc.json
ที่มีชื่อคล้ายกัน - การใช้บรรทัดคำสั่ง
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://
) เพื่อดูเว็บแอป คุณจะเห็นอินเทอร์เฟซต่อไปนี้
เว็บ UI นี้แสดงแพลตฟอร์มของบุคคลที่สามเพื่อดูหรือแก้ไขสถานะของอุปกรณ์ หากต้องการเริ่มป้อนข้อมูลอุปกรณ์ลงในฐานข้อมูล ให้คลิกอัปเดต คุณจะไม่เห็นว่าหน้าเว็บมีการเปลี่ยนแปลงใดๆ แต่ระบบจะจัดเก็บสถานะปัจจุบันของเครื่องซักผ้าไว้ในฐานข้อมูล
ตอนนี้ถึงเวลาเชื่อมต่อบริการระบบคลาวด์ที่คุณติดตั้งใช้งานกับ Google Assistant โดยใช้คอนโซลนักพัฒนาแอป Google Home
กำหนดค่าโปรเจ็กต์ใน Developer Console
ในแท็บพัฒนา ให้เพิ่มชื่อที่แสดงสำหรับการโต้ตอบ ชื่อนี้จะปรากฏในแอป Google Home
ในส่วนการสร้างแบรนด์แอป ให้อัปโหลดไฟล์ png
สำหรับไอคอนแอปขนาด 144 x 144 พิกเซล และตั้งชื่อว่า
หากต้องการเปิดใช้การลิงก์บัญชี ให้ใช้การตั้งค่าการลิงก์บัญชีต่อไปนี้
รหัสลูกค้า |
|
รหัสลับไคลเอ็นต์ |
|
URL สำหรับการอนุญาต |
|
URL โทเค็น |
|
ในส่วน Cloud fulfillment URL ให้ป้อน URL ของ Cloud Functions ที่ดำเนินการตามคำสั่งสำหรับสมาร์ทโฮม
https://us-central1-
คลิกบันทึกเพื่อบันทึกการกําหนดค่าโปรเจ็กต์ แล้วคลิกถัดไป: ทดสอบเพื่อเปิดใช้การทดสอบในโปรเจ็กต์
ตอนนี้คุณจะเริ่มใช้ 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 Assistant
หากต้องการทดสอบการผสานรวมระบบคลาวด์กับระบบคลาวด์ คุณต้องลิงก์โปรเจ็กต์กับบัญชี Google ซึ่งจะช่วยให้ทดสอบผ่านแพลตฟอร์มต่างๆ ของ Google Assistant และแอป Google Home ที่ลงชื่อเข้าใช้บัญชีเดียวกันได้
- เปิดการตั้งค่า Google Assistant ในโทรศัพท์ โปรดทราบว่าคุณควรลงชื่อเข้าใช้ด้วยบัญชีเดียวกับในคอนโซล
- ไปที่ Google Assistant > การตั้งค่า > การควบคุมอุปกรณ์สมาร์ทโฮม (ในส่วน Assistant)
- คลิกไอคอนค้นหาที่ด้านขวาบน
- ค้นหาแอปทดสอบโดยใช้คำนำหน้า [test] เพื่อค้นหาแอปทดสอบที่ต้องการ
- เลือกรายการนั้น จากนั้น Google Assistant จะตรวจสอบสิทธิ์กับบริการของคุณและส่งคําขอ
SYNC
โดยขอให้บริการของคุณระบุรายการอุปกรณ์สําหรับผู้ใช้
เปิดแอป Google Home และตรวจสอบว่าคุณเห็นอุปกรณ์เครื่องซักผ้า
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
เปิดใช้สถานะรายงาน
การเขียนลงในฐานข้อมูลแบบเรียลไทม์จะทริกเกอร์ฟังก์ชัน 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
ทดสอบการใช้งาน
คลิกปุ่มรีเฟรช ใน UI ของเว็บ และตรวจสอบว่าคุณเห็นคําขอซิงค์ในบันทึกของคอนโซล Firebase
จากนั้นปรับแอตทริบิวต์ของอุปกรณ์เครื่องซักผ้าใน UI ของเว็บส่วนหน้า แล้วคลิกอัปเดต ตรวจสอบว่าคุณเห็นการเปลี่ยนแปลงสถานะที่รายงานไปยัง Google ในบันทึกของคอนโซล Firebase
8. ขอแสดงความยินดี
ยินดีด้วย คุณผสานรวม Assistant กับบริการระบบคลาวด์ของอุปกรณ์โดยใช้การผสานรวมระบบคลาวด์กับระบบคลาวด์เรียบร้อยแล้ว
ดูข้อมูลเพิ่มเติม
ต่อไปนี้คือแนวคิดบางส่วนที่คุณนำไปใช้เพื่อเจาะลึกได้
- เพิ่มโหมดและปุ่มเปิด/ปิดลงในอุปกรณ์
- เพิ่มลักษณะที่รองรับลงในอุปกรณ์
- สํารวจการเรียกใช้ในพื้นที่สําหรับสมาร์ทโฮม
- ดูข้อมูลเพิ่มเติมได้ในตัวอย่าง GitHub
นอกจากนี้ คุณยังดูข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบและส่งการผสานรวมเพื่อรับการตรวจสอบ รวมถึงกระบวนการรับรองเพื่อเผยแพร่การผสานรวมให้ผู้ใช้ทราบได้ด้วย