חיבור מכשירים של בית חכם אל Google Assistant

1. לפני שמתחילים

מפתחים של האינטרנט של הדברים (IoT) יכולים ליצור שילובים בין עננים שיאפשרו למשתמשים לשלוט במכשירים שלהם באמצעות פקודות קוליות ל-Assistant ופקדי מגע באפליקציית Google Home.

79266e5f45e6ae20.gif

שילובים בין ענן לענן מסתמכים על Home Graph כדי לספק נתונים הקשריים על הבית והמכשירים שבו, וכך ליצור מפה לוגית של הבית. ההקשר הזה מאפשר ל-Assistant להבין בצורה טבעית יותר את הבקשות של המשתמשים ביחס למיקום שלהם בבית. לדוגמה, ב-Home Graph אפשר לאחסן את הרעיון של סלון שמכיל כמה סוגים של מכשירים מיצרנים שונים, כמו תרמוסטט, מנורה, מאוורר ושואב אבק.

d009cef0f903d284.jpeg

דרישות מוקדמות

מה תפַתחו

בשיעור הזה תלמדו איך לפרסם שירות ענן שמנהל מכונת כביסה חכמה וירטואלית, ואז ליצור אינטגרציה בין ענן לענן ולחבר אותה ל-Assistant.

מה תלמדו

  • איך פורסים שירות ענן לבית חכם
  • איך לקשר את השירות ל-Assistant
  • איך מפרסמים ב-Google שינויים במצב המכשיר

מה צריך בשביל להצטרף

2. תחילת העבודה

הפעלת בקרת הפעילות בחשבון

כדי להשתמש ב-Google Assistant, אתם צריכים לשתף עם Google נתונים מסוימים של פעילות. ‫Google Assistant זקוקה לנתונים האלה כדי לפעול כראוי, אבל הדרישה לשיתוף נתונים לא ספציפית ל-SDK. כדי לשתף את הנתונים האלה, צריך ליצור חשבון Google אם עדיין אין לכם חשבון. אפשר להשתמש בכל חשבון Google – לא צריך להשתמש בחשבון הפיתוח.

פותחים את דף בקרת הפעילות בחשבון Google שבו רוצים להשתמש עם Assistant.

מוודאים שהמתגים הבאים מופעלים:

  • פעילות באינטרנט ובאפליקציות – בנוסף, חשוב לסמן את תיבת הסימון שמירה של ההיסטוריה והפעילות של Chrome מאתרים, מאפליקציות וממכשירים המשתמשים בשירותי Google.
  • פרטי המכשיר
  • תיעוד קול ואודיו

יצירת פרויקט של שילוב בין עננים

  1. נכנסים אל Developer Console.
  2. לוחצים על Create Project, מזינים שם לפרויקט ולוחצים על Create Project.

שם הפרויקט

בחירת שילוב בין ענן לענן

בדף Project Home ב-Developer Console, בוחרים באפשרות Add cloud-to-cloud integration בקטע Cloud-to-cloud.

הוספת שילוב מענן לענן

התקנת Firebase CLI

ממשק שורת הפקודה (CLI) של Firebase מאפשר להפעיל את אפליקציות האינטרנט באופן מקומי ולפרוס אותן באירוח ב-Firebase.

כדי להתקין את ה-CLI, מריצים את פקודת ה-npm הבאה מהטרמינל:

npm install -g firebase-tools

כדי לוודא שה-CLI הותקן בצורה נכונה, מריצים את הפקודה:

firebase --version

כדי לתת הרשאה ל-Firebase CLI באמצעות חשבון Google, מריצים את הפקודה:

firebase login

3. הפעלת האפליקציה למתחילים

אחרי שמגדירים את סביבת הפיתוח, אפשר לפרוס את פרויקט המתחילים כדי לוודא שהכול מוגדר בצורה תקינה.

קבלת קוד המקור

כדי להוריד את הדוגמה ל-codelab הזה למחשב הפיתוח, לוחצים על הקישור הבא:

אפשר גם לשכפל את מאגר GitHub משורת הפקודה:

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

מידע על הפרויקט

פרויקט המתחיל מכיל את ספריות המשנה הבאות:

  • public: ממשק משתמש קל לשימוש שמאפשר לשלוט במכונת הכביסה החכמה ולעקוב אחרי המצב שלה.
  • functions: שירות ענן מיושם במלואו שמנהל את מכונת הכביסה החכמה באמצעות Cloud Functions for Firebase ו-Firebase Realtime Database.

הוספת Firebase לפרויקט ב-Google Home Developer Console

