เปิดใช้การดําเนินการตามคําสั่งซื้อในพื้นที่สําหรับการดําเนินการในบ้านอัจฉริยะ

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

การผสานรวมกับสมาร์ทโฮมช่วยให้ Google Assistant ควบคุมอุปกรณ์ที่เชื่อมต่อในบ้านของผู้ใช้ได้ หากต้องการสร้างการดำเนินการสำหรับสมาร์ทโฮม คุณต้องระบุปลายทางของเว็บฮุคของระบบคลาวด์ที่สามารถจัดการ Intent สมาร์ทโฮมได้ ตัวอย่างเช่น เมื่อผู้ใช้พูดว่า "Ok Google เปิดไฟหน่อย" Assistant จะส่งคำสั่งไปยัง Fulfillment ระบบคลาวด์เพื่ออัปเดตสถานะของอุปกรณ์

Local Home SDK ช่วยปรับปรุงการผสานรวมสมาร์ทโฮมของคุณด้วยการเพิ่มเส้นทางภายในเพื่อกำหนดเส้นทาง Intent ของสมาร์ทโฮมไปยังอุปกรณ์ Google Home โดยตรง ซึ่งช่วยเพิ่มความน่าเชื่อถือและลดเวลาในการตอบสนองในการประมวลผลคำสั่งของผู้ใช้ ซึ่งช่วยให้คุณเขียนและทำให้แอป Fulfillment ในเครื่องใช้งานได้ใน TypeScript หรือ JavaScript ที่ระบุอุปกรณ์และเรียกใช้คำสั่งบนลำโพงอัจฉริยะ Google Home หรือ Smart Display ของ Google Nest จากนั้นแอปจะสื่อสารกับอุปกรณ์อัจฉริยะที่ผู้ใช้มีอยู่ได้โดยตรงผ่านเครือข่ายท้องถิ่น โดยใช้โปรโตคอลมาตรฐานที่มีอยู่เพื่อดำเนินการตามคำสั่ง

72ffb320986092c.png

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

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

ใน Codelab นี้ คุณจะได้ใช้การผสานรวมสมาร์ทโฮมที่สร้างไว้ก่อนหน้านี้กับ Firebase จากนั้นใช้การกำหนดค่าการสแกนในคอนโซล Actions และสร้างแอปในเครื่องโดยใช้ TypeScript เพื่อส่งคำสั่งที่เขียนใน Node.js ไปยังอุปกรณ์เครื่องซักผ้าเสมือนจริง

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

  • วิธีเปิดใช้และกำหนดค่า Fulfillment ภายในเครื่องในคอนโซลการดำเนินการ
  • วิธีใช้ Local Home SDK เพื่อเขียนแอป Fulfillment ในเครื่อง
  • วิธีแก้ไขข้อบกพร่องในแอป Fulfillment ในเครื่องซึ่งโหลดในลำโพง Google Home หรือ Smart Display ของ Google Nest

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

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

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

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

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

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

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

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

  1. ไปที่คอนโซล Actions on Google Developer
  2. คลิกโครงการใหม่ ป้อนชื่อโครงการแล้วคลิกสร้างโครงการ

AWXw5E1m9zVgvVeyeL3uxwCX6DtWOCK6LRSLmOATFzjMbmE5cSWBdSVhJZDFpEFH2azZTK2eMs6OYYdMJYiGb5bKqFEzxaLyRUYuwVGBlSjXzTyy8Z9CvwpXvRwP7xdycklETzFc7Q

เลือกแอปบ้านอัจฉริยะ

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

36RsBUWBgbgsa5xZ7MJVMm1sIg07nXbfjv0mWCxXViaC5SlbL2gMigw9hgXsZQhNMHLLFOfiKdZsSTNXONFB1i47gksw3SBNpkVYl492WeryOlgxKjpVrLAvg-5cZqu1DI-s5kxM3g

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

pzgHPsmc2LvLoeUvJfkjKQqD_BvO4v8JOPlcrxsmyptFkkjL4PP6LqrM9r5tNvEIfT9HmK-UKw3GWFPXTjqo4nUrhD2o5shUKHBE31OT8iIA69JZCev7_0_nh-lnL2oJHoxGfqqZ4w

ติดตั้ง 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

5SVCzM8IZLi_9DV8M0nEklv16NXkpvM0bIzQK2hSyKyvnFHBxPOz90rbr72ayxzmxd5aNROOqC_Cp4outbdlwJdObDs0DIE_8vYzw6dovoVrP9IZWlWsZxDS7UHOi1jiRbDMG8MqUA

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 วิธี ดังนี้

  1. ใช้ GUI ให้ไปที่โฟลเดอร์ ../functions ภายใต้โปรเจ็กต์ เลือกไฟล์ที่ซ่อนไว้ .eslintrc.js แล้วลบออก อย่าเข้าใจผิดว่า .eslintrc.json มีชื่อคล้ายกัน
  2. การใช้บรรทัดคำสั่ง:
    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) เพื่อดูเว็บแอป โดยคุณจะเห็นอินเทอร์เฟซต่อไปนี้

