اجرای محلی را برای اقدامات خانه هوشمند فعال کنید

1. قبل از شروع

ادغام خانه های هوشمند به دستیار Google اجازه می دهد تا دستگاه های متصل در خانه کاربران را کنترل کند. برای ساخت یک اکشن خانه هوشمند، باید یک نقطه پایانی وب هوک ابری ارائه دهید که بتواند اهداف خانه هوشمند را مدیریت کند. به عنوان مثال، وقتی کاربری می گوید: «Hey Google، چراغ ها را روشن کن»، دستیار دستوری را برای به روز رسانی وضعیت دستگاه به اجرای ابری شما ارسال می کند.

Local Home SDK با افزودن یک مسیر محلی برای مسیریابی اهداف خانه هوشمند به طور مستقیم به یک دستگاه Google Home، ادغام خانه هوشمند شما را بهبود می بخشد، که قابلیت اطمینان را افزایش می دهد و تأخیر در پردازش دستورات کاربران را کاهش می دهد. این به شما امکان می دهد یک برنامه تکمیل محلی را در TypeScript یا JavaScript بنویسید و اجرا کنید که دستگاه ها را شناسایی می کند و دستورات را در هر بلندگوی هوشمند Google Home یا نمایشگر هوشمند Google Nest اجرا می کند. سپس برنامه شما مستقیماً با دستگاه‌های هوشمند موجود کاربران از طریق شبکه محلی با استفاده از پروتکل‌های استاندارد موجود برای اجرای دستورات ارتباط برقرار می‌کند.

72ffb320986092c.png

پیش نیازها

چیزی که خواهی ساخت

در این کد لبه، یک ادغام خانه هوشمند قبلی را با Firebase اجرا می‌کنید، سپس یک پیکربندی اسکن را در کنسول Actions اعمال می‌کنید و یک برنامه محلی با استفاده از TypeScript برای ارسال دستورات نوشته شده در Node.js به یک دستگاه شستشوی مجازی می‌سازید.

چیزی که یاد خواهید گرفت

  • نحوه فعال کردن و پیکربندی انجام محلی در کنسول Actions.
  • نحوه استفاده از Local Home SDK برای نوشتن یک برنامه تکمیل محلی.
  • نحوه اشکال زدایی برنامه تحقق محلی بارگذاری شده در بلندگوی Google Home یا نمایشگر هوشمند Google Nest.

آنچه شما نیاز دارید

2. شروع به کار

فعال کردن کنترل های فعالیت

برای استفاده از Google Assistant، باید داده‌های فعالیت خاصی را با Google به اشتراک بگذارید. دستیار Google برای عملکرد صحیح به این داده ها نیاز دارد. با این حال، نیاز به اشتراک گذاری داده ها مختص SDK نیست. برای اشتراک‌گذاری این داده‌ها، اگر قبلاً ندارید، یک حساب Google ایجاد کنید. می توانید از هر حساب Google استفاده کنید—نیازی نیست که حساب توسعه دهنده شما باشد.

صفحه Activity Controls را برای حساب Google که می‌خواهید با Assistant استفاده کنید، باز کنید.

اطمینان حاصل کنید که سوئیچ های زیر فعال هستند:

  • فعالیت وب و برنامه - علاوه بر این، حتماً کادر بررسی شامل سابقه و فعالیت Chrome از سایت‌ها، برنامه‌ها و دستگاه‌هایی که از خدمات Google استفاده می‌کنند را انتخاب کنید.
  • اطلاعات دستگاه
  • فعالیت صوتی و صوتی

یک پروژه Actions ایجاد کنید

  1. به Actions on Google Developer Console بروید.
  2. پروژه جدید را کلیک کنید، یک نام برای پروژه وارد کنید و روی ایجاد پروژه کلیک کنید.

AWXW5E1M9ZVGVVEYEL3UXWCX6DTWOCK6LRSLMOATFZJMBME5CSWBDSVHJZDFPEFH2EMS6AZTK2EMS6OYYDMJYIDMS6OYDMASTK2EMS6OYDMASTK2EMS6OZLYDMASENEMAS6ONEMS6ONEAMS6ONEAMS6ONEAMS6ONEAMS6OZLYREAS6ONEAMS6OZLYRENEMASTK

