تفعيل توصيل الطلبات محليًا في الإجراءات المنزلية الذكية

1- قبل البدء

تسمح عمليات الدمج في المنزل المزوّد بأجهزة ذكية لخدمة "مساعد Google" بالتحكّم في الأجهزة المتصلة في منازل المستخدمين. لإنشاء إجراء للمنزل المزوّد بأجهزة ذكية، عليك توفير نقطة نهاية للردّ التلقائي على الويب على السحابة الإلكترونية يمكنها التعامل مع أهداف المنزل المزوّد بأجهزة ذكية. على سبيل المثال، عندما يقول المستخدم "Ok Google، أريد إضاءة المصابيح"، يرسل "مساعد Google" الطلب إلى طريقة التنفيذ على السحابة الإلكترونية لتعديل حالة الجهاز.

تعمل حزمة تطوير البرامج (SDK) للمنزل المحلي على تحسين عملية دمج المنزل المزوّد بأجهزة ذكية من خلال إضافة مسار محلي لتوجيه أهداف المنزل المزوّد بأجهزة ذكية مباشرةً إلى جهاز Google Home، ما يعزّز الموثوقية ويقلل من وقت الاستجابة في معالجة أوامر المستخدمين. تسمح لك هذه السياسة بكتابة تطبيق تنفيذ محلي ونشره في TypeScript أو JavaScript يحدّد الأجهزة وينفّذ الأوامر على أي مكبّر صوت ذكي من Google Home أو شاشة Google Nest ذكية. يتواصل تطبيقك بعد ذلك مباشرةً مع الأجهزة الذكية الحالية الخاصة بالمستخدمين عبر شبكة الاتصال المحلية باستخدام البروتوكولات العادية الحالية لتنفيذ الأوامر.

72ffb320986092c.png

المتطلبات الأساسية

العناصر التي ستنشئها

في هذا الدرس التطبيقي حول الترميز، ستعمل على نشر دمج للمنزل المزوّد بأجهزة ذكية سابقًا مع 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.
  • معلومات الجهاز
  • التفاعل الصوتي مع الجهاز

إنشاء مشروع "المهام"

  1. انتقِل إلى الإجراءات على Google Developer Console.
  2. انقر على مشروع جديد، وأدخِل اسمًا للمشروع، ثمّ انقر على إنشاء مشروع.

AWXw5E1m9zVgvVeyeL3uxwCX6DtWOCK6LRSLmOATFzjMbmE5cSWBdSVhJZDFpEFH2azZTK2eMs6OYYdMJYiGb5bKqFEzxaLyRUYuRETGBlyXdyXky

يُرجى النقر على تطبيق المنزل المزوّد بأجهزة ذكية.

في شاشة "نظرة عامة" في "وحدة تحكّم الإجراءات"، اختَر منزل مزوّد بأجهزة ذكية.

36RsBUWBgbgsa5xZ7MJVMm1sIg07nXbfjv0mWCxXViaC5SlbL2gMigw9hgXsZQhNMHLLFOfiKdZsSTNXONFB1i47gksw3SBNpkVYl4MDIxKjpsVYl4MDIK-jps5rx

اختَر بطاقة التجربة للمنزل المزوّد بأجهزة ذكية، وسيتم توجيهك بعد ذلك إلى وحدة تحكُّم المشروع.

pzgHPsmc2LvLoeUvJfkjKQqD_BvO4v8JOPlcrxsmyptFkkjL4PP6LqrM9r5tNvEIfT9HmK-UKw3GWFPXTjqo4nUrhD2o5shUKHBE31OT8iIA69JZCev7_0_nh-lnL2oJHoxGfqqZ4w

تثبيت واجهة سطر الأوامر في 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.

5SVCzM8IZLi_9DV8M0nEklv16NXkpvM0bIzQK2hSyKyvnFHBxPOz90rbr72ayxzmxd5aNROOqC_Cp4outbdlwJdObDs0DIE_8vYzw6dovoVrP9IZWlWsZxDS7UHOi1jiRbDMG8MqUA

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 عن طريق الخطأ، تتوفر طريقتان لإيقافه:

  1. باستخدام واجهة المستخدم الرسومية، انتقِل إلى مجلد ../functions ضمن المشروع، واختَر الملف المخفي .eslintrc.js واحذفه. لا تخطئ في استخدام الاسم مثل .eslintrc.json.
  2. استخدام سطر الأوامر:
    cd functions
    rm .eslintrc.js
    

