ربط الأجهزة المنزلية الذكية بخدمة "مساعد Google"

1- قبل البدء

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

79266e5f45e6ae20.gif

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

d009cef0f903d284.jpeg

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

ما ستقوم بإنشائه

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

المعلومات التي ستطّلع عليها

  • كيفية نشر خدمة سحابية للمنزل المزوّد بأجهزة ذكية
  • كيفية ربط خدمتك بخدمة "مساعد Google"
  • كيفية نشر تغييرات حالة الجهاز على Google

المتطلبات

2- الخطوات الأولى

تفعيل عناصر التحكم في النشاط

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

افتح صفحة عناصر التحكّم في النشاط في حساب Google الذي تريد استخدامه مع "مساعد Google".

تأكّد من أنّ مفاتيح التبديل التالية مفعَّلة:

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

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

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

3d6b68ca79afd54c.png

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

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

2fa4988f44f8914b.png

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

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

  1. باستخدام واجهة المستخدم الرسومية، انتقِل إلى مجلد ../functions ضمن المشروع، واختَر الملف المخفي .eslintrc.js واحذفه. لا تخطئ في استخدام الاسم مثل .eslintrc.json.
  2. استخدام سطر الأوامر:
    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) لعرض تطبيق الويب. ستظهر لك الواجهة التالية:

5845443e94705557.png

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

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

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

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

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

9d7b223427f587ca.png

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

774d0c40c351c7da.png

a8c4673eb11d76ee.png

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

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

ABC123

سر العميل

DEF456

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

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

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

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

9730d20b90bcc038.png

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

ee0547f05b5efd98.png

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

d0495810dbadf059.png

يمكنك الآن بدء تنفيذ الردود التلقائية على الويب اللازمة لربط حالة الجهاز بخدمة "مساعد 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 Home الذين سجّلوا الدخول إلى الحساب نفسه.

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

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

ae252220753726f6.png

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.

ee198858a6eac112.png

تفعيل حالة التقرير

في حال الكتابة في قاعدة بيانات الوقت الفعلي، يتم تشغيل الدالة 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

التحقق من نجاح العملية

انقر على زر إعادة التحميل ae8d3b25777a5e30.png في واجهة مستخدم الويب وتأكّد من ظهور طلب المزامنة في سجلّ وحدة تحكّم Firebase.

بعد ذلك، اضبط سمات جهاز الغسّالة في واجهة مستخدم الويب الأمامية وانقر على Update (تحديث). تأكَّد من أنّه يمكنك الاطّلاع على تغيير الحالة الذي تم إبلاغ Google به في سجلّات "وحدة تحكُّم Firebase".

8. تهانينا

674c4f4392e98c1.png

تهانينا تمّ دمج "مساعد Google" مع خدمة السحابة الإلكترونية للجهاز من خلال إجراءات المنزل المزوّد بأجهزة ذكية.

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

في ما يلي بعض الأفكار التي يمكنك تنفيذها للتعمق أكثر:

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