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 Developer Console.
- انقر على مشروع جديد، وأدخِل اسمًا للمشروع، ثمّ انقر على إنشاء مشروع.
يُرجى النقر على تطبيق المنزل المزوّد بأجهزة ذكية.
في شاشة "نظرة عامة" في "وحدة تحكّم الإجراءات"، اختَر منزل مزوّد بأجهزة ذكية.
اختَر بطاقة تجربة المنزل المزوّد بأجهزة ذكية وانقر على بدء البناء، وسيتم توجيهك بعد ذلك إلى وحدة تحكّم المشروع.
تثبيت واجهة سطر الأوامر في Firebase
ستتيح لك واجهة سطر أوامر Firebase (CLI) عرض تطبيقات الويب محليًا ونشر تطبيق الويب على استضافة Firebase.
لتثبيت واجهة سطر الأوامر، قم بتشغيل الأمر npm التالي من الوحدة الطرفية:
npm install -g firebase-tools
للتحقّق من أنّه تم تثبيت واجهة سطر الأوامر بشكل صحيح، شغِّل:
firebase --version
يمكنك تفويض واجهة سطر الأوامر في Firebase باستخدام حسابك على Google من خلال تشغيل:
firebase login
3- تشغيل تطبيق المبتدئين
الآن وبعد إعداد بيئة التطوير، يمكنك نشر المشروع المبدئي للتحقق من ضبط كل شيء بشكل صحيح.
الحصول على رمز المصدر
انقر على الرابط التالي لتنزيل نموذج هذا الدرس التطبيقي حول الترميز على جهاز التطوير الذي تستخدمه:
...أو يمكنك استنساخ مستودع جيت هب من سطر الأوامر:
git clone https://github.com/google-home/smarthome-washer.git
لمحة عن المشروع
يحتوي المشروع الأوّلي على الأدلة الفرعية التالية:
public:
واجهة مستخدم أمامية للتحكّم بسهولة في حالة الغسّالة الذكية ومراقبتهاfunctions:
هي خدمة سحابية يتم تنفيذها بالكامل وتدير الغسّالة الذكية باستخدام وظائف Cloud لمنصة 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
نظرًا لأنك تستخدم رمز مشروع المبتدئين، يُرجى اختيار الملف التلقائي لقواعد الأمان، والتأكّد من عدم استبدال ملف قواعد قاعدة البيانات الحالي.
? 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
من الدليل app-done
إلى الدليل app-start
، بدلاً من الملف في app-start
.
في الدليل app-start
:
cp -vp ../app-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".
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 وتفعيل HomeGraph API.
في وحدة تحكُّم 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.
بعد ذلك، اضبط سمات جهاز الغسّالة في واجهة مستخدم الويب الأمامية وانقر على Update (تحديث). تأكَّد من أنّه يمكنك الاطّلاع على تغيير الحالة الذي تم إبلاغ Google به في سجلّات "وحدة تحكُّم Firebase".
8. تهانينا
تهانينا تمّ دمج "مساعد Google" مع خدمة السحابة الإلكترونية للجهاز من خلال إجراءات المنزل المزوّد بأجهزة ذكية.
مزيد من المعلومات
في ما يلي بعض الأفكار التي يمكنك تنفيذها للتعمق أكثر:
- أضِف modes ومفاتيح التبديل إلى جهازك.
- إضافة المزيد من السمات المتوافقة إلى جهازك
- يمكنك استكشاف التنفيذ المحلي للمنزل المزوّد بأجهزة ذكية.
- يمكنك الاطّلاع على نموذج GitHub لاستكشاف المزيد.
يمكنك أيضًا الاطّلاع على المزيد من المعلومات حول اختبار الإجراء الخاص بك وإرساله للمراجعة، بما في ذلك عملية الاعتماد لنشر الإجراء الخاص بك للمستخدمين.