התראות על פעולות בבית החכם

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

השילוב שלכם עם Cloud-to-cloud יכול לשלוח למשתמשים את סוגי ההתראות הבאים:

  • התראות יזומות: התראות למשתמש על smart home אירוע במכשיר ללא בקשות קודמות של המשתמש למכשיר, כמו צלצול בדלת.

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

Assistant מספקת את ההתראות האלה למשתמשים כהודעות ברמקולים חכמים ובמסכים חכמים. ההתראות היזומות מושבתות כברירת מחדל. המשתמשים יכולים להפעיל או להשבית את כל ההתראות היזומות מתוך Google Home app (GHA).

אירועים שמפעילים התראות

כשמתרחשים אירועים במכשיר, מרכז הבקשות שולח בקשת התראה ל-Google. התכונות של המכשיר שCloud-to-cloudהשילוב תומך בהן קובעות אילו סוגים של אירועי התראות זמינים ואילו נתונים אפשר לכלול בהתראות האלה.

המאפיינים הבאים תומכים בהתראות יזומות:

תכונה אירועים
ObjectDetection אובייקטים שזוהו על ידי המכשיר, למשל כשפנים מוכרות זוהו בדלת. לדוגמה: "עליזה ויוסי עומדים ליד הדלת הקדמית"
RunCycle המכשיר משלים מחזור. לדוגמה: "The washing machine cycle has completed."
SensorState המכשיר מזהה מצב חיישן נתמך. לדוגמה: "גלאי העשן מזהה עשן".

התכונות הבאות תומכות בתשובות המשך:

תכונה אירועים
LockUnlock סטטוס ההשלמה ושינוי המצב אחרי ההפעלה של פקודת המכשיר action.devices.commands.LockUnlock. לדוגמה: "הדלת הקדמית נעולה" או "הדלת הקדמית תקועה".
NetworkControl סטטוס ההשלמה ושינוי המצב אחרי ההפעלה של פקודת המכשיר action.devices.commands.TestNetworkSpeed. לדוגמה: "בדיקת מהירות הרשת הסתיימה. מהירות ההורדה בנתב של המשרד היא כרגע 80.2Kbps, ומהירות ההעלאה היא 9.3Kbps".
OpenClose סטטוס ההשלמה ושינוי המצב אחרי ההפעלה של פקודת המכשיר action.devices.commands.OpenClose. לדוגמה: "הדלת הקדמית נפתחה" או "לא ניתן לפתוח את הדלת הקדמית".

כל סוגי המכשירים תומכים בהתראות לגבי ה-traits הרלוונטיים.

התראות על גרסאות build לשילוב בין ענן לענן

מוסיפים התראות לשלבים הבאים של Cloud-to-cloudהשילוב:

  1. צריך לציין ל-Google אם ההתראות מופעלות באפליקציית המכשיר שלכם. אם המשתמשים מפעילים או משביתים את ההתראות באפליקציה שלכם, צריך לשלוח SYNCבקשה כדי לעדכן את Google לגבי השינוי במכשיר.smart home
  2. כשמתרחש אירוע רלוונטי במכשיר או שינוי במצב שמפעיל התראה, שולחים בקשה להתראה על ידי קריאה ל-Report State reportStateAndNotification API. אם מצב המכשיר השתנה, אפשר לשלוח גם מטען ייעודי (payload) של מצב וגם מטען ייעודי של התראה ביחד בשיחה Report State ובהתראה.

בקטעים הבאים מוסבר בהרחבה על השלבים האלה.

איך מציינים אם ההתראות מופעלות באפליקציה

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

.

כדי לעדכן את נתוני המכשיר, צריך לשלוח ל-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

  1. ב-Google Cloud Console, עוברים לדף HomeGraph API.

    כניסה לדף HomeGraph API
  2. בוחרים את הפרויקט שתואם למזהה הפרויקט smart home.
  3. לוחצים על הפעלה.

יצירת מפתח של חשבון שירות

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

הערה: חשוב להקפיד להשתמש בפרויקט הנכון ב-GCP כשמבצעים את השלבים האלה. זהו הפרויקט שתואם למזהה הפרויקט smart home.
  1. ב-Google Cloud Console, עוברים לדף Service accounts.

    מעבר לדף Service Accounts

    יכול להיות שתצטרכו לבחור פרויקט לפני שתועברו לדף 'חשבונות שירות'.

  2. לוחצים על יצירת חשבון שירות.

  3. כותבים שם בשדה Service account name.

  4. מזינים מזהה בשדה Service account ID.

  5. כותבים תיאור בשדה Service account description.

  6. לוחצים על יצירה והמשך.

  7. בתפריט הנפתח Role, בוחרים באפשרות Service Accounts > Service Account OpenID Connect Identity Token Creator.

  8. לוחצים על המשך.

  9. לוחצים על סיום.

  10. בוחרים את חשבון השירות שיצרתם מהרשימה של חשבונות השירות ובוחרים באפשרות ניהול מפתחות בתפריט פעולות.

  11. בוחרים באפשרות Add key (הוספת מפתח) > Create new key (יצירת מפתח חדש).

  12. בסוג המפתח, בוחרים באפשרות JSON.

  13. לוחצים על יצירה. קובץ JSON שמכיל את המפתח יורד למחשב.

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

