پرس و جو کنید و اجرا کنید

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

مدیریت اهداف 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"
          }
        }]
      }
    }]
}
جی‌سون
{
  "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
        }
      }
    }
  }
}
نود جی اس
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
          }
        }
      }
    }
  };
});
جاوا
@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);
}

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

مدیریت اهداف EXECUTE

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

از Report State زمانی استفاده کنید که وضعیت دستگاه کاربران تغییر کند. برای مثال، به دلیل یک EXECUTE intent یا تغییر وضعیت محلی (مانند روشن کردن دستی کلید برق). این کار باعث می‌شود 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
            }
          }]
        }]
      }
    }]
}
جی‌سون
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "commands": [
      {
        "ids": [
          "123"
        ],
        "status": "SUCCESS",
        "states": {
          "on": true,
          "online": true
        }
      },
      {
        "ids": [
          "456"
        ],
        "status": "ERROR",
        "errorCode": "deviceTurnedOff"
      }
    ]
  }
}
نود جی اس
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 intent مراجعه کنید.

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

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

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

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