שיטה 1: דרך מסוף Firebase

  1. עוברים אל Firebase.
  2. לוחצים על יצירת פרויקט Firebase.
    יצירת פרויקט Firebase
  3. במסך Create a project (יצירת פרויקט), לוחצים על Add Firebase to Google Cloud project (הוספת Firebase לפרויקט Google Cloud).
    הוספת Firebase לפרויקט ב-Google Cloud
  4. במסך Get started, בוחרים את הפרויקט ב-Google Cloud שיצרתם זה עתה במסוף הפיתוח של Google Home ולוחצים על Continue.
    בחירת פרויקט ב-Google Cloud

שיטה 2: דרך Firebase CLI

firebase projects:addfirebase

בוחרים את הפרויקט ב-Google Home Developer Console שיצרתם כדי להוסיף את Firebase.

כשמוסיפים את Firebase לפרויקט ב-Google Home Developer Console, הוא מופיע במסוף Firebase. מזהה הפרויקט ב-Firebase יהיה זהה למזהה הפרויקט ב-Google Home Developer Console.

הפרויקט ב-Cloud נוסף

התחברות אל Firebase

עוברים אל הספרייה washer-start ומגדירים את Firebase CLI עם פרויקט השילוב:

cd washer-start
firebase use <project-id>

הגדרת פרויקט Firebase

מאתחלים פרויקט Firebase.

firebase init

בוחרים את התכונות של ה-CLI,‏ Realtime Database ו-Functions.

? Which Firebase features do you want to set up for this directory? Press Space to select features, then Enter
 to confirm your choices. (Press <space> to select, <a> to toggle all, <i> to invert selection, and <enter> to
 proceed)
>( ) Data Connect: Set up a Firebase Data Connect service
 ( ) Firestore: Configure security rules and indexes files for Firestore
 ( ) Genkit: Setup a new Genkit project with Firebase
 (*) Functions: Configure a Cloud Functions directory and its files
 ( ) App Hosting: Configure an apphosting.yaml file for App Hosting
 ( ) Hosting: Configure files for Firebase Hosting and (optionally) 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: Configure a security rules file for Realtime Database and (optionally) provision
default instance
 ( ) Data Connect: Set up a Firebase Data Connect service
 ( ) Firestore: Configure security rules and indexes files for Firestore

הפעולה הזו תאתחל את ממשקי ה-API והתכונות הנדרשים לפרויקט.

כשמתבקשים, מאתחלים את 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

אם אתם מאתחלים מחדש את הפרויקט, בוחרים באפשרות Overwrite (החלפה) כשמוצגת השאלה אם אתם רוצים לאתחל או להחליף בסיס קוד.

? 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

אם אתם מאתחלים מחדש את הפרויקט, בוחרים באפשרות No כשנשאלים אם אתם רוצים לאתחל או להחליף את functions/.gitignore.

? File functions/.gitignore already exists. Overwrite?
No
? Do you want to install dependencies with npm now?
Yes

אם הפעלתם את ESLint בטעות, יש שתי דרכים להשבית אותו:

  1. בממשק המשתמש הגרפי, עוברים לתיקייה ../functions מתחת לפרויקט, בוחרים את הקובץ המוסתר .eslintrc.js ומוחקים אותו. אל תתבלבלו בינו לבין .eslintrc.json, ששמו דומה.
  2. באמצעות שורת הפקודה:
    cd functions
    rm .eslintrc.js
    

בקובץ washer-start/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/<project-id>/overview
Hosting URL: https://<project-id>.web.app

הפקודה הזו פורסת אפליקציית אינטרנט, יחד עם כמה Cloud Functions for Firebase.

