1. قبل از شروع
ادغام خانه های هوشمند به دستیار Google اجازه می دهد تا دستگاه های متصل در خانه کاربران را کنترل کند. برای ایجاد یک ادغام Cloud-to-Cloud، باید یک نقطه پایانی وب هوک ابری ارائه دهید که بتواند اهداف خانه هوشمند را مدیریت کند. به عنوان مثال، وقتی کاربری میگوید: «Hey Google، چراغها را روشن کن»، «دستیار» فرمان را برای بهروزرسانی وضعیت دستگاه به اجرای ابری شما ارسال میکند.
Local Home SDK با افزودن یک مسیر محلی برای مسیریابی اهداف خانه هوشمند به طور مستقیم به یک دستگاه Google Home، ادغام خانه هوشمند شما را بهبود می بخشد، که قابلیت اطمینان را افزایش می دهد و تأخیر در پردازش دستورات کاربران را کاهش می دهد. این به شما امکان میدهد یک برنامه تکمیل محلی را در TypeScript یا JavaScript بنویسید و اجرا کنید که دستگاهها را شناسایی کرده و دستورات را روی هر بلندگوی هوشمند Google Home یا نمایشگر هوشمند Google Nest اجرا میکند. سپس برنامه شما مستقیماً با دستگاههای هوشمند موجود کاربران از طریق شبکه محلی با استفاده از پروتکلهای استاندارد موجود برای اجرای دستورات ارتباط برقرار میکند.
پیش نیازها
- یک راهنمای توسعه دهنده یکپارچه سازی Cloud-to-Cloud ایجاد کنید
- کد لبه شستشوی خانه هوشمند
- راهنمای توسعه دهنده تحقق محلی
چیزی که خواهی ساخت
در این کد لبه، شما یک ادغام خانه هوشمند قبلی را با Firebase اجرا میکنید، سپس یک پیکربندی اسکن را در Developer Console اعمال میکنید و یک برنامه محلی با استفاده از TypeScript برای ارسال دستورات نوشته شده در Node.js به یک دستگاه شستشوی مجازی میسازید.
چیزی که یاد خواهید گرفت
- نحوه فعال کردن و پیکربندی انجام محلی در Developer Console.
- نحوه استفاده از Local Home SDK برای نوشتن یک برنامه تکمیل محلی.
- نحوه اشکال زدایی برنامه تحقق محلی بارگذاری شده در بلندگوی Google Home یا نمایشگر هوشمند Google Nest.
آنچه شما نیاز دارید
- آخرین نسخه گوگل کروم
- یک دستگاه iOS یا Android با برنامه Google Home
- یک بلندگوی هوشمند Google Home یا نمایشگر هوشمند Google Nest
- Node.js نسخه 10.16 یا بالاتر
- یک حساب Google
- یک حساب صورتحساب Google Cloud
2. شروع به کار
فعال کردن کنترل های فعالیت
برای استفاده از Google Assistant، باید دادههای فعالیت خاصی را با Google به اشتراک بگذارید. دستیار Google برای عملکرد صحیح به این داده ها نیاز دارد. با این حال، نیاز به اشتراک گذاری داده ها مختص SDK نیست. برای اشتراکگذاری این دادهها، اگر قبلاً ندارید، یک حساب Google ایجاد کنید. می توانید از هر حساب Google استفاده کنید—نیازی نیست که حساب توسعه دهنده شما باشد.
صفحه Activity Controls را برای حساب Google که میخواهید با Assistant استفاده کنید، باز کنید.
اطمینان حاصل کنید که سوئیچ های زیر فعال هستند:
- فعالیت وب و برنامه - علاوه بر این، حتماً کادر بررسی شامل سابقه و فعالیت Chrome از سایتها، برنامهها و دستگاههایی که از خدمات Google استفاده میکنند را انتخاب کنید.
- اطلاعات دستگاه
- فعالیت صوتی و صوتی
یک پروژه ادغام ابر به ابر ایجاد کنید
- به Developer Console بروید.
- روی ایجاد پروژه کلیک کنید، نامی برای پروژه وارد کنید و روی ایجاد پروژه کلیک کنید.
Cloud-to-cloud Integration را انتخاب کنید
در Project Home در Developer Console، Add cloud-to-cloud integration را در Cloud-to-cloud انتخاب کنید.
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، مطمئن شوید که پروژه ای را انتخاب کنید که با <project-id>.
سپس، در صفحه کتابخانه API برای HomeGraph API، روی فعال کردن کلیک کنید.
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 را با پروژه ادغام Cloud-to-Cloud خود راه اندازی کنید:
cd app-start firebase use <project-id>
پیکربندی پروژه Firebase
یک پروژه Firebase را راه اندازی کنید.
firebase init
ویژگی های CLI، پایگاه داده بیدرنگ ، توابع ، و ویژگی میزبانی که شامل میزبانی Firebase است را انتخاب کنید.
? 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
اگر پروژه خود را مجدداً راه اندازی می کنید، وقتی از شما پرسیده شد که آیا می خواهید توابع/.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 به طور تصادفی فعال شد، دو روش برای غیرفعال کردن آن وجود دارد:
- با استفاده از رابط کاربری گرافیکی، به پوشه
../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 مستقر شوید
اکنون که وابستگی ها را نصب کرده اید و پروژه خود را پیکربندی کرده اید، برای اولین بار آماده اجرای برنامه هستید.
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
). رابط زیر را خواهید دید:
این رابط کاربری وب نشان دهنده یک پلت فرم شخص ثالث برای مشاهده یا تغییر وضعیت دستگاه است. برای شروع پر کردن پایگاه داده خود با اطلاعات دستگاه، روی UPDATE کلیک کنید. هیچ تغییری در صفحه مشاهده نمی کنید، اما وضعیت فعلی ماشین لباسشویی شما در پایگاه داده ذخیره می شود.
اکنون زمان آن رسیده است که سرویس ابری را با استفاده از Developer Console به Google Assistant متصل کنید.
پروژه Developer Console خود را پیکربندی کنید
در تب Develop ، یک نام نمایشی برای تعامل خود اضافه کنید. این نام در برنامه Google Home ظاهر می شود.
در زیر نام تجاری برنامه ، یک فایل png
برای نماد برنامه با اندازه 144 x 144 پیکسل و با نام آپلود کنید
.
برای فعال کردن پیوند حساب از این تنظیمات پیوند حساب استفاده کنید:
شناسه مشتری | |
راز مشتری | |
URL مجوز | |
نشانی اینترنتی رمز | |
در زیر نشانی اینترنتی تکمیل ابر ، نشانی اینترنتی عملکرد ابری خود را وارد کنید که اهداف خانه هوشمند را برآورده میکند.
https://us-central1-<project-id>.cloudfunctions.net/smarthome
روی Save کلیک کنید تا پیکربندی پروژه ذخیره شود، سپس روی Next: Test کلیک کنید تا تست پروژه شما فعال شود.
اکنون می توانید اجرای وبکهک های لازم برای اتصال وضعیت دستگاه به دستیار را شروع کنید.
پیوند به دستیار گوگل
برای آزمایش ادغام Cloud-to-Cloud خود، باید پروژه خود را با یک حساب Google مرتبط کنید. این امکان آزمایش از طریق سطوح دستیار Google و برنامه Google Home را فراهم می کند که به سیستم یک حساب وارد شده اند.
- در تلفن خود، تنظیمات دستیار Google را باز کنید. توجه داشته باشید که باید با همان حساب کاربری در کنسول وارد شوید.
- به Google Assistant > Settings > Home Control (در زیر Assistant) بروید.
- روی نماد جستجو در بالا سمت راست کلیک کنید.
- برنامه آزمایشی خود را با استفاده از پیشوند [test] جستجو کنید تا برنامه آزمایشی خاص خود را پیدا کنید.
- آن مورد را انتخاب کنید. سپس Google Assistant با سرویس شما احراز هویت میکند و یک درخواست
SYNC
ارسال میکند و از سرویس شما میخواهد فهرستی از دستگاهها را برای کاربر ارائه دهد.
برنامه Google Home را باز کنید و بررسی کنید که میتوانید دستگاه لباسشویی خود را ببینید.
بررسی کنید که میتوانید ماشین لباسشویی را با استفاده از دستورات صوتی در برنامه Google Home کنترل کنید. همچنین باید تغییر وضعیت دستگاه را در رابط کاربری وب جلویی اجرای ابری خود مشاهده کنید.
اکنون می توانید شروع به افزودن تکمیل محلی به ادغام خود کنید.
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 کلیک کنید دکمه در نوار ابزار این یک عملیات درخواست همگامسازی را راهاندازی میکند تا دستیار دادههای پاسخ
SYNC
بهروزرسانیشده را دریافت کند.
5. انجام محلی را پیکربندی کنید
در این بخش، گزینه های پیکربندی لازم برای انجام محلی را به ادغام Cloud-to-Cloud خود اضافه می کنید. در طول توسعه، برنامه تحقق محلی را در Firebase Hosting منتشر میکنید، جایی که دستگاه Google Home میتواند به آن دسترسی داشته باشد و آن را دانلود کند.
در Google Home Developer Console ، به Project > Cloud-to-Cloud در سمت چپ صفحه بروید، سپس ویرایش را برای ادغام انتخاب کنید. در صفحه Setup and configuration ، به Local realization بروید و تنظیمات را روشن کنید. URL زیر را در هر فیلد URL آزمایشی وارد کنید، ID پروژه خود را وارد کنید و روی Save کلیک کنید:
https://<project-id>.web.app/local-home/index.html
در مرحله بعد، باید تعریف کنیم که چگونه دستگاه Google Home باید دستگاه های هوشمند محلی را کشف کند . پلتفرم Local Home از چندین پروتکل برای کشف دستگاه پشتیبانی می کند، از جمله پخش mDNS، UPnP و UDP. برای کشف واشر هوشمند از پخش UDP استفاده خواهید کرد.
برای افزودن پیکربندی اسکن جدید، روی + افزودن پیکربندی اسکن در قسمت کشف دستگاه کلیک کنید. UDP را به عنوان پروتکل انتخاب کنید و ویژگی های زیر را پر کنید:
میدان | توضیحات | ارزش پیشنهادی |
آدرس کشف | آدرس کشف UDP | |
پورت پخش | درگاهی که Google Home در آن پخش UDP را ارسال می کند | |
پورت گوش دادن | درگاهی که Google Home برای پاسخ گوش می دهد | |
بسته کشف | محموله داده پخش UDP | |
در نهایت روی 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 دستگاههای تأیید نشده را بر اساس پیکربندی اسکن ارائه شده در Developer Console پیدا میکند، 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 استفاده کند که در پیکربندی اسکن برای کشف دستگاه در Developer Console اعمال کردید. علاوه بر این، باید به دستگاه مجازی بگویید که کدام شناسه دستگاه محلی را گزارش کند و شناسه پروژه ادغام Cloud-to-Cloud برای رویدادهای گزارش وضعیت زمانی که وضعیت دستگاه تغییر می کند استفاده کند.
پارامتر | ارزش پیشنهادی |
شناسه دستگاه | |
DiscoveryPortOut | |
DiscoveryPacket | |
شناسه پروژه | شناسه پروژه ادغام ابر به ابر شما |
دستگاه را راه اندازی کنید
به دایرکتوری 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 را وصل کنید
برای اتصال دیباگر به برنامه تکمیل محلی خود، این مراحل را دنبال کنید:
- مطمئن شوید که دستگاه Google Home خود را به کاربری با مجوز دسترسی به پروژه Developer Console مرتبط کرده اید.
- دستگاه Google Home خود را راه اندازی مجدد کنید، که به آن امکان می دهد URL HTML شما و همچنین پیکربندی اسکنی را که در Developer Console قرار داده اید دریافت کند.
- Chrome را در دستگاه توسعه خود راه اندازی کنید.
- یک برگه کروم جدید باز کنید و
chrome://inspect
در قسمت آدرس وارد کنید تا بازرس راه اندازی شود.
باید فهرستی از دستگاهها را در صفحه ببینید و URL برنامه شما باید زیر نام دستگاه Google Home شما ظاهر شود.
بازرس را راه اندازی کنید
برای راهاندازی ابزار برنامهنویس Chrome، بر روی Inspect در زیر URL برنامه کلیک کنید. تب Console را انتخاب کنید و تأیید کنید که میتوانید محتوای IDENTIFY
را که توسط برنامه TypeScript چاپ شده است ببینید.
این خروجی به این معنی است که برنامه تحقق محلی شما با موفقیت دستگاه مجازی را کشف و شناسایی کرده است.
اجرای محلی را آزمایش کنید
با استفاده از کنترلهای لمسی در برنامه Google Home یا از طریق دستورات صوتی به دستگاه Google Home دستورات را به دستگاه خود ارسال کنید، مانند:
"Hey Google، ماشین لباسشویی من را روشن کن."
"Hey Google، ماشین لباسشویی من را روشن کن."
"Hey Google، ماشین لباسشویی من را متوقف کن."
این باید پلتفرم را برای ارسال یک هدف EXECUTE
به برنامه TypeScript شما تحریک کند.
بررسی کنید که با هر دستور میتوانید تغییر وضعیت واشر هوشمند محلی را مشاهده کنید.
... ***** The washer is RUNNING ***** ... ***** The washer is STOPPED *****
9. تبریک می گویم
تبریک می گویم! شما از Local Home SDK برای ادغام اجرای محلی در یک ادغام Cloud-to-Cloud استفاده کردید.
بیشتر بدانید
در اینجا موارد دیگری وجود دارد که می توانید امتحان کنید:
- پیکربندی اسکن را تغییر دهید و آن را فعال کنید. به عنوان مثال، سعی کنید از یک پورت UDP دیگر یا بسته کشف استفاده کنید.
- پایگاه کدهای دستگاه هوشمند مجازی را طوری تغییر دهید که روی یک دستگاه تعبیه شده - مانند رزبری پای - اجرا شود و از LED یا نمایشگر برای تجسم وضعیت فعلی استفاده کنید.
1. قبل از شروع
ادغام خانه های هوشمند به دستیار Google اجازه می دهد تا دستگاه های متصل در خانه کاربران را کنترل کند. برای ایجاد یک ادغام Cloud-to-Cloud، باید یک نقطه پایانی وب هوک ابری ارائه دهید که بتواند اهداف خانه هوشمند را مدیریت کند. به عنوان مثال، وقتی کاربری میگوید: «Hey Google، چراغها را روشن کن»، «دستیار» فرمان را برای بهروزرسانی وضعیت دستگاه به اجرای ابری شما ارسال میکند.
Local Home SDK با افزودن یک مسیر محلی برای مسیریابی اهداف خانه هوشمند به طور مستقیم به یک دستگاه Google Home، ادغام خانه هوشمند شما را بهبود می بخشد، که قابلیت اطمینان را افزایش می دهد و تأخیر در پردازش دستورات کاربران را کاهش می دهد. این به شما امکان میدهد یک برنامه تکمیل محلی را در TypeScript یا JavaScript بنویسید و اجرا کنید که دستگاهها را شناسایی کرده و دستورات را روی هر بلندگوی هوشمند Google Home یا نمایشگر هوشمند Google Nest اجرا میکند. سپس برنامه شما مستقیماً با دستگاههای هوشمند موجود کاربران از طریق شبکه محلی با استفاده از پروتکلهای استاندارد موجود برای اجرای دستورات ارتباط برقرار میکند.
پیش نیازها
- یک راهنمای توسعه دهنده یکپارچه سازی Cloud-to-Cloud ایجاد کنید
- کد لبه شستشوی خانه هوشمند
- راهنمای توسعه دهنده تحقق محلی
چیزی که خواهی ساخت
در این کد لبه، شما یک ادغام خانه هوشمند قبلی را با Firebase اجرا میکنید، سپس یک پیکربندی اسکن را در Developer Console اعمال میکنید و یک برنامه محلی با استفاده از TypeScript برای ارسال دستورات نوشته شده در Node.js به یک دستگاه شستشوی مجازی میسازید.
چیزی که یاد خواهید گرفت
- نحوه فعال کردن و پیکربندی انجام محلی در Developer Console.
- نحوه استفاده از Local Home SDK برای نوشتن یک برنامه تکمیل محلی.
- نحوه اشکال زدایی برنامه تحقق محلی بارگذاری شده در بلندگوی Google Home یا نمایشگر هوشمند Google Nest.
آنچه شما نیاز دارید
- آخرین نسخه گوگل کروم
- یک دستگاه iOS یا Android با برنامه Google Home
- یک بلندگوی هوشمند Google Home یا نمایشگر هوشمند Google Nest
- Node.js نسخه 10.16 یا بالاتر
- یک حساب Google
- یک حساب صورتحساب Google Cloud
2. شروع به کار
فعال کردن کنترل های فعالیت
برای استفاده از Google Assistant، باید دادههای فعالیت خاصی را با Google به اشتراک بگذارید. دستیار Google برای عملکرد صحیح به این داده ها نیاز دارد. با این حال، نیاز به اشتراک گذاری داده ها مختص SDK نیست. برای اشتراکگذاری این دادهها، اگر قبلاً ندارید، یک حساب Google ایجاد کنید. می توانید از هر حساب Google استفاده کنید—نیازی نیست که حساب توسعه دهنده شما باشد.
صفحه Activity Controls را برای حساب Google که میخواهید با Assistant استفاده کنید، باز کنید.
اطمینان حاصل کنید که سوئیچ های زیر فعال هستند:
- فعالیت وب و برنامه - علاوه بر این، حتماً کادر بررسی شامل سابقه و فعالیت Chrome از سایتها، برنامهها و دستگاههایی که از خدمات Google استفاده میکنند را انتخاب کنید.
- اطلاعات دستگاه
- فعالیت صوتی و صوتی
یک پروژه ادغام ابر به ابر ایجاد کنید
- به Developer Console بروید.
- روی ایجاد پروژه کلیک کنید، نامی برای پروژه وارد کنید و روی ایجاد پروژه کلیک کنید.
Cloud-to-cloud Integration را انتخاب کنید
در Project Home در Developer Console، Add cloud-to-cloud integration را در Cloud-to-cloud انتخاب کنید.
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، مطمئن شوید که پروژه ای را انتخاب کنید که با <project-id>.
سپس، در صفحه کتابخانه API برای HomeGraph API، روی فعال کردن کلیک کنید.
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 را با پروژه ادغام Cloud-to-Cloud خود راه اندازی کنید:
cd app-start firebase use <project-id>
پیکربندی پروژه Firebase
یک پروژه Firebase را راه اندازی کنید.
firebase init
ویژگی های CLI، پایگاه داده بیدرنگ ، توابع ، و ویژگی میزبانی که شامل میزبانی Firebase است را انتخاب کنید.
? 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
اگر پروژه خود را مجدداً راه اندازی می کنید، وقتی از شما پرسیده شد که آیا می خواهید توابع/.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 به طور تصادفی فعال شد، دو روش برای غیرفعال کردن آن وجود دارد:
- با استفاده از رابط کاربری گرافیکی، به پوشه
../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 مستقر شوید
اکنون که وابستگی ها را نصب کرده اید و پروژه خود را پیکربندی کرده اید، برای اولین بار آماده اجرای برنامه هستید.
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
). رابط زیر را خواهید دید:
این رابط کاربری وب نشان دهنده یک پلت فرم شخص ثالث برای مشاهده یا تغییر وضعیت دستگاه است. برای شروع پر کردن پایگاه داده خود با اطلاعات دستگاه، روی UPDATE کلیک کنید. هیچ تغییری در صفحه مشاهده نمی کنید، اما وضعیت فعلی ماشین لباسشویی شما در پایگاه داده ذخیره می شود.
اکنون زمان آن رسیده است که سرویس ابری را با استفاده از Developer Console به Google Assistant متصل کنید.
پروژه Developer Console خود را پیکربندی کنید
در تب Develop ، یک نام نمایشی برای تعامل خود اضافه کنید. این نام در برنامه Google Home ظاهر می شود.
در زیر نام تجاری برنامه ، یک فایل png
برای نماد برنامه با اندازه 144 x 144 پیکسل و با نام آپلود کنید
.
برای فعال کردن پیوند حساب از این تنظیمات پیوند حساب استفاده کنید:
شناسه مشتری | |
راز مشتری | |
URL مجوز | |
نشانی اینترنتی رمز | |
در زیر نشانی اینترنتی تکمیل ابر ، نشانی اینترنتی عملکرد ابری خود را وارد کنید که اهداف خانه هوشمند را برآورده میکند.
https://us-central1-<project-id>.cloudfunctions.net/smarthome
روی Save کلیک کنید تا پیکربندی پروژه ذخیره شود، سپس روی Next: Test کلیک کنید تا تست پروژه شما فعال شود.
اکنون می توانید اجرای وبکهک های لازم برای اتصال وضعیت دستگاه به دستیار را شروع کنید.
پیوند به دستیار گوگل
برای آزمایش ادغام Cloud-to-Cloud خود، باید پروژه خود را با یک حساب Google مرتبط کنید. این امکان آزمایش از طریق سطوح دستیار Google و برنامه Google Home را فراهم می کند که به سیستم یک حساب وارد شده اند.
- در تلفن خود، تنظیمات دستیار Google را باز کنید. توجه داشته باشید که باید با همان حساب کاربری در کنسول وارد شوید.
- به Google Assistant > Settings > Home Control (در زیر Assistant) بروید.
- روی نماد جستجو در بالا سمت راست کلیک کنید.
- برنامه آزمایشی خود را با استفاده از پیشوند [test] جستجو کنید تا برنامه آزمایشی خاص خود را پیدا کنید.
- آن مورد را انتخاب کنید. سپس Google Assistant با سرویس شما احراز هویت میکند و یک درخواست
SYNC
ارسال میکند و از سرویس شما میخواهد فهرستی از دستگاهها را برای کاربر ارائه دهد.
برنامه Google Home را باز کنید و بررسی کنید که میتوانید دستگاه لباسشویی خود را ببینید.
بررسی کنید که میتوانید ماشین لباسشویی را با استفاده از دستورات صوتی در برنامه Google Home کنترل کنید. همچنین باید تغییر وضعیت دستگاه را در رابط کاربری وب جلویی اجرای ابری خود مشاهده کنید.
اکنون می توانید شروع به افزودن تکمیل محلی به ادغام خود کنید.
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 کلیک کنید دکمه در نوار ابزار این یک عملیات درخواست همگامسازی را راهاندازی میکند تا دستیار دادههای پاسخ
SYNC
بهروزرسانیشده را دریافت کند.
5. انجام محلی را پیکربندی کنید
در این بخش، گزینه های پیکربندی لازم برای انجام محلی را به ادغام Cloud-to-Cloud خود اضافه می کنید. در طول توسعه، برنامه تحقق محلی را در Firebase Hosting منتشر میکنید، جایی که دستگاه Google Home میتواند به آن دسترسی داشته باشد و آن را دانلود کند.
در Google Home Developer Console ، به Project > Cloud-to-Cloud در سمت چپ صفحه بروید، سپس ویرایش را برای ادغام انتخاب کنید. در صفحه Setup and configuration ، به Local realization بروید و تنظیمات را روشن کنید. URL زیر را در هر فیلد URL آزمایشی وارد کنید، ID پروژه خود را وارد کنید و روی Save کلیک کنید:
https://<project-id>.web.app/local-home/index.html
در مرحله بعد، باید تعریف کنیم که چگونه دستگاه Google Home باید دستگاه های هوشمند محلی را کشف کند . پلتفرم Local Home از چندین پروتکل برای کشف دستگاه پشتیبانی می کند، از جمله پخش mDNS، UPnP و UDP. برای کشف واشر هوشمند از پخش UDP استفاده خواهید کرد.
برای افزودن پیکربندی اسکن جدید، روی + افزودن پیکربندی اسکن در قسمت کشف دستگاه کلیک کنید. UDP را به عنوان پروتکل انتخاب کنید و ویژگی های زیر را پر کنید:
میدان | توضیحات | ارزش پیشنهادی |
آدرس کشف | آدرس کشف UDP | |
پورت پخش | درگاهی که Google Home در آن پخش UDP را ارسال می کند | |
پورت گوش دادن | درگاهی که Google Home برای پاسخ گوش می دهد | |
بسته کشف | محموله داده پخش UDP | |
در نهایت روی 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 دستگاههای تأیید نشده را بر اساس پیکربندی اسکن ارائه شده در Developer Console پیدا میکند، 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 استفاده کند که در پیکربندی اسکن برای کشف دستگاه در Developer Console اعمال کردید. علاوه بر این، باید به دستگاه مجازی بگویید که کدام شناسه دستگاه محلی را گزارش کند و شناسه پروژه ادغام Cloud-to-Cloud برای رویدادهای گزارش وضعیت زمانی که وضعیت دستگاه تغییر می کند استفاده کند.
پارامتر | ارزش پیشنهادی |
شناسه دستگاه | |
DiscoveryPortOut | |
DiscoveryPacket | |
شناسه پروژه | شناسه پروژه ادغام ابر به ابر شما |
دستگاه را راه اندازی کنید
به دایرکتوری 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 را وصل کنید
برای اتصال دیباگر به برنامه تکمیل محلی خود، این مراحل را دنبال کنید:
- مطمئن شوید که دستگاه Google Home خود را به کاربری با مجوز دسترسی به پروژه Developer Console مرتبط کرده اید.
- دستگاه Google Home خود را راه اندازی مجدد کنید، که به آن امکان می دهد URL HTML شما و همچنین پیکربندی اسکنی را که در Developer Console قرار داده اید دریافت کند.
- Chrome را در دستگاه توسعه خود راه اندازی کنید.
- یک برگه کروم جدید باز کنید و
chrome://inspect
در قسمت آدرس وارد کنید تا بازرس راه اندازی شود.
باید فهرستی از دستگاهها را در صفحه ببینید و URL برنامه شما باید زیر نام دستگاه Google Home شما ظاهر شود.
بازرس را راه اندازی کنید
برای راهاندازی ابزار برنامهنویس Chrome، بر روی Inspect در زیر URL برنامه کلیک کنید. تب Console را انتخاب کنید و تأیید کنید که میتوانید محتوای IDENTIFY
را که توسط برنامه TypeScript چاپ شده است ببینید.
این خروجی به این معنی است که برنامه تحقق محلی شما با موفقیت دستگاه مجازی را کشف و شناسایی کرده است.
اجرای محلی را آزمایش کنید
با استفاده از کنترلهای لمسی در برنامه Google Home یا از طریق دستورات صوتی به دستگاه Google Home دستورات را به دستگاه خود ارسال کنید، مانند:
"Hey Google، ماشین لباسشویی من را روشن کن."
"Hey Google، ماشین لباسشویی من را روشن کن."
"Hey Google، ماشین لباسشویی من را متوقف کن."
این باید پلتفرم را تحریک کند تا یک هدف EXECUTE
به برنامه TypeScript شما ارسال کند.
بررسی کنید که با هر دستور میتوانید تغییر وضعیت واشر هوشمند محلی را مشاهده کنید.
... ***** The washer is RUNNING ***** ... ***** The washer is STOPPED *****
9. تبریک می گویم
تبریک می گویم! شما از Local Home SDK برای ادغام اجرای محلی در یک ادغام Cloud-to-Cloud استفاده کردید.
بیشتر بدانید
در اینجا موارد دیگری وجود دارد که می توانید امتحان کنید:
- پیکربندی اسکن را تغییر دهید و آن را فعال کنید. به عنوان مثال، سعی کنید از یک پورت UDP دیگر یا بسته کشف استفاده کنید.
- پایگاه کدهای دستگاه هوشمند مجازی را طوری تغییر دهید که روی یک دستگاه تعبیه شده - مانند رزبری پای - اجرا شود و از LED یا نمایشگر برای تجسم وضعیت فعلی استفاده کنید.
1. قبل از شروع
ادغام خانه های هوشمند به دستیار Google اجازه می دهد تا دستگاه های متصل در خانه کاربران را کنترل کند. برای ایجاد یک ادغام Cloud-to-Cloud، باید یک نقطه پایانی وب هوک ابری ارائه دهید که بتواند اهداف خانه هوشمند را مدیریت کند. به عنوان مثال، وقتی کاربری میگوید: «Hey Google، چراغها را روشن کن»، «دستیار» فرمان را برای بهروزرسانی وضعیت دستگاه به اجرای ابری شما ارسال میکند.
Local Home SDK با افزودن یک مسیر محلی برای مسیریابی اهداف خانه هوشمند به طور مستقیم به یک دستگاه Google Home، ادغام خانه هوشمند شما را بهبود می بخشد، که قابلیت اطمینان را افزایش می دهد و تأخیر در پردازش دستورات کاربران را کاهش می دهد. این به شما امکان میدهد یک برنامه تکمیل محلی را در TypeScript یا JavaScript بنویسید و اجرا کنید که دستگاهها را شناسایی کرده و دستورات را روی هر بلندگوی هوشمند Google Home یا نمایشگر هوشمند Google Nest اجرا میکند. سپس برنامه شما مستقیماً با دستگاههای هوشمند موجود کاربران از طریق شبکه محلی با استفاده از پروتکلهای استاندارد موجود برای اجرای دستورات ارتباط برقرار میکند.
پیش نیازها
- یک راهنمای توسعه دهنده یکپارچه سازی Cloud-to-Cloud ایجاد کنید
- کد لبه شستشوی خانه هوشمند
- راهنمای توسعه دهنده تحقق محلی
چیزی که خواهی ساخت
در این کد لبه، شما یک ادغام خانه هوشمند قبلی را با Firebase اجرا میکنید، سپس یک پیکربندی اسکن را در Developer Console اعمال میکنید و یک برنامه محلی با استفاده از TypeScript برای ارسال دستورات نوشته شده در Node.js به یک دستگاه شستشوی مجازی میسازید.
چیزی که یاد خواهید گرفت
- نحوه فعال کردن و پیکربندی انجام محلی در Developer Console.
- نحوه استفاده از Local Home SDK برای نوشتن یک برنامه تکمیل محلی.
- نحوه اشکال زدایی برنامه تحقق محلی بارگذاری شده در بلندگوی Google Home یا نمایشگر هوشمند Google Nest.
آنچه شما نیاز دارید
- آخرین نسخه گوگل کروم
- یک دستگاه iOS یا Android با برنامه Google Home
- یک بلندگوی هوشمند Google Home یا نمایشگر هوشمند Google Nest
- Node.js نسخه 10.16 یا بالاتر
- یک حساب Google
- یک حساب صورتحساب Google Cloud
2. شروع به کار
فعال کردن کنترل های فعالیت
برای استفاده از Google Assistant، باید دادههای فعالیت خاصی را با Google به اشتراک بگذارید. دستیار Google برای عملکرد صحیح به این داده ها نیاز دارد. با این حال، نیاز به اشتراک گذاری داده ها مختص SDK نیست. برای اشتراکگذاری این دادهها، اگر قبلاً ندارید، یک حساب Google ایجاد کنید. می توانید از هر حساب Google استفاده کنید—نیازی نیست که حساب توسعه دهنده شما باشد.
صفحه Activity Controls را برای حساب Google که میخواهید با Assistant استفاده کنید، باز کنید.
اطمینان حاصل کنید که سوئیچ های زیر فعال هستند:
- فعالیت وب و برنامه - علاوه بر این، حتماً کادر بررسی شامل سابقه و فعالیت Chrome از سایتها، برنامهها و دستگاههایی که از خدمات Google استفاده میکنند را انتخاب کنید.
- اطلاعات دستگاه
- فعالیت صوتی و صوتی
یک پروژه ادغام ابر به ابر ایجاد کنید
- به Developer Console بروید.
- روی ایجاد پروژه کلیک کنید، نامی برای پروژه وارد کنید و روی ایجاد پروژه کلیک کنید.
Cloud-to-cloud Integration را انتخاب کنید
در Project Home در Developer Console، Add cloud-to-cloud integration را در Cloud-to-cloud انتخاب کنید.
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 ، حتماً پروژه ای را انتخاب کنید که مطابق با ادغام شما <project-id>.
سپس، در صفحه کتابخانه API برای HomeGraph API، روی فعال کردن کلیک کنید.
3. برنامه استارتر را اجرا کنید
اکنون که محیط توسعه خود را راهاندازی میکنید، میتوانید پروژه راهاندازی را اجرا کنید تا تأیید کنید همه چیز به درستی پیکربندی شده است.
کد منبع را دریافت کنید
برای دانلود نمونه این کد لبه روی دستگاه توسعه خود، روی لینک زیر کلیک کنید:
... یا می توانید مخزن GitHub را از خط فرمان کلون کنید:
git clone https://github.com/google-home/smarthome-local.git
در مورد پروژه
پروژه شروع کننده شامل زیر شاخه های زیر است:
-
public
- UI وب را برای کنترل و نظارت بر واشر هوشمند انجام دهید -
functions
-توابع Cloud اجرای تحقق ابر برای ادغام ابر به ابر - پروژه برنامه تحقق محلی Skeleton
local
با دستگیره های قصد درindex.ts
تحقق ابر ارائه شده شامل توابع زیر در index.js
است:
-
fakeauth
- نقطه پایانی حقوقی برای پیوند حساب -
faketoken
- نقطه پایانی برای پیوند حساب -
smarthome
- Smart Home قصد تحقق نقطه پایانی -
reportstate
- API Homegraph را در حالت دستگاه تغییر می دهد -
updateDevice
- انتهایی که توسط دستگاه مجازی برای تحریک حالت گزارش استفاده شده است
به Firebase متصل شوید
به دایرکتوری app-start
بروید ، سپس Firebase CLI را با پروژه ادغام ابر به ابر خود تنظیم کنید:
cd app-start firebase use <project-id>
پیکربندی پروژه Firebase
یک پروژه Firebase را راه اندازی کنید.
firebase init
ویژگی های CLI، پایگاه داده بیدرنگ ، توابع ، و ویژگی میزبانی که شامل میزبانی Firebase است را انتخاب کنید.
? 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
اگر پروژه خود را مجدداً راه اندازی می کنید، وقتی از شما پرسیده شد که آیا می خواهید توابع/.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 به طور تصادفی فعال شد، دو روش برای غیرفعال کردن آن وجود دارد:
- با استفاده از رابط کاربری گرافیکی، به پوشه
../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 مستقر شوید
اکنون که وابستگی ها را نصب کرده اید و پروژه خود را پیکربندی کرده اید، برای اولین بار آماده اجرای برنامه هستید.
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
). رابط زیر را خواهید دید:
این رابط کاربری وب نشان دهنده یک پلت فرم شخص ثالث برای مشاهده یا تغییر وضعیت دستگاه است. برای شروع پر کردن پایگاه داده خود با اطلاعات دستگاه، روی UPDATE کلیک کنید. هیچ تغییری در صفحه مشاهده نمی کنید، اما وضعیت فعلی ماشین لباسشویی شما در پایگاه داده ذخیره می شود.
اکنون وقت آن رسیده است که سرویس ابری را که با استفاده از کنسول توسعه دهنده به دستیار Google اعزام کرده اید ، وصل کنید.
پروژه Developer Console خود را پیکربندی کنید
در تب Develop ، یک نام نمایشی برای تعامل خود اضافه کنید. این نام در برنامه Google Home ظاهر می شود.
در زیر نام تجاری برنامه ، یک فایل png
برای نماد برنامه با اندازه 144 x 144 پیکسل و با نام آپلود کنید
.
برای فعال کردن پیوند حساب از این تنظیمات پیوند حساب استفاده کنید:
شناسه مشتری | |
راز مشتری | |
URL مجوز | |
نشانی اینترنتی رمز | |
در زیر نشانی اینترنتی تکمیل ابر ، نشانی اینترنتی عملکرد ابری خود را وارد کنید که اهداف خانه هوشمند را برآورده میکند.
https://us-central1-<project-id>.cloudfunctions.net/smarthome
روی Save کلیک کنید تا پیکربندی پروژه ذخیره شود، سپس روی Next: Test کلیک کنید تا تست پروژه شما فعال شود.
اکنون می توانید اجرای وبکهک های لازم برای اتصال وضعیت دستگاه به دستیار را شروع کنید.
پیوند به دستیار گوگل
برای آزمایش ادغام Cloud-to-Cloud خود، باید پروژه خود را با یک حساب Google مرتبط کنید. این امکان آزمایش از طریق سطوح دستیار Google و برنامه Google Home را فراهم می کند که به سیستم یک حساب وارد شده اند.
- در تلفن خود، تنظیمات دستیار Google را باز کنید. توجه داشته باشید که باید با همان حساب کاربری در کنسول وارد شوید.
- به Google Assistant > Settings > Home Control (در زیر Assistant) بروید.
- روی نماد جستجو در بالا سمت راست کلیک کنید.
- برنامه آزمایشی خود را با استفاده از پیشوند [test] جستجو کنید تا برنامه آزمایشی خاص خود را پیدا کنید.
- آن مورد را انتخاب کنید. سپس Google Assistant با سرویس شما احراز هویت میکند و یک درخواست
SYNC
ارسال میکند و از سرویس شما میخواهد فهرستی از دستگاهها را برای کاربر ارائه دهد.
برنامه Google Home را باز کنید و بررسی کنید که میتوانید دستگاه لباسشویی خود را ببینید.
تأیید کنید که می توانید واشر را با استفاده از دستورات صوتی در برنامه Google Home کنترل کنید. همچنین باید تغییر وضعیت دستگاه در UI وب جلوی تحقق ابر خود را ببینید.
اکنون می توانید شروع به افزودن تحقق محلی به ادغام خود کنید.
4. تحقق ابر را به روز کنید
برای حمایت از تحقق محلی ، باید یک زمینه جدید برای هر دستگاه به نام otherDeviceIds
را به پاسخ 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
پس از اتمام استقرار ، به UI وب بروید و روی Refresh کلیک کنید دکمه در نوار ابزار. این باعث می شود یک عمل همگام سازی درخواست به گونه ای باشد که دستیار داده های پاسخ
SYNC
به روز شده را دریافت کند.
5. تحقق محلی را پیکربندی کنید
در این بخش گزینه های پیکربندی لازم برای تحقق محلی را به ادغام ابر به ابر خود اضافه خواهید کرد. در حین توسعه ، شما برنامه Local Embilment را به میزبانی Firebase منتشر خواهید کرد ، جایی که دستگاه Google Home می تواند به آن دسترسی داشته و آن را بارگیری کند.
در کنسول Google Home Developer ، به Project> Cloud-to-Cloud در سمت چپ صفحه بروید ، سپس Edit را برای ادغام انتخاب کنید. در صفحه تنظیم و پیکربندی ، به انجام محلی بروید و تنظیمات را تغییر دهید. URL زیر را در هر قسمت URL Test وارد کنید ، شناسه پروژه خود را وارد کنید و روی ذخیره کلیک کنید:
https://<project-id>.web.app/local-home/index.html
در مرحله بعد ، ما باید تعریف کنیم که چگونه دستگاه Google Home باید دستگاه های هوشمند محلی را کشف کند . سکوی خانگی محلی از چندین پروتکل برای کشف دستگاه ، از جمله MDNS ، UPNP و پخش UDP پشتیبانی می کند. برای کشف واشر هوشمند از UDP Broadcast استفاده خواهید کرد.
برای افزودن پیکربندی اسکن جدید ، روی + پیکربندی اسکن را در زیر دستگاه کشف کنید . UDP را به عنوان پروتکل انتخاب کنید و ویژگی های زیر را پر کنید:
میدان | توضیحات | ارزش پیشنهادی |
آدرس کشف | آدرس کشف UDP | |
بندر پخش کننده | پورت که در آن Google Home پخش UDP را ارسال می کند | |
بندر گوش دادن | پورت که در آن Google Home برای پاسخ گوش می دهد | |
بسته کشف | UDP پخش داده بارگذاری | |
در آخر ، روی ذخیره در پایین پنجره کلیک کنید تا تغییرات خود را منتشر کنید.
6. اجرای محلی را اجرا کنید
شما می توانید با استفاده از بسته محلی SDK Typings ، برنامه تحقق محلی خود را در TypeScript تهیه کنید. به اسکلت ارائه شده در پروژه استارت نگاه کنید:
محلی/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 محلی را که برنامه آماده است ، مطلع کند.
کنترل کننده شناسایی را اضافه کنید
خانه محلی SDK هنگامی که دستگاه Google Home دستگاه های تأیید نشده در شبکه محلی را بر اساس پیکربندی اسکن ارائه شده در کنسول توسعه دهنده کشف می کند ، IDENTIFY
کننده شما را به وجود می آورد.
در همین حال ، هنگامی که Google یک دستگاه تطبیق یافته را کشف می کند ، این پلتفرم با داده های identifyHandler
حاصل از آن ، با داده های اسکن حاصل از آن استفاده می کند. در برنامه شما ، اسکن با استفاده از پخش UDP انجام می شود و داده های اسکن ارائه شده به Handler IDENTIFY
شامل بار پاسخ ارسال شده توسط دستگاه محلی است.
Handler یک نمونه IdentifyResponse
حاوی یک شناسه منحصر به فرد برای دستگاه محلی را برمی گرداند. برای پردازش پاسخ UDP از دستگاه محلی و تعیین شناسه دستگاه محلی مناسب ، کد زیر را به روش identifyHandler
خود اضافه کنید:
محلی/شاخص .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 را اضافه کنید
خانه محلی SDK هنگامی که دستگاهی که از تحقق محلی پشتیبانی می کند ، یک فرمان را دریافت می کند ، EXECUTE
کننده شما را تحریک می کند. محتوای هدف محلی معادل هدف EXECUTE
ارسال شده به ابر شما است ، بنابراین منطق پردازش محلی به قصد شبیه به نحوه برخورد با آن در ابر است.
این برنامه می تواند از سوکت های TCP/UDP یا درخواست HTTP (ها) برای برقراری ارتباط با دستگاه های محلی استفاده کند. در این CodeLab ، HTTP به عنوان پروتکل مورد استفاده برای کنترل دستگاه مجازی عمل می کند. شماره پورت در index.ts
به عنوان متغیر SERVER_PORT
تعریف شده است.
برای پردازش دستورات ورودی و ارسال آنها به دستگاه محلی از طریق HTTP ، کد زیر را به روش executeHandler
خود اضافه کنید:
محلی/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 مستقر کنید تا بتوانید از دستگاه Google Home به آنها دسترسی پیدا کنید.
firebase deploy --only hosting
7. واشر هوشمند را شروع کنید
اکنون وقت آن رسیده است که ارتباطات بین برنامه تحقق محلی خود و واشر هوشمند را آزمایش کنید! پروژه استارت CodeLab شامل یک واشر هوشمند V irtual است که در 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
8. اشکال زدایی برنامه Typescript
در بخش زیر تأیید خواهید کرد که دستگاه Google Home می تواند به درستی اسکن ، شناسایی و ارسال دستورات به واشر هوشمند مجازی از طریق شبکه محلی شود. شما می توانید از ابزارهای توسعه دهنده Google Chrome برای اتصال به دستگاه Google Home ، مشاهده سیاهههای مربوط به کنسول و اشکال زدایی برنامه TypeScript استفاده کنید.
ابزارهای توسعه دهنده Chrome را به هم وصل کنید
برای اتصال اشکال زدایی به برنامه تحقق محلی خود ، این مراحل را دنبال کنید:
- اطمینان حاصل کنید که دستگاه Google Home خود را با اجازه دسترسی به پروژه کنسول توسعه دهنده به کاربر پیوند داده اید.
- دستگاه Google Home خود را مجدداً راه اندازی مجدد کنید ، که این امکان را برای دریافت URL HTML و همچنین پیکربندی اسکن که در کنسول توسعه دهنده قرار داده اید ، قرار می دهد.
- Chrome را در دستگاه توسعه خود راه اندازی کنید.
- یک برگه جدید Chrome را باز کنید و
chrome://inspect
تا بازرس را راه اندازی کنید.
شما باید لیستی از دستگاه ها را در صفحه مشاهده کنید و URL برنامه شما باید تحت نام دستگاه Google Home شما ظاهر شود.
بازرس را راه اندازی کنید
برای راه اندازی ابزارهای توسعه دهنده Chrome ، روی بازرسی تحت URL برنامه خود کلیک کنید. برگه کنسول را انتخاب کرده و تأیید کنید که می توانید محتوای IDENTIFY
قصد چاپ شده توسط برنامه TypeScript خود را مشاهده کنید.
این خروجی به این معنی است که برنامه تحقق محلی شما با موفقیت دستگاه مجازی را کشف و شناسایی کرد.
تحقق محلی را آزمایش کنید
با استفاده از کنترل های لمسی در برنامه Google Home یا از طریق دستورات صوتی به دستگاه Google Home ، مانند:
"Hey Google، ماشین لباسشویی من را روشن کن."
"سلام گوگل ، واشر من را شروع کنید."
"Hey Google، ماشین لباسشویی من را متوقف کن."
این باید باعث شود تا بستر ارسال یک قصد EXECUTE
به برنامه TypeScript شما.
تأیید کنید که می توانید با هر دستور ، تغییر حالت واشر هوشمند محلی را مشاهده کنید.
... ***** The washer is RUNNING ***** ... ***** The washer is STOPPED *****
9. تبریک می گویم
تبریک می گویم! شما از خانه محلی SDK برای ادغام تحقق محلی در ادغام ابر به ابر استفاده کرده اید.
بیشتر بدانید
در اینجا موارد دیگری که می توانید امتحان کنید وجود دارد:
- پیکربندی اسکن را تغییر داده و آن را کار کنید. به عنوان مثال ، از یک درگاه UDP متفاوت یا بسته کشف استفاده کنید.
- برای اجرای روی یک دستگاه تعبیه شده - مانند Raspberry Pi - و از LED یا صفحه نمایش برای تجسم وضعیت فعلی ، در یک دستگاه تعبیه شده را تغییر دهید.
1. قبل از شروع
ادغام خانه هوشمند به دستیار Google اجازه می دهد تا دستگاه های متصل را در خانه کاربران کنترل کند. برای ایجاد یک ادغام ابر به ابر ، باید یک نقطه پایانی Cloud Webhook را که قادر به دستیابی به اهداف خانه هوشمند است ، فراهم کنید. به عنوان مثال ، هنگامی که کاربر می گوید ، "سلام گوگل ، چراغ ها را روشن کنید" ، دستیار دستور را برای تحقق ابر شما ارسال می کند تا وضعیت دستگاه را به روز کند.
خانه محلی SDK با افزودن یک مسیر محلی برای مسیریابی اهداف خانه هوشمند مستقیم به یک دستگاه Google Home ، ادغام خانه هوشمند شما را تقویت می کند ، که باعث افزایش قابلیت اطمینان و کاهش تأخیر در پردازش دستورات کاربران می شود. این امکان را به شما می دهد تا یک برنامه تحقق محلی را در TypeScript یا JavaScript بنویسید که دستگاه ها را مشخص می کند و دستورات خود را در هر بلندگو هوشمند Google Home یا نمایشگر هوشمند Google Nest اجرا می کند. برنامه شما سپس با استفاده از پروتکل های استاندارد موجود برای انجام دستورات ، مستقیماً با دستگاه های هوشمند موجود کاربران از طریق شبکه محلی ارتباط برقرار می کند.
پیش نیازها
- یک راهنمای توسعه دهنده یکپارچه سازی Cloud-to-Cloud ایجاد کنید
- CodeLab Washer Home Smart
- راهنمای توسعه دهنده محلی
چیزی که خواهی ساخت
در این CodeLab ، شما یک ادغام خانه هوشمند قبلاً ساخته شده را با Firebase مستقر خواهید کرد ، سپس یک پیکربندی اسکن را در کنسول توسعه دهنده اعمال می کنید و با استفاده از TypeScript برای ارسال دستورات نوشته شده در Node.js به یک دستگاه واشر مجازی ، یک برنامه محلی بسازید.
چیزی که یاد خواهید گرفت
- نحوه فعال سازی و پیکربندی تحقق محلی در کنسول توسعه دهنده.
- نحوه استفاده از خانه محلی SDK برای نوشتن یک برنامه تحقق محلی.
- نحوه اشکال زدایی برنامه محلی تحقق بارگیری شده در بلندگو Google Home یا Google Nest Smart Smart.
آنچه شما نیاز دارید
- آخرین نسخه Google Chrome
- یک دستگاه iOS یا Android با برنامه Google Home
- بلندگو هوشمند Google Home یا Google Nest Smart Display
- Node.js نسخه 10.16 یا بالاتر
- یک حساب Google
- یک حساب صورتحساب Google Cloud
2. شروع به کار
فعال کردن کنترل های فعالیت
برای استفاده از Google Assistant، باید دادههای فعالیت خاصی را با Google به اشتراک بگذارید. دستیار Google برای عملکرد صحیح به این داده ها نیاز دارد. با این حال، نیاز به اشتراک گذاری داده ها مختص SDK نیست. برای به اشتراک گذاشتن این داده ها ، اگر قبلاً یکی از آنها را ندارید ، یک حساب Google ایجاد کنید. شما می توانید از هر حساب Google استفاده کنید - نیازی به حساب توسعه دهنده شما نیست.
صفحه Activity Controls را برای حساب Google که میخواهید با Assistant استفاده کنید، باز کنید.
اطمینان حاصل کنید که سوئیچ های زیر فعال هستند:
- فعالیت وب و برنامه - علاوه بر این، حتماً کادر بررسی شامل سابقه و فعالیت Chrome از سایتها، برنامهها و دستگاههایی که از خدمات Google استفاده میکنند را انتخاب کنید.
- اطلاعات دستگاه
- فعالیت صوتی و صوتی
یک پروژه ادغام ابر به ابر ایجاد کنید
- به Developer Console بروید.
- روی ایجاد پروژه کلیک کنید، نامی برای پروژه وارد کنید و روی ایجاد پروژه کلیک کنید.
Cloud-to-cloud Integration را انتخاب کنید
در Project Home در Developer Console، Add cloud-to-cloud integration را در Cloud-to-cloud انتخاب کنید.
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 ، حتماً پروژه ای را انتخاب کنید که مطابق با ادغام شما <project-id>.
سپس، در صفحه کتابخانه API برای HomeGraph API، روی فعال کردن کلیک کنید.
3. برنامه استارتر را اجرا کنید
اکنون که محیط توسعه خود را راهاندازی میکنید، میتوانید پروژه راهاندازی را اجرا کنید تا تأیید کنید همه چیز به درستی پیکربندی شده است.
کد منبع را دریافت کنید
برای دانلود نمونه این کد لبه روی دستگاه توسعه خود، روی لینک زیر کلیک کنید:
... یا می توانید مخزن GitHub را از خط فرمان کلون کنید:
git clone https://github.com/google-home/smarthome-local.git
در مورد پروژه
پروژه شروع کننده شامل زیر شاخه های زیر است:
-
public
- UI وب را برای کنترل و نظارت بر واشر هوشمند انجام دهید -
functions
-توابع Cloud اجرای تحقق ابر برای ادغام ابر به ابر - پروژه برنامه تحقق محلی Skeleton
local
با دستگیره های قصد درindex.ts
تحقق ابر ارائه شده شامل توابع زیر در index.js
است:
-
fakeauth
- نقطه پایانی حقوقی برای پیوند حساب -
faketoken
- نقطه پایانی برای پیوند حساب -
smarthome
- Smart Home قصد تحقق نقطه پایانی -
reportstate
- API Homegraph را در حالت دستگاه تغییر می دهد -
updateDevice
- انتهایی که توسط دستگاه مجازی برای تحریک حالت گزارش استفاده شده است
به Firebase متصل شوید
به دایرکتوری app-start
بروید ، سپس Firebase CLI را با پروژه ادغام ابر به ابر خود تنظیم کنید:
cd app-start firebase use <project-id>
پیکربندی پروژه Firebase
یک پروژه Firebase را راه اندازی کنید.
firebase init
ویژگی های CLI، پایگاه داده بیدرنگ ، توابع ، و ویژگی میزبانی که شامل میزبانی Firebase است را انتخاب کنید.
? 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
اگر پروژه خود را مجدداً راه اندازی می کنید، وقتی از شما پرسیده شد که آیا می خواهید توابع/.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 به طور تصادفی فعال شد، دو روش برای غیرفعال کردن آن وجود دارد:
- با استفاده از رابط کاربری گرافیکی، به پوشه
../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 مستقر شوید
اکنون که وابستگی ها را نصب کرده اید و پروژه خود را پیکربندی کرده اید، برای اولین بار آماده اجرای برنامه هستید.
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
). رابط زیر را خواهید دید:
این رابط کاربری وب نشان دهنده یک پلت فرم شخص ثالث برای مشاهده یا تغییر وضعیت دستگاه است. برای شروع پر کردن پایگاه داده خود با اطلاعات دستگاه، روی UPDATE کلیک کنید. هیچ تغییری در صفحه مشاهده نمی کنید، اما وضعیت فعلی ماشین لباسشویی شما در پایگاه داده ذخیره می شود.
اکنون وقت آن رسیده است که سرویس ابری را که با استفاده از کنسول توسعه دهنده به دستیار Google اعزام کرده اید ، وصل کنید.
پروژه Developer Console خود را پیکربندی کنید
در تب Develop ، یک نام نمایشی برای تعامل خود اضافه کنید. این نام در برنامه Google Home ظاهر می شود.
در زیر نام تجاری برنامه ، یک فایل png
برای نماد برنامه با اندازه 144 x 144 پیکسل و با نام آپلود کنید
.
برای فعال کردن پیوند حساب از این تنظیمات پیوند حساب استفاده کنید:
شناسه مشتری | |
راز مشتری | |
URL مجوز | |
نشانی اینترنتی رمز | |
در زیر نشانی اینترنتی تکمیل ابر ، نشانی اینترنتی عملکرد ابری خود را وارد کنید که اهداف خانه هوشمند را برآورده میکند.
https://us-central1-<project-id>.cloudfunctions.net/smarthome
روی Save کلیک کنید تا پیکربندی پروژه ذخیره شود، سپس روی Next: Test کلیک کنید تا تست پروژه شما فعال شود.
اکنون می توانید اجرای وبکهک های لازم برای اتصال وضعیت دستگاه به دستیار را شروع کنید.
پیوند به دستیار گوگل
برای آزمایش ادغام Cloud-to-Cloud خود، باید پروژه خود را با یک حساب Google مرتبط کنید. این امکان آزمایش از طریق سطوح دستیار Google و برنامه Google Home را فراهم می کند که به سیستم یک حساب وارد شده اند.
- در تلفن خود، تنظیمات دستیار Google را باز کنید. توجه داشته باشید که باید با همان حساب کاربری در کنسول وارد شوید.
- به Google Assistant > Settings > Home Control (در زیر Assistant) بروید.
- روی نماد جستجو در بالا سمت راست کلیک کنید.
- برنامه آزمایشی خود را با استفاده از پیشوند [test] جستجو کنید تا برنامه آزمایشی خاص خود را پیدا کنید.
- آن مورد را انتخاب کنید. سپس Google Assistant با سرویس شما احراز هویت میکند و یک درخواست
SYNC
ارسال میکند و از سرویس شما میخواهد فهرستی از دستگاهها را برای کاربر ارائه دهد.
برنامه Google Home را باز کنید و بررسی کنید که میتوانید دستگاه لباسشویی خود را ببینید.
تأیید کنید که می توانید واشر را با استفاده از دستورات صوتی در برنامه Google Home کنترل کنید. همچنین باید تغییر وضعیت دستگاه در UI وب جلوی تحقق ابر خود را ببینید.
اکنون می توانید شروع به افزودن تحقق محلی به ادغام خود کنید.
4. تحقق ابر را به روز کنید
برای حمایت از تحقق محلی ، باید یک زمینه جدید برای هر دستگاه به نام otherDeviceIds
را به پاسخ 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
پس از اتمام استقرار ، به UI وب بروید و روی Refresh کلیک کنید دکمه در نوار ابزار. این باعث می شود یک عمل همگام سازی درخواست به گونه ای باشد که دستیار داده های پاسخ
SYNC
به روز شده را دریافت کند.
5. تحقق محلی را پیکربندی کنید
در این بخش گزینه های پیکربندی لازم برای تحقق محلی را به ادغام ابر به ابر خود اضافه خواهید کرد. در حین توسعه ، شما برنامه Local Embilment را به میزبانی Firebase منتشر خواهید کرد ، جایی که دستگاه Google Home می تواند به آن دسترسی داشته و آن را بارگیری کند.
در کنسول Google Home Developer ، به Project> Cloud-to-Cloud در سمت چپ صفحه بروید ، سپس Edit را برای ادغام انتخاب کنید. در صفحه تنظیم و پیکربندی ، به انجام محلی بروید و تنظیمات را تغییر دهید. URL زیر را در هر قسمت URL Test وارد کنید ، شناسه پروژه خود را وارد کنید و روی ذخیره کلیک کنید:
https://<project-id>.web.app/local-home/index.html
در مرحله بعد ، ما باید تعریف کنیم که چگونه دستگاه Google Home باید دستگاه های هوشمند محلی را کشف کند . سکوی خانگی محلی از چندین پروتکل برای کشف دستگاه ، از جمله MDNS ، UPNP و پخش UDP پشتیبانی می کند. برای کشف واشر هوشمند از UDP Broadcast استفاده خواهید کرد.
برای افزودن پیکربندی اسکن جدید ، روی + پیکربندی اسکن را در زیر دستگاه کشف کنید . UDP را به عنوان پروتکل انتخاب کنید و ویژگی های زیر را پر کنید:
میدان | توضیحات | ارزش پیشنهادی |
آدرس کشف | آدرس کشف UDP | |
بندر پخش کننده | پورت که در آن Google Home پخش UDP را ارسال می کند | |
بندر گوش دادن | پورت که در آن Google Home برای پاسخ گوش می دهد | |
بسته کشف | UDP پخش داده بارگذاری | |
در آخر ، روی ذخیره در پایین پنجره کلیک کنید تا تغییرات خود را منتشر کنید.
6. اجرای محلی را اجرا کنید
شما می توانید با استفاده از بسته محلی SDK Typings ، برنامه تحقق محلی خود را در TypeScript تهیه کنید. به اسکلت ارائه شده در پروژه استارت نگاه کنید:
محلی/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 محلی را که برنامه آماده است ، مطلع کند.
کنترل کننده شناسایی را اضافه کنید
خانه محلی SDK هنگامی که دستگاه Google Home دستگاه های تأیید نشده در شبکه محلی را بر اساس پیکربندی اسکن ارائه شده در کنسول توسعه دهنده کشف می کند ، IDENTIFY
کننده شما را به وجود می آورد.
در همین حال ، هنگامی که Google یک دستگاه تطبیق یافته را کشف می کند ، این پلتفرم با داده های identifyHandler
حاصل از آن ، با داده های اسکن حاصل از آن استفاده می کند. در برنامه شما ، اسکن با استفاده از پخش UDP انجام می شود و داده های اسکن ارائه شده به Handler IDENTIFY
شامل بار پاسخ ارسال شده توسط دستگاه محلی است.
Handler یک نمونه IdentifyResponse
حاوی یک شناسه منحصر به فرد برای دستگاه محلی را برمی گرداند. برای پردازش پاسخ UDP از دستگاه محلی و تعیین شناسه دستگاه محلی مناسب ، کد زیر را به روش identifyHandler
خود اضافه کنید:
محلی/شاخص .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 را اضافه کنید
خانه محلی SDK هنگامی که دستگاهی که از تحقق محلی پشتیبانی می کند ، یک فرمان را دریافت می کند ، EXECUTE
کننده شما را تحریک می کند. محتوای هدف محلی معادل هدف EXECUTE
ارسال شده به ابر شما است ، بنابراین منطق پردازش محلی به قصد شبیه به نحوه برخورد با آن در ابر است.
این برنامه می تواند از سوکت های TCP/UDP یا درخواست HTTP (ها) برای برقراری ارتباط با دستگاه های محلی استفاده کند. در این CodeLab ، HTTP به عنوان پروتکل مورد استفاده برای کنترل دستگاه مجازی عمل می کند. شماره پورت در index.ts
به عنوان متغیر SERVER_PORT
تعریف شده است.
برای پردازش دستورات ورودی و ارسال آنها به دستگاه محلی از طریق HTTP ، کد زیر را به روش executeHandler
خود اضافه کنید:
محلی/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 مستقر کنید تا بتوانید از دستگاه Google Home به آنها دسترسی پیدا کنید.
firebase deploy --only hosting
7. واشر هوشمند را شروع کنید
اکنون وقت آن رسیده است که ارتباطات بین برنامه تحقق محلی خود و واشر هوشمند را آزمایش کنید! پروژه استارت CodeLab شامل یک واشر هوشمند V irtual است که در 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
8. اشکال زدایی برنامه Typescript
در بخش زیر تأیید خواهید کرد که دستگاه Google Home می تواند به درستی اسکن ، شناسایی و ارسال دستورات به واشر هوشمند مجازی از طریق شبکه محلی شود. شما می توانید از ابزارهای توسعه دهنده Google Chrome برای اتصال به دستگاه Google Home ، مشاهده سیاهههای مربوط به کنسول و اشکال زدایی برنامه TypeScript استفاده کنید.
ابزارهای توسعه دهنده Chrome را به هم وصل کنید
برای اتصال اشکال زدایی به برنامه تحقق محلی خود ، این مراحل را دنبال کنید:
- اطمینان حاصل کنید که دستگاه Google Home خود را با اجازه دسترسی به پروژه کنسول توسعه دهنده به کاربر پیوند داده اید.
- دستگاه Google Home خود را مجدداً راه اندازی مجدد کنید ، که این امکان را برای دریافت URL HTML و همچنین پیکربندی اسکن که در کنسول توسعه دهنده قرار داده اید ، قرار می دهد.
- Chrome را در دستگاه توسعه خود راه اندازی کنید.
- یک برگه جدید Chrome را باز کنید و
chrome://inspect
تا بازرس را راه اندازی کنید.
شما باید لیستی از دستگاه ها را در صفحه مشاهده کنید و URL برنامه شما باید تحت نام دستگاه Google Home شما ظاهر شود.
بازرس را راه اندازی کنید
برای راه اندازی ابزارهای توسعه دهنده Chrome ، روی بازرسی تحت URL برنامه خود کلیک کنید. برگه کنسول را انتخاب کرده و تأیید کنید که می توانید محتوای IDENTIFY
قصد چاپ شده توسط برنامه TypeScript خود را مشاهده کنید.
این خروجی به این معنی است که برنامه تحقق محلی شما با موفقیت دستگاه مجازی را کشف و شناسایی کرد.
تحقق محلی را آزمایش کنید
با استفاده از کنترل های لمسی در برنامه Google Home یا از طریق دستورات صوتی به دستگاه Google Home ، مانند:
"Hey Google، ماشین لباسشویی من را روشن کن."
"سلام گوگل ، واشر من را شروع کنید."
"Hey Google، ماشین لباسشویی من را متوقف کن."
این باید باعث شود تا بستر ارسال یک قصد EXECUTE
به برنامه TypeScript شما.
تأیید کنید که می توانید با هر دستور ، تغییر حالت واشر هوشمند محلی را مشاهده کنید.
... ***** The washer is RUNNING ***** ... ***** The washer is STOPPED *****
9. تبریک می گویم
تبریک می گویم! شما از خانه محلی SDK برای ادغام تحقق محلی در ادغام ابر به ابر استفاده کرده اید.
بیشتر بدانید
در اینجا موارد دیگری که می توانید امتحان کنید وجود دارد:
- پیکربندی اسکن را تغییر داده و آن را کار کنید. به عنوان مثال ، از یک درگاه UDP متفاوت یا بسته کشف استفاده کنید.
- برای اجرای روی یک دستگاه تعبیه شده - مانند Raspberry Pi - و از LED یا صفحه نمایش برای تجسم وضعیت فعلی ، در یک دستگاه تعبیه شده را تغییر دهید.