برنامه خانه هوشمند را انتخاب کنید

در صفحه نمای کلی در کنسول اقدامات، خانه هوشمند را انتخاب کنید.

36RsBUWBgbgsa5xZ7MJVMm1sIg07nXbfjv0mWCxXViaC5SlbL2gMigw9hgXsZQhNMHLLFOfiKdZsSTNXONFB1i47gksw3SBNpkVYl49xXXViaC5SlbL2gMigw9hgXsZQhNMHLLFOfiKdZsSTNXONFB1i47gksw3SBNpkVYl49xXXViaC5SlbL2g

کارت تجربه خانه هوشمند را انتخاب کنید و سپس به کنسول پروژه خود هدایت خواهید شد.

pzgHPsmc2LvLoeUvJfkjKQqD_BvO4v8JOPlcrxsmyptFkkjL4PP6LqrM9r5tNvEIfT9HmK-UKw3GWFPXTjqo4nUrhD2o5shUKHBE31OTZqChl4Go5shUKHBE31OTZqChl4GHBE31OTZqChV7-GUHBE31OTZql4GHBE31OTZqlOxl7 w

Firebase CLI را نصب کنید

رابط خط فرمان Firebase (CLI) به شما این امکان را می دهد که برنامه های وب خود را به صورت محلی ارائه دهید و برنامه وب خود را در میزبانی Firebase مستقر کنید.

برای نصب CLI، دستور npm زیر را از ترمینال اجرا کنید:

npm install -g firebase-tools

برای تأیید اینکه CLI به درستی نصب شده است، اجرا کنید:

firebase --version

با اجرای زیر Firebase CLI را با حساب Google خود مجاز کنید:

firebase login

HomeGraph API را فعال کنید

HomeGraph API ذخیره و پرس و جو از دستگاه ها و وضعیت آنها را در نمودار اصلی کاربر فعال می کند. برای استفاده از این API، ابتدا باید کنسول Google Cloud را باز کرده و HomeGraph API را فعال کنید .

در کنسول Google Cloud، مطمئن شوید که پروژه‌ای را انتخاب کنید که با Actions <project-id>. سپس، در صفحه کتابخانه API برای HomeGraph API، روی فعال کردن کلیک کنید.

5SVCzM8IZLi_9DV8M0nEklv16NXkpvM0bIzQK2hSyKyvnFHBxPOz90rbr72ayxzmxd5aNROOqC_Cp4outbdlwJdObDs0DIE_8vYzw6WDVDVUVRX1000DVRX1XW1DVR

3. برنامه استارتر را اجرا کنید

اکنون که محیط توسعه خود را راه‌اندازی می‌کنید، می‌توانید پروژه راه‌اندازی را اجرا کنید تا تأیید کنید همه چیز به درستی پیکربندی شده است.

کد منبع را دریافت کنید

برای دانلود نمونه این کد لبه روی دستگاه توسعه خود، روی لینک زیر کلیک کنید:

یا می توانید مخزن GitHub را از خط فرمان کلون کنید:

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

در مورد پروژه

پروژه شروع کننده شامل زیر شاخه های زیر است:

  • public — رابط کاربری وب جلویی برای کنترل و نظارت بر واشر هوشمند
  • functions — توابع ابری که اجرای ابر را برای اقدام خانه هوشمند اجرا می کنند
  • local — پروژه برنامه تحقق محلی Skeleton با کنترل‌کننده‌های هدف در index.ts

تکمیل ابر ارائه شده شامل توابع زیر در index.js است:

  • fakeauth - نقطه پایانی مجوز برای پیوند دادن حساب
  • faketoken - نقطه پایانی رمز برای پیوند دادن حساب
  • smarthome - نقطه پایان تحقق هدف خانه هوشمند
  • reportstate — API HomeGraph را در تغییرات وضعیت دستگاه فراخوانی می کند
  • updateDevice - نقطه پایانی که توسط دستگاه مجازی برای راه اندازی وضعیت گزارش استفاده می شود

به Firebase متصل شوید

به دایرکتوری app-start بروید، سپس Firebase CLI را با پروژه Actions خود راه اندازی کنید:

cd app-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 را مقداردهی اولیه کنید. می توانید از مکان پیش فرض برای نمونه پایگاه داده استفاده کنید.

