Estado do relatório

Report State é um recurso importante que permite que a ação Google Home informe proativamente o status mais recente do dispositivo do usuário de volta para Google Home Graph em vez de esperar uma intenção QUERY.

O Report State informa ao Google os estados dos dispositivos do usuário com o agentUserId especificado associado a eles (enviado na solicitação SYNC original). Quando Google Assistant quer realizar uma ação que exige entender o estado atual de um dispositivo, basta pesquisar as informações de estado no Home Graph em vez de emitir uma intent QUERY para várias nuvens de terceiros antes de emitir a intent EXECUTE.

Sem o Report State, considerando luzes de vários provedores em uma sala de estar, o comando Ok Google, ilumine minha sala de estar exige a resolução de várias intenções QUERY enviadas a várias nuvens, em vez de apenas pesquisar os valores de brilho atuais com base no que foi informado anteriormente. Para oferecer a melhor experiência do usuário, o Assistant precisa ter o estado atual de um dispositivo sem exigir uma viagem de ida e volta.

Após o SYNC inicial de um dispositivo, a plataforma envia uma intent QUERY que coleta o estado do dispositivo para preencher Home Graph. Depois disso, o Home Graph armazena apenas o estado enviado com Report State.

Ao chamar Report State, forneça dados de estado completos para uma determinada característica. O Home Graph atualiza os estados por característica e substitui todos os dados dela quando uma chamada Report State é feita. Por exemplo, se você estiver informando o estado do traço StartStop, o payload precisa incluir valores para isRunning e isPaused.

Primeiros passos

Para implementar o Report State, siga estas etapas:

Ativar a API Google HomeGraph

  1. No Google Cloud Console, acesse a página da API HomeGraph.

    Acessar a página da API HomeGraph
  2. Selecione o projeto que corresponde ao ID do projeto smart home.
  3. Clique em ATIVAR.

Criar uma chave de conta de serviço

Siga estas instruções para gerar uma chave de conta de serviço no Google Cloud Console:

Observação: verifique se você está usando o projeto correto do GCP ao realizar estas etapas. Esse é o projeto que corresponde ao ID do projeto smart home.
  1. No Google Cloud Console, acesse a página Contas de serviço.

    Acesse a página "Contas de serviço".

    Talvez seja necessário selecionar um projeto antes de acessar a página "Contas de serviço".

  2. Clique em Criar conta de serviço.

  3. No campo Nome da conta de serviço, insira um nome.

  4. No campo ID da conta de serviço, insira um ID.

  5. No campo Descrição da conta de serviço, insira uma descrição.

  6. Clique em Criar e continuar.

  7. No menu suspenso Papel, selecione Contas de serviço > Criador do token de identidade do OpenID Connect da conta de serviço.

  8. Clique em Continuar.

  9. Clique em Concluído.

  10. Selecione a conta de serviço que você acabou de criar na lista de contas de serviço e escolha Gerenciar chaves no menu Ações.

  11. Selecione Adicionar chave > Criar nova chave.

  12. Em Tipo de chave, selecione a opção JSON.

  13. Clique em Criar. O download de um arquivo JSON com sua chave é feito no computador.

Para instruções detalhadas e informações sobre como criar chaves de conta de serviço, consulte Criar e excluir chaves de conta de serviço no site de ajuda do console do Google Cloud.

Chamar a API

Selecione uma opção nas guias abaixo:

HTTP

O Home Graph fornece um endpoint HTTP.

  1. Use o arquivo JSON da conta de serviço baixado para criar um JSON Web Token (JWT). Para mais informações, consulte Autenticação usando uma conta de serviço.
  2. Receba um token de acesso do OAuth 2.0 com o escopo https://www.googleapis.com/auth/homegraph usando oauth2l:
  3. oauth2l fetch --credentials service-account.json \
      --scope https://www.googleapis.com/auth/homegraph
    
  4. Crie a solicitação JSON com o agentUserId. Confira um exemplo de solicitação JSON para Report State e Notification:
  5. {
      "requestId": "123ABC",
      "agentUserId": "user-123",
      "payload": {
        "devices": {
          "states": {
            "light-123": {
              "on": true
            }
          }
        }
      }
    }
  6. Combine o estado do relatório e o JSON de notificação com o token na sua solicitação HTTP POST para o endpoint do Google Home Graph. Confira um exemplo de como fazer a solicitação na linha de comando usando curl, como um teste:
  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

O Home Graph fornece um endpoint gRPC

  1. Solicite a definição de serviço de Buffers de protocolo da API Home Graph.
  2. Siga a documentação para desenvolvedores do gRPC e gere stubs de cliente para uma das linguagens compatíveis.
  3. Chame o método ReportStateAndNotification.

Node.js

