Sau khi bạn tạo một chế độ tích hợp Cloud-to-cloud, bước tiếp theo là thêm chức năng trong quá trình thực hiện để xử lý ý định cho nhà thông minh và trả về các phản hồi mà Google Assistant nhận dạng được.
Xác định người dùng
Assistant đưa ra các yêu cầu cho việc thực hiện Hành động smart home bằng mã truy cập do máy chủ OAuth 2.0 cung cấp trong tiêu đề Authorization
.
POST /fulfillment HTTP/1.1 Host: smarthome.example.com Content-Type: application/json Authorization: Bearer ACCESS_TOKEN
Trước khi phản hồi bất kỳ yêu cầu nào, logic thực hiện của bạn phải xác minh rằng thông tin xác thực bằng mã thông báo này là hợp lệ và xác định tài khoản người dùng được liên kết. Nếu mã thông báo truy cập không hợp lệ, thì phương thức thực hiện sẽ trả về lỗi 401 Unauthorized
HTTP.
Liệt kê các thiết bị và chức năng của thiết bị
Assistant gửi ý định action.devices.SYNC
đến phương thức thực hiện để yêu cầu danh sách thiết bị liên kết với người dùng nhất định và chức năng của họ. Phương thức thực hiện của bạn phải trả về một mã nhận dạng duy nhất cho mỗi người dùng trong trường agentUserId
của phản hồi SYNC
. Mã nhận dạng này phải là một giá trị không thể thay đổi để đại diện cho người dùng với dịch vụ đám mây của bạn. Bạn không nên cung cấp địa chỉ email hoặc các thuộc tính khác dựa trên chế độ cài đặt mà người dùng có thể thay đổi.
Trường devices
của phản hồi SYNC
chứa tất cả thiết bị mà người dùng đã uỷ quyền cho Assistant truy cập, các loại và đặc điểm mà chúng hỗ trợ, cũng như các thuộc tính cần thiết để định cấu hình hành vi của đặc điểm cho thiết bị cụ thể đó.
Ý định SYNC
được kích hoạt trong quá trình liên kết tài khoản hoặc khi người dùng đồng bộ hoá lại thiết bị theo cách thủ công. Nếu danh sách thiết bị, các đặc điểm được hỗ trợ hoặc giá trị thuộc tính của người dùng thay đổi, hãy sử dụng Yêu cầu đồng bộ hoá để kích hoạt ý định SYNC
mới và báo cáo nội dung cập nhật cho 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); }
Để biết thêm thông tin, hãy xem tài liệu tham khảo về ý định SYNC
.