ربط الأجهزة المنزلية الذكية بخدمة "مساعد 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 Play Console.
  2. انقر على مشروع جديد، وأدخِل اسمًا للمشروع، ثم انقر على إنشاء مشروع.

3d6b68ca79afd54c.png

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

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

2fa4988f44f8914b.png

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

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

  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

عليك الانتقال إلى المجلد 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) لعرض تطبيق الويب. ستظهر لك الواجهة التالية:

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 وتفعيل واجهة برمجة التطبيقات Home Graph.

في وحدة تحكُّم 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.

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

8. تهانينا

674c4f4392e98c1.png

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

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

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

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