Report State é um recurso importante que permite que a
ação Google Home informe proativamente o status mais recente do
dispositivo do usuário 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, aumente o brilho da minha sala de estar exige a resolução de várias intenções QUERY enviadas a várias nuvens, em vez de simplesmente 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
- 
    No Google Cloud Console, acesse a página da API HomeGraph. Acessar a página da API HomeGraph
- Selecione o projeto que corresponde ao ID do projeto smart home.
- 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:
- 
    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". 
- Clique em Criar conta de serviço. 
- No campo Nome da conta de serviço, insira um nome. 
- No campo ID da conta de serviço, insira um ID. 
- No campo Descrição da conta de serviço, insira uma descrição. 
- Clique em Criar e continuar. 
- No menu suspenso Papel, selecione Contas de serviço > Criador do token de identidade do OpenID Connect da conta de serviço. 
- Clique em Continuar. 
- Clique em Concluído. 
- 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. 
- Selecione Adicionar chave > Criar nova chave. 
- Em Tipo de chave, selecione a opção JSON. 
- Clique em Criar. O download de um arquivo JSON com sua chave é feito no computador. 
Chamar a API
Selecione uma opção nas guias abaixo:
HTTP
O Home Graph fornece um endpoint HTTP.
- 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.
- Receba um token de acesso do OAuth 2.0 com o escopo
    https://www.googleapis.com/auth/homegraphusando oauth2l:
- Crie a solicitação JSON com o agentUserId. Confira um exemplo de solicitação JSON para Report State e Notification:
- Combine o estado do relatório e o JSON de notificação, além do 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:
oauth2l fetch --credentials service-account.json \ --scope https://www.googleapis.com/auth/homegraph
{ "requestId": "123ABC", "agentUserId": "user-123", "payload": { "devices": { "states": { "light-123": { "on": true } } } } }
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
- Solicite a definição de serviço de Buffers de protocolo da API Home Graph.
- Siga a documentação para desenvolvedores do gRPC e gere stubs de cliente para uma das linguagens compatíveis.
- Chame o método ReportStateAndNotification.
Node.js
O cliente Node.js das APIs do Google fornece vinculações para a API Home Graph.
- Inicialize o serviço google.homegraphusando as credenciais padrão do aplicativo.
- Chame o método reportStateAndNotificationcom o ReportStateAndNotificationRequest. Ele retorna umPromisecom 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.
- Inicialize o HomeGraphApiServiceusando as credenciais padrão do aplicativo.
- Chame o método reportStateAndNotificationcom oReportStateAndNotificationRequest. Ele retorna umReportStateAndNotificationResponse.
// 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
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- nullem 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- agentUserIdinválido. Verifique se o- agentUserIdcorresponde 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 APIreportStateAndNotification.
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": {},
        }
      }
    }