Cuando los usuarios interactúan con Google Assistant para consultar el estado actual de un dispositivo, tu entrega recibe un intent action.devices.QUERY
que contiene una lista de IDs de dispositivos (según lo proporciona tu respuesta de SYNC
).
Tu acción de cumplimiento recibe una intención action.devices.EXECUTE
cuando los usuarios envían comandos a Assistant para controlar tu dispositivo.
Cómo controlar intents de QUERY
Tu respuesta de QUERY
incluye un conjunto completo de estados para cada uno de los rasgos admitidos por los dispositivos solicitados.
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.QUERY", "payload": { "devices": [{ "id": "123", "customData": { "fooValue": 74, "barValue": true, "bazValue": "foo" } }, { "id": "456", "customData": { "fooValue": 12, "barValue": false, "bazValue": "bar" } }] } }] }
JSON
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "devices": { "123": { "on": true, "online": true }, "456": { "on": true, "online": true, "brightness": 80, "color": { "name": "cerulean", "spectrumRGB": 31655 } } } } }
Node.js
const {smarthome} = require('actions-on-google'); const app = smarthome(); // ... app.onQuery((body, headers) => { // TODO Get device state return { requestId: body.requestId, payload: { devices: { 123: { on: true, online: true }, 456: { on: true, online: true, brightness: 80, color: { name: "cerulean", spectrumRGB: 31655 } } } } }; });
Java
@NotNull @Override public QueryResponse onQuery(@NotNull QueryRequest queryRequest, @Nullable Map<?, ?> map) { QueryResponse.Payload payload = new QueryResponse.Payload(); payload.setDevices( new HashMap<String, Map<String, Object>>() { { put( "123", new HashMap<String, Object>() { { put("on", true); put("online", true); } }); put( "456", new HashMap<String, Object>() { { put("on", true); put("online", true); put("brightness", 80); put( "color", new HashMap<String, Object>() { { put("name", "cerulean"); put("spectrumRGB", 31655); } }); } }); } }); return new QueryResponse(queryRequest.getRequestId(), payload); }
Para obtener más información, consulta la documentación de referencia de la intención QUERY
.
Cómo controlar intents de EXECUTE
Al igual que con QUERY
, una sola intención puede segmentarse para varios IDs de dispositivos. Un solo intent EXECUTE
también puede contener varios comandos distintos que se dan a un grupo de dispositivos. Por ejemplo, un intent activado puede establecer el brillo y el color en un grupo de luces, o bien establecer cada luz en un color diferente. Tu respuesta de EXECUTE
debe devolver el nuevo estado del dispositivo después de la ejecución.
Usa Report State cuando cambie el estado del dispositivo del usuario. Por ejemplo, debido a una intención de EXECUTE
o a un cambio de estado local (como accionar manualmente un interruptor de luz).
Esto mantiene Google Home Graph sincronizado con tu servicio en la nube.
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "inputs": [{ "intent": "action.devices.EXECUTE", "payload": { "commands": [{ "devices": [{ "id": "123", "customData": { "fooValue": 74, "barValue": true, "bazValue": "sheepdip" } }, { "id": "456", "customData": { "fooValue": 36, "barValue": false, "bazValue": "moarsheep" } }], "execution": [{ "command": "action.devices.commands.OnOff", "params": { "on": true } }] }] } }] }
JSON
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [ { "ids": [ "123" ], "status": "SUCCESS", "states": { "on": true, "online": true } }, { "ids": [ "456" ], "status": "ERROR", "errorCode": "deviceTurnedOff" } ] } }
Node.js
const {smarthome} = require('actions-on-google'); const app = smarthome(); // ... app.onExecute((body, headers) => { // TODO Send command to device return { requestId: body.requestId, payload: { commands: [{ ids: ["123"], status: "SUCCESS", states: { on: true, online: true } }, { ids: ["456"], status: "ERROR", errorCode: "deviceTurnedOff" }] } }; });
Java
@NotNull @Override public ExecuteResponse onExecute( @NotNull ExecuteRequest executeRequest, @Nullable Map<?, ?> map) { ExecuteResponse.Payload payload = new ExecuteResponse.Payload(); payload.setCommands( new Commands[] { new Commands( new String[] {"123"}, "SUCCESS", new HashMap<String, Object>() { { put("on", true); put("online", true); } }, null, null), new Commands(new String[] {"456"}, "ERROR", null, "deviceTurnedOff", null) }); return new ExecuteResponse(executeRequest.getRequestId(), payload); }
Para obtener más información, consulta la documentación de referencia de la intención EXECUTE
.
Respuestas de estado
Tus respuestas QUERY
y EXECUTE
incluyen un campo status
para informar el resultado de la solicitud. Cada respuesta de estado puede proporcionar uno de los siguientes valores:
SUCCESS
: La solicitud se realizó correctamente.OFFLINE
: El dispositivo de destino está sin conexión o no se puede acceder a él.EXCEPTIONS
: Hay un problema o una alerta asociados con la solicitud.ERROR
: La solicitud falló con elerrorCode
correspondiente.
Para ERROR
y EXCEPTIONS
, consulta Controla errores y excepciones y Errores y excepciones para obtener más detalles.