شناسایی و همگام‌سازی

پس‌از ایجاد ادغام Cloud-to-cloud، مرحله بعدی افزودن عملکرد در اجرای شما برای پردازش اهداف خانه هوشمند و برگرداندن پاسخ‌هایی است که Google Assistant تشخیص می‌دهد.

شناسایی کاربر

‫Assistant با رمز دسترسی ارائه‌شده توسط سرور OAuth 2.0 شما در سرایند Authorization، درخواست‌هایی را برای smart home انجام کنش شما ارسال می‌کند.

POST /fulfillment HTTP/1.1
Host: smarthome.example.com
Content-Type: application/json
Authorization: Bearer ACCESS_TOKEN

پیش‌از پاسخ دادن به هر درخواستی، منطق انجام باید درستی‌سنجی کند که این اطلاعات اعتباری کد معتبر است و حساب کاربری مرتبط را تعیین کند. اگر کد دسترسی نامعتبر باشد، انجام درخواست شما باید خطای HTTP 401 Unauthorized برگرداند.

فهرست کردن دستگاه‌ها و قابلیت‌های آن‌ها

ابزارهای توصیه‌شده برای این تکلیف

Assistant قصد action.devices.SYNC را به انجام درخواست شما ارسال می‌کند تا فهرست دستگاه‌های منسوب به کاربر داده‌شده و قابلیت‌های آن‌ها را درخواست کند. اجرای شما باید شناسه یکتایی برای هر کاربر در فیلد agentUserId پاسخ SYNC برگرداند. این شناسه باید مقدار تغییرناپذیری داشته باشد تا کاربر را در سرویس ابری شما نشان دهد. توصیه نمی‌شود نشانی‌های ایمیل یا دیگر مشخصه‌ها را براساس تنظیماتی که کاربر می‌تواند تغییر دهد ارائه دهید.

فیلد devices پاسخ SYNC شما حاوی همه دستگاه‌هایی است که کاربر به Assistant اجازه داده است به آن‌ها دسترسی داشته باشد، انواع و ویژگی‌های که پشتیبانی می‌کنند، و مشخصه‌های لازم برای پیکربندی رفتار ویژگی برای آن دستگاه خاص.

هدف SYNC درطول پیوند دادن حساب یا زمانی که کاربر به‌صورت دستی دستگاه‌هایش را دوباره همگام‌سازی می‌کند راه‌اندازی می‌شود. اگر فهرست دستگاه‌های کاربران، ویژگی‌های پشتیبانی‌شده، یا مقادیر مشخصه تغییر کرد، از درخواست همگام‌سازی برای راه‌اندازی هدف SYNC جدید و گزارش کردن به‌روزرسانی‌ها به Google استفاده کنید.

