Powiadomienia o działaniach w inteligentnym domu

Dzięki powiadomieniom akcja smart home może używać Google Assistant do informowania użytkowników o ważnych zdarzeniach lub zmianach związanych z urządzeniem. Możesz wdrożyć powiadomienia, które będą informować użytkowników o terminowych zdarzeniach związanych z urządzeniem, na przykład gdy ktoś jest przed drzwiami, lub aby raportować o żądanej zmianie stanu urządzenia, na przykład po uruchomieniu lub zablokowaniu zamka do zamka.

Akcja smart home może wysyłać do użytkowników te typy powiadomień:

  • Aktywne powiadomienia: informuje użytkownika o zdarzeniu urządzenia smart home bez wcześniejszego wysyłania do niego żadnych żądań, np. z dzwonka.

  • Dalsze odpowiedzi: potwierdzenie pomyślnego lub nieudanego żądania polecenia urządzenia, np. w przypadku zamknięcia zamka w drzwiach. Korzystaj z tych alertów w przypadku poleceń urządzenia, których wykonanie wymaga czasu. Kolejne odpowiedzi są obsługiwane tylko wtedy, gdy żądania poleceń urządzenia są wysyłane z inteligentnych głośników i ekranów.

Assistant wyświetla użytkownikom te powiadomienia w formie ogłoszeń na inteligentnych głośnikach i ekranach. Powiadomienia aktywne są domyślnie wyłączone. Użytkownicy mogą włączać i wyłączać wszystkie aktywne powiadomienia w Google Home app (GHA).

Zdarzenia wyzwalające powiadomienia

W przypadku wystąpienia zdarzeń na urządzeniu usługa Realizacja akcji wysyła do Google prośbę o powiadomienie. Cechy urządzenia obsługiwane przez akcje smart home określają, jakie typy zdarzeń powiadomień są dostępne oraz jakie dane można w nich uwzględnić.

Te funkcje obsługują aktywne powiadomienia:

Cecha Wydarzenia
ObjectDetection Obiekty wykryte przez urządzenie, na przykład w przypadku wykrycia rozpoznanej twarzy przy drzwiach. Na przykład: „Alicja i Robert są przy drzwiach frontowych”.
RunCycle Urządzenie kończy cykl. Na przykład: „Cykl pralki się zakończył”.
SensorState Urządzenie wykrywa stan obsługiwanego czujnika. Na przykład: „Czujnik dymu wykrył dym”.
TemperatureControl Urządzenie osiągnęło nastawę temperatury. Na przykład: „Pikarnik został podgrzany do 350 stopni”.
ArmDisarm System przechodzi w stan przed alarmem z odliczaniem wejść, które jest aktywowane przez otwarte drzwi.
CameraStream Link do transmisji na żywo z kamery po wykryciu przez urządzenie obiektu lub ruchu.
MotionDetection „1 lipca 2020 roku o 12:00 wykryto ruch”.

Te cechy umożliwiają dodatkowe odpowiedzi:

Cecha Wydarzenia
ArmDisarm Stan ukończenia i stan zmienią się po wykonaniu polecenia na urządzeniu action.devices.commands.ArmDisarm. Na przykład: „System alarmowy został włączony”.
LockUnlock Stan ukończenia i stan zmienią się po wykonaniu polecenia na urządzeniu action.devices.commands.LockUnlock. Na przykład: „Zamknięto drzwi frontowe” lub „Zacięte są drzwi wejściowe”.
NetworkControl Stan ukończenia i stan zmienią się po wykonaniu polecenia na urządzeniu action.devices.commands.TestNetworkSpeed. Na przykład: „Test szybkości sieci dobiegł końca. Szybkość pobierania na routerze w biurze to obecnie 80,2 kb/s, a szybkość wysyłania – 9,3 kb/s."
OpenClose Stan ukończenia i stan zmienią się po wykonaniu polecenia na urządzeniu action.devices.commands.OpenClose. Na przykład: „Otwarto drzwi wejściowe” lub „Nie udało się otworzyć drzwi frontowych”.
StartStop Stan ukończenia i stan zmienią się po wykonaniu polecenia na urządzeniu action.devices.commands.StartStop. Na przykład: „Odkurzacz został uruchomiony”.

