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

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

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

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 במסוף הפיתוח, בוחרים באפשרות 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

  1. עוברים אל Firebase.
  2. לוחצים על Create a project ומזינים את שם הפרויקט.
  3. מסמנים את התיבה של ההסכם ולוחצים על המשך. אם אין תיבת סימון של הסכמה, אפשר לדלג על השלב הזה.
    יצירת פרויקט Firebase
  4. אחרי שיוצרים את פרויקט Firebase, מחפשים את מזהה הפרויקט. עוברים אל סקירה כללית של הפרויקט ולוחצים על סמל ההגדרות > הגדרות הפרויקט.
    פתיחת הגדרות הפרויקט
  5. הפרויקט מופיע בכרטיסייה General.
    הגדרות כלליות של הפרויקט

התחברות ל-Firebase

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

cd washer-start
firebase use <firebase-project-id>

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

איך מפעילים פרויקט Firebase.

firebase init

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

? 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

הפעולה הזו תאתחלל את ממשקי ה-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

לבסוף, מגדירים את הגדרות האירוח כך שישתמשו בספרייה public בקוד הפרויקט, ומשתמשים בקובץ index.html הקיים. כשתתבקשו להשתמש ב-ESLint, בוחרים באפשרות No.

? 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

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

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

5845443e94705557.png

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

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

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

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

הוספת שם מוצג

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

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

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

Client-ID

ABC123

סוד לקוח

DEF456

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

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

כתובת URL לטוקן

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

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

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

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

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

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

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

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

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

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

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

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

עדכון תגובת ה-SYNC

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

כדי לטפל בכוונת 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

פורסים את העדכון של Cloud Fulfillment באמצעות ה-CLI של Firebase:

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

כוונת 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,
  };
});

עבור כל מכשיר שמופיע בבקשה, החזרת המצב הנוכחי שמאוחסן ב-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,
  };
};

טיפול בכוונה מסוג EXECUTE

הכוונה 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

פורסים את העדכון של Cloud Fulfillment באמצעות ה-CLI של Firebase:

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, what cycle is my washer on?‎"

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

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

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

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

בעזרת בקשת סנכרון, אפשר להפעיל בקשת סנכרון חדשה כשמשתמשים מוסיפים או מסירים מכשירים, או כשהיכולות של המכשירים שלהם משתנות. בעזרת דיווח על מצב, שירות הענן יכול לשלוח באופן יזום את מצב המכשיר ל-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 בפרויקט ההתחלתי. מעדכנים את הפונקציה 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

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

firebase deploy --only functions

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

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

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

8. מזל טוב

674c4f4392e98c1.png

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

מידע נוסף

ריכזנו כאן כמה רעיונות שתוכלו ליישם כדי להעמיק את הניתוח:

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