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

1. قبل البدء

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

79266e5f45e6ae20.gif

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

d009cef0f903d284.jpeg

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

ما الذي ستقوم ببنائه

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

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

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

المتطلبات

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

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

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

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

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

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

إنشاء مشروع على "المهام مع مساعد Google"

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

3d6b68ca79afd54c.png

اختيار تطبيق Smart Home

في شاشة "نظرة عامة" ضمن "وحدة التحكّم في الإجراءات"، اختَر الصفحة الرئيسية الذكية.

2fa4988f44f8914b.png

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

تثبيت واجهة سطر الأوامر في Firebase

ستتيح لك واجهة سطر أوامر Firebase عرض تطبيقات الويب محليًا ونشر تطبيق الويب في استضافة Firebase.

لتثبيت واجهة سطر الأوامر، شغِّل أمر npm التالي من الوحدة الطرفية:

npm install -g firebase-tools

للتحقّق من تثبيت واجهة سطر الأوامر بشكل صحيح، شغِّل:

firebase --version

يمكنك تفويض واجهة سطر الأوامر في Firebase باستخدام حسابك على Google من خلال تنفيذ ما يلي:

firebase login

3- تشغيل تطبيق إجراء التفعيل

الآن بعد إعداد بيئة التطوير، يمكنك نشر مشروع البداية للتأكّد من ضبط كل شيء بشكل صحيح.

الحصول على رمز المصدر

انقر على الرابط التالي لتنزيل نموذج لهذا الدرس التطبيقي حول الترميز على جهاز التطوير:

...أو يمكنك استنساخ مستودع GitHub من سطر الأوامر:

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

اختَر ميزات واجهة سطر الأوامر وقاعدة البيانات في الوقت الفعلي والوظائف وميزة الاستضافة التي تتضمن "استضافة 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

يؤدي هذا الأمر إلى نشر تطبيق ويب إلى جانب العديد من وظائف السحابة الإلكترونية لبرنامج 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 intent من خلال عرض البيانات الوصفية للجهاز وإمكاناته. يمكنك تعديل ملف 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 intent مجموعة من الأجهزة. بالنسبة إلى كل جهاز، يجب إرسال حالته الحالية.

في functions/index.js، يمكنك تعديل معالج QUERY لمعالجة قائمة الأجهزة المستهدفة المضمّنة في طلب intent.

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 intent الأوامر لتعديل حالة الجهاز. تعرض الاستجابة حالة كل طلب، مثل 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 إمكانية تخزين الأجهزة وحالاتها وإجراء طلبات بحث عنها ضمن "الرسم البياني المنزلي" الخاص بالمستخدم. لاستخدام واجهة برمجة التطبيقات هذه، يجب أولاً فتح وحدة التحكّم في Google Cloud وتفعيل HomeGraph API.

في وحدة تحكُّم Google Cloud، احرص على اختيار المشروع الذي يتطابق مع "الإجراءات" <project-id>.، ثم انقر على تفعيل في شاشة مكتبة واجهة برمجة التطبيقات الخاصة بواجهة برمجة التطبيقات HomeGraph.

ee198858a6eac112.png

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

يؤدي الكتابة إلى قاعدة بيانات الوقت الفعلي إلى تشغيل الدالة reportstate في مشروع البداية. يمكنك تعديل الدالة reportstate في functions/index.js لتسجيل البيانات المكتوبة في قاعدة البيانات ونشرها على Home Graph من خلال "حالة التقرير".

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

انشر الرمز المعدَّل باستخدام واجهة سطر الأوامر (CLI) في Firebase:

firebase deploy --only functions

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

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

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

8. تهانينا

674c4f4392e98c1.png

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

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

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

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