פותחים את כתובת ה-URL של האירוח בדפדפן (https://<project-id>.web.app) כדי לראות את אפליקציית האינטרנט. יוצג לכם הממשק הבא:

5845443e94705557.png

ממשק המשתמש הזה באינטרנט מייצג פלטפורמה של צד שלישי שמאפשרת לראות או לשנות את מצבי המכשיר. כדי להתחיל לאכלס את מסד הנתונים בפרטי המכשיר, לוחצים על עדכון. לא תראו שינויים בדף, אבל המצב הנוכחי של מכונת הכביסה יישמר במסד הנתונים.

עכשיו צריך לחבר את שירות הענן שפרסתם ל-Google Assistant באמצעות Google Home Developer Console.

הגדרת הפרויקט ב-Developer Console

בכרטיסייה פיתוח, מוסיפים שם לתצוגה לאינטראקציה. השם הזה יופיע באפליקציית Google Home.

הוספת שם מוצג

בקטע מיתוג האפליקציה, מעלים קובץ png של סמל האפליקציה בגודל 144x144 פיקסלים, עם השם .png.

הוספת סמל אפליקציה

כדי להפעיל קישור לחשבון, משתמשים בהגדרות הבאות של קישור לחשבון:

Client-ID

ABC123

סוד לקוח

DEF456

כתובת אתר להרשאה

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

כתובת URL לטוקן

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

עדכון כתובות URL לקישור חשבונות

בקטע כתובת URL של מילוי הזמנות בענן, מזינים את כתובת ה-URL של פונקציית הענן שמספקת מילוי הזמנות לכוונות של בית חכם.

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

הוספת כתובת URL של פונקציית ענן

לוחצים על שמירה כדי לשמור את הגדרות הפרויקט, ואז לוחצים על הבא: בדיקה כדי להפעיל את הבדיקה בפרויקט.

בדיקת השילוב בין ענן לענן

עכשיו אפשר להתחיל להטמיע את ה-webhook שנדרשים כדי לקשר את מצב המכשיר ל-Assistant.

4. יצירת מכונת כביסה

אחרי שמגדירים את השילוב, אפשר להוסיף מכשירים ולשלוח נתונים. שירות הענן צריך לטפל בכוונה הבאה:

  • SYNC כוונה מתרחשת כש-Assistant רוצה לדעת אילו מכשירים מחוברים למשתמש. הפרטים האלה נשלחים לשירות כשמשתמש מקשר חשבון. עליך להגיב עם מטען ייעודי (payload) של JSON שמכיל את כל המכשירים של המשתמש והיכולות שלהם.
  • אינטנט QUERY מתרחש כש-Assistant רוצה לדעת את המצב הנוכחי של מכשיר. עליכם להגיב עם מטען ייעודי (payload) של JSON עם המצב של כל מכשיר שביקשתם.
  • EXECUTEכוונה מתרחשת כש-Assistant רוצה לשלוט במכשיר בשם משתמש. צריך להגיב עם מטען ייעודי (payload) של JSON עם סטטוס הביצוע של כל מכשיר שהתבקש.
  • DISCONNECT כוונת המשתמש מתרחשת כשהמשתמש מבטל את הקישור של החשבון שלו ל-Assistant. צריך להפסיק לשלוח אירועים מהמכשירים של המשתמש הזה אל Assistant.

בקטעים הבאים תעדכנו את הפונקציות שפרסתם קודם כדי לטפל בכוונות האלה.

עדכון תגובת הסנכרון

פותחים את functions/index.js, שמכיל את הקוד לתגובה לבקשות מ-Assistant.

תצטרכו לטפל בכוונה (intent) מסוג 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 CLI:

firebase deploy --only functions

כדי לבדוק את השילוב בין ענן לענן, צריך לקשר את הפרויקט לחשבון Google. כך אפשר לבצע בדיקות באמצעות ממשקי Google Assistant ואפליקציית Google Home שמחוברים לאותו חשבון.

  1. בטלפון, פותחים את ההגדרות של Google Assistant. שימו לב שאתם צריכים להיות מחוברים לאותו חשבון שדרכו נכנסתם למסוף.
  2. עוברים אל Google Assistant > הגדרות > שליטה בבית (בקטע Assistant).
  3. לוחצים על סמל החיפוש בפינה השמאלית העליונה.
  4. מחפשים את אפליקציית הבדיקה באמצעות הקידומת [test] כדי למצוא את אפליקציית הבדיקה הספציפית.
  5. בוחרים את הפריט. לאחר מכן, Google Assistant תבצע אימות מול השירות שלכם ותשלח בקשת SYNC, שבה היא מבקשת מהשירות שלכם לספק רשימה של מכשירים עבור המשתמש.

פותחים את אפליקציית Google Home ומוודאים שמכונת הכביסה מופיעה ברשימת המכשירים.

ae252220753726f6.png

5. טיפול בפקודות ובשאילתות

עכשיו, אחרי ששירות הענן מדווח ל-Google על מכשיר הכביסה בצורה תקינה, צריך להוסיף את האפשרות לבקש את מצב המכשיר ולשלוח פקודות.

טיפול בכוונת QUERY

QUERYIntent כולל קבוצה של מכשירים. עליך לציין את המצב הנוכחי של כל מכשיר.

ב-functions/index.js, עורכים את ה-handler של 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 Database. מעדכנים את הפונקציות 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,
  };
};

טיפול באובייקט Intent מסוג EXECUTE

