1- قبل البدء
بما أنّك من مطوّري برامج إنترنت الأشياء (IoT)، يمكنك إنشاء إجراءات منزلية ذكية تتيح للمستخدمين التحكّم في أجهزتهم من خلال عناصر التحكّم باللمس في تطبيق Google Home والطلبات الصوتية باستخدام "مساعد Google".
تعتمد إجراءات المنزل المزوّد بأجهزة ذكية على الرسم البياني للمنزل لتوفير بيانات سياقية حول المنزل وأجهزته، ما يؤدي إلى إنشاء خريطة منطقية للمنزل. ومن خلال هذا السياق، يفهم "مساعد Google" طلبات المستخدم بطريقة طبيعية أكثر بالنسبة إلى موقعه الجغرافي في المنزل. على سبيل المثال، يمكن لتطبيق Home Graph تخزين مفهوم غرفة معيشة تحتوي على أنواع متعددة من الأجهزة من شركات تصنيع مختلفة، مثل الترموستات والمصباح والمروحة والمكنسة الكهربائية.
المتطلبات الأساسية
- دليل مطوّري برامج إنشاء إجراءات منزلية ذكية
ما ستقوم بإنشائه
في هذا الدرس التطبيقي حول الترميز، ستنشر خدمة سحابية تدير غسّالة ذكية افتراضية، ثم تنشئ إجراءً للمنزل المزوّد بأجهزة ذكية وتربطه بخدمة "مساعد Google".
المعلومات التي ستطّلع عليها
- كيفية نشر خدمة سحابية للمنزل المزوّد بأجهزة ذكية
- كيفية ربط خدمتك بخدمة "مساعد Google"
- كيفية نشر تغييرات حالة الجهاز على Google
المتطلبات
- متصفح ويب، مثل Google Chrome
- جهاز iOS أو Android مثبّت عليه تطبيق Google Home
- الإصدار 10.16 من Node.js أو إصدار أحدث
- حساب فوترة على Google Cloud
2. البدء
تفعيل "عناصر التحكم في النشاط"
لاستخدام "مساعد Google"، يجب مشاركة بيانات نشاط معيّنة مع Google. يحتاج "مساعد Google" إلى هذه البيانات ليعمل بشكل سليم، ومع ذلك، لا تقتصر متطلبات مشاركة البيانات على حزمة تطوير البرامج (SDK). لمشاركة هذه البيانات، عليك إنشاء حساب على Google إذا لم يكن لديك حساب حاليًا. يمكنك استخدام أي حساب على Google، وليس من الضروري أن يكون هذا الحساب هو حساب المطوّر الخاص بك.
افتح صفحة عناصر التحكّم في النشاط لحساب Google الذي تريد استخدامه مع "مساعد Google".
تأكد من تفعيل مفاتيح التبديل التالية:
- النشاط على الويب وفي التطبيقات: احرص أيضًا على وضع علامة في مربّع الاختيار تضمين سجلّ Chrome والأنشطة من المواقع والتطبيقات والأجهزة التي تستخدم خدمات Google.
- معلومات الجهاز
- التفاعل الصوتي مع الجهاز
إنشاء مشروع المهام
- انتقِل إلى المهام مع Google Play Console.
- انقر على مشروع جديد، وأدخِل اسمًا للمشروع، ثم انقر على إنشاء مشروع.
يُرجى اختيار تطبيق المنزل المزوّد بأجهزة ذكية
على شاشة "نظرة عامة" في وحدة تحكّم الإجراءات، اختَر منزل مزوّد بأجهزة ذكية.
اختَر بطاقة تجربة المنزل المزوّد بأجهزة ذكية وانقر على بدء المبنى، وسيتمّ توجيهك إلى وحدة التحكّم في المشروع.
تثبيت واجهة سطر الأوامر في Firebase
ستتيح لك واجهة سطر الأوامر في Firebase عرض تطبيقات الويب محليًا ونشر تطبيق الويب التابع لك لاستضافة Firebase.
لتثبيت واجهة سطر الأوامر، شغِّل الأمر npm التالي من الوحدة الطرفية:
npm install -g firebase-tools
للتحقق من تثبيت واجهة سطر الأوامر بشكل صحيح، شغِّل:
firebase --version
يمكنك تفويض واجهة سطر الأوامر (CLI) في Firebase باستخدام حسابك على Google من خلال تشغيل:
firebase login
3. تشغيل تطبيق المبتدئين
الآن بعد أن أعددت بيئة التطوير، يمكنك نشر المشروع الأوّلي للتحقّق من ضبط كل شيء بشكل صحيح.
الحصول على رمز المصدر
انقر على الرابط التالي لتنزيل نموذج هذا الدرس التطبيقي حول الترميز على جهاز التطوير الذي تستخدمه:
...أو يمكنك استنساخ مستودع جيت هب من سطر الأوامر:
git clone https://github.com/google-home/smarthome-washer.git
لمحة عن المشروع
يحتوي المشروع الأوّلي على الأدلة الفرعية التالية:
public:
واجهة مستخدم أمامية للتحكّم بسهولة في حالة الغسالة الذكية ومراقبتها.functions:
هي خدمة سحابية تم تنفيذها بالكامل وتدير الغسّالة الذكية باستخدام دوال السحابة الإلكترونية لمنصّة Firebase وقاعدة بيانات Firebase في الوقت الفعلي.
الربط بنظام Firebase
انتقِل إلى دليل washer-start
، ثم اضبط واجهة سطر الأوامر في Firebase باستخدام مشروع الإجراءات:
cd washer-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
لأنّك تستخدم رمز مشروع إجراء التفعيل، اختَر الملف التلقائي لقواعد الأمان، وتأكَّد من عدم استبدال ملف قواعد قاعدة البيانات الحالي.
? What file should be used for Realtime Database Security Rules? Database.rules.json ? 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 ? File functions/package.json already exists. Overwrite? No ? File functions/index.js 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 ? Do you want to use ESLint to catch probable bugs and enforce style? No ? 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
من الدليل app-done
إلى الدليل app-start
، بدلاً من الملف في app-start
.
في دليل app-start
:
cp -vp ../app-done/firebase.json .
النشر في Firebase
عليك الانتقال إلى المجلد functions
وتثبيت كل العناصر الاعتمادية اللازمة باستخدام npm.
.
cd functions npm install
الآن بعد أن قمت بتثبيت التبعيات وإعداد مشروعك، فأنت جاهز لتشغيل التطبيق لأول مرة.
firebase deploy
إليك مخرجات وحدة التحكم التي يجب أن تراها:
... ✔ Deploy complete! Project Console: https://console.firebase.google.com/project/<project-id>/overview Hosting URL: https://<project-id>.web.app
ينشر هذا الأمر تطبيق ويب، إلى جانب العديد من دوال السحابة الإلكترونية لبرنامج Firebase.
افتح Hosting URL (عنوان URL للاستضافة) في متصفحك (https://<project-id>.web.app
) لعرض تطبيق الويب. ستظهر لك الواجهة التالية:
تمثل واجهة مستخدم الويب هذه منصة تابعة لجهة خارجية لعرض حالات الجهاز أو تعديلها. لبدء تعبئة قاعدة البيانات بمعلومات الجهاز، انقر على تحديث. لن تظهر لك أي تغييرات على الصفحة، ولكن سيتم تخزين الحالة الحالية للغسّالة في قاعدة البيانات.
حان الوقت الآن لربط خدمة السحابة الإلكترونية التي نشرتها في "مساعد Google" باستخدام وحدة تحكّم المهام.
ضبط مشروع وحدة تحكّم المهام
ضمن نظرة عامة > إنشاء الإجراء، اختر إضافة إجراءات. أدخِل عنوان URL لوظيفة السحابة الإلكترونية التي توفّر عملية تنفيذ إجراءات المنزل المزوّد بأجهزة ذكية، ثم انقر على حفظ.
https://us-central1-<project-id>.cloudfunctions.net/smarthome
في علامة التبويب التطوير > الاستدعاء، أضِف الاسم المعروض للإجراء، ثم انقر على حفظ. سيظهر هذا الاسم في تطبيق Google Home.
لتفعيل ربط الحساب، حدّد الخيار تطوير > ربط الحساب في شريط التنقّل الأيمن. استخدِم إعدادات ربط الحساب التالية:
معرِّف العميل |
|
سر العميل |
|
عنوان URL للترخيص |
|
عنوان URL للرمز المميز |
|
انقر على حفظ لحفظ إعدادات ربط الحساب، ثم انقر على اختبار لتفعيل الاختبار على مشروعك.
ستتم إعادة توجيهك إلى المحاكي. إذا لم يظهر لك الخيار "الاختبار الآن مفعَّل"، انقر على إعادة ضبط الاختبار للتأكّد من تفعيل الاختبار.
يمكنك الآن البدء في تنفيذ الردود التلقائية على الويب اللازمة لربط حالة الجهاز بخدمة "مساعد Google".
4. إنشاء غسّالة
الآن بعد أن ضبطت الإجراء، يمكنك إضافة أجهزة وإرسال البيانات. تحتاج خدمة السحابة الإلكترونية إلى معالجة الأهداف التالية:
- يتم تسجيل هدف
SYNC
عندما يريد "مساعد Google" معرفة الأجهزة التي ربطها المستخدم. يتم إرسال هذه المعلومات إلى خدمتك عندما يربط المستخدم حسابًا. يجب الاستجابة باستخدام حمولة JSON لكل أجهزة المستخدم وإمكانياته. - يحدث هدف "
QUERY
" عندما يريد "مساعد Google" معرفة الحالة الحالية لأحد الأجهزة أو حالته. يجب الردّ باستخدام حمولة JSON مع حالة كل جهاز مطلوب. - يحدث هدف
EXECUTE
عندما يريد "مساعد Google" التحكّم في جهاز نيابةً عن المستخدم. يجب الاستجابة باستخدام حمولة JSON مع حالة التنفيذ لكل جهاز مطلوب. - يحدث هدف
DISCONNECT
عندما يلغي المستخدم ربط حسابه بخدمة "مساعد Google". يجب إيقاف إرسال الأحداث الخاصة بأجهزة هذا المستخدم إلى "مساعد Google".
ستُعدِّل الدوال التي نشرتها سابقًا للتعامل مع هذه الأغراض في الأقسام التالية.
تعديل استجابة المزامنة
يمكنك فتح functions/index.js
الذي يتضمّن الرمز الذي يتيح لك الردّ على الطلبات الواردة من "مساعد Google".
يجب معالجة هدف SYNC
من خلال عرض البيانات الوصفية والإمكانات الخاصة بالجهاز. يمكنك تعديل ملف JSON في مصفوفة onSync
لتضمين معلومات الجهاز والسمات المقترَحة في غسّالة الملابس.
index.js
app.onSync((body) => {
return {
requestId: body.requestId,
payload: {
agentUserId: USER_ID,
devices: [{
id: 'washer',
type: 'action.devices.types.WASHER',
traits: [
'action.devices.traits.OnOff',
'action.devices.traits.StartStop',
'action.devices.traits.RunCycle',
],
name: {
defaultNames: ['My Washer'],
name: 'Washer',
nicknames: ['Washer'],
},
deviceInfo: {
manufacturer: 'Acme Co',
model: 'acme-washer',
hwVersion: '1.0',
swVersion: '1.0.1',
},
willReportState: true,
attributes: {
pausable: true,
},
}],
},
};
});
النشر في Firebase
انشُر التنفيذ المعدَّل للسحابة الإلكترونية باستخدام واجهة سطر الأوامر في Firebase:
firebase deploy --only functions
الربط بخدمة "مساعد Google"
لاختبار إجراء المنزل المزوّد بأجهزة ذكية، عليك ربط مشروعك بحساب على Google. ويتيح ذلك إجراء الاختبار من خلال مساحات عرض "مساعد Google" وتطبيق Google Home اللذَين تم تسجيل الدخول إلىهما باستخدام الحساب نفسه.
- على هاتفكَ، افتح إعدادات مساعد Google. تجدر الإشارة إلى أنّه يجب تسجيل الدخول باستخدام الحساب نفسه الذي سجّلته في وحدة التحكّم.
- انتقِل إلى مساعد Google > الإعدادات > الإدارة الآلية للمنزل (ضمن "مساعد Google").
- انقر على رمز البحث في أعلى يسار الصفحة.
- ابحث عن تطبيقك التجريبي باستخدام البادئة [test] للعثور على تطبيقك التجريبي المحدّد.
- اختَر هذا العنصر. بعد ذلك، سيُجري "مساعد Google" عملية مصادقة مع خدمتك ويرسل طلبًا من "
SYNC
" يطلب من خدمتك تقديم قائمة بالأجهزة للمستخدم.
يُرجى فتح تطبيق Google Home والتحقّق من إمكانية عرض الغسّالة.
5. التعامل مع الأوامر وطلبات البحث
الآن وبعد أن أبلغت Google عن جهاز الغسّالة في خدمة السحابة الإلكترونية، عليك إضافة إمكانية طلب حالة الجهاز وإرسال الأوامر.
التعامل مع الغرض من طلب البحث QUERY
تتضمّن هدف QUERY
مجموعة من الأجهزة. بالنسبة إلى كل جهاز، يجب الاستجابة بحالته الحالية.
في functions/index.js
، عدِّل معالج QUERY
لمعالجة قائمة الأجهزة المستهدفة المضمَّنة في طلب الغرض.
index.js
app.onQuery(async (body) => {
const {requestId} = body;
const payload = {
devices: {},
};
const queryPromises = [];
const intent = body.inputs[0];
for (const device of intent.payload.devices) {
const deviceId = device.id;
queryPromises.push(queryDevice(deviceId)
.then((data) => {
// Add response to device payload
payload.devices[deviceId] = data;
}
));
}
// Wait for all promises to resolve
await Promise.all(queryPromises);
return {
requestId: requestId,
payload: payload,
};
});
لكل جهاز يتضمن الطلب، يتم إرجاع الحالة الحالية المخزنة في قاعدة بيانات الوقت الفعلي. يُرجى تعديل الدالتَين queryFirebase
وqueryDevice
لعرض بيانات حالة الغسّالة.
index.js
const queryFirebase = async (deviceId) => {
const snapshot = await firebaseRef.child(deviceId).once('value');
const snapshotVal = snapshot.val();
return {
on: snapshotVal.OnOff.on,
isPaused: snapshotVal.StartStop.isPaused,
isRunning: snapshotVal.StartStop.isRunning,
};
};
const queryDevice = async (deviceId) => {
const data = await queryFirebase(deviceId);
return {
on: data.on,
isPaused: data.isPaused,
isRunning: data.isRunning,
currentRunCycle: [{
currentCycle: 'rinse',
nextCycle: 'spin',
lang: 'en',
}],
currentTotalRemainingTime: 1212,
currentCycleRemainingTime: 301,
};
};
التعامل مع النية بالشراء
يتعامل الهدف EXECUTE
مع الأوامر الخاصة بتعديل حالة الجهاز. تعرض الاستجابة حالة كل أمر، على سبيل المثال، SUCCESS
أو ERROR
أو PENDING
، وحالة الجهاز الجديدة.
في functions/index.js
، يمكنك تعديل المعالج EXECUTE
لمعالجة قائمة السمات التي تحتاج إلى تحديثات ومجموعة الأجهزة المستهدفة لكل أمر:
index.js
app.onExecute(async (body) => {
const {requestId} = body;
// Execution results are grouped by status
const result = {
ids: [],
status: 'SUCCESS',
states: {
online: true,
},
};
const executePromises = [];
const intent = body.inputs[0];
for (const command of intent.payload.commands) {
for (const device of command.devices) {
for (const execution of command.execution) {
executePromises.push(
updateDevice(execution, device.id)
.then((data) => {
result.ids.push(device.id);
Object.assign(result.states, data);
})
.catch(() => functions.logger.error('EXECUTE', device.id)));
}
}
}
await Promise.all(executePromises);
return {
requestId: requestId,
payload: {
commands: [result],
},
};
});
يمكنك تعديل القيم في "قاعدة بيانات الوقت الفعلي" التي تتوافق مع السمة المطلوبة لكل أمر وجهاز هدف. يمكنك تعديل الدالة updateDevice
لتعديل مرجع Firebase المناسب وعرض حالة الجهاز المعدَّلة.
index.js
const updateDevice = async (execution, deviceId) => {
const {params, command} = execution;
let state; let ref;
switch (command) {
case 'action.devices.commands.OnOff':
state = {on: params.on};
ref = firebaseRef.child(deviceId).child('OnOff');
break;
case 'action.devices.commands.StartStop':
state = {isRunning: params.start};
ref = firebaseRef.child(deviceId).child('StartStop');
break;
case 'action.devices.commands.PauseUnpause':
state = {isPaused: params.pause};
ref = firebaseRef.child(deviceId).child('StartStop');
break;
}
return ref.update(state)
.then(() => state);
};
6. اختبار الإجراء الخاص بك
بعد تنفيذ الأغراض الثلاثة، يمكنك اختبار ما إذا كان الإجراء يتحكّم في الغسالة.
النشر في Firebase
انشُر التنفيذ المعدَّل للسحابة الإلكترونية باستخدام واجهة سطر الأوامر في Firebase:
firebase deploy --only functions
اختبار الغسّالة
يمكنك الآن معرفة تغيير القيمة عند تجربة أي من الطلبات الصوتية التالية عبر هاتفك:
"Ok Google، أريد تشغيل الغسّالة".
"Ok Google، أريد إيقاف الغسّالة مؤقتًا"
"Ok Google، أريد إيقاف غسّالة ملابسي"
يمكنك أيضًا الاطّلاع على حالة الغسّالة الحالية من خلال طرح الأسئلة.
"Ok Google، هل غسّالتي قيد التشغيل؟"
"Ok Google، هل غسّالتي قيد التشغيل؟"
"Ok Google، ما هي دورة التشغيل الحالية في الغسّالة؟"
يمكنك عرض طلبات البحث والأوامر هذه في السجلّات التي تظهر ضمن الدالة في قسم الدوالّ في وحدة تحكُّم Firebase. يمكنك الاطّلاع على مزيد من المعلومات عن سجلّات Firebase في مقالة كتابة السجلّات وعرضها.
يمكنك أيضًا العثور على هذه الطلبات والأوامر في Google Cloud Console من خلال الانتقال إلى التسجيل > مستكشف السجلات. تعرَّف على المزيد من المعلومات حول تسجيل الدخول إلى Google Cloud في مقالة الوصول إلى سجلات الأحداث باستخدام تسجيل الدخول في السحابة الإلكترونية.
7. إبلاغ Google بالتحديثات
لقد دمجت خدمتك السحابية بالكامل مع أغراض المنزل المزوّد بأجهزة ذكية، ما أتاح للمستخدمين التحكّم في الحالة الحالية لأجهزتهم والاستعلام عنها. ومع ذلك، لا تتوفّر في عملية التنفيذ التي تستخدمها خدمتك لإرسال معلومات الحدث بشكل استباقي إلى "مساعد Google"، مثل التغييرات في توفّر الجهاز أو حالته.
باستخدام طلب المزامنة، يمكنك تشغيل طلب مزامنة جديد عندما يضيف المستخدمون أجهزة أو يزيلونها أو عندما تتغير إمكانات أجهزتهم. باستخدام حالة التقرير، يمكن لخدمة السحابة الإلكترونية إرسال حالة الجهاز بشكل استباقي إلى قاعدة البيانات Home Graph عندما يغيِّر المستخدمون حالة الجهاز فعليًا، مثل تشغيل مفتاح إضاءة، أو يغيِّرون الحالة باستخدام خدمة أخرى.
في هذا القسم، ستضيف رمزًا لاستدعاء هذه الطرق من تطبيق الويب للواجهة الأمامية.
تفعيل HomeGraph API
تتيح HomeGraph API تخزين وإجراء طلبات بحث عن الأجهزة وحالاتها ضمن Home Graph للمستخدم. لاستخدام واجهة برمجة التطبيقات هذه، عليك أولاً فتح وحدة تحكُّم Google Cloud وتفعيل واجهة برمجة التطبيقات Home Graph.
في وحدة تحكُّم Google Cloud، تأكَّد من اختيار المشروع الذي يطابق الإجراءات <project-id>.
بعد ذلك، انقر على تفعيل في شاشة مكتبة واجهة برمجة التطبيقات الخاصة بـ HomeGraph API.
تفعيل حالة التقرير
اكتب في قاعدة بيانات الوقت الفعلي التي تؤدي إلى تشغيل الدالة reportstate
في مشروع البدء. يمكنك تعديل الدالة reportstate
في functions/index.js
لالتقاط البيانات المكتوبة في قاعدة البيانات ونشرها في "الرسم البياني الرئيسي" من خلال "حالة التقرير".
index.js
exports.reportstate = functions.database.ref('{deviceId}').onWrite(
async (change, context) => {
functions.logger.info('Firebase write event triggered Report State');
const snapshot = change.after.val();
const requestBody = {
requestId: 'ff36a3cc', /* Any unique ID */
agentUserId: USER_ID,
payload: {
devices: {
states: {
/* Report the current state of our washer */
[context.params.deviceId]: {
on: snapshot.OnOff.on,
isPaused: snapshot.StartStop.isPaused,
isRunning: snapshot.StartStop.isRunning,
},
},
},
},
};
const res = await homegraph.devices.reportStateAndNotification({
requestBody,
});
functions.logger.info('Report state response:', res.status, res.data);
});
تفعيل "طلب المزامنة"
تؤدي إعادة تحميل الرمز في واجهة مستخدم الويب الأمامية إلى تشغيل دالة requestsync
في مشروع البداية. يمكنك تنفيذ دالة requestsync
في functions/index.js
لطلب بيانات HomeGraph API.
index.js
exports.requestsync = functions.https.onRequest(async (request, response) => {
response.set('Access-Control-Allow-Origin', '*');
functions.logger.info(`Request SYNC for user ${USER_ID}`);
try {
const res = await homegraph.devices.requestSync({
requestBody: {
agentUserId: USER_ID,
},
});
functions.logger.info('Request sync response:', res.status, res.data);
response.json(res.data);
} catch (err) {
functions.logger.error(err);
response.status(500).send(`Error requesting sync: ${err}`);
}
});
النشر في Firebase
انشر الرمز المعدَّل باستخدام واجهة سطر الأوامر في Firebase:
firebase deploy --only functions
التحقق من نجاح العملية
انقر على زر إعادة التحميل في واجهة مستخدم الويب وتحقّق من ظهور طلب المزامنة في سجلّ وحدة تحكّم Firebase.
بعد ذلك، اضبط سمات جهاز الغسالة في واجهة مستخدم الويب الأمامية وانقر على تحديث. تحقَّق من أنه يمكنك الاطّلاع على تغيير الحالة الذي تم إبلاغ Google به في سجلّات "وحدة تحكُّم Firebase".
8. تهانينا
تهانينا! تم بنجاح دمج "مساعد Google" مع خدمة السحابة الإلكترونية للجهاز باستخدام إجراءات المنزل المزوّد بأجهزة ذكية.
مزيد من المعلومات
في ما يلي بعض الأفكار التي يمكنك تنفيذها للتعمق أكثر:
- أضِف modes ومفاتيح التبديل إلى جهازك.
- أضِف المزيد من السمات المتوافقة إلى جهازك.
- تعرَّف على التنفيذ المحلي للمنزل المزوّد بأجهزة ذكية.
- يمكنك الاطّلاع على نموذج GitHub لاستكشاف المزيد.
يمكنك أيضًا الاطّلاع على المزيد من المعلومات حول اختبار الإجراء الخاص بك وإرساله للمراجعة، بما في ذلك عملية الاعتماد لنشر الإجراء الخاص بك للمستخدمين.