Wszystkie typy urządzeń obsługują powiadomienia dotyczące odpowiednich cech.

Tworzenie powiadomień dotyczących akcji inteligentnego domu

Dodawanie powiadomień do działania smart home na tych etapach:

  1. Poinformuj Google, czy powiadomienia są włączone w aplikacji na urządzeniu smart home. Jeśli użytkownicy włączą lub wyłączą powiadomienia w aplikacji, wyślij SYNC, aby poinformować Google o zmianie urządzenia.
  2. Gdy wystąpi odpowiednie zdarzenie lub zmiana stanu urządzenia, które aktywuje powiadomienie, wyślij żądanie powiadomienia, wywołując interfejs Report State reportStateAndNotification API. Jeśli stan urządzenia się zmienił, możesz wysłać jednocześnie stan i ładunek powiadomień w Report State i wywołaniu powiadomienia.

W kolejnych sekcjach znajdziesz bardziej szczegółowe informacje o tych czynnościach.

Określ, czy w aplikacji są włączone powiadomienia

Użytkownicy mogą wybrać, czy chcą otrzymywać aktywne powiadomienia, włączając tę funkcję w GHA. W aplikacji na urządzeniu z smart home możesz też opcjonalnie dodać możliwość przełączania powiadomień z urządzenia, na przykład w ustawieniach aplikacji.

Aby poinformować Google, że powiadomienia są włączone na urządzeniu, wywołaj polecenie Request SYNC (Prośba o SYNCHRONIZACJĘ) w celu zaktualizowania danych na urządzeniu. Wysyłaj takie żądanie SYNC za każdym razem, gdy użytkownicy zmienią to ustawienie w Twojej aplikacji.

W odpowiedzi z SYNC wyślij jedną z tych informacji:

  • Jeśli użytkownik samodzielnie włączył powiadomienia w aplikacji na urządzeniu lub jeśli nie udostępniasz takiej opcji, ustaw właściwość devices.notificationSupportedByAgent na true.
  • Jeśli użytkownik wprost wyłączył powiadomienia w aplikacji na urządzeniu, ustaw właściwość devices.notificationSupportedByAgent na false.

Poniższy fragment kodu pokazuje, jak ustawić odpowiedź SYNC:

devices: [{
   id: 'device123',
   ...
   notificationSupportedByAgent: true,
}]

Wysyłaj prośby o powiadomienia do Google

Aby aktywować powiadomienia w Assistant, realizacja wysyła do usługi Google Home Graph ładunek powiadomień za pomocą wywołania Report State i interfejsu Notification API.

Włączanie interfejsu Google HomeGraph API

  1. W Google Cloud Console otwórz stronę HomeGraph API.

    Otwórz stronę interfejsu HomeGraph API
  2. Wybierz projekt, który pasuje do identyfikatora projektu smart home.
  3. Kliknij WŁĄCZ.

Tworzenie klucza konta usługi

Aby wygenerować klucz konta usługi z Google Cloud Console, wykonaj te instrukcje:

Uwaga: upewnij się, że podczas wykonywania tych czynności używasz właściwego projektu GCP. To jest projekt, który pasuje do identyfikatora projektu smart home.
  1. W Google Cloud Console otwórz stronę Utwórz klucz konta usługi.

    Otwórz stronę tworzenia klucza konta usługi
  2. Z listy Konto usługi wybierz Nowe konto usługi.
  3. W polu Nazwa konta usługi wpisz nazwę.
  4. W polu Identyfikator konta usługi wpisz identyfikator.
  5. Z listy Rola wybierz Konta usługi > Twórca tokenów konta usługi.

  6. W polu Typ klucza wybierz opcję JSON.

  7. Kliknij Utwórz. Na komputer zostanie pobrany plik JSON zawierający klucz.

