Witamy w Google Home Developer Center – nowym miejscu, gdzie możesz dowiedzieć się, jak tworzyć inteligentne działania domowe. Uwaga: nadal będziesz tworzyć działania w konsoli Actions.

Zapytanie i wykonanie

Gdy użytkownicy wchodzą w interakcję z Google Assistant, aby wysłać zapytanie dotyczące bieżącego stanu urządzenia, Twoja realizacja otrzymuje intencję action.devices.QUERY zawierającą listę identyfikatorów urządzeń (dostarczoną przez odpowiedź SYNC). Gdy użytkownik wyśle polecenia do Assistant, aby sterować urządzeniem, otrzyma ona intencję action.devices.EXECUTE.

Obsługa QUERY intencji

Odpowiedź QUERY zawiera pełny zestaw stanów dla wszystkich cech obsługiwanych przez żądane urządzenia.

Żądanie
{
    "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 dotyczącej intencji QUERY.

Obsługa EXECUTE intencji

Tak jak QUERY, jedna intencja może być kierowana na wiele identyfikatorów urządzeń. Pojedyncza intencja EXECUTE może też zawierać różne różne polecenia kierowane do grupy urządzeń. Na przykład aktywowana intencja może ustawić jasność i kolor grupy oświetlenia lub ustawić dla każdego z nich inny kolor. Odpowiedź EXECUTE powinna zwrócić nowy stan urządzenia po wykonaniu.

Użyj Report State, gdy zmieni się stan urządzenia użytkownika. Na przykład ze względu na zamiar EXECUTE lub zmianę stanu lokalnego (np. ręczne przesuwanie przełącznika oświetlenia). Dzięki temu Google Home Graph będzie zsynchronizowany z usługą w chmurze.

Żądanie
{
    "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 dotyczącej intencji EXECUTE.

Odpowiedzi w sekcji Stan

Twoje odpowiedzi QUERY i EXECUTE zawierają pole status, by zgłosić wynik żądania. Każda odpowiedź stanu może mieć jedną z tych wartości:

  • SUCCESS: prośba została zrealizowana.
  • OFFLINE: urządzenie docelowe jest offline lub z innego powodu nieosiągalne.
  • EXCEPTIONS: z żądaniem jest powiązany problem lub alert.
  • ERROR: nie udało się wysłać żądania dla odpowiedniego parametru errorCode.

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