O cliente Node.js das APIs do Google fornece vinculações para a API Home Graph.

  1. Inicialize o serviço google.homegraph usando as credenciais padrão do aplicativo.
  2. Chame o método reportStateAndNotification com o ReportStateAndNotificationRequest. Ele retorna um Promise com o 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',
    requestId: 'PLACEHOLDER-REQUEST-ID',
    payload: {
      devices: {
        states: {
          "PLACEHOLDER-DEVICE-ID": {
            on: true
          }
        }
      }
    }
  }
});
    

Java

A biblioteca de cliente da API HomeGraph para Java oferece vinculações para a API Home Graph.

  1. Inicialize o HomeGraphApiService usando as credenciais padrão do aplicativo.
  2. Chame o método reportStateAndNotification com o ReportStateAndNotificationRequest. Ele retorna um 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 state payload.
  Map<?, ?> states = Map.of("on", true);

  // Report device state.
  ReportStateAndNotificationRequest request =
      new ReportStateAndNotificationRequest()
          .setRequestId("PLACEHOLDER-REQUEST-ID")
          .setAgentUserId("PLACEHOLDER-USER-ID")
          .setPayload(
              new StateAndNotificationPayload()
                  .setDevices(
                      new ReportStateAndNotificationDevice()
                          .setStates(Map.of("PLACEHOLDER-DEVICE-ID", states))));
  homegraphService.devices().reportStateAndNotification(request);
}
    

Estado do relatório de teste

Ferramentas recomendadas para esta tarefa

Para preparar sua integração do Cloud-to-cloud para a certificação, é importante testar o Report State.

Para isso, recomendamos usar a ferramenta Home Graph Viewer, um app da Web independente que não exige download ou implantação.

O painel Report State ainda está disponível, mas foi descontinuado e não tem mais suporte.

Painel de estado do relatório

Pré-requisitos

Antes de testar sua integração do Cloud-to-cloud, você precisa da chave da conta de serviço e do agentUserId. Se você já tiver a chave da conta de serviço e agentUserId, consulte Implantar o painel Report State.

Implantar o painel "Estado do relatório"

Depois de ter a chave da conta de serviço e o ID do usuário do agente para seu projeto, baixe e implante a versão mais recente do painel Report State. Depois de fazer o download da versão mais recente, siga as instruções do arquivo README.MD incluído.

Depois de implantar o painel Report State, acesse-o no seguinte URL. Substitua your_project_id pelo ID do seu projeto:

http://<your-project-id>.appspot.com

No painel, faça o seguinte:

  • Escolha o arquivo de chave da conta
  • Adicionar seu agentUserId

Em seguida, clique em Lista.

Todos os seus dispositivos são listados. Depois que a lista for preenchida, use o botão Atualizar para atualizar os estados dos dispositivos. Se houver uma mudança no estado do dispositivo, a linha será destacada em verde.

Informar discrepância de estado

A acurácia do estado do relatório com base em consultas mede a correspondência entre o estado mais recente do relatório de um dispositivo e o status dele quando um usuário faz uma consulta. Esse valor deve ser de 99,5%.

Respostas de erro

Você pode receber uma das seguintes respostas de erro ao chamar Report State. Essas respostas vêm na forma de códigos de status HTTP.

  • 400 Bad Request: o servidor não conseguiu processar a solicitação enviada pelo cliente devido a uma sintaxe inválida. As causas comuns incluem JSON malformado ou o uso de null em vez de "" para um valor de string.
  • 404 Not Found - Não foi possível encontrar o recurso solicitado, mas ele pode estar disponível no futuro. Normalmente, isso significa que não conseguimos encontrar o dispositivo solicitado. Também pode significar que a conta de usuário não está vinculada ao Google ou que recebemos um agentUserId inválido. Verifique se o agentUserId corresponde ao valor fornecido na resposta SYNC e se você está processando corretamente as intents DISCONNECT.

Relatórios de estado on-line e off-line

Quando um dispositivo estiver off-line, informe <code{"online": code="" dir="ltr" false}<="" translate="no"> para Report State em até cinco minutos após o comportamento do dispositivo. Por outro lado, quando um dispositivo volta a ficar on-line, você precisa informar <code{"online": code="" dir="ltr" translate="no" true}<=""> para Report State em até cinco minutos após o comportamento do dispositivo. Sempre que um dispositivo volta a ficar on-line, o parceiro precisa informar todos os estados atuais do dispositivo usando a API reportStateAndNotification. Este exemplo mostra que um tipo de dispositivo light está on-line e informa todos os estados atuais do dispositivo.
"requestId": "test-request-id",
  "agentUserId": "agent-user-1",
    "payload":{
      "devices": {
        "states": {
          "device-id-1": {
            "brightness": 65,
            "on": true,
            "online": true
          }
          "notifications": {},
        }
      }
    }
</code{"online":></code{"online":>