1. ก่อนเริ่มต้น
การผสานรวมกับสมาร์ทโฮมช่วยให้ Google Assistant ควบคุมอุปกรณ์ที่เชื่อมต่อในบ้านของผู้ใช้ได้ หากต้องการสร้างการดำเนินการสำหรับสมาร์ทโฮม คุณต้องระบุปลายทางของเว็บฮุคของระบบคลาวด์ที่สามารถจัดการ Intent สมาร์ทโฮมได้ ตัวอย่างเช่น เมื่อผู้ใช้พูดว่า "Ok Google เปิดไฟหน่อย" Assistant จะส่งคำสั่งไปยัง Fulfillment ระบบคลาวด์เพื่ออัปเดตสถานะของอุปกรณ์
Local Home SDK ช่วยปรับปรุงการผสานรวมสมาร์ทโฮมของคุณด้วยการเพิ่มเส้นทางภายในเพื่อกำหนดเส้นทาง Intent ของสมาร์ทโฮมไปยังอุปกรณ์ Google Home โดยตรง ซึ่งช่วยเพิ่มความน่าเชื่อถือและลดเวลาในการตอบสนองในการประมวลผลคำสั่งของผู้ใช้ ซึ่งช่วยให้คุณเขียนและทำให้แอป Fulfillment ในเครื่องใช้งานได้ใน TypeScript หรือ JavaScript ที่ระบุอุปกรณ์และเรียกใช้คำสั่งบนลำโพงอัจฉริยะ Google Home หรือ Smart Display ของ Google Nest จากนั้นแอปจะสื่อสารกับอุปกรณ์อัจฉริยะที่ผู้ใช้มีอยู่ได้โดยตรงผ่านเครือข่ายท้องถิ่น โดยใช้โปรโตคอลมาตรฐานที่มีอยู่เพื่อดำเนินการตามคำสั่ง
ข้อกำหนดเบื้องต้น
- สร้างคู่มือสำหรับนักพัฒนาซอฟต์แวร์เพื่อการดำเนินการสำหรับสมาร์ทโฮม
- Codelab เครื่องซักผ้าสมาร์ทโฮม
- คู่มือนักพัฒนาซอฟต์แวร์เกี่ยวกับการจำหน่ายในพื้นที่
สิ่งที่คุณจะสร้าง
ใน Codelab นี้ คุณจะได้ใช้การผสานรวมสมาร์ทโฮมที่สร้างไว้ก่อนหน้านี้กับ Firebase จากนั้นใช้การกำหนดค่าการสแกนในคอนโซล Actions และสร้างแอปในเครื่องโดยใช้ TypeScript เพื่อส่งคำสั่งที่เขียนใน Node.js ไปยังอุปกรณ์เครื่องซักผ้าเสมือนจริง
สิ่งที่คุณจะได้เรียนรู้
- วิธีเปิดใช้และกำหนดค่า Fulfillment ภายในเครื่องในคอนโซลการดำเนินการ
- วิธีใช้ Local Home SDK เพื่อเขียนแอป Fulfillment ในเครื่อง
- วิธีแก้ไขข้อบกพร่องในแอป Fulfillment ในเครื่องซึ่งโหลดในลำโพง Google Home หรือ Smart Display ของ Google Nest
สิ่งที่คุณต้องมี
- Google Chrome เวอร์ชันล่าสุด
- อุปกรณ์ iOS หรือ Android ที่มีแอป Google Home
- ลำโพงอัจฉริยะ Google Home หรือ Smart Display ของ Google Nest
- Node.js เวอร์ชัน 10.16 ขึ้นไป
- บัญชี Google
- บัญชีสำหรับการเรียกเก็บเงินของ Google Cloud
2. เริ่มต้นใช้งาน
เปิดใช้ส่วนควบคุมกิจกรรม
คุณต้องแชร์ข้อมูลกิจกรรมบางอย่างกับ Google จึงจะใช้ Google Assistant ได้ Google Assistant ต้องการให้ข้อมูลนี้ทำงานได้อย่างถูกต้อง แต่ข้อกำหนดในการแชร์ข้อมูลไม่ได้มีไว้เฉพาะใน SDK หากต้องการแชร์ข้อมูลนี้ ให้สร้างบัญชี Google หากยังไม่มีบัญชี คุณจะใช้บัญชี Google ใดก็ได้และไม่จำเป็นต้องเป็นบัญชีนักพัฒนาแอปของคุณ
เปิดหน้าส่วนควบคุมกิจกรรมสำหรับบัญชี Google ที่ต้องการใช้กับ Assistant
ตรวจสอบว่าสวิตช์เปิด/ปิดต่อไปนี้เปิดอยู่
- กิจกรรมบนเว็บและแอป - นอกจากนี้ อย่าลืมเลือกช่องทำเครื่องหมายรวมประวัติการเข้าชมใน Chrome และกิจกรรมจากเว็บไซต์ แอป และอุปกรณ์ที่ใช้บริการต่างๆ ของ Google
- ข้อมูลอุปกรณ์
- กิจกรรมเสียงพูดและเสียง
สร้างโปรเจ็กต์ Actions
- ไปที่คอนโซล Actions on Google Developer
- คลิกโครงการใหม่ ป้อนชื่อโครงการแล้วคลิกสร้างโครงการ
เลือกแอปบ้านอัจฉริยะ
ในหน้าจอภาพรวมในคอนโซลการดำเนินการ ให้เลือกสมาร์ทโฮม
เลือกการ์ดประสบการณ์สมาร์ทโฮม แล้วระบบจะนำคุณไปยังคอนโซลของโปรเจ็กต์
ติดตั้ง Firebase CLI
Firebase Command Line Interface (CLI) ช่วยให้คุณแสดงเว็บแอปในเครื่องและใช้งานเว็บแอปในโฮสติ้งของ Firebase ได้
หากต้องการติดตั้ง CLI ให้เรียกใช้คำสั่ง npm ต่อไปนี้จากเทอร์มินัล:
npm install -g firebase-tools
หากต้องการยืนยันว่า CLI ได้รับการติดตั้งอย่างถูกต้อง ให้เรียกใช้คำสั่งต่อไปนี้
firebase --version
ให้สิทธิ์ Firebase CLI ด้วยบัญชี Google โดยการเรียกใช้
firebase login
เปิดใช้ HomeGraph API
HomeGraph API ช่วยให้มีพื้นที่เก็บข้อมูลและค้นหาข้อมูลของอุปกรณ์และสถานะภายใน Home Graph ของผู้ใช้ หากต้องการใช้ API นี้ คุณต้องเปิดคอนโซล Google Cloud และเปิดใช้ HomeGraph API ก่อน
ในคอนโซล Google Cloud ให้ตรวจสอบว่าคุณเลือกโปรเจ็กต์ที่ตรงกับ Actions ของคุณ <project-id>.
จากนั้นคลิกเปิดใช้ในหน้าจอไลบรารี API ของ HomeGraph API
3. เรียกใช้แอปเริ่มต้น
เมื่อตั้งค่าสภาพแวดล้อมการพัฒนาแล้ว คุณสามารถทำให้โปรเจ็กต์เริ่มต้นใช้งานได้เพื่อยืนยันว่าทุกอย่างมีการกำหนดค่าอย่างถูกต้อง
ดูซอร์สโค้ด
คลิกลิงก์ต่อไปนี้เพื่อดาวน์โหลดตัวอย่าง Codelab นี้ในเครื่องการพัฒนาของคุณ
...หรือโคลนที่เก็บ GitHub จากบรรทัดคำสั่งได้
git clone https://github.com/google-home/smarthome-local.git
เกี่ยวกับโปรเจ็กต์
โปรเจ็กต์เริ่มต้นมีไดเรกทอรีย่อยต่อไปนี้
public
- UI เว็บฟรอนท์เอนด์สำหรับควบคุมและตรวจสอบเครื่องซักผ้าอัจฉริยะfunctions
- ฟังก์ชันระบบคลาวด์ที่นำ Fulfillment ระบบคลาวด์มาใช้สำหรับการดำเนินการสมาร์ทโฮมlocal
- โปรเจ็กต์แอป Fulfillment ภายใน SketchUP ที่มีตัวแฮนเดิล Intent ที่แฝงอยู่ในindex.ts
Fulfillment ระบบคลาวด์ที่ระบุมีฟังก์ชันต่อไปนี้ใน index.js
fakeauth
- ปลายทางการให้สิทธิ์สำหรับการลิงก์บัญชีfaketoken
- ปลายทางโทเค็นสำหรับการลิงก์บัญชีsmarthome
- อุปกรณ์ปลายทางสำหรับ Intent ของสมาร์ทโฮมreportstate
- เรียกใช้ HomeGraph API เมื่อมีการเปลี่ยนแปลงสถานะของอุปกรณ์updateDevice
- ปลายทางที่อุปกรณ์เสมือนใช้เพื่อทริกเกอร์สถานะรายงาน
เชื่อมต่อกับ Firebase
ไปที่ไดเรกทอรี app-start
จากนั้นตั้งค่า Firebase CLI ด้วยโปรเจ็กต์ Actions ดังนี้
cd app-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
เนื่องจากคุณใช้รหัสโปรเจ็กต์เริ่มต้นอยู่ ให้เลือกไฟล์เริ่มต้นสำหรับกฎความปลอดภัย และตรวจสอบว่าคุณไม่ได้เขียนทับไฟล์กฎฐานข้อมูลที่มีอยู่
? 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 วิธี ดังนี้
- ใช้ GUI ให้ไปที่โฟลเดอร์
../functions
ภายใต้โปรเจ็กต์ เลือกไฟล์ที่ซ่อนไว้.eslintrc.js
แล้วลบออก อย่าเข้าใจผิดว่า.eslintrc.json
มีชื่อคล้ายกัน - การใช้บรรทัดคำสั่ง:
cd functions rm .eslintrc.js
เพื่อให้แน่ใจว่าคุณกำหนดค่า Firebase ได้ถูกต้องและสมบูรณ์ ให้คัดลอกไฟล์ firebase.json
จากไดเรกทอรี washer-done
ไปยังไดเรกทอรี washer-start
โดยเขียนทับไฟล์ใน washer-start
ในไดเรกทอรี 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
) เพื่อดูเว็บแอป โดยคุณจะเห็นอินเทอร์เฟซต่อไปนี้
UI บนเว็บนี้แสดงแพลตฟอร์มของบุคคลที่สามเพื่อดูหรือแก้ไขสถานะของอุปกรณ์ หากต้องการเริ่มสร้างฐานข้อมูลด้วยข้อมูลอุปกรณ์ ให้คลิกอัปเดต คุณจะไม่เห็นการเปลี่ยนแปลงใดๆ ในหน้านั้น แต่ระบบจะเก็บสถานะปัจจุบันของเครื่องซักผ้าไว้ในฐานข้อมูล
ตอนนี้ถึงเวลาเชื่อมต่อบริการระบบคลาวด์ที่คุณทำให้ใช้งานได้กับ Google Assistant โดยใช้คอนโซล Actions แล้ว
กำหนดค่าโปรเจ็กต์คอนโซล Actions
ใต้ภาพรวม > สร้างการดำเนินการ ให้เลือกเพิ่มการดำเนินการ ป้อน URL ของฟังก์ชันระบบคลาวด์ที่ให้ Fulfillment ของ Intent สมาร์ทโฮม แล้วคลิกบันทึก
https://us-central1-<project-id>.cloudfunctions.net/smarthome
ในแท็บพัฒนา > การเรียกใช้ ให้เพิ่มชื่อที่แสดงสำหรับการดำเนินการ แล้วคลิกบันทึก ชื่อนี้จะปรากฏในแอป Google Home
หากต้องการเปิดใช้การลิงก์บัญชี ให้เลือกตัวเลือกพัฒนา > การลิงก์บัญชี ในการนำทางด้านซ้าย ใช้การตั้งค่าการลิงก์บัญชีเหล่านี้
Client-ID |
|
รหัสลับไคลเอ็นต์ |
|
URL สำหรับการอนุญาต |
|
URL โทเค็น |
|
คลิกบันทึกเพื่อบันทึกการกำหนดค่าการลิงก์บัญชี แล้วคลิกทดสอบเพื่อเปิดใช้การทดสอบในโปรเจ็กต์
ระบบจะเปลี่ยนเส้นทางคุณไปยังเครื่องมือจำลอง ตรวจสอบว่าได้เปิดใช้การทดสอบสำหรับโปรเจ็กต์แล้วโดยวางเมาส์เหนือไอคอนการทดสอบในอุปกรณ์ ( )
ลิงก์กับ Google Assistant
คุณต้องลิงก์โปรเจ็กต์กับบัญชี Google เพื่อทดสอบการดำเนินการสำหรับสมาร์ทโฮม การดำเนินการนี้จะทำให้ทำการทดสอบผ่านแพลตฟอร์มของ Google Assistant และแอป Google Home ที่ลงชื่อเข้าใช้บัญชีเดียวกัน
- เปิดการตั้งค่า Google Assistant ในโทรศัพท์ โปรดทราบว่าคุณควรลงชื่อเข้าสู่ระบบด้วยบัญชีเดียวกับในคอนโซล
- ไปที่ Google Assistant > การตั้งค่า > ระบบควบคุมอุปกรณ์ในบ้าน (ในส่วน Assistant)
- คลิกไอคอนค้นหาที่ด้านขวาบน
- ค้นหาแอปทดสอบโดยใช้คำนำหน้า [test] เพื่อค้นหาแอปทดสอบที่เฉพาะเจาะจง
- เลือกรายการนั้น จากนั้น Google Assistant จะตรวจสอบสิทธิ์กับบริการและส่งคำขอ
SYNC
เพื่อขอให้บริการของคุณระบุรายการอุปกรณ์ให้กับผู้ใช้
เปิดแอป Google Home แล้วตรวจสอบว่าเห็นอุปกรณ์เครื่องซักผ้า
ยืนยันว่าคุณควบคุมเครื่องซักผ้าโดยใช้คำสั่งเสียงในแอป Google Home ได้ และคุณควรจะเห็นสถานะของอุปกรณ์ใน UI เว็บฟรอนท์เอนด์ของ Cloud Fulfillment ด้วย
ตอนนี้คุณเริ่มเพิ่ม Fulfillment ในพื้นที่ไปยังการดำเนินการของคุณได้แล้ว
4. อัปเดต Fulfillment ระบบคลาวด์
หากต้องการให้รองรับ Fulfillment ภายในเครื่อง คุณต้องเพิ่มช่องใหม่ต่ออุปกรณ์ชื่อ otherDeviceIds
ในการตอบกลับ SYNC
ในระบบคลาวด์ที่มีตัวระบุในอุปกรณ์ที่ไม่ซ้ำกัน ช่องนี้ยังระบุความสามารถในการควบคุมอุปกรณ์นั้นๆ ภายในเครื่องด้วย
เพิ่มช่อง otherDeviceIds
ลงในการตอบกลับ SYNC
ดังที่แสดงในข้อมูลโค้ดต่อไปนี้
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',
}],
}],
},
};
});
ทำให้โปรเจ็กต์ที่อัปเดตใช้งานได้ใน Firebase:
firebase deploy --only functions
หลังจากทำให้ใช้งานได้เรียบร้อยแล้ว ให้ไปที่ UI ของเว็บแล้วคลิกปุ่มรีเฟรช ในแถบเครื่องมือ การดำเนินการนี้จะทริกเกอร์การดำเนินการส่งคำขอซิงค์เพื่อให้ Assistant ได้รับข้อมูลการตอบกลับ SYNC
ที่อัปเดต
5. กำหนดค่า Fulfillment ภายในเครื่อง
ในส่วนนี้ คุณจะเพิ่มตัวเลือกการกำหนดค่าที่จำเป็นสำหรับ Fulfillment ภายในเครื่องลงในการดำเนินการสมาร์ทโฮม ในระหว่างการพัฒนา คุณจะเผยแพร่แอป Fulfillment ในเครื่องไปยังโฮสติ้งของ Firebase ซึ่งอุปกรณ์ Google Home จะเข้าถึงและดาวน์โหลดได้
ในคอนโซลการดําเนินการ ให้เลือกพัฒนา > การดําเนินการ แล้วหาส่วนกําหนดค่า SDK บ้านในเครื่อง ป้อน URL ต่อไปนี้ลงในช่อง URL ทดสอบ แทรกรหัสโปรเจ็กต์แล้วคลิกบันทึก
https://<project-id>.web.app/local-home/index.html
ถัดไป เราต้องระบุวิธีที่อุปกรณ์ Google Home ค้นพบอุปกรณ์อัจฉริยะในพื้นที่ แพลตฟอร์ม Local Home รองรับโปรโตคอลที่หลากหลายสำหรับการค้นพบอุปกรณ์ รวมถึงการออกอากาศ mDNS, UPnP และ UDP คุณจะใช้การออกอากาศ UDP เพื่อค้นหาเครื่องซักผ้าอัจฉริยะ
คลิกการกำหนดค่าการสแกนใหม่ในส่วนการกำหนดค่าการสแกนอุปกรณ์เพื่อเพิ่มการกำหนดค่าการสแกนใหม่ เลือก UDP เป็นโปรโตคอล แล้วกรอกแอตทริบิวต์ต่อไปนี้
ฟิลด์ | คำอธิบาย | มูลค่าที่แนะนำ |
ที่อยู่ในการบรอดแคสต์ข้อความ | ที่อยู่ในการออกอากาศ UDP |
|
พอร์ตออกอากาศ | พอร์ตที่ Google Home ส่งการออกอากาศ UDP |
|
พอร์ตการฟัง | พอร์ตที่ Google Home คอยฟังคำตอบ |
|
แพ็กเก็ต Discovery | เพย์โหลดข้อมูลการออกอากาศ UDP |
|
สุดท้าย ให้คลิกบันทึกที่ด้านบนของหน้าต่างเพื่อเผยแพร่การเปลี่ยนแปลง
6. ใช้ Fulfillment ในพื้นที่
คุณจะพัฒนาแอป Fulfillment ในเครื่องได้ใน TypeScript โดยใช้แพ็กเกจการพิมพ์ของ Local Home SDK ดูที่โครงกระดูกที่ระบุไว้ในโปรเจ็กต์เริ่มต้น:
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));
องค์ประกอบหลักของ Fulfillment ในเครื่องคือคลาส smarthome.App
โปรเจ็กต์เริ่มต้นแนบตัวแฮนเดิลสำหรับ Intent IDENTIFY
และ EXECUTE
จากนั้นเรียกใช้เมธอด listen()
เพื่อแจ้งให้ Local Home SDK ทราบว่าแอปพร้อมใช้งานแล้ว
เพิ่มเครื่องจัดการ IDENTIFY
Local Home SDK จะทริกเกอร์ตัวแฮนเดิล IDENTIFY
เมื่ออุปกรณ์ Google Home พบอุปกรณ์ที่ยังไม่ได้ยืนยันในเครือข่ายภายในตามการกำหนดค่าการสแกนที่ให้ไว้ในคอนโซลการดำเนินการ
ในขณะเดียวกัน แพลตฟอร์มจะเรียกใช้ identifyHandler
ซึ่งมีข้อมูลการสแกนที่ได้ เมื่อ Google พบอุปกรณ์ที่ตรงกัน ในแอป การสแกนจะเกิดขึ้นโดยใช้การออกอากาศ UDP และข้อมูลการสแกนที่ให้ไว้กับตัวแฮนเดิล IDENTIFY
รวมถึงเพย์โหลดการตอบกลับที่ส่งโดยอุปกรณ์ในเครือข่ายเดียวกัน
เครื่องจัดการแสดงผลอินสแตนซ์ IdentifyResponse
ที่มีตัวระบุที่ไม่ซ้ำกันสำหรับอุปกรณ์ภายใน เพิ่มโค้ดต่อไปนี้ลงในเมธอด identifyHandler
เพื่อประมวลผลการตอบสนอง UDP ที่มาจากอุปกรณ์ภายในเครื่องและระบุรหัสอุปกรณ์ที่ถูกต้องในพื้นที่
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);
}
โปรดทราบว่าช่อง verificationId
ต้องตรงกับค่า otherDeviceIds
ค่าใดค่าหนึ่งในการตอบกลับ SYNC
ซึ่งจะแจ้งว่าอุปกรณ์พร้อมใช้งานสำหรับการดำเนินการตามคำสั่งซื้อในเครื่องใน Home Graph ของผู้ใช้ หลังจากที่ Google พบอุปกรณ์ที่ตรงกันแล้ว อุปกรณ์ดังกล่าวจะถือว่าได้รับการยืนยันและพร้อมสำหรับการดำเนินการตามคำสั่งซื้อในพื้นที่แล้ว
เพิ่มเครื่องจัดการ EXECUTE
Local Home SDK จะทริกเกอร์ตัวแฮนเดิล EXECUTE
เมื่ออุปกรณ์ที่รองรับ Fulfillment ภายในได้รับคำสั่ง เนื้อหาของ Intent ในเครื่องเทียบเท่ากับ Intent ของ EXECUTE
ที่ส่งไปยัง Fulfillment ระบบคลาวด์ ดังนั้นตรรกะสำหรับการประมวลผล Intent ในเครื่องจึงคล้ายกับวิธีที่คุณจัดการในระบบคลาวด์
แอปสามารถใช้ซ็อกเก็ต TCP/UDP หรือคำขอ HTTP(S) เพื่อสื่อสารกับอุปกรณ์ภายในเครื่องได้ ใน Codelab นี้ HTTP ทำหน้าที่เป็นโปรโตคอลที่ใช้ในการควบคุมอุปกรณ์เสมือน หมายเลขพอร์ตจะกำหนดไว้ใน index.ts
เป็นตัวแปร SERVER_PORT
เพิ่มโค้ดต่อไปนี้ลงในเมธอด executeHandler
เพื่อประมวลผลคำสั่งขาเข้าและส่งไปยังอุปกรณ์ภายในผ่าน 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);
});
}
รวบรวมแอป TypeScript
ไปที่ไดเรกทอรี local/
แล้วเรียกใช้คำสั่งต่อไปนี้เพื่อดาวน์โหลดคอมไพเลอร์ TypeScript และคอมไพล์แอป
cd local npm install npm run build
การดำเนินการนี้คอมไพล์แหล่งที่มา index.ts
(TypeScript) และวางเนื้อหาต่อไปนี้ลงในไดเรกทอรี public/local-home/
bundle.js
- เอาต์พุต JavaScript ที่คอมไพล์ซึ่งมีแอปในเครื่องและทรัพยากร Dependencyindex.html
- หน้าโฮสติ้งในเครื่องที่ใช้เพื่อให้บริการแอปสำหรับการทดสอบในอุปกรณ์
นำโปรเจ็กต์ทดสอบไปใช้
ทำให้ไฟล์โปรเจ็กต์ที่อัปเดตใช้งานได้กับโฮสติ้งของ Firebase เพื่อให้คุณเข้าถึงได้จากอุปกรณ์ Google Home
firebase deploy --only hosting
7. เปิดเครื่องเครื่องซักผ้าอัจฉริยะ
ตอนนี้ได้เวลาทดสอบการสื่อสารระหว่างแอปที่ดำเนินการตามคำสั่งซื้อในเครื่องและเครื่องซักผ้าอัจฉริยะแล้ว โปรเจ็กต์เริ่มต้นของ Codelab ประกอบด้วยvเครื่องซักผ้าอัจฉริยะเสมือนจริง ซึ่งเขียนด้วย Node.js ซึ่งจำลองเครื่องซักผ้าอัจฉริยะที่ผู้ใช้ควบคุมได้จากเครื่อง
กำหนดค่าอุปกรณ์
คุณต้องกำหนดค่าอุปกรณ์เสมือนให้ใช้พารามิเตอร์ UDP เดียวกันกับที่ใช้กับการกำหนดค่าการสแกนเพื่อค้นหาอุปกรณ์ในคอนโซลการดำเนินการ นอกจากนี้ คุณต้องบอกอุปกรณ์เสมือนว่าจะรายงานรหัสอุปกรณ์ภายในเครื่องใด และรหัสโปรเจ็กต์การดำเนินการที่จะใช้สำหรับเหตุการณ์สถานะการรายงานเมื่อสถานะของอุปกรณ์มีการเปลี่ยนแปลง
พารามิเตอร์ | มูลค่าที่แนะนำ |
deviceId |
|
discoveryPortOut |
|
discoveryPacket |
|
projectId | รหัสโปรเจ็กต์ Actions ของคุณ |
เริ่มใช้งานอุปกรณ์
ไปที่ไดเรกทอรี virtual-device/
และเรียกใช้สคริปต์อุปกรณ์โดยส่งพารามิเตอร์การกำหนดค่าเป็นอาร์กิวเมนต์ ดังนี้
cd virtual-device npm install npm start -- \ --deviceId=deviceid123 --projectId=<project-id> \ --discoveryPortOut=3311 --discoveryPacket=HelloLocalHomeSDK
ตรวจสอบว่าสคริปต์อุปกรณ์ทำงานด้วยพารามิเตอร์ที่คาดไว้ โดยทำดังนี้
(...): UDP Server listening on 3311 (...): Device listening on port 3388 (...): Report State successful
8. แก้ไขข้อบกพร่องแอป TypeScript
ในส่วนต่อไปนี้ คุณจะได้ยืนยันว่าอุปกรณ์ Google Home สแกน ระบุ และส่งคำสั่งไปยังเครื่องซักผ้าอัจฉริยะเสมือนผ่านเครือข่ายในพื้นที่ได้อย่างถูกต้อง คุณสามารถใช้เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Google Chrome เพื่อเชื่อมต่อกับอุปกรณ์ Google Home, ดูบันทึกของคอนโซล และแก้ไขข้อบกพร่องของแอป TypeScript
เชื่อมต่อเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Chrome
หากต้องการเชื่อมต่อโปรแกรมแก้ไขข้อบกพร่องกับแอป Fulfillment ในเครื่อง ให้ทำตามขั้นตอนต่อไปนี้
- ตรวจสอบว่าคุณได้ลิงก์อุปกรณ์ Google Home กับผู้ใช้ที่มีสิทธิ์เข้าถึงโปรเจ็กต์คอนโซลการดำเนินการแล้ว
- รีบูตอุปกรณ์ Google Home ซึ่งทำให้อุปกรณ์รับ URL ของ HTML รวมถึงการกำหนดค่าการสแกนที่คุณใส่ไว้ในคอนโซลการดำเนินการได้
- เปิด Chrome ในเครื่องการพัฒนาของคุณ
- เปิดแท็บ Chrome ใหม่และป้อน
chrome://inspect
ในช่องที่อยู่เพื่อเปิดใช้งานเครื่องมือตรวจสอบ
คุณจะเห็นรายการอุปกรณ์ในหน้าดังกล่าวและ URL ของแอปควรปรากฏใต้ชื่ออุปกรณ์ Google Home
เปิดเครื่องมือตรวจสอบ
คลิกตรวจสอบใต้ URL ของแอปเพื่อเปิดเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Chrome เลือกแท็บคอนโซลและยืนยันว่าคุณสามารถดูเนื้อหาของ Intent IDENTIFY
ที่แอป TypeScript พิมพ์อยู่
เอาต์พุตนี้หมายความว่าแอปที่ Fulfillment ในเครื่องของคุณค้นพบและระบุตัวตนอุปกรณ์เสมือนได้สำเร็จ
ทดสอบการดำเนินการตามคำสั่งซื้อในพื้นที่
ส่งคำสั่งไปยังอุปกรณ์โดยใช้การควบคุมด้วยการสัมผัสในแอป Google Home หรือผ่านคำสั่งเสียงไปยังอุปกรณ์ Google Home เช่น
"Ok Google เปิดเครื่องซักผ้า"
"Ok Google เปิดเครื่องซักผ้าให้หน่อย"
"Ok Google ปิดเครื่องซักผ้า"
การดำเนินการนี้จะทริกเกอร์แพลตฟอร์มให้ส่ง Intent EXECUTE
ไปยังแอป TypeScript ของคุณ
ยืนยันว่าคุณเห็นการเปลี่ยนแปลงสถานะของเครื่องซักผ้าอัจฉริยะในเครื่องจากแต่ละคำสั่ง
... ***** The washer is RUNNING ***** ... ***** The washer is STOPPED *****
9. ขอแสดงความยินดี
ยินดีด้วย คุณใช้ Local Home SDK เพื่อผสานรวม Fulfillment ภายในบ้านเข้ากับการดำเนินการสำหรับสมาร์ทโฮม
ดูข้อมูลเพิ่มเติม
คุณสามารถลองทำสิ่งต่อไปนี้
- เปลี่ยนการกำหนดค่าการสแกนและทำให้การสแกนใช้งานได้ เช่น ลองใช้พอร์ต UDP หรือแพ็กเกตการค้นหาอื่น
- ปรับแต่งโค้ดเบสของอุปกรณ์อัจฉริยะเสมือนให้ทำงานในอุปกรณ์ที่ฝัง เช่น Raspberry Pi และใช้ LED หรือจอแสดงผลเพื่อแสดงสถานะปัจจุบัน