۱. قبل از شروع
یکپارچهسازی خانههای هوشمند به دستیار گوگل اجازه میدهد تا دستگاههای متصل در خانههای کاربران را کنترل کند. برای ایجاد یکپارچهسازی ابر به ابر، باید یک نقطه پایانی وبهوک ابری فراهم کنید که بتواند اهداف خانه هوشمند را مدیریت کند. به عنوان مثال، وقتی کاربری میگوید: «هی گوگل، چراغها را روشن کن»، دستیار گوگل این دستور را به بخش ابری شما ارسال میکند تا وضعیت دستگاه را بهروزرسانی کند.
کیت توسعه نرمافزار Local Home با افزودن یک مسیر محلی برای هدایت مستقیم اهداف خانه هوشمند به دستگاه Google Home، یکپارچهسازی خانه هوشمند شما را بهبود میبخشد، که این امر قابلیت اطمینان را افزایش داده و تأخیر در پردازش دستورات کاربران را کاهش میدهد. این کیت به شما امکان میدهد یک برنامه تحویل سفارش محلی را با TypeScript یا JavaScript بنویسید و مستقر کنید که دستگاهها را شناسایی کرده و دستورات را روی هر بلندگوی هوشمند Google Home یا نمایشگر هوشمند Google Nest اجرا میکند. سپس برنامه شما با استفاده از پروتکلهای استاندارد موجود برای انجام دستورات، مستقیماً با دستگاههای هوشمند موجود کاربران از طریق شبکه محلی ارتباط برقرار میکند.

پیشنیازها
- یک راهنمای توسعهدهنده برای ادغام ابر به ابر ایجاد کنید
- ماشین لباسشویی هوشمند codelab
- راهنمای توسعهدهندگان برای تکمیل سفارشات محلی
آنچه خواهید ساخت
در این آزمایشگاه کد، شما یک سیستم یکپارچهسازی خانه هوشمند که قبلاً با Firebase ساخته شده است را پیادهسازی خواهید کرد، سپس پیکربندی اسکن را در کنسول توسعهدهندگان اعمال خواهید کرد و یک برنامه محلی با استفاده از TypeScript میسازید تا دستورات نوشته شده در Node.js را به یک دستگاه ماشین لباسشویی مجازی ارسال کند.
آنچه یاد خواهید گرفت
- نحوه فعالسازی و پیکربندی تکمیل سفارش محلی در کنسول توسعهدهندگان.
- نحوه استفاده از SDK محلی Home برای نوشتن یک اپلیکیشن تحویل سفارشات محلی.
- نحوه اشکالزدایی برنامه محلی تکمیل سفارش بارگذاری شده روی بلندگوی گوگل هوم یا نمایشگر هوشمند گوگل نست.
آنچه نیاز دارید
- آخرین نسخه گوگل کروم
- یک دستگاه iOS یا اندروید با برنامه Google Home
- بلندگوی هوشمند گوگل هوم یا نمایشگر هوشمند گوگل نست
- نسخه Node.js 10.16 یا بالاتر
- یک حساب گوگل
- یک حساب پرداخت گوگل کلود
۲. شروع کار
کنترلهای فعالیت را فعال کنید
برای استفاده از دستیار گوگل، باید دادههای فعالیت خاصی را با گوگل به اشتراک بگذارید. دستیار گوگل برای عملکرد صحیح به این دادهها نیاز دارد؛ با این حال، الزام به اشتراکگذاری دادهها مختص SDK نیست. برای به اشتراک گذاشتن این دادهها، اگر از قبل حساب گوگل ندارید، یک حساب کاربری گوگل ایجاد کنید. میتوانید از هر حساب کاربری گوگلی استفاده کنید - نیازی نیست که حساب کاربری توسعهدهنده شما باشد.
صفحه کنترلهای فعالیت را برای حساب گوگلی که میخواهید با دستیار استفاده کنید، باز کنید.
مطمئن شوید که کلیدهای تغییر وضعیت زیر فعال هستند:
- فعالیت وب و برنامه - علاوه بر این، حتماً کادر انتخاب « افزودن سابقه و فعالیت Chrome از سایتها، برنامهها و دستگاههایی که از سرویسهای Google استفاده میکنند» را علامت بزنید.
- اطلاعات دستگاه
- فعالیت صوتی و تصویری
ایجاد یک پروژه ادغام ابر به ابر
- به کنسول توسعهدهندگان بروید.
- روی «ایجاد پروژه» کلیک کنید، یک نام برای پروژه وارد کنید و روی «ایجاد پروژه» کلیک کنید.

