אחרי שיצרתם את הפעולה 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
לפני שאתם מגיבים לבקשות, צריך לוודא שפרטי הכניסה של האסימון תקפים ולקבוע את חשבון המשתמש המשויך. אם אסימון הגישה לא תקין, מילוי הבקשה אמור להחזיר שגיאת 401 Unauthorized
HTTP.
רישום מכשירים והיכולות שלהם
Assistant שולח Intent אל
action.devices.SYNC
כדי לבקש את רשימת המכשירים שמשויכים למשתמש הנתון ואת היכולות שלו. מילוי הבקשה חייב להחזיר מזהה ייחודי לכל משתמש בשדה agentUserId
של התשובה SYNC
. המזהה הזה צריך להיות ערך שלא ניתן לשינוי, לייצוג המשתמש בשירות הענן. לא מומלץ לספק כתובות אימייל או מאפיינים אחרים על סמך הגדרות שהמשתמש יכול לשנות.
השדה devices
בתגובה SYNC
מכיל את כל המכשירים שהמשתמש העניק ל-Assistant גישה אליהם, את הסוגים והתכונות שבהם הם תומכים, ואת המאפיינים הנדרשים כדי להגדיר את ההתנהגות של התכונה במכשיר הספציפי הזה.
Intent SYNC
מופעל במהלך קישור החשבונות או כשמשתמש מסנכרן מחדש באופן ידני את המכשירים שלו. אם רשימת המכשירים, התכונות הנתמכות או ערכי המאפיינים של המשתמשים משתנים, יש להשתמש באפשרות Request 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
.