? 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

اگر پروژه خود را مجدداً مقداردهی اولیه می کنید، وقتی از شما پرسیده شد که آیا می خواهید یک پایگاه کد را مقداردهی اولیه یا بازنویسی کنید، گزینه Overwrite را انتخاب کنید.

? 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 را مقداردهی اولیه یا بازنویسی کنید، گزینه No را انتخاب کنید.

? File functions/.gitignore already exists. Overwrite?
No
? Do you want to install dependencies with npm now?
Yes

در نهایت، تنظیمات میزبانی خود را برای استفاده از دایرکتوری public در کد پروژه پیکربندی کنید و از فایل index.html موجود استفاده کنید. هنگامی که از ESLint خواسته شد گزینه No را انتخاب کنید.

? 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 به طور تصادفی فعال شد، دو روش برای غیرفعال کردن آن وجود دارد:

  1. با استفاده از رابط کاربری گرافیکی، به پوشه ../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 مستقر شوید

اکنون که وابستگی ها را نصب کرده اید و پروژه خود را پیکربندی کرده اید، برای اولین بار آماده اجرای برنامه هستید.

firebase deploy

این خروجی کنسولی است که باید ببینید:

...

✔ Deploy complete!

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

این دستور یک برنامه وب را به همراه چندین تابع Cloud برای Firebase مستقر می کند.

