אחרי שיוצרים שילוב של Cloud-to-cloud, השלב הבא הוא להוסיף פונקציונליות לשרשור הפעולות (fulfillment) כדי לעבד את הכוונות (intents) של הבית החכם ולהחזיר תשובות ש-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 שולח action.devices.SYNC
כוונה (intent) לשירותי המילוי כדי לבקש את רשימת המכשירים המשויכים למשתמש הנתון ואת היכולות שלהם. המערכת שתבצעו את ההטמעה שלה צריכה להחזיר מזהה ייחודי לכל משתמש בשדה agentUserId
בתגובה SYNC
. המזהה הזה חייב להיות ערך שלא ניתן לשינוי כדי לייצג את המשתמש בשירות הענן. לא מומלץ לספק כתובות אימייל או מאפיינים אחרים על סמך הגדרות שהמשתמש יכול לשנות.
השדה devices
בתגובה SYNC
מכיל את כל המכשירים שהמשתמש העניק ל-Assistant הרשאת גישה אליהם, את הסוגים והמאפיינים שהם תומכים בהם ואת המאפיינים הנדרשים כדי להגדיר את התנהגות המאפיין במכשיר הספציפי הזה.
הכוונה SYNC
מופעלת במהלך קישור החשבון או כשמשתמש מסנכרן ידנית את המכשירים שלו. אם רשימת המכשירים של המשתמשים, המאפיינים הנתמכים או ערכי המאפיינים משתנים, צריך להשתמש ב-Request 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
.