پُرسمان و اجرا

وقتی کاربران با Google Assistant تعامل می‌کنند تا وضعیت فعلی دستگاهی را پُرسمان کنند، اجرای شما قصد action.devices.QUERY را که حاوی فهرستی از شناسه‌های دستگاه است (همان‌طور که در پاسخ SYNC شما ارائه شده است) دریافت می‌کند. وقتی کاربران برای کنترل دستگاهتان به Assistant فرمان ارسال می‌کنند، تحقق شما قصد action.devices.EXECUTE را دریافت می‌کند.

مدیریت کردن QUERY هدف

پاسخ QUERY شما شامل مجموعه کاملی از حالت‌ها برای هریک از ویژگی‌های پشتیبانی‌شده توسط دستگاه‌های درخواست‌شده است.

درخواست
{
    "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,
        "status": "SUCCESS"
      },
      "456": {
        "on": true,
        "online": true,
        "status": "SUCCESS",
        "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,
          status: "SUCCESS"
        },
        456: {
          on: true,
          online: true,
          status: "SUCCESS",
          brightness: 80,
          color: {
            name: "cerulean",
            spectrumRGB: 31655
          }
        }
      }
    }
  };
});
جاوا
@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("status", "SUCCESS");
                }
              });
          put(
              "456",
              new HashMap<String, Object>() {
                {
                  put("on", true);
                  put("online", true);
                  put("status", "SUCCESS");
                  put("brightness", 80);
                  put(
                      "color",
                      new HashMap<String, Object>() {
                        {
                          put("name", "cerulean");
                          put("spectrumRGB", 31655);
                        }
                      });
                }
              });
        }
      });

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

برای اطلاعات بیشتر، به سند مرجع هدف QUERY مراجعه کنید.

رسیدگی به EXECUTE هدف

مشابه QUERY، یک هدف می‌تواند چندین شناسه دستگاه را هدف‌یابی کند. یک EXECUTE قصد ممکن است شامل چندین فرمان متمایز باشد که به گروهی از دستگاه‌ها داده شده است. برای مثال، یک قصد راه‌اندازی‌شده ممکن است هم روشنایی و هم رنگ را روی گروهی از چراغ‌ها تنظیم کند، یا چندین چراغ را هرکدام روی رنگ متفاوتی تنظیم کند. پاسخ EXECUTE شما باید وضعیت جدید دستگاه را پس‌از اجرا برگرداند.

وقتی وضعیت دستگاه کاربر تغییر می‌کند، از Report State استفاده کنید. برای مثال، به‌دلیل EXECUTE قصد یا تغییر وضعیت محلی (مثل زدن دستی کلید چراغ). این کار Google Home Graph را با سرویس ابری شما همگام‌سازی می‌کند.

درخواست
{
    "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"
      }]
    }
  };
});
جاوا
@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);
}

برای اطلاعات بیشتر، به سند مرجع هدف EXECUTE مراجعه کنید.

پاسخ‌های وضعیت

پاسخ‌های QUERY و EXECUTE شما شامل فیلد status برای گزارش نتیجه درخواست است. هر پاسخ وضعیت می‌تواند یکی از مقادیر زیر را ارائه دهد:

  • ‫SUCCESS: درخواست با موفقیت انجام شد.
  • ‫OFFLINE: دستگاه هدف آفلاین است یا به هر دلیل دیگری دردسترس نیست.
  • ‫EXCEPTIONS: مشکل یا هشداری دررابطه‌با درخواست وجود دارد.
  • ERROR: درخواست با errorCode مربوطه ناموفق بود.

برای ERROR و EXCEPTIONS، به رسیدگی به خطاها و استثناها و خطاها و استثناها برای جزئیات بیشتر مراجعه کنید.