برای مشاهده برنامه وب ، URL میزبانی را در مرورگر خود باز کنید ( https://<project-id>.web.app ). رابط زیر را خواهید دید:

L60eA7MONPmbBMl2XMipT9MdnP-RaVjyjf0Y93Y1b7mEyIsqZrrwczE7D3RQISRs-iusL1g4XbNmGhuA6-5sLcWefnczwNJEPfNLtwB9YvXcO4T g

این رابط کاربری وب نشان دهنده یک پلت فرم شخص ثالث برای مشاهده یا تغییر وضعیت دستگاه است. برای شروع پر کردن پایگاه داده خود با اطلاعات دستگاه، روی UPDATE کلیک کنید. هیچ تغییری در صفحه مشاهده نمی کنید، اما وضعیت فعلی ماشین لباسشویی شما در پایگاه داده ذخیره می شود.

اکنون زمان آن رسیده است که سرویس ابری را با استفاده از کنسول Actions به Google Assistant متصل کنید.

پروژه کنسول Actions خود را پیکربندی کنید

در قسمت نمای کلی > Build your Action ، Add Action(s) را انتخاب کنید. URL را برای عملکرد ابری خود وارد کنید که اهداف خانه هوشمند را برآورده می کند و روی ذخیره کلیک کنید.

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

استفاده

در برگه Develop > Invocation ، یک نام نمایشی برای Action خود اضافه کنید و روی Save کلیک کنید. این نام در برنامه Google Home ظاهر می شود.

gvC-TvmKDy-D-xjwkeCjNt__9ErA7DL8hZWa1oH1yPJ9SpYOepDYjxx6WnJ56IG-t37fJ65kmHISQdh72Ot2G-0tu6Flxf4gom5kvFWLWMqn5kvFWLxY03 55p1zw

s4yc1kOW4XtKUQN1EYegiDLU5oTqmxQ2PNbeaujm26OQmYKKpjug7j5FYmutLSAZ1zBd-ZkcZlL7zyTZqw4bge3_oOeWvJTsqJ-A08vfZwWQiquMxLXR

برای فعال کردن پیوند حساب، گزینه Develop > Account linking را در ناوبری سمت چپ انتخاب کنید. از این تنظیمات پیوند حساب استفاده کنید:

شناسه مشتری

ABC123

راز مشتری

DEF456

URL مجوز

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

نشانی اینترنتی رمز

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

rRyZTiBSTuPk3YtJtXjDK1pPftUxsaEhs9jzpvFtbHTD6bEwYxM8jV4MWxiljKA1bKVZrIRoO9O3jtBefLKf_OyMpukPjwIj8zGvyU3UwASzMrnRskl-hVAfAmQVi4sC_zAwgYwRXw

روی Save کلیک کنید تا پیکربندی پیوند حساب خود را ذخیره کنید، سپس روی Test کلیک کنید تا آزمایش روی پروژه شما فعال شود.

OgUvpQfXioygkRwPcaJpzjyNQDZy6enidUC8YMPaCOrZi0YeWCFsCJV9Gqg-_UfsqTnn4KEg--uE3Ymr0QuamDonF4RyYHtRKcULXABDuaCorZi0YeWCFsCJV9Gqg-_UfsqTnn4KEg--uE3Ymr0QuamDonF4RyYHtRKcULXABDuaCuEnj2PUl1

شما به شبیه ساز هدایت خواهید شد. با حرکت دادن ماوس بر روی Testing on Device بررسی کنید که تست برای پروژه شما فعال شده است ( soCeBB1CkSIEqsBmDc8Cth6EjgcXUnrOHeOpLNlvMiiXM73Rmh8iBK1ZFLFd47kycYqIMq3Fm49ryAGUt79BXVPDyEB1IU3W0fgiL49zqLvMiiXM73Rmh8iBK1ZFLFd47kycYqIMq3Fm49ryAGUt79BXVPDyEB1IU3W0fgiL49zqLV1Xor ) آیکون.

2zbfeYpG-wEd2SFP07Wc4mJzHakLX7YvrNw3IV0_0Kd-TonfsKIvvjKWlwvrmTm5jLj3XPWqCtcDd5J2z6gwn9fnchpYVraw1j_ppcA4M5W0LV001JPC4MW00L g

برای آزمایش اکشن خانه هوشمند خود، باید پروژه خود را با یک حساب Google مرتبط کنید. این امکان آزمایش از طریق سطوح دستیار Google و برنامه Google Home را فراهم می کند که به سیستم یک حساب وارد شده اند.

  1. در تلفن خود، تنظیمات دستیار Google را باز کنید. توجه داشته باشید که باید با همان حساب کاربری در کنسول وارد شوید.
  2. به Google Assistant > Settings > Home Control (در زیر Assistant) بروید.
  3. روی نماد جستجو در بالا سمت راست کلیک کنید.
  4. برنامه آزمایشی خود را با استفاده از پیشوند [test] جستجو کنید تا برنامه آزمایشی خاص خود را پیدا کنید.
  5. آن مورد را انتخاب کنید. سپس Google Assistant با سرویس شما احراز هویت می‌کند و یک درخواست SYNC ارسال می‌کند و از سرویس شما می‌خواهد فهرستی از دستگاه‌ها را برای کاربر ارائه دهد.

برنامه Google Home را باز کنید و بررسی کنید که می‌توانید دستگاه لباسشویی خود را ببینید.

XcWmBVamBZtPfOFqtsr5I38stPWTqDcMfQwbBjetBgxt0FCjEs285pa9K3QXSASptw0KYN2G8yfkT0-xg664V4PjqMreDDs-HPegHjOcq4WKZ78Puq4WZ78000000000000

بررسی کنید که می‌توانید ماشین لباسشویی را با استفاده از دستورات صوتی در برنامه Google Home کنترل کنید. همچنین باید تغییر وضعیت دستگاه را در رابط کاربری وب جلویی اجرای ابری خود مشاهده کنید.

اکنون می توانید شروع به افزودن اجرای محلی به Action خود کنید.

4. تکمیل ابر را به روز کنید

برای پشتیبانی از انجام محلی، باید یک فیلد جدید برای هر دستگاه به نام 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

پس از تکمیل استقرار، به رابط کاربری وب بروید و روی Refresh کلیک کنید ae8d3b25777a5e30.png دکمه در نوار ابزار این یک عملیات درخواست همگام‌سازی را راه‌اندازی می‌کند تا دستیار داده‌های پاسخ SYNC به‌روزرسانی‌شده را دریافت کند.

bf4f6a866160a982.png

5. انجام محلی را پیکربندی کنید

در این بخش، گزینه های پیکربندی لازم برای انجام محلی را به اکشن خانه هوشمند خود اضافه می کنید. در طول توسعه، برنامه تحقق محلی را در Firebase Hosting منتشر می‌کنید، جایی که دستگاه Google Home می‌تواند به آن دسترسی داشته باشد و آن را دانلود کند.

در کنسول Actions ، Develop > Actions را انتخاب کنید و بخش Configure local home SDK را پیدا کنید. URL زیر را در قسمت URL تست وارد کنید، ID پروژه خود را وارد کنید و روی Save کلیک کنید:

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

7d59b31f8d2a988.png

در مرحله بعد، باید تعریف کنیم که چگونه دستگاه Google Home باید دستگاه های هوشمند محلی را کشف کند . پلتفرم Local Home از چندین پروتکل برای کشف دستگاه پشتیبانی می کند، از جمله پخش mDNS، UPnP و UDP. برای کشف واشر هوشمند از پخش UDP استفاده خواهید کرد.

برای افزودن پیکربندی اسکن جدید، در قسمت پیکربندی اسکن دستگاه، روی New scan config کلیک کنید. UDP را به عنوان پروتکل انتخاب کنید و ویژگی های زیر را پر کنید:

رشته

شرح

ارزش پیشنهادی

آدرس پخش

آدرس پخش UDP

255.255.255.255

پورت پخش

درگاهی که Google Home پخش UDP را در آن ارسال می کند

3311

پورت گوش دادن

درگاهی که Google Home برای پاسخ گوش می دهد

3312

بسته کشف

محموله داده پخش UDP

48656c6c6f4c6f63616c486f6d6553444b

4777bf63c53b6858.png

در نهایت روی Save در بالای پنجره کلیک کنید تا تغییرات شما منتشر شود.

6. اجرای محلی

با استفاده از بسته تایپ Local Home SDK، برنامه تکمیل محلی خود را در TypeScript توسعه خواهید داد. به اسکلت ارائه شده در پروژه شروع نگاه کنید:

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));