للتأكّد من أنّ لديك إعدادات Firebase صحيحة وكاملة، انسخ الملف firebase.json من الدليل washer-done إلى الدليل washer-start، بدلاً من الملف في washer-start.

في الدليل washer-start:

cp -vp ../washer-done/firebase.json .

النشر على Firebase

الآن بعد أن قمت بتثبيت التبعيات وإعداد مشروعك، فأنت جاهز لتشغيل التطبيق لأول مرة.

firebase deploy

هذه هي مخرجات وحدة التحكم التي يُفترض أن تظهر لك:

...

✔ Deploy complete!

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

يؤدي هذا الأمر إلى نشر تطبيق ويب، مع العديد من دوال Cloud لمنصة Firebase.

افتح عنوان URL للاستضافة في متصفحك (https://<project-id>.web.app) لعرض تطبيق الويب. ستظهر لك الواجهة التالية:

L60eA7MOnPmbBMl2XMipT9MdnP-RaVjyjf0Y93Y1b7mEyIsqZrrwczE7D3RQISRs-iusL1g4XbNmGhuA6-5sLcWefnczwNJEPfNLtwBsO4Tb9YvcAZBI6_rX19z8rxbik9Vq8F2fwg

تمثّل واجهة مستخدم الويب هذه منصة تابعة لجهة خارجية من أجل عرض حالات الأجهزة أو تعديلها. لبدء ملء قاعدة البيانات بمعلومات الجهاز، انقر على تعديل. لن تظهر أي تغييرات في الصفحة، ولكن سيتم تخزين الحالة الحالية للغسّالة في قاعدة البيانات.

حان الوقت الآن لربط خدمة السحابة الإلكترونية التي نشرتها في "مساعد Google" باستخدام وحدة تحكّم الإجراءات.

ضبط مشروع وحدة تحكّم المهام

ضمن نظرة عامة > إنشاء الإجراء، اختَر إضافة إجراءات. أدخِل عنوان URL لوظيفة السحابة الإلكترونية التي توفّر تنفيذ أهداف المنزل المزوّد بأجهزة ذكية، وانقر على حفظ.

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

Uso-o00XQXBHvOR9vQq9tmpYDYQJKsFEstsgRFnxPAJf7zJ2FxwhISiodo3dB1Tz49Okd6ivi66fjpo7rarS_GZelglGWCT1r9FzDGUl1r67ddIcIbQrxqN8jG9F9GAKOpk0Ckc-eA

في علامة التبويب التطوير > الاستدعاء، أضِف الاسم المعروض للإجراء، ثم انقر على حفظ. سيظهر هذا الاسم في تطبيق Google Home.

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

s4yc1kOW4XtKUQN1EYegiDLU5oTqmxQ2PNbeaujm26OQmYKKpjug7j5FYmutLSAZ1zBd-ZkcZlL7zyTZqw4bge3_oOeWvJTsqJ-A08vfZwImYQrKiquLskLuTpmMqXEZD1xchhCWGQ

لتفعيل ربط الحساب، انقر على الخيار تطوير > ربط الحساب في شريط التنقّل على يمين الصفحة. يمكنك استخدام إعدادات ربط الحساب التالية:

معرِّف العميل

ABC123

سر العميل

DEF456

عنوان URL للترخيص

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

عنوان URL للرمز المميّز

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

rRyZTiBSTuPk3YtJtXjDK1pPftUxsaEhs9jzpvFtbHTD6bEwYxM8jV4MWxiljKA1bKVZrIRoO9O3jtBefLKf_OyMpukPjwIj8zGvyU3UwASzMrnRskl-hVAfAmQVi4sC_zAwgYwRXw

انقر على حفظ لحفظ إعدادات ربط الحساب، ثم انقر على اختبار لتفعيل الاختبار على مشروعك.

OgUvpQfXioygkRwPcaJpzjyNQDZy6enidUC8YMPaCOrZi0YeWCFsCJV9Gqg-_UfsqTnn4KEg--uE3Ymr0QuamDonF4RyYHtRKcULXABDuaEnj2hq8i20LYj1SrGP_1lQ_UsUB90pGw

ستتم إعادة توجيهك إلى المحاكي. تحقَّق من تفعيل الاختبار لمشروعك من خلال تحريك الماوس فوق رمز "الاختبار على الجهاز" (لذلك).

2zbfeYpG-wEd2SFP07Wc4mJzHakLX7YvrNw3IV0_0Kd-TonfsKIvvjKWlwvrmTm5jLj3XPWqCtcDd5J2z6gwn9fnchpYVraw1j_mE4M0LVppAl5WY5cK7g0uZyhZ3VFFS25yPmyksg

من أجل اختبار الإجراء الخاص بمنزلك المزوّد بأجهزة ذكية، عليك ربط مشروعك بحساب على Google. ويتيح ذلك إجراء الاختبارات من خلال منصات "مساعد Google" وتطبيق Google Home الذين سجّلوا الدخول إلى الحساب نفسه.

  1. افتح إعدادات مساعد Google على هاتفك. ملاحظة: يجب تسجيل الدخول باستخدام الحساب نفسه الذي تستخدمه في وحدة التحكم.
  2. انتقِل إلى مساعد Google > الإعدادات > الإدارة الآلية للمنزل (ضمن "مساعد Google").
  3. انقر على رمز البحث في أعلى يسار الصفحة.
  4. ابحث عن تطبيقك التجريبي باستخدام البادئة [test] للعثور على تطبيقك التجريبي المحدّد.
  5. اختَر هذا العنصر. سيُجري "مساعد Google" بعد ذلك المصادقة مع خدمتك ويرسل طلب SYNC، ليطلب من الخدمة تقديم قائمة بالأجهزة للمستخدم.

يُرجى فتح تطبيق Google Home والتأكّد من رؤية جهاز الغسّالة.

XcWmBVamBZtPfOFqtsr5I38stPWTqDcMfQwbBjetBgxt0FCjEs285pa9K3QXSASptw0KYN2G8yfkT0-xg664V4PjqMreDDs-HPegHjOc4EVtReYPu-WKZyygq9Xmkf8X8z9177nBjQ

تأكَّد من أنّه بإمكانك التحكّم في الغسّالة باستخدام الطلبات الصوتية في تطبيق 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

بعد اكتمال النشر، انتقِل إلى واجهة مستخدم الويب وانقر على زر إعادة تحميل ae8d3b25777a5e30.png في شريط الأدوات. يؤدي ذلك إلى تفعيل عملية "طلب المزامنة" لكي يتلقّى "مساعد Google" بيانات استجابة "SYNC" المعدَّلة.

bf4f6a866160a982.png

5- ضبط التنفيذ المحلي

في هذا القسم، ستضيف خيارات الإعدادات اللازمة للتنفيذ المحلي إلى إجراء المنزل المزوّد بأجهزة ذكية. أثناء التطوير، سيتم نشر تطبيق التنفيذ المحلي على "استضافة Firebase"، حيث يمكن لجهاز Google Home الوصول إليه وتنزيله.

في وحدة تحكُّم الإجراءات، اختَر تطوير > الإجراءات وابحث عن القسم Configure local Home SDK (ضبط حزمة تطوير البرامج (SDK) للمنزل المحلي)). أدخل عنوان URL التالي في حقل عنوان URL التجريبي، وأدخل رقم تعريف مشروعك، ثم انقر على حفظ:

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

