เมื่อสร้างการดําเนินการ smart home แล้ว ขั้นตอนต่อไปคือเพิ่มฟังก์ชันในการตอบสนองเพื่อดําเนินการ Intent ของบ้านอัจฉริยะและการตอบสนองที่ Google Assistant จดจํา
เพื่อให้การพัฒนาง่ายขึ้นระบุผู้ใช้
Assistant จะส่งคําขอไปยังการดําเนินการของ smart home ที่ดําเนินการด้วยโทเค็นเพื่อการเข้าถึงที่เซิร์ฟเวอร์ OAuth 2.0 กําหนดไว้ในส่วนหัว Authorization
POST /fulfillment HTTP/1.1 Host: smarthome.example.com Content-Type: application/json Authorization: Bearer ACCESS_TOKEN
ก่อนตอบสนองคําขอใดๆ ตรรกะการดําเนินการตามคําสั่งซื้อควรยืนยันว่าข้อมูลรับรองของโทเค็นนี้ถูกต้องและกําหนดบัญชีผู้ใช้ที่เชื่อมโยง หากโทเค็นเพื่อการเข้าถึงไม่ถูกต้อง การดําเนินการตามคําสั่งซื้อควรแสดงข้อผิดพลาด HTTP 401 Unauthorized
แสดงรายการอุปกรณ์และความสามารถของอุปกรณ์
Assistant จะส่ง Intent ของ action.devices.SYNC
ไปยังดําเนินการตามคําสั่งซื้อเพื่อขอรายการอุปกรณ์ที่เชื่อมโยงกับผู้ใช้และความสามารถนั้นๆ การดําเนินการตามคําสั่งซื้อต้องส่งรหัสที่ไม่ซ้ํากันสําหรับผู้ใช้แต่ละคนในช่อง agentUserId
ของการตอบกลับ SYNC
รหัสนี้ต้องเป็นค่าที่เปลี่ยนแปลงไม่ได้เพื่อแสดงถึงผู้ใช้กับบริการระบบคลาวด์ของคุณ เราไม่แนะนําให้ระบุที่อยู่อีเมลหรือแอตทริบิวต์อื่นๆ ตามการตั้งค่าที่ผู้ใช้สามารถเปลี่ยนแปลงได้
ช่อง devices
ของการตอบกลับ SYNC
ประกอบด้วยอุปกรณ์ทั้งหมดที่ผู้ใช้ให้สิทธิ์ Assistant ในการเข้าถึง ประเภทและลักษณะเฉพาะ ที่รองรับ และแอตทริบิวต์ที่จําเป็นในการกําหนดค่าลักษณะนิสัยของอุปกรณ์นั้น
Intent ของ SYNC
จะทริกเกอร์ในระหว่างการลิงก์บัญชีหรือเมื่อผู้ใช้ซิงค์อุปกรณ์ด้วยตนเองอีกครั้ง หากรายการอุปกรณ์ของผู้ใช้ ลักษณะที่รองรับ หรือค่าแอตทริบิวต์มีการเปลี่ยนแปลง ให้ใช้ขอการซิงค์เพื่อเรียกใช้ Intent ใหม่ของ 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); }
ดูข้อมูลเพิ่มเติมได้ในเอกสารอ้างอิง Intent ของ SYNC