Consultar e executar

Quando os usuários interagem com Google Assistant para consultar o estado atual de um dispositivo, o fulfillment recebe uma intent action.devices.QUERY contendo uma lista de IDs de dispositivo (fornecidos pela resposta SYNC). O fulfillment recebe uma intent action.devices.EXECUTE quando os usuários enviam comandos a Assistant para controlar o dispositivo.

Processar intents QUERY

Sua resposta QUERY inclui um conjunto completo de estados para cada uma das características com suporte dos dispositivos solicitados.

Solicitação
{
    "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
    "inputs": [{
      "intent": "action.devices.QUERY",
      "payload": {
        "devices": [{
          "id": "123",
          "customData": {
            "fooValue": 74,
            "barValue": true,
            "bazValue": "foo"
          }
        }, {
          "id": "456",
          "customData": {
            "fooValue": 12,
            "barValue": false,
            "bazValue": "bar"
          }
        }]
      }
    }]
}
JSON
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "devices": {
      "123": {
        "on": true,
        "online": true
      },
      "456": {
        "on": true,
        "online": true,
        "brightness": 80,
        "color": {
          "name": "cerulean",
          "spectrumRGB": 31655
        }
      }
    }
  }
}
Node.js
const {smarthome} = require('actions-on-google');
const app = smarthome();
// ...
app.onQuery((body, headers) => {
  // TODO Get device state
  return {
    requestId: body.requestId,
    payload: {
      devices: {
        123: {
          on: true,
          online: true
        },
        456: {
          on: true,
          online: true,
          brightness: 80,
          color: {
            name: "cerulean",
            spectrumRGB: 31655
          }
        }
      }
    }
  };
});
Java
@NotNull
@Override
public QueryResponse onQuery(@NotNull QueryRequest queryRequest, @Nullable Map<?, ?> map) {
  QueryResponse.Payload payload = new QueryResponse.Payload();
  payload.setDevices(
      new HashMap<String, Map<String, Object>>() {
        {
          put(
              "123",
              new HashMap<String, Object>() {
                {
                  put("on", true);
                  put("online", true);
                }
              });
          put(
              "456",
              new HashMap<String, Object>() {
                {
                  put("on", true);
                  put("online", true);
                  put("brightness", 80);
                  put(
                      "color",
                      new HashMap<String, Object>() {
                        {
                          put("name", "cerulean");
                          put("spectrumRGB", 31655);
                        }
                      });
                }
              });
        }
      });

  return new QueryResponse(queryRequest.getRequestId(), payload);
}

Para mais informações, consulte a documentação de referência da intent QUERY.

Processar intents EXECUTE

Assim como QUERY, uma única intent pode segmentar vários IDs de dispositivo. Uma única intent EXECUTE também pode conter vários comandos distintos dados a um grupo de dispositivos. Por exemplo, uma intent acionada pode definir o brilho e a cor em um grupo de luzes ou definir várias luzes para uma cor diferente. A resposta de EXECUTE precisa retornar o novo estado do dispositivo após a execução.

Use Report State quando o estado do dispositivo do usuário mudar. Por exemplo, devido a uma intent EXECUTE ou a uma mudança de estado local (como acionar manualmente um interruptor de luz). Isso mantém o Google Home Graph sincronizado com seu serviço de nuvem.

Solicitar
{
    "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
    "inputs": [{
      "intent": "action.devices.EXECUTE",
      "payload": {
        "commands": [{
          "devices": [{
            "id": "123",
            "customData": {
              "fooValue": 74,
              "barValue": true,
              "bazValue": "sheepdip"
            }
          }, {
            "id": "456",
            "customData": {
              "fooValue": 36,
              "barValue": false,
              "bazValue": "moarsheep"
            }
          }],
          "execution": [{
            "command": "action.devices.commands.OnOff",
            "params": {
              "on": true
            }
          }]
        }]
      }
    }]
}
JSON
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [
      {
        "ids": [
          "123"
        ],
        "status": "SUCCESS",
        "states": {
          "on": true,
          "online": true
        }
      },
      {
        "ids": [
          "456"
        ],
        "status": "ERROR",
        "errorCode": "deviceTurnedOff"
      }
    ]
  }
}
Node.js
const {smarthome} = require('actions-on-google');
const app = smarthome();
// ...
app.onExecute((body, headers) => {
  // TODO Send command to device
  return {
    requestId: body.requestId,
    payload: {
      commands: [{
        ids: ["123"],
        status: "SUCCESS",
        states: {
          on: true,
          online: true
        }
      }, {
        ids: ["456"],
        status: "ERROR",
        errorCode: "deviceTurnedOff"
      }]
    }
  };
});
Java
@NotNull
@Override
public ExecuteResponse onExecute(
    @NotNull ExecuteRequest executeRequest, @Nullable Map<?, ?> map) {
  ExecuteResponse.Payload payload = new ExecuteResponse.Payload();

  payload.setCommands(
      new Commands[] {
        new Commands(
            new String[] {"123"},
            "SUCCESS",
            new HashMap<String, Object>() {
              {
                put("on", true);
                put("online", true);
              }
            },
            null,
            null),
        new Commands(new String[] {"456"}, "ERROR", null, "deviceTurnedOff", null)
      });
  return new ExecuteResponse(executeRequest.getRequestId(), payload);
}

Para mais informações, consulte a documentação de referência da intent EXECUTE.

Respostas de status

As respostas QUERY e EXECUTE incluem um campo status para informar o resultado da solicitação. Cada resposta de status pode fornecer um dos seguintes valores:

  • SUCCESS: a solicitação foi bem-sucedida.
  • OFFLINE: o dispositivo de destino está off-line ou não pode ser acessado.
  • EXCEPTIONS: há um problema ou alerta associado à solicitação.
  • ERROR: a solicitação falhou com o errorCode correspondente.

Para ERROR e EXCEPTIONS, consulte Lidar com erros e exceções e Erros e exceções para mais detalhes.