Wyślij powiadomienie

Wywołaj żądanie powiadomienia za pomocą interfejsu API devices.reportStateAndNotification. Żądanie JSON musi zawierać eventId, czyli unikalny identyfikator generowany przez Twoją platformę dla zdarzenia wywołującego powiadomienie. Wartość eventId powinna być losowym identyfikatorem, który jest inny za każdym razem, gdy wysyłasz prośbę o powiadomienie.

W obiekcie notifications przekazywanym w wywołaniu interfejsu API umieść wartość priority, która określa sposób wyświetlania powiadomienia. Obiekt notifications może zawierać różne pola w zależności od właściwości urządzenia.

Wykonaj jedną z tych ścieżek, aby ustawić ładunek i wywołać interfejs API:

Wysyłanie proaktywnego ładunku powiadomień

Aby wywołać interfejs API, wybierz opcję z jednej z tych kart:

HTTP

Interfejs API Home Graph udostępnia punkt końcowy HTTP.

  1. Użyj pobranego pliku JSON konta usługi, aby utworzyć token sieciowy JSON (JWT). Więcej informacji znajdziesz w artykule o uwierzytelnianiu za pomocą konta usługi.
  2. Uzyskaj token dostępu OAuth 2.0 z zakresem https://www.googleapis.com/auth/homegraph za pomocą oauth2l:
  3. oauth2l fetch --credentials service-account.json \
      --scope https://www.googleapis.com/auth/homegraph
    
  4. Utwórz żądanie JSON za pomocą agentUserId. Oto przykładowe żądanie JSON dla Report State i powiadomienia:
  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. Połącz pliki JSON Report State i powiadomienia w formacie JSON oraz token z żądania HTTP POST z punktem końcowym Google Home Graph. Oto przykład wykonania żądania w wierszu poleceń przy użyciu interfejsu curl w ramach testu:
  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

Interfejs Home Graph API udostępnia punkt końcowy gRPC

  1. Pobierz definicję usługi buforów protokołów dla interfejsu API Home Graph.
  2. Postępuj zgodnie z dokumentacją dla programistów gRPC, aby wygenerować atrapy klienta w jednym z obsługiwanych języków.
  3. Wywołaj metodę ReportStateAndNotification.

Node.js

Klient Node.js interfejsów API Google zapewnia powiązania dla interfejsu Home Graph API.

  1. Zainicjuj usługę google.homegraph przy użyciu domyślnych danych logowania aplikacji.
  2. Wywołaj metodę reportStateAndNotification za pomocą metody ReportStateAndNotificationRequest. Zwraca Promise z funkcją 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

Biblioteka klienta interfejsu HomeGraph API dla języka Java zawiera powiązania dla interfejsu Home Graph API.

  1. Zainicjuj HomeGraphApiService przy użyciu domyślnych danych logowania aplikacji.
  2. Wywołaj metodę reportStateAndNotification za pomocą funkcji ReportStateAndNotificationRequest. Zwraca 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);
    
Wysyłanie ładunku odpowiedzi

Ładunek kolejnej odpowiedzi zawiera stan żądania, kody błędów dotyczące nieudanych zdarzeń (w stosownych przypadkach) oraz prawidłowy followUpToken podany w żądaniu intencji EXECUTE. followUpToken musi zostać użyty w ciągu 5 minut, aby zachować ważność i prawidłowo powiązać odpowiedź z oryginalnym żądaniem.

Ten fragment kodu zawiera przykładowy ładunek żądania EXECUTE z polem 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 używa followUpToken do wysyłania powiadomień tylko na urządzeniu, z którym użytkownik pierwotnie wszedł w interakcję, a nie do wysyłania powiadomień na wszystkie urządzenia użytkownika.

Aby wywołać interfejs API, wybierz opcję z jednej z tych kart:

HTTP