שליחת ההתראה

מבצעים את הקריאה לבקשת ההתראה באמצעות devices.reportStateAndNotification API. בקשת ה-JSON חייבת לכלול eventId, שהוא מזהה ייחודי שנוצר על ידי הפלטפורמה שלכם לאירוע שמפעיל את ההתראה. הערך של eventId צריך להיות מזהה אקראי שמשתנה בכל פעם ששולחים בקשה לשליחת התראה.

באובייקט notifications שמועבר בקריאת ה-API, צריך לכלול ערך priority שמגדיר איך ההתראה תוצג. אובייקט notifications עשוי לכלול שדות שונים בהתאם למאפיין המכשיר.

כדי להגדיר את מטען הייעודי (payload) ולקרוא ל-API, פועלים לפי אחת מהדרכים הבאות:

שליחת מטען ייעודי (payload) של התראה יזומה

כדי להתקשר ל-API, בוחרים באחת מהאפשרויות בכרטיסיות הבאות:

HTTP

Home Graph API מספק נקודת קצה (endpoint) של HTTP

  1. משתמשים בקובץ ה-JSON של חשבון השירות שהורד כדי ליצור אסימון אינטרנט מסוג JSON ‏ (JWT). מידע נוסף זמין במאמר אימות באמצעות חשבון שירות.
  2. מקבלים אסימון גישה מסוג OAuth 2.0 עם ההיקף https://www.googleapis.com/auth/homegraph באמצעות oauth2l:
  3. oauth2l fetch --credentials service-account.json \
      --scope https://www.googleapis.com/auth/homegraph
    
  4. יוצרים את בקשת ה-JSON עם agentUserId. דוגמה לבקשת JSON עבור Report State והתראה:
  5. {
      "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
                }
              }
            }
          }
        }
      }
    }
  6. משלבים את Report State ואת ה-JSON של ההתראה ואת האסימון בבקשת ה-HTTP POST לנקודת הקצה של Google Home Graph. הנה דוגמה לאופן שבו אפשר לשלוח את הבקשה בשורת הפקודה באמצעות curl, כבדיקה:
  7. 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

Home Graph API מספק נקודת קצה (endpoint) של gRPC

  1. אפשר לקבל את הגדרת השירות של מאגרי פרוטוקולים עבור Home Graph API.
  2. פועלים לפי התיעוד למפתחים של gRPC כדי ליצור stub של לקוח לאחת מהשפות הנתמכות .
  3. מפעילים את השיטה ReportStateAndNotification .

Node.js

לקוח Node.js של Google APIs מספק קשירות ל-API‏ Home Graph.

  1. מפעילים את שירות google.homegraph באמצעות Application Default Credentials.
  2. מתקשרים לשיטה 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.

  1. מאתחלים את HomeGraphApiService באמצעות Application Default Credentials.
  2. מפעילים את השיטה 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, שסופק במהלך בקשת הכוונה 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

  1. משתמשים בקובץ ה-JSON של חשבון השירות שהורד כדי ליצור אסימון אינטרנט מסוג JSON ‏ (JWT). מידע נוסף זמין במאמר אימות באמצעות חשבון שירות.
  2. מקבלים אסימון גישה מסוג OAuth 2.0 עם ההיקף https://www.googleapis.com/auth/homegraph באמצעות oauth2l:
  3. oauth2l fetch --credentials service-account.json \
      --scope https://www.googleapis.com/auth/homegraph
    
  4. יוצרים את בקשת ה-JSON עם agentUserId. דוגמה לבקשת JSON עבור Report State והתראה:
  5. {
      "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
                }
              }
            }
          }
        }
      }
    }
  6. משלבים את Report State ואת ה-JSON של ההתראה ואת האסימון בבקשת ה-HTTP POST לנקודת הקצה של Google Home Graph. הנה דוגמה לאופן שבו אפשר לשלוח את הבקשה בשורת הפקודה באמצעות curl, כבדיקה:
  7. 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

Home Graph API מספק נקודת קצה (endpoint) של gRPC

  1. אפשר לקבל את הגדרת השירות של מאגרי פרוטוקולים עבור Home Graph API.
  2. פועלים לפי ההוראות בתיעוד למפתחים של gRPC כדי ליצור קובצי stub של לקוח לאחת מהשפות הנתמכות.
  3. מפעילים את השיטה ReportStateAndNotification.

Node.js

לקוח Node.js של Google APIs מספק קשירות ל-API‏ Home Graph.

  1. מפעילים את שירות google.homegraph באמצעות Application Default Credentials.
  2. מתקשרים לשיטה 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.

  1. מאתחלים את HomeGraphApiService באמצעות Application Default Credentials
  2. מפעילים את השיטה 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. היומנים האלה שימושיים לבדיקה ולשמירה על איכות ההתראות בפעולה שלכם.

זוהי הסכימה של רשומה 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).