درخواست
{
    "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
    "inputs": [{
      "intent": "action.devices.SYNC"
    }]
}
JSON
{
  "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf",
  "payload": {
    "agentUserId": "1836.15267389",
    "devices": [
      {
        "id": "123",
        "type": "action.devices.types.OUTLET",
        "traits": [
          "action.devices.traits.OnOff"
        ],
        "name": {
          "defaultNames": [
            "My Outlet 1234"
          ],
          "name": "Night light",
          "nicknames": [
            "wall plug"
          ]
        },
        "willReportState": false,
        "roomHint": "kitchen",
        "deviceInfo": {
          "manufacturer": "lights-out-inc",
          "model": "hs1234",
          "hwVersion": "3.2",
          "swVersion": "11.4"
        },
        "otherDeviceIds": [
          {
            "deviceId": "local-device-id"
          }
        ],
        "customData": {
          "fooValue": 74,
          "barValue": true,
          "bazValue": "foo"
        }
      },
      {
        "id": "456",
        "type": "action.devices.types.LIGHT",
        "traits": [
          "action.devices.traits.OnOff",
          "action.devices.traits.Brightness",
          "action.devices.traits.ColorSetting"
        ],
        "name": {
          "defaultNames": [
            "lights out inc. bulb A19 color hyperglow"
          ],
          "name": "lamp1",
          "nicknames": [
            "reading lamp"
          ]
        },
        "willReportState": false,
        "roomHint": "office",
        "attributes": {
          "colorModel": "rgb",
          "colorTemperatureRange": {
            "temperatureMinK": 2000,
            "temperatureMaxK": 9000
          },
          "commandOnlyColorSetting": false
        },
        "deviceInfo": {
          "manufacturer": "lights out inc.",
          "model": "hg11",
          "hwVersion": "1.2",
          "swVersion": "5.4"
        },
        "customData": {
          "fooValue": 12,
          "barValue": false,
          "bazValue": "bar"
        }
      }
    ]
  }
}
Node.js
const {smarthome} = require('actions-on-google');
const app = smarthome();
// ...
app.onSync((body, headers) => {
  // TODO Get devices for user
  return {
    requestId: body.requestId,
    payload: {
      agentUserId: "1836.15267389",
      devices: [{
        id: "123",
        type: "action.devices.types.OUTLET",
        traits: [
          "action.devices.traits.OnOff"
        ],
        name: {
          defaultNames: ["My Outlet 1234"],
          name: "Night light",
          nicknames: ["wall plug"]
        },
        willReportState: false,
        roomHint: "kitchen",
        deviceInfo: {
          manufacturer: "lights-out-inc",
          model: "hs1234",
          hwVersion: "3.2",
          swVersion: "11.4"
        },
        otherDeviceIds: [{
          deviceId: "local-device-id"
        }],
        customData: {
          fooValue: 74,
          barValue: true,
          bazValue: "foo"
        }
      }, {
        id: "456",
        type: "action.devices.types.LIGHT",
        traits: [
          "action.devices.traits.OnOff",
          "action.devices.traits.Brightness",
          "action.devices.traits.ColorSetting"
        ],
        name: {
          defaultNames: ["lights out inc. bulb A19 color hyperglow"],
          name: "lamp1",
          nicknames: ["reading lamp"]
        },
        willReportState: false,
        roomHint: "office",
        attributes: {
          colorModel: 'rgb',
          colorTemperatureRange: {
            temperatureMinK: 2000,
            temperatureMaxK: 9000
          },
          commandOnlyColorSetting: false
        },
        deviceInfo: {
          manufacturer: "lights out inc.",
          model: "hg11",
          hwVersion: "1.2",
          swVersion: "5.4"
        },
        customData: {
          fooValue: 12,
          barValue: false,
          bazValue: "bar"
        }
      }]
    }
  };
});
Java
@NotNull
@Override
public SyncResponse onSync(@NotNull SyncRequest syncRequest, @Nullable Map<?, ?> map) {
  Payload payload = new Payload();
  payload.setAgentUserId("1836.15267389");
  payload.setDevices(
      new Device[] {
        new Device.Builder()
            .setId("123")
            .setType("action.devices.types.OUTLET")
            .addTrait("action.devices.traits.OnOff")
            .setName(
                Collections.singletonList("My Outlet 1234"),
                "Night light",
                Collections.singletonList("Wall plug"))
            .setWillReportState(true)
            .setDeviceInfo("lights-out-inc", "hs1234", "3.2", "11.4")
            .setCustomData(
                new JSONObject()
                    .put("fooValue", 74)
                    .put("barValue", true)
                    .put("bazValue", "foo"))
            .build(),
        new Device.Builder()
            .setId("456")
            .setType("action.devices.types.LIGHT")
            .addTrait("action.devices.traits.OnOff")
            .addTrait("action.devices.traits.Brightness")
            .addTrait("action.devices.traits.ColorTemperature")
            .addTrait("action.devices.traits.ColorSpectrum")
            .setName(
                Collections.singletonList("Lights Out Inc. bulb A19 color hyperglow"),
                "Lamp",
                Collections.singletonList("Reading lamp"))
            .setWillReportState(true)
            .setDeviceInfo("Lights Out Inc.", "hg11", "1.2", "5.4")
            .setCustomData(
                new JSONObject()
                    .put("fooValue", 12)
                    .put("barValue", false)
                    .put("bazValue", "bar"))
            .build(),
      });
  return new SyncResponse(syncRequest.getRequestId(), payload);
}

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