ההתראות מאפשרות לשילוב של Cloud-to-cloud להשתמש ב-Google Assistant כדי להודיע למשתמשים על אירועים או שינויים חשובים שקשורים למכשיר. אתם יכולים להטמיע התראות כדי להודיע למשתמשים על אירועים במכשיר בזמן אמת, למשל כשמישהו נמצא בדלת, או כדי לדווח על שינוי במצב המכשיר, כמו כשבריח של מנעול הדלת ננעל או נתקע.
השילוב של Cloud-to-cloud יכול לשלוח למשתמשים את סוגי ההתראות הבאים:
התראות יזומות: התראות למשתמש על אירוע במכשיר smart home בלי שהמשתמש שלח בקשה למכשיר, כמו צלצול בפעמון הדלת.
תגובות המשך: אישור על כך שבקשה לפקודה במכשיר הצליחה או נכשלה, למשל כשנועלים דלת. ההתראות האלה מיועדות לפקודות במכשיר שלוקח זמן להשלים אותן. אפשר להשתמש בתגובות המשך רק כשבקשות לפקודות במכשיר נשלחות מרמקולים חכמים וממסכים חכמים.
Assistant מספק את ההתראות האלה למשתמשים כהודעות ברמקולים חכמים ובמסכים חכמים. ההתראות היזומות מושבתות כברירת מחדל. המשתמשים יכולים להפעיל או להשבית את כל ההתראות היזומות דרך Google Home app (GHA).
אירועים שמפעילים התראות
כשמתרחשים אירועים במכשיר, המילוי שולח בקשת התראה ל-Google. תכונות המכשיר שנתמכות בשילוב של Cloud-to-cloud קובעות אילו סוגים של אירועי התראות זמינים ואילו נתונים אפשר לכלול בהתראות האלה.
התכונות הבאות תומכות בהתראות יזומות:
| תכונה | אירועים |
|---|---|
| ObjectDetection | אובייקטים שזוהו על ידי המכשיר, למשל כשפנים מוכרות זוהו בדלת. לדוגמה: "מיכל ויוסי נמצאים בדלת הכניסה". |
| RunCycle | המכשיר משלים מחזור. לדוגמה: "הושלם מחזור במכונת הכביסה". |
| SensorState | המכשיר מזהה מצב חיישן נתמך. לדוגמה: "גלאי העשן מזהה עשן" |
התכונות הבאות תומכות בתגובות המשך:
| תכונה | אירועים |
|---|---|
| LockUnlock | סטטוס ההשלמה ושינוי המצב אחרי הפעלת הפקודה action.devices.commands.LockUnlock במכשיר. לדוגמה: "הדלת הראשית ננעלה" או "הדלת הראשית תקועה".
|
| NetworkControl | סטטוס ההשלמה ושינוי המצב אחרי הפעלת הפקודה action.devices.commands.TestNetworkSpeed במכשיר. לדוגמה: "בדיקת מהירות הרשת הסתיימה. מהירות ההורדה בנתב של המשרד היא כרגע 80.2Kbps, ומהירות ההעלאה היא 9.3Kbps".
|
| OpenClose | סטטוס ההשלמה ושינוי המצב אחרי הפעלת פקודת המכשיר action.devices.commands.OpenClose. לדוגמה: "הדלת הראשית נפתחה" או "לא ניתן לפתוח את הדלת הראשית".
|
כל סוגי המכשירים תומכים בהתראות על ה-traits הרלוונטיים.
יצירת התראות לשילוב בין שירותי ענן
כדי להוסיף התראות לשילוב של Cloud-to-cloud, צריך לבצע את השלבים הבאים:
- צריך לציין ל-Google אם ההתראות מופעלות באפליקציה לניהול מכשיר משני של smart home. אם המשתמשים מפעילים או משביתים את ההתראות באפליקציה, צריך לשלוח בקשת
SYNCכדי להודיע ל-Google על השינוי במכשיר. - כשמתרחש אירוע רלוונטי במכשיר או שינוי במצב שמפעיל התראה, שולחים בקשה להתראה באמצעות קריאה ל-API של Report State
reportStateAndNotification. אם מצב המכשיר השתנה, אפשר לשלוח גם את המצב וגם את המטען הייעודי (payload) של ההתראה ביחד בקריאה ל-Report State ול-Notification.
בקטעים הבאים מוסבר בהרחבה על השלבים האלה.
מציינים אם ההתראות מופעלות באפליקציה
המשתמשים יכולים לבחור אם הם רוצים לקבל התראות יזומות על ידי הפעלת התכונה הזו בGHA. באפליקציה של מכשיר smart home, אתם יכולים גם להוסיף למשתמשים את האפשרות להפעיל או להשבית באופן מפורש את ההתראות מהמכשיר, למשל בהגדרות האפליקציה.
GHAכדי לעדכן את Google שההתראות מופעלות במכשיר, שולחים קריאת Request SYNC לעדכון נתוני המכשיר. צריך לשלוח בקשת SYNC כזו בכל פעם שהמשתמשים משנים את ההגדרה הזו באפליקציה.
בתשובה שלכם ל-SYNC, שלחו אחד מהעדכונים הבאים:
- אם המשתמש הפעיל את ההתראות באופן מפורש באפליקציה לניהול מכשיר משני, או אם אתם לא מספקים אפשרות להפעיל או להשבית את ההתראות, הגדירו את המאפיין
devices.notificationSupportedByAgentכ-true. - אם המשתמש השבית באופן מפורש את ההתראות באפליקציה לניהול המכשיר המשני, צריך להגדיר את המאפיין
devices.notificationSupportedByAgentכ-false.
בקטע הקוד הבא אפשר לראות דוגמה להגדרה של תגובת SYNC:
devices: [{
id: 'device123',
...
notificationSupportedByAgent: true,
}]
שליחת בקשות התראה ל-Google
כדי להפעיל התראות ב-Assistant, המילוי שולח מטען ייעודי (payload) של התראה אל Google Home Graph באמצעות קריאה ל-Report State ול-Notification API.
הפעלת Google HomeGraph API
-
ב-Google Cloud Console, נכנסים לדף HomeGraph API.
כניסה לדף HomeGraph API - בוחרים את הפרויקט שתואם למזהה הפרויקט ב-smart home.
- לוחצים על הפעלה.
יצירת מפתח לחשבון שירות
כדי ליצור מפתח לחשבון שירות מ-Google Cloud Console:
-
ב-Google Cloud Console, נכנסים לדף Service accounts.
נכנסים לדף Service Accounts.יכול להיות שתצטרכו לבחור פרויקט לפני שתועברו לדף Service Accounts.
לוחצים על Create service account.
כותבים שם בשדה Service account name.
כותבים מזהה בשדה Service account ID.
כותבים תיאור בשדה Service account description.
לוחצים על יצירה והמשך.
בתפריט הנפתח Role, בוחרים באפשרות Service Accounts > Service Account OpenID Connect Identity Token Creator.
לוחצים על המשך.
לוחצים על סיום.
בוחרים את חשבון השירות שיצרתם מרשימת חשבונות השירות ולוחצים על Manage keys בתפריט Actions.
לוחצים על Add key ואז על Create new key.
ב-Key type, בוחרים באפשרות JSON.
לוחצים על יצירה. קובץ JSON שמכיל את המפתח יורד למחשב.
שליחת ההתראה
מבצעים את הקריאה לבקשת ההתראה באמצעות ה-API של devices.reportStateAndNotification.
בקשת ה-JSON חייבת לכלול eventId, שהוא מזהה ייחודי שנוצר על ידי הפלטפורמה שלכם לאירוע שמפעיל את ההתראה. הערך של eventId צריך להיות מזהה רנדומלי שמשתנה בכל פעם ששולחים בקשה להתראה.
באובייקט notifications שאתם מעבירים בקריאה ל-API, צריך לכלול ערך priority שמגדיר איך ההתראה תוצג. האובייקט notifications עשוי לכלול שדות שונים בהתאם לתכונה של המכשיר.
כדי להגדיר את המטען הייעודי (payload) ולקרוא ל-API, אתם יכולים לפעול לפי אחד מהתהליכים הבאים:
שליחת מטען ייעודי (payload) של התראה יזומה
כדי לשלוח קריאה ל-API, בוחרים אפשרות באחת מהכרטיסיות הבאות:
HTTP
Home Graph API מספק נקודת קצה (endpoint) ב-HTTP
- משתמשים בקובץ ה-JSON של חשבון השירות שהורדתם כדי ליצור אסימון JWT (JSON Web Token). מידע נוסף זמין במאמר אימות באמצעות חשבון שירות.
- מקבלים אסימון גישה מסוג OAuth 2.0 עם ההיקף
https://www.googleapis.com/auth/homegraphבאמצעות oauth2l: - יוצרים את בקשת ה-JSON עם
agentUserId. דוגמה לבקשת JSON ל-Report State ולהתראה: - משלבים את ה-JSON של Report State וההתראה ואת האסימון בבקשת ה-HTTP POST לנקודת הקצה של Google Home Graph. כדי לבדוק את הבקשה, אפשר לשלוח אותה משורת הפקודה באמצעות
curl, כמו בדוגמה הבאה:
oauth2l fetch --credentials service-account.json \ --scope https://www.googleapis.com/auth/homegraph
{ "agentUserId": "PLACEHOLDER-USER-ID", "eventId": "PLACEHOLDER-EVENT-ID", "requestId": "PLACEHOLDER-REQUEST-ID", "payload": { "devices": { "notifications": { "PLACEHOLDER-DEVICE-ID": { "ObjectDetection": { "priority": 0, "detectionTimestamp": 1534875126750, "objects": { "named": [ "Alice" ], "unclassified": 2 } } } } } } }
curl -X POST -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d @request-body.json \ "https://homegraph.googleapis.com/v1/devices:reportStateAndNotification"
gRPC
API של Home Graph מספק נקודת קצה (endpoint) של gRPC
- מורידים את הגדרת השירות של מאגרי האחסון לפרוטוקולים ל-API של Home Graph.
- פועלים לפי ההוראות ב<term ref="developer documentation">מאמרי עזרה למפתחים</term> של gRPC כדי ליצור <term ref="stub">קטעי קוד חלופי (stub)</term> של <term ref="client">לקוח</term> באחת מהשפות הנתמכות .
- מפעילים את ה-method ReportStateAndNotification .
Node.js
לקוח Node.js של Google APIs מספק קישורים ל-API של Home Graph.
- מפעילים את השירות
google.homegraphבאמצעות Application Default Credentials. - מפעילים את ה-method
reportStateAndNotificationעם ReportStateAndNotificationRequest. היא מחזירהPromiseעם ReportStateAndNotificationResponse.
const homegraphClient = homegraph({ version: 'v1', auth: new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/homegraph' }) }); const res = await homegraphClient.devices.reportStateAndNotification({ requestBody: { agentUserId: 'PLACEHOLDER-USER-ID', eventId: 'PLACEHOLDER-EVENT-ID', requestId: 'PLACEHOLDER-REQUEST-ID', payload: { devices: { notifications: { 'PLACEHOLDER-DEVICE-ID': { ObjectDetection: { priority: 0, detectionTimestamp: 1534875126750, objects: { named: ['Alice'], unclassified: 2 } } } } } } } });
Java
ספריית הלקוח של HomeGraph API ל-Java מספקת קישורים ל-API של Home Graph.
- מפעילים את
HomeGraphApiServiceבאמצעות Application Default Credentials. - מבצעים קריאה ל-
reportStateAndNotificationעםReportStateAndNotificationRequest. היא מחזירהReportStateAndNotificationResponse.
// Get Application Default credentials. GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(List.of("https://www.googleapis.com/auth/homegraph")); // Create Home Graph service client. HomeGraphService homegraphService = new HomeGraphService.Builder( GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance(), new HttpCredentialsAdapter(credentials)) .setApplicationName("HomeGraphExample/1.0") .build(); // Build device notification payload. Map<?, ?> notifications = Map.of( "ObjectDetection", Map.of( "priority", 0, "detectionTimestamp", 1534875126, "objects", Map.of("named", List.of("Alice"), "unclassifed", 2))); // Send notification. ReportStateAndNotificationRequest request = new ReportStateAndNotificationRequest() .setRequestId("PLACEHOLDER-REQUEST-ID") .setAgentUserId("PLACEHOLDER-USER-ID") .setEventId("PLACEHOLDER-EVENT-ID") .setPayload( new StateAndNotificationPayload() .setDevices( new ReportStateAndNotificationDevice() .setNotifications(Map.of("PLACEHOLDER-DEVICE-ID", notifications)))); homegraphService.devices().reportStateAndNotification(request);
שליחת מטען ייעודי (payload) של תגובת המשך
המטען הייעודי (payload) של תגובת המעקב מכיל את סטטוס הבקשה, קודי שגיאה של כשלים באירועים (אם רלוונטי) ואת הערך התקין של followUpToken שסופק במהלך בקשת ה-Intent של EXECUTE. צריך להשתמש ב-followUpToken תוך חמש דקות כדי שהתוקף שלו יישמר וכדי לשייך את התגובה לבקשה המקורית בצורה נכונה.
בקטע הקוד הבא מוצגת דוגמה למטען ייעודי (payload) של בקשת EXECUTE עם שדה followUpToken.
{
"requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
"inputs": [{
"intent": "action.devices.EXECUTE",
"payload": {
"commands": [{
"devices": [{
"id": "123",
}],
"execution": [{
"command": "action.devices.commands.TestNetworkSpeed",
"params": {
"testDownloadSpeed": true,
"testUploadSpeed": false,
"followUpToken": "PLACEHOLDER"
}
}]
}]
}
}]
};
Google משתמשת ב-followUpToken כדי להציג את ההתראה רק במכשיר שהמשתמש השתמש בו, ולא לשדר אותה לכל המכשירים של המשתמש.
כדי לשלוח קריאה ל-API, בוחרים אפשרות באחת מהכרטיסיות הבאות:
HTTP
Home Graph API מספק נקודת קצה (endpoint) ב-HTTP
- משתמשים בקובץ ה-JSON של חשבון השירות שהורדתם כדי ליצור אסימון JWT (JSON Web Token). מידע נוסף זמין במאמר אימות באמצעות חשבון שירות.
- מקבלים אסימון גישה מסוג OAuth 2.0 עם ההיקף
https://www.googleapis.com/auth/homegraphבאמצעות oauth2l: - יוצרים את בקשת ה-JSON עם
agentUserId. דוגמה לבקשת JSON ל-Report State ולהתראה: - משלבים את ה-JSON של Report State וההתראה ואת האסימון בבקשת ה-HTTP POST לנקודת הקצה של Google Home Graph. כדי לבדוק את הבקשה, אפשר לשלוח אותה משורת הפקודה באמצעות
curl, כמו בדוגמה הבאה:
oauth2l fetch --credentials service-account.json \ --scope https://www.googleapis.com/auth/homegraph
{ "agentUserId": "PLACEHOLDER-USER-ID", "eventId": "PLACEHOLDER-EVENT-ID", "requestId": "PLACEHOLDER-REQUEST-ID", "payload": { "devices": { "notifications": { "PLACEHOLDER-DEVICE-ID": { "NetworkControl": { "priority": 0, "followUpResponse": { "status": "SUCCESS", "followUpToken": "PLACEHOLDER", "networkDownloadSpeedMbps": 23.3, "networkUploadSpeedMbps": 10.2 } } } } } } }
curl -X POST -H "Authorization: Bearer ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d @request-body.json \ "https://homegraph.googleapis.com/v1/devices:reportStateAndNotification"
gRPC
API של Home Graph מספק נקודת קצה (endpoint) של gRPC
- משיגים את הגדרת השירות של מאגרי האחסון לפרוטוקולים ל-API של Home Graph.
- פועלים לפי ההוראות במאמרי העזרה למפתחים של gRPC כדי ליצור קטעי קוד חלופי (stub) של לקוח באחת מהשפות הנתמכות.
- מפעילים את ה-method ReportStateAndNotification.
Node.js
לקוח Node.js של Google APIs מספק קישורים ל-API של Home Graph.
- מפעילים את השירות
google.homegraphבאמצעות Application Default Credentials. - מפעילים את ה-method
reportStateAndNotificationעם ReportStateAndNotificationRequest. היא מחזירהPromiseעם ReportStateAndNotificationResponse.
const followUpToken = executionRequest.inputs[0].payload.commands[0].execution[0].params.followUpToken; const homegraphClient = homegraph({ version: 'v1', auth: new GoogleAuth({ scopes: 'https://www.googleapis.com/auth/homegraph' }) }); const res = await homegraphClient.devices.reportStateAndNotification({ requestBody: { agentUserId: 'PLACEHOLDER-USER-ID', eventId: 'PLACEHOLDER-EVENT-ID', requestId: 'PLACEHOLDER-REQUEST-ID', payload: { devices: { notifications: { 'PLACEHOLDER-DEVICE-ID': { NetworkControl: { priority: 0, followUpResponse: { status: 'SUCCESS', followUpToken, networkDownloadSpeedMbps: 23.3, networkUploadSpeedMbps: 10.2, } } } } } } } });
Java
ספריית הלקוח של HomeGraph API ל-Java מספקת קישורים ל-API של Home Graph.
- מפעילים את
HomeGraphApiServiceבאמצעות Application Default Credentials. - מפעילים את ה-method
reportStateAndNotificationעםReportStateAndNotificationRequest. היא מחזירה אובייקט מסוגReportStateAndNotificationResponse
// Get Application Default credentials. GoogleCredentials credentials = GoogleCredentials.getApplicationDefault() .createScoped(List.of("https://www.googleapis.com/auth/homegraph")); // Create Home Graph service client. HomeGraphService homegraphService = new HomeGraphService.Builder( GoogleNetHttpTransport.newTrustedTransport(), GsonFactory.getDefaultInstance(), new HttpCredentialsAdapter(credentials)) .setApplicationName("HomeGraphExample/1.0") .build(); // Extract follow-up token. ExecuteRequest.Inputs executeInputs = (Inputs) executeRequest.getInputs()[0]; String followUpToken = (String) executeInputs .getPayload() .getCommands()[0] .getExecution()[0] .getParams() .get("followUpToken"); // Build device follow-up response payload. Map<?, ?> followUpResponse = Map.of( "NetworkControl", Map.of( "priority", 0, "followUpResponse", Map.of( "status", "SUCCESS", "followUpToken", followUpToken, "networkDownloadSpeedMbps", 23.3, "networkUploadSpeedMbps", 10.2))); // Send follow-up response. ReportStateAndNotificationRequest request = new ReportStateAndNotificationRequest() .setRequestId("PLACEHOLDER-REQUEST-ID") .setAgentUserId("PLACEHOLDER-USER-ID") .setEventId("PLACEHOLDER-EVENT-ID") .setPayload( new StateAndNotificationPayload() .setDevices( new ReportStateAndNotificationDevice() .setNotifications(Map.of("PLACEHOLDER-DEVICE-ID", followUpResponse)))); homegraphService.devices().reportStateAndNotification(request);
רישום ביומן
ההתראות תומכות ברישום אירועים ביומן, כפי שמתואר במאמר Cloud Logging לפלטפורמת Cloud-to-cloud. היומנים האלה שימושיים לבדיקה ולשמירה על איכות ההתראות ב-Action.
הסכימה של רשומת notificationLog:
| נכס | תיאור |
|---|---|
requestId |
מזהה בקשת ההתראה. |
structName |
שם המבנה של ההתראה, למשל "ObjectDetection". |
status |
מציין את הסטטוס של ההתראה. |
השדה status כולל סטטוסים שונים שעשויים להצביע על שגיאות במטען הייעודי (payload) של ההתראה. יכול להיות שחלק מהאפשרויות האלה יהיו זמינות רק בפעולות שלא הושקו בסביבת הייצור.
דוגמאות לסטטוסים:
| סטטוס | תיאור |
|---|---|
EVENT_ID_MISSING |
מציין שחסר שדה החובה eventId.
|
PRIORITY_MISSING |
מציין שחסר שדה priority.
|
NOTIFICATION_SUPPORTED_BY_AGENT_FALSE |
מציין שהמאפיין notificationSupportedByAgent של המכשיר ששולח את ההתראה, שסופק ב-SYNC, הוא False.
|
NOTIFICATION_ENABLED_BY_USER_FALSE |
מציין שהמשתמש לא הפעיל התראות במכשיר ששולח את ההתראות ב-GHA. הסטטוס הזה זמין רק בשילובים שלא הושקו בסביבת הייצור. |
NOTIFYING_DEVICE_NOT_IN_STRUCTURE |
מציין שהמשתמש לא הקצה את המכשיר ששולח את ההתראה לבית וירטואלי. הסטטוס הזה זמין רק בשילובים שלא הושקו בסביבת הייצור. |
בנוסף לסטטוסים הכלליים האלה שיכולים לחול על כל ההתראות, השדה status יכול לכלול גם סטטוסים ספציפיים למאפיינים, אם רלוונטי (לדוגמה, OBJECT_DETECTION_DETECTION_TIMESTAMP_MISSING).