Zapytanie i wykonanie

Gdy użytkownicy korzystają z funkcji Google Assistant, aby sprawdzić bieżący stan urządzenia, Twoja usługa realizacja otrzymuje intencję action.devices.QUERY zawierającą listę identyfikatorów urządzeń (podanych w odpowiedzi SYNC). Twoja usługa otrzymuje intencję action.devices.EXECUTE, gdy użytkownicy wysyłają polecenia do Assistant, aby sterować urządzeniem.

Obsługa intencji QUERY

Odpowiedź QUERY zawiera pełny zestaw stanów dla każdego z atrybutów obsługiwanych przez żądane urządzenia.

Prośba
{
    "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);
}

Więcej informacji znajdziesz w dokumentacji referencyjnej dotyczącej intencji QUERY.

Obsługa intencji EXECUTE

Podobnie jak w przypadku QUERY, pojedynczy zamiar może być kierowany na wiele identyfikatorów urządzeń. Pojedyncza intencja EXECUTE może też zawierać wiele różnych poleceń przekazanych grupie urządzeń. Na przykład wywołana intencja może ustawiać zarówno jasność, jak i kolor dla grupy świateł, lub ustawiać dla każdego z nich inny kolor. Odpowiedź EXECUTE powinna zwracać nowy stan urządzenia po wykonaniu operacji.

Użyj Report State, gdy zmieni się stan urządzenia użytkownika. Na przykład z powodu zamiaru EXECUTElub zmiany stanu lokalnego (np. ręcznego włączenia światła). Dzięki temu usługa Google Home Graph będzie synchronizowana z usługą w chmurze.

Prośba
{
    "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);
}

Więcej informacji znajdziesz w dokumentacji referencyjnej dotyczącej intencji EXECUTE.

Odpowiedzi dotyczące stanu

Odpowiedzi na żądania QUERYEXECUTE zawierają pole status, w którym podano wynik wykonania żądania. Każda odpowiedź stanu może zawierać jedną z tych wartości:

  • SUCCESS: prośba została zrealizowana.
  • OFFLINE: urządzenie docelowe jest offline lub niedostępne.
  • EXCEPTIONS: wystąpił problem lub alert związany z prośbą.
  • ERROR: prośba zakończyła się niepowodzeniem z odpowiednim errorCode.

Więcej informacji o elementach ERROREXCEPTIONS znajdziesz w artykułach Przetwarzanie błędów i wyjątków oraz Błędy i wyjątki.