مؤلفه اصلی تحقق محلی، کلاس smarthome.App است. پروژه شروع کننده، کنترل کننده هایی را برای مقاصد IDENTIFY و EXECUTE متصل می کند، سپس متد listen() را فراخوانی می کند تا به Local Home SDK اطلاع دهد که برنامه آماده است.

کنترل کننده IDENTIFY را اضافه کنید

هنگامی که دستگاه Google Home دستگاه‌های تأیید نشده را بر اساس پیکربندی اسکن ارائه شده در کنسول Actions کشف می‌کند، Local Home SDK، کنترل‌کننده IDENTIFY شما را فعال می‌کند.

در همین حال، پلتفرم identifyHandler با داده‌های اسکن به‌دست‌آمده زمانی که گوگل دستگاهی منطبق را کشف می‌کند، فراخوانی می‌کند. در برنامه شما، اسکن با استفاده از یک پخش 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 شما مطابقت داشته باشد، که دستگاه را به عنوان موجود برای انجام محلی در نمودار اصلی کاربر پرچم‌گذاری می‌کند. پس از اینکه Google مورد منطبق را پیدا کرد، آن دستگاه تأیید شده و آماده برای تکمیل محلی در نظر گرفته می شود.

کنترل کننده EXECUTE را اضافه کنید

هنگامی که دستگاهی که از اجرای محلی پشتیبانی می‌کند فرمانی دریافت می‌کند، Local Home SDK کنترل‌کننده EXECUTE شما را فعال می‌کند. محتوای هدف محلی معادل هدف EXECUTE است که به اجرای ابری شما ارسال شده است، بنابراین منطق پردازش محلی هدف شبیه نحوه مدیریت آن در ابر است.

این برنامه می‌تواند از سوکت‌های TCP/UDP یا درخواست‌های HTTP(S) برای برقراری ارتباط با دستگاه‌های محلی استفاده کند. در این کد، 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 را کامپایل کنید

برای دانلود کامپایلر TypeScript و کامپایل برنامه، به دایرکتوری local/ بروید و دستورات زیر را اجرا کنید:

cd local
npm install
npm run build

این منبع index.ts (TypeScript) را کامپایل می کند و محتویات زیر را در دایرکتوری public/local-home/ قرار می دهد:

  • bundle.js - خروجی جاوا اسکریپت کامپایل شده حاوی برنامه محلی و وابستگی ها.
  • index.html - صفحه میزبانی محلی برای ارائه برنامه برای آزمایش روی دستگاه استفاده می شود.

اجرای پروژه آزمایشی

