1. לפני שמתחילים
מפתחים של האינטרנט של הדברים (IoT) יכולים ליצור שילובים של ענן לענן שמאפשרים למשתמשים לשלוט במכשירים שלהם באמצעות אמצעי בקרה מגע באפליקציית Google Home ופקודות קוליות באמצעות Assistant.
שילובים של ענן לענן מסתמכים על Home Graph כדי לספק נתונים לפי הקשר על הבית ועל המכשירים שלו, וליצור מפה לוגית של הבית. ההקשר הזה מאפשר ל-Assistant להבין בצורה טבעית יותר את הבקשות של המשתמש בהתאם למיקום שלו בבית. לדוגמה, Home Graph יכול לאחסן את הקונספט של סלון שמכיל כמה סוגים של מכשירים מיצרנים שונים, כמו תרמוסטט, מנורה, מאוורר ושאיבה.
דרישות מוקדמות
- המדריך למפתחים בנושא יצירת שילוב בין עננים
מה תפַתחו
בקודלאב הזה תפרסמו שירות בענן שמנהל מכונת כביסה וירטואלית חכמה, ולאחר מכן תיצרו שילוב של ענן לענן ותחברו אותו ל-Assistant.
מה תלמדו
- איך פורסים שירות ענן לבית חכם
- איך מחברים את השירות ל-Assistant
- איך מפרסמים ב-Google שינויים במצב המכשיר
מה נדרש
- דפדפן אינטרנט, כמו Google Chrome
- מכשיר iOS או Android שבו מותקנת אפליקציית Google Home
- Node.js מגרסה 10.16 ואילך
- חשבון לחיוב ב-Google Cloud
2. תחילת העבודה
הפעלת בקרת הפעילות בחשבון
כדי להשתמש ב-Google Assistant, אתם צריכים לשתף עם Google נתוני פעילות מסוימים. הנתונים האלה נחוצים ל-Google Assistant כדי לפעול כראוי, אבל הדרישה לשיתוף נתונים לא ספציפית ל-SDK. כדי לשתף את הנתונים האלה, צריך ליצור חשבון Google, אם עדיין אין לכם חשבון כזה. אפשר להשתמש בכל חשבון Google, לא חייב להיות זה של חשבון הפיתוח.
פותחים את דף בקרת הפעילות בחשבון של חשבון Google שבו רוצים להשתמש עם Assistant.
מוודאים שהמתגים הבאים מופעלים:
- פעילות באינטרנט ובאפליקציות – בנוסף, חשוב לסמן את התיבה הכללת ההיסטוריה והפעילות של Chrome מאתרים, מאפליקציות וממכשירים שמשתמשים בשירותי Google.
- פרטי המכשיר
- תיעוד קול ואודיו
יצירת פרויקט של שילוב בין עננים
- נכנסים ל-Developer Console.
- לוחצים על 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
- עוברים אל Firebase.
- לוחצים על Create a project ומזינים את שם הפרויקט.
- מסמנים את התיבה של ההסכם ולוחצים על המשך. אם אין תיבת סימון של הסכמה, אפשר לדלג על השלב הזה.
- אחרי שיוצרים את פרויקט Firebase, מחפשים את מזהה הפרויקט. עוברים אל סקירה כללית של הפרויקט ולוחצים על סמל ההגדרות > הגדרות הפרויקט.
- הפרויקט מופיע בכרטיסייה 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 הופעל בטעות, יש שתי שיטות להשבתה שלו:
- באמצעות ממשק המשתמש, עוברים לתיקייה
../functions
בפרויקט, בוחרים את הקובץ המוסתר.eslintrc.js
ומוחקים אותו. חשוב לא להתבלבל עם השם הדומה.eslintrc.json
. - באמצעות שורת הפקודה:
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://
) כדי להציג את אפליקציית האינטרנט. יוצג הממשק הבא:
ממשק המשתמש הזה באינטרנט מייצג פלטפורמה של צד שלישי שדרכה אפשר להציג או לשנות את מצבי המכשיר. כדי להתחיל לאכלס את מסד הנתונים בפרטי המכשיר, לוחצים על עדכון. לא יופיעו שינויים בדף, אבל המצב הנוכחי של מכונת הכביסה יישמר במסד הנתונים.
עכשיו הגיע הזמן לחבר את שירות הענן שפרסמתם ל-Google Assistant באמצעות מסוף הפיתוח של Google Home.
הגדרת הפרויקט ב-Developer Console
בכרטיסייה Develop, מוסיפים Display Name (שם לתצוגה) לאינטראקציה. השם הזה יופיע באפליקציית Google Home.
בקטע מיתוג האפליקציה, מעלים קובץ png
של סמל האפליקציה בגודל 144 על 144 פיקסלים ובשם
.
כדי להפעיל את קישור החשבון, משתמשים בהגדרות הבאות של קישור החשבון:
Client-ID |
|
סוד לקוח |
|
כתובת אתר להרשאה |
|
כתובת URL לטוקן |
|
בקטע Cloud fulfillment URL, מזינים את כתובת ה-URL של פונקציית הענן שמספקת את הביצוע של כוונת השימוש בבית החכם.
https://us-central1-
לוחצים על 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 Assistant
כדי לבדוק את השילוב בין עננים, צריך לקשר את הפרויקט לחשבון Google. כך תוכלו לבדוק את התכונה דרך הממשקים של Google Assistant ואפליקציית Google Home, שמוגדרים להתחברות לאותו חשבון.
- בטלפון, פותחים את ההגדרות של Google Assistant. חשוב לזכור שצריך להתחבר לאותו חשבון שבו אתם מחוברים במסוף.
- עוברים אל Google Assistant > הגדרות > בקרת הבית (בקטע Assistant).
- לוחצים על סמל החיפוש בפינה השמאלית העליונה.
- מחפשים את אפליקציית הבדיקה באמצעות הקידומת [test] כדי למצוא את אפליקציית הבדיקה הספציפית.
- בוחרים את הפריט הזה. לאחר מכן, Google Assistant תאמת את השירות ותשלח בקשה מסוג
SYNC
, שבה היא תבקש מהשירות לספק רשימה של מכשירים למשתמש.
פותחים את אפליקציית Google Home ומוודאים שאפשר לראות את מכונת הכביסה.
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.
הפעלת 'סטטוס הדוח'
כתיבת ב-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 (רענון) בממשק המשתמש באינטרנט ומוודאים שמוצגת בקשת סנכרון ביומן של מסוף Firebase.
לאחר מכן, משנים את המאפיינים של מכשיר הכביסה בממשק המשתמש האינטרנטי של הקצה הקדמי ולוחצים על עדכון. מוודאים שאפשר לראות את שינוי המצב שדווח ל-Google ביומני מסוף Firebase.
8. מזל טוב
מעולה! השלמתם את השילוב של Assistant עם שירות ענן של מכשיר באמצעות שילובים מענן לענן.
מידע נוסף
ריכזנו כאן כמה רעיונות שתוכלו ליישם כדי להעמיק את הניתוח:
- מוסיפים למכשיר מצבים ומתגים.
- מוסיפים למכשיר עוד מאפיינים נתמכים.
- ביצוע מקומי לבית חכם
- בדוגמה ב-GitHub תוכלו לקרוא מידע נוסף.
אפשר גם לקרוא מידע נוסף על בדיקה ושליחה של שילוב לבדיקה, כולל תהליך ההסמכה לפרסום השילוב למשתמשים.