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

1. قبل البدء

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

79266e5f45e6ae20.gif

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

d009cef0f903d284.jpeg

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

ما ستُنشئه

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

ما ستتعرّف عليه

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

المتطلبات

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

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

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

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

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

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

إنشاء مشروع دمج من السحابة الإلكترونية إلى السحابة الإلكترونية

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

اسم المشروع

اختيار الدمج من السحابة الإلكترونية إلى السحابة الإلكترونية

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

إضافة عملية دمج من السحابة الإلكترونية إلى السحابة الإلكترونية

تثبيت Firebase CLI

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

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

npm install -g firebase-tools

للتحقّق من تثبيت واجهة برمجة التطبيقات بشكل صحيح، يمكنك تنفيذ ما يلي:

firebase --version

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

firebase login

3- تشغيل التطبيق النموذجي

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

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

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

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

git clone https://github.com/google-home/smarthome-washer.git

لمحة عن المشروع

يحتوي المشروع الأوّلي على الأدلة الفرعية التالية:

  • public: واجهة مستخدم أمامية للتحكّم بسهولة في حالة الغسالة الذكية ومراقبتها
  • functions: خدمة سحابة إلكترونية مُنفَّذة بالكامل تدير الغسالة الذكية باستخدام وظائف السحابة الإلكترونية لبرنامج Firebase و"قاعدة بيانات Firebase الآنية الاستجابة"

إنشاء مشروع على Firebase

  1. انتقِل إلى Firebase.
  2. انقر على إنشاء مشروع وأدخِل اسم مشروعك.
  3. ضَع علامة في مربّع الاختيار الخاص بالاتفاقية وانقر على متابعة. إذا لم يكن هناك مربّع اختيار للاتفاقية، يمكنك تخطّي هذه الخطوة.
    إنشاء مشروع Firebase
  4. بعد إنشاء مشروعك على Firebase، ابحث عن رقم تعريف المشروع. انتقِل إلى نظرة عامة على المشروع وانقر على رمز الإعدادات > إعدادات المشروع.
    فتح إعدادات المشروع
  5. يظهر مشروعك ضمن علامة التبويب عام.
    الإعدادات العامة للمشروع

الربط بمنصّة Firebase

انتقِل إلى الدليل washer-start، ثمّ أعدّ واجهة Firebase CLI مع مشروع الدمج:

cd washer-start
firebase use <firebase-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

سيؤدي ذلك إلى بدء واجهات برمجة التطبيقات والميزات اللازمة لمشروعك.

ابدأ قاعدة بيانات Realtime Database عندما يُطلب منك ذلك. يمكنك استخدام الموقع الجغرافي التلقائي لمثيل قاعدة البيانات.

? 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

عند ضبط Functions، يجب استخدام الملفات التلقائية والتأكّد من عدم استبدال الملفَين الحاليَين 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

إذا كنت بصدد إعادة بدء مشروعك، اختَر لا عندما يُطلب منك تحديد ما إذا كنت تريد بدء أو استبدال functions/.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
    

في ملف washer-done/firebase.json، أكمِل الرمز البرمجي بما يلي:

{
  "database": {
    "rules": "database.rules.json"
  },
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  },
    "headers": [{
      "source" : "**/*.@(js|html)",
      "headers" : [ {
        "key" : "Cache-Control",
        "value" : "max-age=0"
      } ]
    }],
  "functions": [
    {
      "source": "functions",
      "codebase": "default",
      "ignore": [
        "node_modules",
        ".git",
        "firebase-debug.log",
        "firebase-debug.*.log",
        "*.local"
      ]
    }
  ]
}

النشر على Firebase

بعد تثبيت التبعيات وضبط مشروعك، أصبحت جاهزًا لتشغيل التطبيق للمرّة الأولى.

firebase deploy

في ما يلي نتائج وحدة التحكّم التي من المفترض أن تظهر لك:

...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/<firebase-project-id>/overview
Hosting URL: https://<firebase-project-id>.web.app

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

