When devices or requests don't work as expected, it is important to provide good error handling and communication for your users so they understand what happened, and whenever possible, how to correct it. Make sure you think through possible failure scenarios and how your device should respond: What if a user interrupts a task in progress? What if a user requests an action from a device while it is offline? Planning for these issues and helping your user recover from them can avoid user frustration and creates a higher quality experience for your devices.
This guide provides some examples of intent responses that handle errors. See
the Errors and exceptions to
review the valid errorCode values for error and exceptions.
Example 1: Error response for EXECUTE intent
An end user has two smart lights installed in their living room. The user
issues a command "turn on living room lights" and Google sent an EXECUTE
intent to your fulfillment URL. You found that the user's devices are offline
and not controllable, so your fulfillment returns an EXECUTE response with
status ERROR and errorCode deviceOffline.
This example demonstrates how to return an EXECUTE response with an
errorCode from a light device as described earlier:
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [ { "ids": [ "light-device-id-1" ], "status": "ERROR", "errorCode": "deviceOffline" }, { "ids": [ "light-device-id-2" ], "status": "ERROR", "errorCode": "deviceOffline" } ] } }
The Google Assistant prompts the user with "the device are
not available right now" after receiving the response. Remember that you still
need to send offline state for devices in report state after sending
errorCode deviceOffline in EXECUTE response.
Example 2: Non-blocking exception for EXECUTE intent
A user tries to lock the smart lock on their front door using
Assistant. You can successfully control their lock but
you find the device battery is low, so your fulfillment returns an EXECUTE
response with status SUCCESS and exceptionCode lowBattery.
This example demonstrates how to send a EXECUTE response with an
exceptionCode from a lock device as described earlier:
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "payload": { "commands": [{ "ids": ["lock-device-id-1"], "status": "SUCCESS", "states": { "on": true, "online": true, "isLocked": true, "isJammed": false, "exceptionCode": "lowBattery" } }] } }
The Assistant prompts user with "the device has low battery" after receiving the response.
Example 3: Proactive error notifications
In some cases, it can be helpful to alert users to an error, particularly for functions that are users expect to complete automatically. For traits that support proactive notifications, you can proactively notify the user while an error happens if you have implemented smart home proactive notifications.
A smart dryer is running, and someone opens the door before the cycle finishes.
You can call the Google Home Graph API
reportStateAndNotifications method to send a proactive notification with an
errorCode:
This example demonstrates how to send a proactive notification with an
errorCode from a dryer device as described earlier:
POST https://homegraph.googleapis.com/v1/devices:reportStateAndNotification
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "agentUserId": "agent-user-id", "eventId": "unique-event-id", "payload": { "devices": { "notifications": { "dryer-device-id": { "RunCycle": { "priority": 0, "status": "FAILURE", "errorCode": "deviceDoorOpen" } } }, "states": { "dryer-device-id": { "isRunning": false, "isPaused": true } } } } }
The Assistant prompts the user with "the device door is opened" after receiving the notification. You can send the corresponding device states alongside notifications in the same payload.
Example 4: Follow-up notification
For traits commands that support follow-up notifications, you can send a follow-up notification to the user while an error or an exception happens, if you have implemented smart home follow-up notifications.
A user issues a command to close their garage door, but the door is jammed
while closing. You can send a follow-up notification with an errorCode:
POST https://homegraph.googleapis.com/v1/devices:reportStateAndNotification
{ "requestId": "ff36a3cc-ec34-11e6-b1a0-64510650abcf", "agentUserId": "agent-user-id", "eventId": "unique-event-id", "payload": { "devices": { "notifications": { "door-device-id": { "LockUnlock": { "priority": 0, "followUpResponse": { "status": "FAILURE", "errorCode": "deviceJammingDetected", "followUpToken": "follow-up-token-1" } } } }, "states": { "door-device-id": { "openPercent": 70 } } } } }
The Assistant prompts the user with "the device is jammed" after receiving the notification. You can send the corresponding device states with notifications in the same payload.
For more information and detailed errorCodes, see the
Errors and exceptions
reference documentation.