7d59b31f8d2a988.png

بعد ذلك، علينا تحديد الطريقة التي يمكن لجهاز Google Home من خلالها اكتشاف الأجهزة الذكية المحلية. يتيح النظام الأساسي للمنزل المحلي استخدام بروتوكولات متعدّدة لاكتشاف الأجهزة، بما في ذلك بث mDNS وUPnP وUDP. ستستخدم بث UDP لاكتشاف الغسّالة الذكية.

انقر على ضبط فحص جديد ضِمن ضبط فحص الجهاز لإضافة إعدادات فحص جديدة. حدد بروتوكول UDP كبروتوكول، واملأ السمات التالية:

الحقل

الوصف

القيمة المقترَحة

عنوان البث

عنوان بث بروتوكول مخطط بيانات المستخدم (UDP)

255.255.255.255

منفذ البث

المنفذ الذي يرسل من خلاله Google Home بث UDP

3311

منفذ الاستماع

منفذ يتم من خلاله الاستماع إلى Google Home عند تلقّي ردّ

3312

حزمة الاستكشاف

حمولة بيانات بث بروتوكول مخطط بيانات المستخدم (UDP)

48656c6c6f4c6f63616c486f6d6553444b

4777bf63c53b6858.png

وأخيرًا، انقر على حفظ أعلى النافذة لنشر التغييرات.

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

