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

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

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

79266e5f45e6ae20.gif

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

d009cef0f903d284.jpeg

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

מה תפַתחו

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

מה תלמדו

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

למה תזדקק?

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

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

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

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

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

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

יצירת פרויקט פעולות

  1. עוברים אל Actions on Google Developer Console.
  2. לוחצים על פרויקט חדש, נותנים שם לפרויקט ולוחצים על יצירת פרויקט.

3d6b68ca79afd54c.png

בחירת אפליקציית הבית החכם

במסך הסקירה הכללית ב-Actions Console, בוחרים באפשרות Smart Home (בית חכם).

2fa4988f44f8914b.png

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

התקנת ה-CLI של Firebase

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

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

npm install -g firebase-tools

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

firebase --version

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

firebase login

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

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

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

לוחצים על הקישור הבא כדי להוריד את הדוגמה של Codelab זו למכונת הפיתוח שלך:

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

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

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

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

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

התחברות ל-Firebase

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

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

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

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

? 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. באמצעות ממשק GUI, נכנסים לתיקייה ../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

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

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

5845443e94705557.png

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

זה הזמן לחבר את שירות הענן שפרסתם ל-Google Assistant באמצעות Actions Console.

הגדרת פרויקט במסוף Actions

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

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

9d7b223427f587ca.png

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

774d0c40c351c7da.png

a8c4673eb11d76ee.png

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

Client-ID

ABC123

סוד לקוח

DEF456

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

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

כתובת ה-URL של האסימון

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

9730d20b90bcc038.png

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

ee0547f05b5efd98.png

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

d0495810dbadf059.png

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

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

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

  • הכוונה מסוג SYNC מתרחשת כש-Assistant רוצה לדעת לאילו מכשירים המשתמש חיבר. הכתובת הזאת נשלחת לשירות שלכם כשמשתמש מקשר חשבון. צריך להגיב עם מטען ייעודי (payload) של JSON של כל המכשירים של המשתמש והיכולות שלהם.
  • הכוונה מסוג QUERY מתרחשת כש-Assistant רוצה לדעת את המצב או הסטטוס הנוכחיים של המכשיר. צריך להשיב עם מטען ייעודי (payload) של JSON עם המצב של כל מכשיר מבוקש.
  • Intent מסוג EXECUTE קורה כש-Assistant רוצה לשלוט במכשיר בשמו של המשתמש. צריך להשיב באמצעות מטען ייעודי (payload) של JSON עם סטטוס הביצוע של כל מכשיר מבוקש.
  • Intent מסוג 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

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

התייחסות ל-Intent של QUERY

אובייקט Intent QUERY כולל קבוצה של מכשירים. המצב הנוכחי של כל מכשיר צריך להופיע.

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

התייחסות לכוונת ההסרה

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

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

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

firebase deploy --only functions

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

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

"Ok Google, turn on my worker".

"Ok Google, Pause my ללחוץ על 'מכונת הכביסה'.

"Ok Google, stop my worker"

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

"Ok Google, is my הייתה מכונת כביסה?"

"Ok Google, האם מכונת הכביסה פועלת?"

"Ok Google, whatcycle is my הייתה מכונת כביסה?"

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

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

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

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

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

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

הפעלת Home Graph API

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

במסוף Google Cloud, בוחרים את הפרויקט שתואם לפעולות <project-id>.. לאחר מכן, במסך של ספריית ה-API של Home Graph API, לוחצים על Enable (הפעלה).

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 כדי לשלוח קריאה ל-Home Graph 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

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

מידע נוסף

הנה כמה רעיונות שאפשר ליישם כדי להתעמק בנושא:

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