ادغام ابر به ابر را انتخاب کنید
در صفحه اصلی پروژه در کنسول توسعهدهندگان، گزینه «افزودن ادغام ابر به ابر» را در زیر «ابر به ابر» انتخاب کنید.

نصب رابط خط فرمان فایربیس
رابط خط فرمان فایربیس (CLI) به شما این امکان را میدهد که برنامههای وب خود را به صورت محلی ارائه دهید و برنامه وب خود را در هاستینگ فایربیس مستقر کنید.
برای نصب CLI، دستور npm زیر را از ترمینال اجرا کنید:
npm install -g firebase-tools
برای تأیید اینکه CLI به درستی نصب شده است، دستور زیر را اجرا کنید:
firebase --version
با اجرای دستور زیر، Firebase CLI را با حساب گوگل خود مجاز کنید:
firebase login
فعال کردن HomeGraph API
رابط برنامهنویسی کاربردی HomeGraph امکان ذخیرهسازی و پرسوجو از دستگاهها و وضعیت آنها را در Home Graph کاربر فراهم میکند. برای استفاده از این API، ابتدا باید کنسول Google Cloud را باز کرده و HomeGraph API را فعال کنید .
در کنسول Google Cloud، مطمئن شوید که پروژهای را انتخاب میکنید که با <project-id>. سپس، در صفحه کتابخانه API برای API HomeGraph، روی فعال کردن کلیک کنید.
۳. برنامهی آغازین را اجرا کنید
اکنون که محیط توسعه خود را راهاندازی کردهاید، میتوانید پروژه اولیه را مستقر کنید تا تأیید کنید که همه چیز به درستی پیکربندی شده است.
دریافت کد منبع
برای دانلود نمونه این codelab روی دستگاه توسعهدهنده خود، روی لینک زیر کلیک کنید:
... یا میتوانید مخزن GitHub را از خط فرمان کلون کنید:
git clone https://github.com/google-home/smarthome-local.git
درباره پروژه
پروژه اولیه شامل زیرشاخههای زیر است:
-
public— رابط کاربری وب Frontend برای کنترل و نظارت بر ماشین لباسشویی هوشمند -
functions— توابع ابری که عملیات ابری را برای ادغام ابر به ابر پیادهسازی میکنند -
local- اسکلت پروژه برنامه تکمیل سفارش محلی با کنترلکنندههای اینتنت که درindex.tsقرار گرفتهاند
تکمیل ابری ارائه شده شامل توابع زیر در index.js است:
-
fakeauth- نقطه پایانی مجوز برای پیوند حساب -
faketoken— نقطه پایانی توکن برای پیوند حساب -
smarthome- نقطه پایانی تحقق هدف خانه هوشمند -
reportstate— رابط برنامهنویسی کاربردی HomeGraph را در صورت تغییر وضعیت دستگاه فراخوانی میکند. -
updateDevice—نقطه پایانی مورد استفاده توسط دستگاه مجازی برای فعال کردن Report State
اتصال به فایربیس
به دایرکتوری app-start بروید، سپس Firebase CLI را با پروژه ادغام Cloud-to-cloud خود تنظیم کنید:
cd app-start firebase use <project-id>
پیکربندی پروژه فایربیس
یک پروژه Firebase را راهاندازی کنید.
firebase init
ویژگیهای CLI، پایگاه داده بلادرنگ و ویژگی توابع را انتخاب کنید.
? Which Firebase features do you want to set up for this directory? Press Space to select features, then Enter to confirm your choices. (Press <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to proceed) >( ) Data Connect: Set up a Firebase Data Connect service ( ) Firestore: Configure security rules and indexes files for Firestore ( ) Genkit: Setup a new Genkit project with Firebase (*) Functions: Configure a Cloud Functions directory and its files ( ) App Hosting: Configure an apphosting.yaml file for App Hosting ( ) Hosting: Configure files for Firebase Hosting and (optionally) 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 (*) Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision default instance ( ) Data Connect: Set up a Firebase Data Connect service ( ) Firestore: Configure security rules and indexes files for Firestore
این کار 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
اگر در حال مقداردهی مجدد پروژه خود هستید، وقتی از شما پرسیده شد که آیا میخواهید functions/.gitignore را مقداردهی اولیه کنید یا بازنویسی کنید، گزینه خیر (No) را انتخاب کنید.
? File functions/.gitignore already exists. Overwrite? No
? Do you want to install dependencies with npm now? Yes
اگر ESLint به طور تصادفی فعال شده باشد، دو روش برای غیرفعال کردن آن وجود دارد:
- با استفاده از رابط کاربری گرافیکی، به پوشه
../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 deploy
این خروجی کنسولی است که باید ببینید:
... ✔ Deploy complete! Project Console: https://console.firebase.google.com/project/<project-id>/overview Hosting URL: https://<project-id>.web.app
این دستور یک برنامه وب را به همراه چندین تابع ابری برای Firebase مستقر میکند.
برای مشاهده برنامه وب، آدرس میزبانی (Hosting URL) را در مرورگر خود باز کنید ( https://<project-id>.web.app ). رابط کاربری زیر را مشاهده خواهید کرد:
این رابط کاربری وب، یک پلتفرم شخص ثالث برای مشاهده یا تغییر وضعیت دستگاهها را نشان میدهد. برای شروع پر کردن پایگاه داده خود با اطلاعات دستگاه، روی بهروزرسانی کلیک کنید. هیچ تغییری در صفحه مشاهده نخواهید کرد، اما وضعیت فعلی ماشین لباسشویی شما در پایگاه داده ذخیره میشود.
اکنون زمان آن رسیده است که سرویس ابری که مستقر کردهاید را با استفاده از کنسول توسعهدهندگان به دستیار گوگل متصل کنید.
پروژه کنسول توسعهدهنده خود را پیکربندی کنید
در برگه «توسعه» ، یک نام نمایشی برای تعامل خود اضافه کنید. این نام در برنامه Google Home نمایش داده خواهد شد.

در قسمت App branding ، یک فایل png برای آیکون برنامه، با اندازه ۱۴۴ در ۱۴۴ پیکسل و نام دلخواه آپلود کنید. .

برای فعال کردن پیوند حساب، از این تنظیمات پیوند حساب استفاده کنید:
شناسه مشتری | |
راز مشتری | |
آدرس اینترنتی مجوز | |
آدرس اینترنتی توکن | |

در زیر آدرس اینترنتی تکمیل سفارش ابری ، آدرس اینترنتی مربوط به عملکرد ابری خود را که برای اهداف خانه هوشمند انجام سفارش را فراهم میکند، وارد کنید.
https://us-central1-<project-id>.cloudfunctions.net/smarthome

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

اکنون میتوانید پیادهسازی وبهوکهای لازم برای اتصال وضعیت دستگاه به دستیار را آغاز کنید.
لینک به دستیار گوگل
برای آزمایش ادغام ابر به ابر، باید پروژه خود را به یک حساب گوگل متصل کنید. این کار امکان آزمایش از طریق سطوح دستیار گوگل و برنامه گوگل هوم را که به یک حساب کاربری یکسان وارد شدهاند، فراهم میکند.
- در گوشی خود، تنظیمات دستیار گوگل (Google Assistant) را باز کنید. توجه داشته باشید که باید با همان حسابی که در کنسول وارد شدهاید، وارد سیستم شوید.
- به دستیار گوگل > تنظیمات > کنترل خانه (زیر دستیار) بروید.
- روی نماد جستجو در بالا سمت راست کلیک کنید.
- برای یافتن برنامه آزمایشی خاص خود، با استفاده از پیشوند [test]، برنامه آزمایشی خود را جستجو کنید.
- آن مورد را انتخاب کنید. سپس دستیار گوگل با سرویس شما احراز هویت میکند و یک درخواست
SYNCارسال میکند و از سرویس شما میخواهد لیستی از دستگاهها را برای کاربر ارائه دهد.
برنامه Google Home را باز کنید و مطمئن شوید که میتوانید دستگاه ماشین لباسشویی خود را ببینید.
تأیید کنید که میتوانید ماشین لباسشویی را با استفاده از دستورات صوتی در برنامه Google Home کنترل کنید. همچنین باید تغییر وضعیت دستگاه را در رابط کاربری وب frontend سرویس ابری خود مشاهده کنید.
اکنون میتوانید تکمیل سفارشات محلی را به فرآیند یکپارچهسازی خود اضافه کنید.
۴. بهروزرسانی پردازش ابری
برای پشتیبانی از انجام محلی، باید یک فیلد جدید به نام otherDeviceIds برای هر دستگاه به پاسخ cloud SYNC اضافه کنید که حاوی یک شناسه محلی منحصر به فرد برای دستگاه باشد. این فیلد همچنین نشاندهنده توانایی کنترل محلی آن دستگاه است.
فیلد otherDeviceIds را همانطور که در قطعه کد زیر نشان داده شده است به پاسخ SYNC اضافه کنید:
توابع/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» کلیک کنید.
دکمه در نوار ابزار. این باعث میشود عملیات درخواست همگامسازی آغاز شود تا دستیار، دادههای پاسخ SYNC بهروزرسانیشده را دریافت کند.

۵. پیکربندی تحویل محلی
در این بخش، گزینههای پیکربندی لازم برای انجام سفارش محلی را به ادغام Cloud-to-cloud خود اضافه خواهید کرد. در طول توسعه، برنامهی انجام سفارش محلی را در Firebase Hosting منتشر خواهید کرد، جایی که دستگاه Google Home میتواند به آن دسترسی داشته باشد و آن را دانلود کند.
در کنسول توسعهدهندگان گوگل هوم ، به مسیر Project > Cloud-to-cloud در سمت چپ صفحه بروید، سپس برای ادغام، گزینه Edit را انتخاب کنید. در صفحه Setup and configuration ، به Local completion بروید و گزینه تنظیمات را فعال کنید. آدرس اینترنتی زیر را در هر فیلد Test URL وارد کنید، شناسه پروژه خود را وارد کنید و روی Save کلیک کنید:
https://<project-id>.web.app/local-home/index.html

در مرحله بعد، باید تعریف کنیم که دستگاه گوگل هوم چگونه باید دستگاههای هوشمند محلی را کشف کند . پلتفرم Local Home از چندین پروتکل برای کشف دستگاه، از جمله mDNS، UPnP و پخش UDP پشتیبانی میکند. شما از پخش UDP برای کشف ماشین لباسشویی هوشمند استفاده خواهید کرد.
برای افزودن پیکربندی اسکن جدید، در زیر بخش Device discovery روی +Add scan configuration کلیک کنید. پروتکل UDP را انتخاب کنید و ویژگیهای زیر را وارد کنید:
میدان | توضیحات | مقدار پیشنهادی |
آدرس دیسکاوری | آدرس کشف UDP | |
پورت پخش | پورتی که گوگل هوم پخش UDP را از آنجا ارسال میکند | |
پورت شنود | پورتی که گوگل هوم در آن منتظر پاسخ میماند | |
بسته اکتشافی | بار داده پخش UDP | |

در نهایت، برای ذخیره تغییرات، روی گزینه ذخیره در پایین پنجره کلیک کنید.
۶. اجرای عملیات تکمیل سفارشات محلی
شما برنامهی تحویل سفارش محلی خود را در TypeScript با استفاده از پکیج تایپینگ Local Home SDK توسعه خواهید داد. به اسکلت ارائه شده در پروژهی آغازین نگاه کنید:
فایل محلی/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() را فراخوانی میکند تا به SDK محلی Home اطلاع دهد که برنامه آماده است.
اضافه کردن هندلر IDENTIFY
کیت توسعه نرمافزاری محلی هوم (Local Home SDK) زمانی که دستگاه گوگل هوم (Google Home) بر اساس پیکربندی اسکن ارائه شده در کنسول توسعهدهندگان، دستگاههای تأیید نشدهای را در شبکه محلی پیدا میکند، هندلر IDENTIFY شما را فعال میکند.
در همین حال، پلتفرم هنگامی که گوگل دستگاه منطبقی را پیدا میکند، identifyHandler را با دادههای اسکن حاصل فراخوانی میکند. در برنامه شما، اسکن با استفاده از یک پخش UDP انجام میشود و دادههای اسکن ارائه شده به IDENTIFY شامل بار داده پاسخ ارسال شده توسط دستگاه محلی است.
این هندلر یک نمونه IdentifyResponse را برمیگرداند که حاوی یک شناسه منحصر به فرد برای دستگاه محلی است. کد زیر را به متد identifyHandler خود اضافه کنید تا پاسخ UDP دریافتی از دستگاه محلی را پردازش کرده و شناسه دستگاه محلی مناسب را تعیین کند:
فایل .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 شما مطابقت داشته باشد، که دستگاه را به عنوان موجود برای انجام محلی در نمودار صفحه اصلی کاربر علامت گذاری میکند. پس از اینکه گوگل یک تطابق پیدا کرد، آن دستگاه تأیید شده و آماده برای انجام محلی در نظر گرفته میشود.
اضافه کردن کنترل کننده EXECUTE
SDK محلی Home، زمانی که دستگاهی که از اجرای محلی پشتیبانی میکند، دستوری را دریافت میکند، کنترلکنندهی EXECUTE شما را فعال میکند. محتوای هدف محلی معادل هدف EXECUTE ارسال شده به اجرای ابری شما است، بنابراین منطق پردازش محلی هدف شبیه نحوهی مدیریت آن در ابر است. اقدامات
این برنامه میتواند از سوکتهای TCP/UDP یا درخواستهای HTTP(S) برای ارتباط با دستگاههای محلی استفاده کند. در این آزمایشگاه کد، HTTP به عنوان پروتکل مورد استفاده برای کنترل دستگاه مجازی عمل میکند. شماره پورت در index.ts به عنوان متغیر SERVER_PORT تعریف شده است.
کد زیر را به متد executeHandler خود اضافه کنید تا دستورات ورودی را پردازش کرده و آنها را از طریق HTTP به دستگاه محلی ارسال کند:
فایل محلی/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— خروجی جاوا اسکریپت کامپایل شده حاوی برنامه محلی و وابستگیها. -
index.html— صفحه میزبانی محلی که برای ارائه برنامه جهت آزمایش روی دستگاه استفاده میشود.
پروژه آزمایشی را مستقر کنید
فایلهای پروژه بهروزرسانیشده را در Firebase Hosting مستقر کنید تا بتوانید از طریق دستگاه Google Home به آنها دسترسی داشته باشید.
firebase deploy --only hosting
۷. ماشین لباسشویی هوشمند را روشن کنید
حالا وقت آن رسیده که ارتباط بین برنامهی محلی ارسال سفارش و ماشین لباسشویی هوشمند را آزمایش کنید! پروژهی اولیهی codelab شامل یک ماشین لباسشویی هوشمند مجازی - نوشته شده با Node.js - است که یک ماشین لباسشویی هوشمند را شبیهسازی میکند و کاربران میتوانند آن را به صورت محلی کنترل کنند.
دستگاه را پیکربندی کنید
شما باید دستگاه مجازی را طوری پیکربندی کنید که از همان پارامترهای UDP که برای پیکربندی اسکن برای کشف دستگاه در کنسول توسعهدهندگان اعمال کردهاید، استفاده کند. علاوه بر این، باید به دستگاه مجازی بگویید که کدام شناسه دستگاه محلی را گزارش دهد و شناسه پروژه ادغام ابر به ابر را برای گزارش رویدادهای وضعیت هنگام تغییر وضعیت دستگاه استفاده کند.
پارامتر | مقدار پیشنهادی |
شناسه دستگاه | |
کشفپورتاوت | |
کشف بسته | |
شناسه پروژه | شناسه پروژه ادغام ابر به ابر شما |
دستگاه را روشن کنید
به دایرکتوری 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
۸. اشکالزدایی برنامه TypeScript
در بخش بعدی، تأیید خواهید کرد که دستگاه Google Home میتواند به درستی ماشین لباسشویی هوشمند مجازی را از طریق شبکه محلی اسکن، شناسایی و ارسال کند. میتوانید از ابزارهای توسعهدهنده Google Chrome برای اتصال به دستگاه Google Home، مشاهده گزارشهای کنسول و اشکالزدایی برنامه TypeScript استفاده کنید.
ابزارهای توسعهدهنده کروم را متصل کنید
برای اتصال دیباگر به برنامهی محلی خود، این مراحل را دنبال کنید:
- مطمئن شوید که دستگاه گوگل هوم خود را به کاربری که اجازه دسترسی به پروژه کنسول توسعهدهندگان را دارد، متصل کردهاید.
- دستگاه گوگل هوم خود را مجدداً راهاندازی کنید، که به آن امکان میدهد URL مربوط به HTML شما و همچنین پیکربندی اسکنی را که در کنسول توسعهدهندگان قرار دادهاید، دریافت کند.
- کروم را روی دستگاه توسعهدهنده خود اجرا کنید.
- یک تب جدید کروم باز کنید و در قسمت آدرس عبارت
chrome://inspectوارد کنید تا ابزار Inspector اجرا شود.
شما باید لیستی از دستگاهها را در صفحه مشاهده کنید و آدرس اینترنتی برنامه شما باید زیر نام دستگاه Google Home شما ظاهر شود.

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

این خروجی به این معنی است که برنامهی محلی شما با موفقیت دستگاه مجازی را کشف و شناسایی کرده است.
تست تکمیل سفارشات محلی
با استفاده از کنترلهای لمسی در برنامه Google Home یا از طریق دستورات صوتی به دستگاه Google Home، دستوراتی را به دستگاه خود ارسال کنید، مانند:
«هی گوگل، ماشین لباسشویی من را روشن کن.»
«هی گوگل، ماشین لباسشویی من را روشن کن.»
«هی گوگل، ماشین لباسشویی من را خاموش کن.»
این باید باعث شود که پلتفرم یک هدف EXECUTE را به برنامه TypeScript شما ارسال کند.

تأیید کنید که میتوانید تغییر وضعیت ماشین لباسشویی هوشمند محلی را با هر دستور مشاهده کنید.
... ***** The washer is RUNNING ***** ... ***** The washer is STOPPED *****
۹. تبریک

تبریک میگویم! شما از کیت توسعه نرمافزار محلی (Local Home SDK) برای ادغام عملیات تحویل محلی در یکپارچهسازی ابر به ابر استفاده کردید.
بیشتر بدانید
در اینجا چند مورد اضافی وجود دارد که میتوانید امتحان کنید:
- پیکربندی اسکن را تغییر دهید و آن را فعال کنید. برای مثال، سعی کنید از یک پورت UDP یا بسته اکتشافی متفاوت استفاده کنید.
- کدبیس دستگاه هوشمند مجازی را برای اجرا روی یک دستگاه تعبیهشده - مانند رزبری پای - تغییر دهید و از LEDها یا یک نمایشگر برای نمایش وضعیت فعلی استفاده کنید.