deviceid123

discoveryPortOut

3311

discoveryPacket

HelloLocalHomeSDK

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

لربط برنامج تصحيح الأخطاء بتطبيق توصيل الطلبات على الجهاز، اتّبِع الخطوات التالية:

  1. تأكَّد من ربط جهاز Google Home بمستخدم لديه إذن الوصول إلى مشروع وحدة تحكّم الإجراءات.
  2. يُرجى إعادة تشغيل جهاز Google Home، ما يتيح له الحصول على عنوان URL لملف HTML بالإضافة إلى إعدادات الفحص التي تضبطها في وحدة التحكّم في الإجراءات.
  3. شغِّل متصفِّح Chrome على جهاز التطوير.
  4. افتح علامة تبويب جديدة في Chrome وأدخِل chrome://inspect في حقل العنوان لتشغيل أداة الفحص.

من المفترض أن تظهر قائمة بالأجهزة على الصفحة، ومن المفترض أن يظهر عنوان URL لتطبيقك تحت اسم جهاز Google Home.

567f97789a7d8846.png

تشغيل أداة الفحص

انقر على فحص أسفل عنوان URL لتطبيقك لتشغيل "أدوات مطوّري برامج Chrome". اختَر علامة التبويب وحدة التحكّم وتأكَّد من أنّه يمكنك الاطّلاع على محتوى IDENTIFY intent المطبوع بواسطة تطبيق TypeScript.

6b67ded470a4c8be.png

تعني هذه النتيجة أنّه تم اكتشاف الجهاز الافتراضي وتحديده بنجاح من خلال تطبيق التنفيذ المحلي.

اختبار توصيل الطلبات على المستوى المحلي

أرسِل الطلبات إلى جهازك باستخدام عناصر التحكّم باللمس في تطبيق Google Home أو من خلال الطلبات الصوتية إلى جهاز Google Home، مثل:

"Ok Google، أريد تشغيل غسّالة ملابسي"

"Ok Google، أريد تشغيل الغسّالة"

"Ok Google، أريد إيقاف الغسّالة"

من المفترض أن يؤدي ذلك إلى تفعيل النظام الأساسي لإرسال هدف EXECUTE إلى تطبيق TypeScript.

bc030517dacc3ac9.png

تأكَّد من أنّه يمكنك الاطّلاع على حالة الغسّالة الذكية المحلية من خلال كل طلب.

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

9. تهانينا

764dbc83b95782a.png

تهانينا لقد استخدمت حزمة تطوير البرامج (SDK) للمنزل المحلي من أجل دمج تنفيذ الأجهزة المحلية في أحد إجراءات المنزل المزوّد بأجهزة ذكية.

مزيد من المعلومات

إليك بعض الإجراءات الإضافية التي يمكنك تجربتها:

  • يجب تغيير إعدادات الفحص وجعلها تعمل بشكلٍ سليم. على سبيل المثال، يمكنك محاولة استخدام منفذ UDP مختلف أو حزمة استكشاف مختلفة.
  • عدِّل قاعدة الرموز الافتراضية للأجهزة الذكية لتشغيلها على جهاز مضمّن، مثل Raspberry Pi، واستخدِم مصابيح LED أو الشاشة لعرض الحالة الحالية.