ה-Intent‏ EXECUTE מטפל בפקודות לעדכון מצב המכשיר. התגובה מחזירה את הסטטוס של כל פקודה – לדוגמה, SUCCESS,‏ ERROR או PENDING – ואת מצב המכשיר החדש.

ב-functions/index.js, עורכים את ה-handler של 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],
    },
  };
});

לכל פקודה ולכל מכשיר יעד, מעדכנים את הערכים ב-Realtime Database שתואמים למאפיין המבוקש. משנים את הפונקציה 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 CLI:

firebase deploy --only functions

בדיקת מכונת הכביסה

עכשיו תוכלו לראות את השינוי בערך כשאתם מנסים להשתמש באחת מהפקודות הקוליות הבאות בטלפון:

‫"Ok Google, turn on my washer" (הפעלת מכונת הכביסה)

"Ok Google, pause my washer"

"Ok Google, stop my washer"

אתם יכולים גם לשאול שאלות כדי לראות את המצב הנוכחי של מכונת הכביסה.

‫"Ok Google, is my washer on?"

"Ok Google, is my washer running?"

‫"Ok Google, באיזה מחזור הכביסה פועלת?"

אפשר לראות את השאילתות והפקודות האלה ביומנים שמופיעים מתחת לפונקציה בקטע Functions במסוף Firebase. מידע נוסף על יומנים של Firebase זמין במאמר כתיבה והצגה של יומנים.

אפשר גם למצוא את השאילתות והפקודות האלה במסוף Google Cloud. כדי לעשות את זה, עוברים אל Logging > Logs Explorer. מידע נוסף על רישום ביומן ב-Google Cloud זמין במאמר גישה ליומני אירועים באמצעות Cloud Logging.

7. דיווח ל-Google על עדכונים

שילבתם באופן מלא את שירות הענן עם כוונות הבית החכם, וכך המשתמשים יכולים לשלוט במכשירים שלהם ולשאול על המצב הנוכחי שלהם. עם זאת, עדיין אין דרך להטמיע את השירות כך שישלח באופן יזום ל-Assistant פרטי אירועים, כמו שינויים בנוכחות או במצב של המכשיר.

באמצעות בקשת סנכרון, אתם יכולים להפעיל בקשת סנכרון חדשה כשמשתמשים מוסיפים או מסירים מכשירים, או כשמשתנים היכולות של המכשיר שלהם. באמצעות Report State, שירות הענן יכול לשלוח באופן יזום את מצב המכשיר ל-Home Graph כשמשתמשים משנים פיזית את מצב המכשיר – למשל, מדליקים מתג אור – או משנים את המצב באמצעות שירות אחר.

בקטע הזה תוסיפו קוד לקריאה לשיטות האלה מאפליקציית האינטרנט של חזית האתר.

הפעלת HomeGraph API

HomeGraph API מאפשר אחסון של מכשירים והמצבים שלהם ב-Home Graph של המשתמש, וגם שליפת נתונים לגביהם. כדי להשתמש ב-API הזה, קודם צריך לפתוח את מסוף Google Cloud ולהפעיל את HomeGraph API.

במסוף Google Cloud, בוחרים את הפרויקט שתואם לשילוב <project-id>. ואז במסך API Library של HomeGraph API, לוחצים על Enable.

ee198858a6eac112.png

הפעלת דיווח על מצב

פעולות כתיבה ל-Realtime Database מפעילות את הפונקציה reportstate בפרויקט tarter. מעדכנים את הפונקציה reportstate ב-functions/index.js כדי לתעד את הנתונים שנכתבו במסד הנתונים ולפרסם אותם ב-Home Graph באמצעות Report State.

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 CLI:

firebase deploy --only functions

מבצעים בדיקות של ההטמעה.

לוחצים על הלחצן רענון ae8d3b25777a5e30.png בממשק המשתמש האינטרנטי ומוודאים שרואים בקשת סנכרון ביומן של מסוף Firebase.

לאחר מכן, משנים את המאפיינים של מכשיר הכביסה בממשק המשתמש של האינטרנט בחלק הקדמי ולוחצים על עדכון. מוודאים שאתם יכולים לראות ביומנים של Firebase Console את השינוי בסטטוס שדווח ל-Google.

8. מזל טוב

674c4f4392e98c1.png

מעולה! הצלחתם לשלב את Assistant עם שירות ענן למכשירים באמצעות שילובים בין עננים.

מידע נוסף

הנה כמה רעיונות להעמקה:

אפשר גם לקרוא מידע נוסף על בדיקה ושליחה של שילוב לבדיקה, כולל תהליך האישור לפרסום השילוב למשתמשים.