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

وقتی کاربران با 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
          }
        }
      }
    }
  };
});
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("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"
      }]
    }
  };
});
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);
}

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

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

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

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

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