افتح عنوان URL للاستضافة في المتصفّح (https://.web.app) لعرض تطبيق الويب. ستظهر لك الواجهة التالية:

5845443e94705557.png

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

حان الآن وقت ربط خدمة السحابة الإلكترونية التي تم نشرها بخدمة "مساعد Google" باستخدام Google Home Developer Console.

ضبط مشروعك على Developer Console

في علامة التبويب تطوير، أضِف اسمًا معروضًا للتفاعل. سيظهر هذا الاسم في تطبيق Google Home.

إضافة اسم معروض

ضمن علامة التطبيق التجارية، حمِّل ملف png لرمز التطبيق بحجم 144 × 144 بكسل واسمه .png.

إضافة رمز تطبيق

لتفعيل ميزة ربط الحساب، استخدِم إعدادات ربط الحساب التالية:

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

ABC123

سر العميل

DEF456

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

https://us-central1-
.cloudfunctions.net/fakeauth

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

https://us-central1-
.cloudfunctions.net/faketoken

تعديل عناوين URL لربط الحساب

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

https://us-central1--cloudfunctions.net/smarthome

إضافة عنوان URL للدالة السحابية

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

اختبار عملية الدمج من السحابة الإلكترونية إلى السحابة الإلكترونية

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

4. إنشاء غسالة

بعد ضبط عملية الدمج، يمكنك إضافة الأجهزة وإرسال البيانات. يجب أن تعالج خدمة السحابة الإلكترونية النوايا التالية:

  • يحدث مصطلح SYNC عندما يريد "مساعد Google" معرفة الأجهزة التي ربطها المستخدم. يتم إرسال هذا الرمز إلى خدمتك عندما يربط المستخدم حسابًا. يجب الردّ باستخدام حمولة JSON تتضمّن جميع أجهزة المستخدم وإمكاناتها.
  • يحدث الإجراء QUERY عندما يريد "مساعد Google" معرفة الحالة الحالية لجهاز معيّن. يجب الردّ باستخدام حِزمة بيانات JSON تتضمّن حالة كل جهاز مطلوب.
  • يحدث مصطلح EXECUTE عندما يريد "مساعد Google" التحكّم في جهاز نيابةً عن المستخدم. يجب الردّ باستخدام حِمل JSON يتضمّن حالة التنفيذ لكل جهاز مطلوب.
  • يحدث مصطلح DISCONNECT عندما يُلغي المستخدم ربط حسابه بخدمة "مساعد Google". عليك إيقاف إرسال أحداث أجهزة هذا المستخدم إلى "مساعد Google".

ستُعدِّل الدوالّ التي تم نشرها سابقًا لمعالجة هذه النوايا في الأقسام التالية.

تعديل استجابة المزامنة

افتح functions/index.js الذي يحتوي على الرمز للردّ على طلبات "مساعد Google".

عليك معالجة SYNCintent من خلال عرض البيانات الوصفية للجهاز وإمكاناته. عدِّل ملف 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 لمعالجة قائمة الأجهزة المستهدَفة الواردة في طلب النية.

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,
  };
});

لكل جهاز مُدرَج في الطلب، أعِد الحالة الحالية المخزّنة في قاعدة بيانات Realtime. عدِّل الدالتَين 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

يعالج 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 = params.start
      ? {isRunning: true, isPaused: false}
      : {isRunning: false, isPaused: false};
      ref = firebaseRef.child(deviceId).child('StartStop');
      break;
    case 'action.devices.commands.PauseUnpause':
      const data = await queryDevice(deviceId);
      state = (data.isPaused === false && data.isRunning === false)
        ? {isRunning: false, isPaused: false}
        : {isRunning: !params.pause, 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"، مثل التغييرات في حالة الجهاز أو تواجده.

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

في هذا القسم، ستضيف رمزًا لاستدعاء هذه الطرق من تطبيق الويب في الواجهة الأمامية.

تفعيل HomeGraph API

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

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

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

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

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