L60eA7MOnPmbBMl2XMipT9MdnP-RaVjyjf0Y93Y1b7mEyIsqZrrwczE7D3RQISRs-iusL1g4XbNmGhuA6-5sLcWefnczwNJEPfNLtwBsO4Tb9YvcAZBI6_rX19z8rxbik9Vq8F2fwg

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

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

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

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

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

Uso-o00XQXBHvOR9vQq9tmpYDYQJKsFEstsgRFnxPAJf7zJ2FxwhISiodo3dB1Tz49Okd6ivi66fjpo7rarS_GZelglGWCT1r9FzDGUl1r67ddIcIbQrxqN8jG9F9GAKOpk0Ckc-eA

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

gvC-TvmKDy-D-xjwkeCjNt__9ErA7DL8hZWa1oH1yPJ9SpYOepDYjxx6WnJ56IG-t37fJ65kmHISQdh72Ot2G-0tu6Flxf4gom5kvx_3hlvFeMqYuFgXr_85pfWWn7VLFHtS55p1zw

s4yc1kOW4XtKUQN1EYegiDLU5oTqmxQ2PNbeaujm26OQmYKKpjug7j5FYmutLSAZ1zBd-ZkcZlL7zyTZqw4bge3_oOeWvJTsqJ-A08vfZwImYQrKiquLskLuTpmMqXEZD1xchhCWGQ

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

Client-ID

ABC123

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

DEF456

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

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

URL โทเค็น

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

rRyZTiBSTuPk3YtJtXjDK1pPftUxsaEhs9jzpvFtbHTD6bEwYxM8jV4MWxiljKA1bKVZrIRoO9O3jtBefLKf_OyMpukPjwIj8zGvyU3UwASzMrnRskl-hVAfAmQVi4sC_zAwgYwRXw

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

OgUvpQfXioygkRwPcaJpzjyNQDZy6enidUC8YMPaCOrZi0YeWCFsCJV9Gqg-_UfsqTnn4KEg--uE3Ymr0QuamDonF4RyYHtRKcULXABDuaEnj2hq8i20LYj1SrGP_1lQ_UsUB90pGw

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

2zbfeYpG-wEd2SFP07Wc4mJzHakLX7YvrNw3IV0_0Kd-TonfsKIvvjKWlwvrmTm5jLj3XPWqCtcDd5J2z6gwn9fnchpYVraw1j_mE4M0LVppAl5WY5cK7g0uZyhZ3VFFS25yPmyksg

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

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

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

XcWmBVamBZtPfOFqtsr5I38stPWTqDcMfQwbBjetBgxt0FCjEs285pa9K3QXSASptw0KYN2G8yfkT0-xg664V4PjqMreDDs-HPegHjOc4EVtReYPu-WKZyygq9Xmkf8X8z9177nBjQ

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

bf4f6a866160a982.png

5. กำหนดค่า Fulfillment ภายในเครื่อง

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

ในคอนโซลการดําเนินการ ให้เลือกพัฒนา > การดําเนินการ แล้วหาส่วนกําหนดค่า SDK บ้านในเครื่อง ป้อน URL ต่อไปนี้ลงในช่อง URL ทดสอบ แทรกรหัสโปรเจ็กต์แล้วคลิกบันทึก

https://<project-id>.web.app/local-home/index.html

7d59b31f8d2a988.png

ถัดไป เราต้องระบุวิธีที่อุปกรณ์ Google Home ค้นพบอุปกรณ์อัจฉริยะในพื้นที่ แพลตฟอร์ม Local Home รองรับโปรโตคอลที่หลากหลายสำหรับการค้นพบอุปกรณ์ รวมถึงการออกอากาศ mDNS, UPnP และ UDP คุณจะใช้การออกอากาศ UDP เพื่อค้นหาเครื่องซักผ้าอัจฉริยะ

คลิกการกำหนดค่าการสแกนใหม่ในส่วนการกำหนดค่าการสแกนอุปกรณ์เพื่อเพิ่มการกำหนดค่าการสแกนใหม่ เลือก UDP เป็นโปรโตคอล แล้วกรอกแอตทริบิวต์ต่อไปนี้

ฟิลด์

คำอธิบาย

มูลค่าที่แนะนำ

ที่อยู่ในการบรอดแคสต์ข้อความ

ที่อยู่ในการออกอากาศ UDP

255.255.255.255

พอร์ตออกอากาศ

พอร์ตที่ Google Home ส่งการออกอากาศ UDP

3311

พอร์ตการฟัง

พอร์ตที่ Google Home คอยฟังคำตอบ