فایل های پروژه به روز شده را در میزبانی Firebase مستقر کنید تا بتوانید از دستگاه Google Home به آنها دسترسی داشته باشید.

firebase deploy --only hosting

7. واشر هوشمند را راه اندازی کنید

اکنون زمان آن است که ارتباط بین برنامه تحقق محلی خود و واشر هوشمند را آزمایش کنید! پروژه آغازگر Codelab شامل یک واشر هوشمند مجازی v – نوشته شده در Node.js – است که یک واشر هوشمند را شبیه سازی می کند که کاربران می توانند به صورت محلی آن را کنترل کنند.

دستگاه را پیکربندی کنید

باید دستگاه مجازی را طوری پیکربندی کنید که از همان پارامترهای UDP استفاده کند که در پیکربندی اسکن برای کشف دستگاه در کنسول Actions اعمال کردید. علاوه بر این، باید به دستگاه مجازی بگویید که کدام شناسه دستگاه محلی را گزارش کند و شناسه پروژه Actions برای رویدادهای گزارش وضعیت زمانی که وضعیت دستگاه تغییر می کند استفاده کند.

پارامتر

ارزش پیشنهادی

شناسه دستگاه

deviceid123

DiscoveryPortOut

3311

DiscoveryPacket

HelloLocalHomeSDK

شناسه پروژه

شناسه پروژه 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 Developer Tools را وصل کنید

برای اتصال دیباگر به برنامه تکمیل محلی خود، این مراحل را دنبال کنید:

  1. مطمئن شوید که دستگاه Google Home خود را به کاربری با مجوز دسترسی به پروژه کنسول Actions مرتبط کرده اید.
  2. دستگاه Google Home خود را راه اندازی مجدد کنید، که به آن امکان می دهد URL HTML شما و همچنین پیکربندی اسکنی را که در کنسول Actions قرار داده اید دریافت کند.
  3. Chrome را در دستگاه توسعه خود راه اندازی کنید.
  4. یک برگه کروم جدید باز کنید و chrome://inspect در قسمت آدرس وارد کنید تا بازرس راه اندازی شود.

باید فهرستی از دستگاه‌ها را در صفحه ببینید و URL برنامه شما باید زیر نام دستگاه Google Home شما ظاهر شود.

567f97789a7d8846.png

بازرس را راه اندازی کنید

برای راه‌اندازی ابزار برنامه‌نویس Chrome، بر روی Inspect در زیر URL برنامه کلیک کنید. تب Console را انتخاب کنید و تأیید کنید که می‌توانید محتوای IDENTIFY را که توسط برنامه TypeScript چاپ شده است ببینید.

6b67ded470a4c8be.png

این خروجی به این معنی است که برنامه تحقق محلی شما با موفقیت دستگاه مجازی را کشف و شناسایی کرده است.

اجرای محلی را آزمایش کنید

با استفاده از کنترل‌های لمسی در برنامه Google Home یا از طریق دستورات صوتی به دستگاه Google Home دستورات را به دستگاه خود ارسال کنید، مانند:

"Hey Google، ماشین لباسشویی من را روشن کن."

"Hey Google، ماشین لباسشویی من را روشن کن."

"Hey Google، ماشین لباسشویی من را متوقف کن."

این باید پلتفرم را برای ارسال یک هدف EXECUTE به برنامه TypeScript شما تحریک کند.

bc030517dacc3ac9.png

بررسی کنید که با هر دستور می‌توانید تغییر وضعیت واشر هوشمند محلی را مشاهده کنید.

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

9. تبریک می گویم

764dbc83b95782a.png

تبریک می گویم! شما از Local Home SDK برای ادغام اجرای محلی در یک اقدام خانه هوشمند استفاده کردید.

بیشتر بدانید

در اینجا موارد دیگری وجود دارد که می توانید امتحان کنید:

  • پیکربندی اسکن را تغییر دهید و آن را کار کنید. به عنوان مثال، سعی کنید از یک پورت UDP دیگر یا بسته کشف استفاده کنید.
  • پایگاه کدهای دستگاه هوشمند مجازی را طوری تغییر دهید که روی یک دستگاه تعبیه شده (مانند Raspberry Pi) اجرا شود و از LED یا نمایشگر برای تجسم وضعیت فعلی استفاده کنید.