Zapytanie i wykonanie

Gdy użytkownicy wchodzą w interakcję za pomocą polecenia Google Assistant, aby przesłać zapytanie o bieżący stan urządzenia, realizacja otrzymuje intencję action.devices.QUERY zawierającą listę identyfikatorów urządzeń (zgodnie z odpowiedzią SYNC). Realizacja 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 zbiór stanów dla każdej cechy obsługiwanej 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 intencji QUERY.

Obsługa intencji EXECUTE

Podobnie jak w przypadku QUERY, jedna intencja może kierować reklamy na wiele identyfikatorów urządzeń. Pojedyncza intencja EXECUTE może też zawierać wiele różnych poleceń wydanych grupie urządzeń. Na przykład intencja wyzwalana może na przykład ustawić jasność i kolor grupy świateł lub kilka różnych świateł dla każdego z nich. Po uruchomieniu Twoja odpowiedź EXECUTE powinna zwracać nowy stan urządzenia.

Używaj Report State, gdy stan urządzenia użytkownika się zmieni. np. z powodu zamiaru EXECUTE lub zmiany stanu lokalnego (np. ręcznego przełączenia przełącznika światła). Dzięki temu usługa Google Home Graph będzie synchronizowana z Twoją 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 zamiarów EXECUTE.

Odpowiedzi dotyczące stanu

Twoje odpowiedzi QUERY i EXECUTE zawierają pole status do raportowania wyniku żądania. Każda odpowiedź dotycząca stanu może zawierać jedną z tych wartości:

  • SUCCESS: żądanie zostało zrealizowane.
  • OFFLINE: urządzenie docelowe jest offline lub z innego powodu nieosiągalne.
  • EXCEPTIONS: z prośbą jest powiązany problem lub alert.
  • ERROR: nie udało się zrealizować żądania z odpowiednim elementem errorCode.

Więcej informacji na temat ERROR i EXCEPTIONS znajdziesz w sekcjach Obsługa błędów i wyjątków oraz Błędy i wyjątki.