Interfejs API Home Graph udostępnia punkt końcowy HTTP.

  1. Użyj pobranego pliku JSON konta usługi, aby utworzyć token sieciowy JSON (JWT). Więcej informacji znajdziesz w artykule o uwierzytelnianiu za pomocą konta usługi.
  2. Uzyskaj token dostępu OAuth 2.0 z zakresem https://www.googleapis.com/auth/homegraph za pomocą oauth2l:
  3. oauth2l fetch --credentials service-account.json \
      --scope https://www.googleapis.com/auth/homegraph
    
  4. Utwórz żądanie JSON za pomocą agentUserId. Oto przykładowe żądanie JSON dla Report State i powiadomienia:
  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. Połącz pliki JSON Report State i powiadomienia w formacie JSON oraz token z żądania HTTP POST z punktem końcowym Google Home Graph. Oto przykład wykonania żądania w wierszu poleceń przy użyciu interfejsu curl w ramach testu:
  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

Interfejs Home Graph API udostępnia punkt końcowy gRPC

  1. Pobierz definicję usługi buforów protokołów dla interfejsu API Home Graph.
  2. Postępuj zgodnie z dokumentacją dla programistów gRPC, aby wygenerować atrapy klienta w jednym z obsługiwanych języków.
  3. Wywołaj metodę ReportStateAndNotification.

Node.js

Klient Node.js interfejsów API Google zapewnia powiązania dla interfejsu Home Graph API.

  1. Zainicjuj usługę google.homegraph przy użyciu domyślnych danych logowania aplikacji.
  2. Wywołaj metodę reportStateAndNotification za pomocą metody ReportStateAndNotificationRequest. Zwraca Promise z funkcją 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

Biblioteka klienta interfejsu HomeGraph API dla języka Java zawiera powiązania dla interfejsu Home Graph API.

  1. Zainicjuj HomeGraphApiService przy użyciu domyślnych danych logowania aplikacji.
  2. Wywołaj metodę reportStateAndNotification za pomocą funkcji ReportStateAndNotificationRequest. Zwraca 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);
    

Logowanie

Powiadomienia obsługują rejestrowanie zdarzeń zgodnie z opisem w artykule Uzyskiwanie dostępu do logów zdarzeń za pomocą Cloud Logging. Logi te przydają się do testowania i utrzymywania jakości powiadomień w akcji.

Oto schemat wpisu notificationLog:

Właściwość Opis
requestId Identyfikator prośby o powiadomienie.
structName Nazwa struktury powiadomień, na przykład „ObjectDetection”.
status Wskazuje stan powiadomienia.

Pole status zawiera różne stany, które mogą wskazywać na błędy w ładunku powiadomień. Niektóre z nich mogą być dostępne tylko w przypadku akcji, które nie zostały jeszcze wprowadzone w wersji produkcyjnej.

Przykładowe stany:

Stan Opis
EVENT_ID_MISSING Wskazuje, że brakuje wymaganego pola eventId.
PRIORITY_MISSING Wskazuje, że brakuje pola priority.
NOTIFICATION_SUPPORTED_BY_AGENT_FALSE Wskazuje, że właściwość notificationSupportedByAgent urządzenia powiadamiającego podana w zasadzie SYNC ma wartość false (fałsz).
NOTIFICATION_ENABLED_BY_USER_FALSE Wskazuje, że użytkownik nie włączył powiadomień na urządzeniu, które wysyła powiadomienie w GHA. Ten stan jest dostępny tylko w przypadku działań, które nie są jeszcze dostępne w wersji produkcyjnej.
NOTIFYING_DEVICE_NOT_IN_STRUCTURE Wskazuje, że użytkownik nie przypisał urządzenia wysyłającego powiadomienia do domu/domu. Ten stan jest dostępny tylko w przypadku działań, które nie są jeszcze dostępne w wersji produkcyjnej.

Oprócz tych ogólnych stanów, które mogą mieć zastosowanie do wszystkich powiadomień, pole status może też zawierać stany związane z określonymi cechami (np. OBJECT_DETECTION_DETECTION_TIMESTAMP_MISSING).