3312

แพ็กเก็ต Discovery

เพย์โหลดข้อมูลการออกอากาศ UDP

48656c6c6f4c6f63616c486f6d6553444b

4777bf63c53b6858.png

สุดท้าย ให้คลิกบันทึกที่ด้านบนของหน้าต่างเพื่อเผยแพร่การเปลี่ยนแปลง

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 ที่คอมไพล์ซึ่งมีแอปในเครื่องและทรัพยากร Dependency
  • index.html - หน้าโฮสติ้งในเครื่องที่ใช้เพื่อให้บริการแอปสำหรับการทดสอบในอุปกรณ์

นำโปรเจ็กต์ทดสอบไปใช้

ทำให้ไฟล์โปรเจ็กต์ที่อัปเดตใช้งานได้กับโฮสติ้งของ Firebase เพื่อให้คุณเข้าถึงได้จากอุปกรณ์ Google Home

firebase deploy --only hosting

7. เปิดเครื่องเครื่องซักผ้าอัจฉริยะ

ตอนนี้ได้เวลาทดสอบการสื่อสารระหว่างแอปที่ดำเนินการตามคำสั่งซื้อในเครื่องและเครื่องซักผ้าอัจฉริยะแล้ว โปรเจ็กต์เริ่มต้นของ Codelab ประกอบด้วยvเครื่องซักผ้าอัจฉริยะเสมือนจริง ซึ่งเขียนด้วย Node.js ซึ่งจำลองเครื่องซักผ้าอัจฉริยะที่ผู้ใช้ควบคุมได้จากเครื่อง

กำหนดค่าอุปกรณ์

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

พารามิเตอร์

มูลค่าที่แนะนำ

deviceId

deviceid123

discoveryPortOut

3311

discoveryPacket

HelloLocalHomeSDK

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 ในเครื่อง ให้ทำตามขั้นตอนต่อไปนี้

  1. ตรวจสอบว่าคุณได้ลิงก์อุปกรณ์ Google Home กับผู้ใช้ที่มีสิทธิ์เข้าถึงโปรเจ็กต์คอนโซลการดำเนินการแล้ว
  2. รีบูตอุปกรณ์ Google Home ซึ่งทำให้อุปกรณ์รับ URL ของ HTML รวมถึงการกำหนดค่าการสแกนที่คุณใส่ไว้ในคอนโซลการดำเนินการได้
  3. เปิด Chrome ในเครื่องการพัฒนาของคุณ
  4. เปิดแท็บ Chrome ใหม่และป้อน chrome://inspect ในช่องที่อยู่เพื่อเปิดใช้งานเครื่องมือตรวจสอบ

คุณจะเห็นรายการอุปกรณ์ในหน้าดังกล่าวและ URL ของแอปควรปรากฏใต้ชื่ออุปกรณ์ Google Home

567f97789a7d8846.png

เปิดเครื่องมือตรวจสอบ

คลิกตรวจสอบใต้ URL ของแอปเพื่อเปิดเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Chrome เลือกแท็บคอนโซลและยืนยันว่าคุณสามารถดูเนื้อหาของ Intent IDENTIFY ที่แอป TypeScript พิมพ์อยู่

6b67ded470a4c8be.png

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

ทดสอบการดำเนินการตามคำสั่งซื้อในพื้นที่

ส่งคำสั่งไปยังอุปกรณ์โดยใช้การควบคุมด้วยการสัมผัสในแอป Google Home หรือผ่านคำสั่งเสียงไปยังอุปกรณ์ Google Home เช่น

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

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

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

การดำเนินการนี้จะทริกเกอร์แพลตฟอร์มให้ส่ง Intent EXECUTE ไปยังแอป TypeScript ของคุณ

bc030517dacc3ac9.png

ยืนยันว่าคุณเห็นการเปลี่ยนแปลงสถานะของเครื่องซักผ้าอัจฉริยะในเครื่องจากแต่ละคำสั่ง

...
***** The washer is RUNNING *****
...
***** The washer is STOPPED *****

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

764dbc83b95782a.png

ยินดีด้วย คุณใช้ Local Home SDK เพื่อผสานรวม Fulfillment ภายในบ้านเข้ากับการดำเนินการสำหรับสมาร์ทโฮม

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

คุณสามารถลองทำสิ่งต่อไปนี้

  • เปลี่ยนการกำหนดค่าการสแกนและทำให้การสแกนใช้งานได้ เช่น ลองใช้พอร์ต UDP หรือแพ็กเกตการค้นหาอื่น
  • ปรับแต่งโค้ดเบสของอุปกรณ์อัจฉริยะเสมือนให้ทำงานในอุปกรณ์ที่ฝัง เช่น Raspberry Pi และใช้ LED หรือจอแสดงผลเพื่อแสดงสถานะปัจจุบัน