1- قبل البدء
تسمح عمليات الدمج في المنزل المزوّد بأجهزة ذكية لخدمة "مساعد Google" بالتحكّم في الأجهزة المتصلة في منازل المستخدمين. لإنشاء إجراء للمنزل المزوّد بأجهزة ذكية، عليك توفير نقطة نهاية للردّ التلقائي على الويب على السحابة الإلكترونية يمكنها التعامل مع أهداف المنزل المزوّد بأجهزة ذكية. على سبيل المثال، عندما يقول المستخدم "Ok Google، أريد إضاءة المصابيح"، يرسل "مساعد Google" الطلب إلى طريقة التنفيذ على السحابة الإلكترونية لتعديل حالة الجهاز.
تعمل حزمة تطوير البرامج (SDK) للمنزل المحلي على تحسين عملية دمج المنزل المزوّد بأجهزة ذكية من خلال إضافة مسار محلي لتوجيه أهداف المنزل المزوّد بأجهزة ذكية مباشرةً إلى جهاز Google Home، ما يعزّز الموثوقية ويقلل من وقت الاستجابة في معالجة أوامر المستخدمين. تسمح لك هذه السياسة بكتابة تطبيق تنفيذ محلي ونشره في TypeScript أو JavaScript يحدّد الأجهزة وينفّذ الأوامر على أي مكبّر صوت ذكي من Google Home أو شاشة Google Nest ذكية. يتواصل تطبيقك بعد ذلك مباشرةً مع الأجهزة الذكية الحالية الخاصة بالمستخدمين عبر شبكة الاتصال المحلية باستخدام البروتوكولات العادية الحالية لتنفيذ الأوامر.
المتطلبات الأساسية
- دليل مطوِّر المهام المخصّصة للمنزل المزوّد بأجهزة ذكية
- الدرس التطبيقي حول ترميز الغسّالات المنزلية الذكية
- دليل المطوِّرين لتنفيذ الطلبات على الجهاز
العناصر التي ستنشئها
في هذا الدرس التطبيقي حول الترميز، ستعمل على نشر دمج للمنزل المزوّد بأجهزة ذكية سابقًا مع Firebase، ثم تطبيق إعدادات الفحص في وحدة تحكّم الإجراءات، وإنشاء تطبيق محلي باستخدام TypeScript لإرسال الأوامر المكتوبة في Node.js إلى جهاز غسّالة افتراضي.
المعلومات التي ستطّلع عليها
- كيفية تفعيل عملية التنفيذ المحلية وإعدادها في وحدة تحكُّم الإجراءات.
- كيفية استخدام حزمة تطوير البرامج (SDK) للمنزل المحلي من أجل كتابة تطبيق محلي لتنفيذ الطلبات
- كيفية تصحيح الأخطاء في تطبيق توصيل الطلبات المحلي الذي تم تحميله على مكبّر صوت Google Home أو شاشة Google Nest الذكية
المتطلبات
- أحدث إصدار من Google Chrome
- جهاز iOS أو Android يتضمّن تطبيق Google Home
- مكبّر صوت ذكي من Google Home أو شاشة Google Nest ذكية
- الإصدار 10.16 من Node.js أو إصدار أحدث
- حساب Google
- حساب فوترة على Google Cloud
2- الخطوات الأولى
تفعيل عناصر التحكم في النشاط
لاستخدام "مساعد Google"، يجب مشاركة بيانات نشاط معيّنة مع Google. ويحتاج "مساعد Google" إلى هذه البيانات ليعمل بشكل صحيح، إلا أنّ شرط مشاركة البيانات لا يقتصر على حزمة تطوير البرامج (SDK). لمشاركة هذه البيانات، أنشِئ حسابًا على Google إذا لم يكن لديك حساب. يمكنك استخدام أي حساب على Google، وليس بالضرورة أن يكون حساب المطوِّر.
افتح صفحة عناصر التحكّم في النشاط لحساب Google الذي تريد استخدامه مع "مساعد Google".
تأكّد من أنّ مفاتيح التبديل التالية مفعَّلة:
- النشاط على الويب وفي التطبيقات: بالإضافة إلى ذلك، احرص على وضع علامة في مربّع الاختيار تضمين سجلّ Chrome والأنشطة من المواقع والتطبيقات والأجهزة التي تستخدم خدمات Google.
- معلومات الجهاز
- التفاعل الصوتي مع الجهاز
إنشاء مشروع "المهام"
- انتقِل إلى الإجراءات على Google Developer Console.
- انقر على مشروع جديد، وأدخِل اسمًا للمشروع، ثمّ انقر على إنشاء مشروع.
يُرجى النقر على تطبيق المنزل المزوّد بأجهزة ذكية.
في شاشة "نظرة عامة" في "وحدة تحكّم الإجراءات"، اختَر منزل مزوّد بأجهزة ذكية.
اختَر بطاقة التجربة للمنزل المزوّد بأجهزة ذكية، وسيتم توجيهك بعد ذلك إلى وحدة تحكُّم المشروع.
تثبيت واجهة سطر الأوامر في Firebase
ستتيح لك واجهة سطر أوامر Firebase (CLI) عرض تطبيقات الويب محليًا ونشر تطبيق الويب على استضافة Firebase.
لتثبيت واجهة سطر الأوامر، قم بتشغيل الأمر npm التالي من الوحدة الطرفية:
npm install -g firebase-tools
للتحقّق من أنّه تم تثبيت واجهة سطر الأوامر بشكل صحيح، شغِّل:
firebase --version
يمكنك تفويض واجهة سطر الأوامر في Firebase باستخدام حسابك على Google من خلال تشغيل:
firebase login
تفعيل HomeGraph API
تتيح HomeGraph API إمكانية تخزين الأجهزة وحالاتها وإجراء طلبات بحث عنها ضمن Home Graph للمستخدم. لاستخدام واجهة برمجة التطبيقات هذه، عليك أولاً فتح وحدة تحكُّم Google Cloud وتفعيل HomeGraph API.
في وحدة تحكُّم Google Cloud، تأكَّد من اختيار المشروع الذي يتطابق مع الإجراءات الخاصة بك <project-id>.
. بعد ذلك، انقر على تفعيل في شاشة "مكتبة واجهة برمجة التطبيقات" الخاصة بواجهة HomeGraph API.
3- تشغيل تطبيق المبتدئين
الآن وبعد إعداد بيئة التطوير، يمكنك نشر المشروع المبدئي للتحقق من ضبط كل شيء بشكل صحيح.
الحصول على رمز المصدر
انقر على الرابط التالي لتنزيل نموذج هذا الدرس التطبيقي حول الترميز على جهاز التطوير الذي تستخدمه:
...أو يمكنك استنساخ مستودع جيت هب من سطر الأوامر:
git clone https://github.com/google-home/smarthome-local.git
لمحة عن المشروع
يحتوي المشروع الأوّلي على الأدلة الفرعية التالية:
public
: واجهة مستخدم الويب الأمامية للتحكّم في الغسّالة الذكية ومراقبتهاfunctions
: وظائف Cloud تنفِّذ التنفيذ على السحابة الإلكترونية لإجراء المنزل المزوّد بأجهزة ذكيةlocal
: مشروع تطبيق تنفيذي للهيكل العظمي تم استخراج معالِجات الأهداف فيindex.ts
يتضمن توفير السحابة الإلكترونية الوظائف التالية في index.js
:
fakeauth
: نقطة نهاية التفويض لربط الحسابfaketoken
: نقطة نهاية الرمز المميّز لربط الحساباتsmarthome
: نقطة نهاية تنفيذ الغرض من المنزل المزوّد بأجهزة ذكيةreportstate
: يستدعي HomeGraph API عند تغيير حالة الجهاز.updateDevice
: نقطة النهاية التي يستخدمها الجهاز الافتراضي لتفعيل "حالة التقرير"
الربط بمنصة Firebase
انتقِل إلى دليل app-start
، ثم اضبط واجهة سطر الأوامر في Firebase باستخدام مشروع الإجراءات:
cd app-start firebase use <project-id>
ضبط مشروع Firebase
يجب إعداد مشروع على Firebase.
firebase init
اختر ميزات CLI وقاعدة بيانات الوقت الفعلي والدوالّ وميزة الاستضافة التي تتضمّن "استضافة Firebase".
? Which Firebase CLI features do you want to set up for this directory? Press Space to select features, then Enter to confirm your choices. ❯◉ Realtime Database: Configure a security rules file for Realtime Database and (optionally) provision default instance ◯ Firestore: Configure security rules and indexes files for Firestore ◉ Functions: Configure a Cloud Functions directory and its files ◉ Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys ◯ Hosting: Set up GitHub Action deploys ◯ Storage: Configure a security rules file for Cloud Storage ◯ Emulators: Set up local emulators for Firebase products ◯ Remote Config: Configure a template file for Remote Config ◯ Extensions: Set up an empty Extensions manifest
سيؤدي ذلك إلى تهيئة واجهات برمجة التطبيقات والميزات اللازمة لمشروعك.
قم بتهيئة قاعدة بيانات الوقت الفعلي عندما يُطلب منك ذلك. يمكنك استخدام الموقع الافتراضي لمثيل قاعدة البيانات.
? It seems like you haven't initialized Realtime Database in your project yet. Do you want to set it up? Yes ? Please choose the location for your default Realtime Database instance: us-central1
نظرًا لأنك تستخدم رمز مشروع المبتدئين، يُرجى اختيار الملف التلقائي لقواعد الأمان، والتأكّد من عدم استبدال ملف قواعد قاعدة البيانات الحالي.
? File database.rules.json already exists. Do you want to overwrite it with the Realtime Database Security Rules for <project-ID>-default-rtdb from the Firebase Console? No
في حال إعادة بدء مشروعك، اختَر استبدال عندما يُطلب منك تحديد ما إذا كنت تريد إعداد قاعدة رموز أو استبدالها.
? Would you like to initialize a new codebase, or overwrite an existing one? Overwrite
عند ضبط الدوال، يجب استخدام الملفات التلقائية والتأكّد من عدم استبدال ملفات index.js وpackage.json الحالية في نموذج المشروع.
? What language would you like to use to write Cloud Functions? JavaScript ? Do you want to use ESLint to catch probable bugs and enforce style? No ? File functions/package.json already exists. Overwrite? No ? File functions/index.js already exists. Overwrite? No
في حال إعادة إعداد المشروع، اختَر لا عند سؤالك ما إذا كنت تريد إعداد الدوال/.gitignore أو استبدالها.
? File functions/.gitignore already exists. Overwrite? No
? Do you want to install dependencies with npm now? Yes
وأخيرًا، اضبط إعداد خدمة "الاستضافة" على استخدام دليل public
في رمز المشروع، واستخدِم ملف index.html الحالي. اختَر لا عندما يُطلب منك استخدام ESLint.
? What do you want to use as your public directory? public ? Configure as a single-page app (rewrite all urls to /index.html)? Yes ? Set up automatic builds and deploys with GitHub? No ? File public/index.html already exists. Overwrite? No
في حال تفعيل ESLint عن طريق الخطأ، تتوفر طريقتان لإيقافه:
- باستخدام واجهة المستخدم الرسومية، انتقِل إلى مجلد
../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
) لعرض تطبيق الويب. ستظهر لك الواجهة التالية:
تمثّل واجهة مستخدم الويب هذه منصة تابعة لجهة خارجية من أجل عرض حالات الأجهزة أو تعديلها. لبدء ملء قاعدة البيانات بمعلومات الجهاز، انقر على تعديل. لن تظهر أي تغييرات في الصفحة، ولكن سيتم تخزين الحالة الحالية للغسّالة في قاعدة البيانات.
حان الوقت الآن لربط خدمة السحابة الإلكترونية التي نشرتها في "مساعد Google" باستخدام وحدة تحكّم الإجراءات.
ضبط مشروع وحدة تحكّم المهام
ضمن نظرة عامة > إنشاء الإجراء، اختَر إضافة إجراءات. أدخِل عنوان URL لوظيفة السحابة الإلكترونية التي توفّر تنفيذ أهداف المنزل المزوّد بأجهزة ذكية، وانقر على حفظ.
https://us-central1-<project-id>.cloudfunctions.net/smarthome
في علامة التبويب التطوير > الاستدعاء، أضِف الاسم المعروض للإجراء، ثم انقر على حفظ. سيظهر هذا الاسم في تطبيق Google Home.
لتفعيل ربط الحساب، انقر على الخيار تطوير > ربط الحساب في شريط التنقّل على يمين الصفحة. يمكنك استخدام إعدادات ربط الحساب التالية:
معرِّف العميل |
|
سر العميل |
|
عنوان URL للترخيص |
|
عنوان URL للرمز المميّز |
|
انقر على حفظ لحفظ إعدادات ربط الحساب، ثم انقر على اختبار لتفعيل الاختبار على مشروعك.
ستتم إعادة توجيهك إلى المحاكي. تحقَّق من تفعيل الاختبار لمشروعك من خلال تحريك الماوس فوق رمز "الاختبار على الجهاز" ().
الربط بخدمة "مساعد Google"
من أجل اختبار الإجراء الخاص بمنزلك المزوّد بأجهزة ذكية، عليك ربط مشروعك بحساب على Google. ويتيح ذلك إجراء الاختبارات من خلال منصات "مساعد Google" وتطبيق Google Home الذين سجّلوا الدخول إلى الحساب نفسه.
- افتح إعدادات مساعد Google على هاتفك. ملاحظة: يجب تسجيل الدخول باستخدام الحساب نفسه الذي تستخدمه في وحدة التحكم.
- انتقِل إلى مساعد Google > الإعدادات > الإدارة الآلية للمنزل (ضمن "مساعد Google").
- انقر على رمز البحث في أعلى يسار الصفحة.
- ابحث عن تطبيقك التجريبي باستخدام البادئة [test] للعثور على تطبيقك التجريبي المحدّد.
- اختَر هذا العنصر. سيُجري "مساعد Google" بعد ذلك المصادقة مع خدمتك ويرسل طلب
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
بعد اكتمال النشر، انتقِل إلى واجهة مستخدم الويب وانقر على زر إعادة تحميل في شريط الأدوات. يؤدي ذلك إلى تفعيل عملية "طلب المزامنة" لكي يتلقّى "مساعد Google" بيانات استجابة "SYNC
" المعدَّلة.
5- ضبط التنفيذ المحلي
في هذا القسم، ستضيف خيارات الإعدادات اللازمة للتنفيذ المحلي إلى إجراء المنزل المزوّد بأجهزة ذكية. أثناء التطوير، سيتم نشر تطبيق التنفيذ المحلي على "استضافة Firebase"، حيث يمكن لجهاز Google Home الوصول إليه وتنزيله.
في وحدة تحكُّم الإجراءات، اختَر تطوير > الإجراءات وابحث عن القسم Configure local Home SDK (ضبط حزمة تطوير البرامج (SDK) للمنزل المحلي)). أدخل عنوان URL التالي في حقل عنوان URL التجريبي، وأدخل رقم تعريف مشروعك، ثم انقر على حفظ:
https://<project-id>.web.app/local-home/index.html
بعد ذلك، علينا تحديد الطريقة التي يمكن لجهاز Google Home من خلالها اكتشاف الأجهزة الذكية المحلية. يتيح النظام الأساسي للمنزل المحلي استخدام بروتوكولات متعدّدة لاكتشاف الأجهزة، بما في ذلك بث mDNS وUPnP وUDP. ستستخدم بث UDP لاكتشاف الغسّالة الذكية.
انقر على ضبط فحص جديد ضِمن ضبط فحص الجهاز لإضافة إعدادات فحص جديدة. حدد بروتوكول UDP كبروتوكول، واملأ السمات التالية:
الحقل | الوصف | القيمة المقترَحة |
عنوان البث | عنوان بث بروتوكول مخطط بيانات المستخدم (UDP) |
|
منفذ البث | المنفذ الذي يرسل من خلاله Google Home بث UDP |
|
منفذ الاستماع | منفذ يتم من خلاله الاستماع إلى Google Home عند تلقّي ردّ |
|
حزمة الاستكشاف | حمولة بيانات بث بروتوكول مخطط بيانات المستخدم (UDP) |
|
وأخيرًا، انقر على حفظ أعلى النافذة لنشر التغييرات.
6. تنفيذ التنفيذ المحلي
يمكنك تطوير تطبيق التنفيذ المحلي في TypeScript باستخدام حزمة الكتابة في حزمة تطوير البرامج (SDK) للمنزل المحلي. انظر إلى الهيكل العظمي المقدم في مشروع البداية:
local/index.ts
/// <reference types="@google/local-home-sdk" />
import App = smarthome.App;
import Constants = smarthome.Constants;
import DataFlow = smarthome.DataFlow;
import Execute = smarthome.Execute;
import Intents = smarthome.Intents;
import IntentFlow = smarthome.IntentFlow;
...
class LocalExecutionApp {
constructor(private readonly app: App) { }
identifyHandler(request: IntentFlow.IdentifyRequest):
Promise<IntentFlow.IdentifyResponse> {
// TODO: Implement device identification
}
executeHandler(request: IntentFlow.ExecuteRequest):
Promise<IntentFlow.ExecuteResponse> {
// TODO: Implement local fulfillment
}
...
}
const localHomeSdk = new App('1.0.0');
const localApp = new LocalExecutionApp(localHomeSdk);
localHomeSdk
.onIdentify(localApp.identifyHandler.bind(localApp))
.onExecute(localApp.executeHandler.bind(localApp))
.listen()
.then(() => console.log('Ready'))
.catch((e: Error) => console.error(e));
تمثّل الفئة smarthome.App
العنصر الأساسي لتنفيذ الطلبات على المستوى المحلي. يرفق مشروع إجراء التفعيل معالِجات للأهداف IDENTIFY
وEXECUTE
، ثم يستدعي طريقة listen()
لإبلاغ حزمة تطوير البرامج (SDK) للمنزل المحلي بأنّ التطبيق جاهز.
إضافة معالج IDENTIFY
تشغِّل حزمة تطوير البرامج (SDK) للمنزل المحلي معالِج "IDENTIFY
" عندما يرصد جهاز Google Home أجهزة لم يتم التحقق منها على الشبكة المحلية استنادًا إلى إعدادات الفحص المتوفّرة في "وحدة التحكّم في الإجراءات".
وفي الوقت نفسه، يستدعي النظام الأساسي identifyHandler
مع بيانات الفحص الناتجة عندما يكتشف Google جهازًا مطابقًا. يتم البحث داخل تطبيقك باستخدام بث UDP، وتشمل بيانات الفحص المقدَّمة إلى معالِج "IDENTIFY
" حمولة الاستجابة التي يرسلها الجهاز المحلي.
يعرض المعالج مثيل IdentifyResponse
يحتوي على معرّف فريد للجهاز المحلي. أضِف الرمز التالي إلى طريقة identifyHandler
لمعالجة استجابة UDP الواردة من الجهاز المحلي وتحديد رقم تعريف الجهاز المحلي المناسب:
local/index .ts
identifyHandler(request: IntentFlow.IdentifyRequest):
Promise<IntentFlow.IdentifyResponse> {
console.log("IDENTIFY intent: " + JSON.stringify(request, null, 2));
const scanData = request.inputs[0].payload.device.udpScanData;
if (!scanData) {
const err = new IntentFlow.HandlerError(request.requestId,
'invalid_request', 'Invalid scan data');
return Promise.reject(err);
}
// In this codelab, the scan data contains only local device id.
const localDeviceId = Buffer.from(scanData.data, 'hex');
const response: IntentFlow.IdentifyResponse = {
intent: Intents.IDENTIFY,
requestId: request.requestId,
payload: {
device: {
id: 'washer',
verificationId: localDeviceId.toString(),
}
}
};
console.log("IDENTIFY response: " + JSON.stringify(response, null, 2));
return Promise.resolve(response);
}
يُرجى العِلم أنّ الحقل verificationId
يجب أن يتطابق مع إحدى قيم otherDeviceIds
في ردّك على SYNC
، ما يؤدي إلى وضع علامة على الجهاز بأنّه متاح للتنفيذ المحلي في الرسم البياني المنزلي للمستخدم. وبعد أن تعثر Google على مطابقة، يُعتبَر أنّ الجهاز تم إثبات ملكيته وجاهزًا للاستخدام المحلي.
إضافة المعالج EXECUTE
تشغِّل حزمة تطوير البرامج (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
انتقِل إلى دليل local/
وشغِّل الأوامر التالية لتنزيل المحول البرمجي لـ TypeScript وتجميع التطبيق:
cd local npm install npm run build
يجمع هذا المصدر index.ts
(TypeScript) ويضع المحتوى التالي في دليل public/local-home/
:
bundle.js
: مخرجات JavaScript مجمّعة تحتوي على التطبيق المحلي والتبعيات.index.html
: صفحة الاستضافة المحلية المستخدمة لعرض التطبيق للاختبار على الجهاز.
نشر المشروع التجريبي
انشر ملفات المشروع المعدَّلة في "استضافة Firebase" حتى تتمكّن من الوصول إليها من جهاز Google Home.
firebase deploy --only hosting
7. تشغيل الغسّالة الذكية
حان الوقت الآن لاختبار الاتصال بين تطبيق توصيل الطلبات المحلي والغسّالة الذكية! يتضمّن مشروع بدء الدرس التطبيقي حول الترميز غسّالة ذكية vافتراضية مكتوبة باستخدام نظام Node.js وتحاكي غسّالة ذكية يمكن للمستخدمين التحكّم فيها محليًا.
ضبط الجهاز
عليك ضبط الجهاز الافتراضي لاستخدام مَعلمات UDP نفسها التي طبّقتها على إعدادات الفحص لاكتشاف الأجهزة في وحدة تحكّم الإجراءات. بالإضافة إلى ذلك، عليك إعلام الجهاز الافتراضي برقم تعريف الجهاز المحلي المطلوب الإبلاغ عنه ورقم تعريف مشروع الإجراءات المطلوب استخدامه لأحداث حالة التقرير عندما تتغير حالة الجهاز.
المعلَمة | القيمة المقترَحة |
deviceId |
|
discoveryPortOut |
|
discoveryPacket |
|
projectId | رقم تعريف مشروع الإجراءات |
تشغيل الجهاز
انتقِل إلى دليل 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.
تشغيل أداة الفحص
انقر على فحص أسفل عنوان URL لتطبيقك لتشغيل "أدوات مطوّري برامج Chrome". اختَر علامة التبويب وحدة التحكّم وتأكَّد من أنّه يمكنك الاطّلاع على محتوى IDENTIFY
intent المطبوع بواسطة تطبيق TypeScript.
تعني هذه النتيجة أنّه تم اكتشاف الجهاز الافتراضي وتحديده بنجاح من خلال تطبيق التنفيذ المحلي.
اختبار توصيل الطلبات على المستوى المحلي
أرسِل الطلبات إلى جهازك باستخدام عناصر التحكّم باللمس في تطبيق Google Home أو من خلال الطلبات الصوتية إلى جهاز Google Home، مثل:
"Ok Google، أريد تشغيل غسّالة ملابسي"
"Ok Google، أريد تشغيل الغسّالة"
"Ok Google، أريد إيقاف الغسّالة"
من المفترض أن يؤدي ذلك إلى تفعيل النظام الأساسي لإرسال هدف EXECUTE
إلى تطبيق TypeScript.
تأكَّد من أنّه يمكنك الاطّلاع على حالة الغسّالة الذكية المحلية من خلال كل طلب.
... ***** The washer is RUNNING ***** ... ***** The washer is STOPPED *****
9. تهانينا
تهانينا لقد استخدمت حزمة تطوير البرامج (SDK) للمنزل المحلي من أجل دمج تنفيذ الأجهزة المحلية في أحد إجراءات المنزل المزوّد بأجهزة ذكية.
مزيد من المعلومات
إليك بعض الإجراءات الإضافية التي يمكنك تجربتها:
- يجب تغيير إعدادات الفحص وجعلها تعمل بشكلٍ سليم. على سبيل المثال، يمكنك محاولة استخدام منفذ UDP مختلف أو حزمة استكشاف مختلفة.
- عدِّل قاعدة الرموز الافتراضية للأجهزة الذكية لتشغيلها على جهاز مضمّن، مثل Raspberry Pi، واستخدِم مصابيح LED أو الشاشة لعرض الحالة الحالية.