Smart Home - Correct JSON to respond to EXECUTE when device is offline - actions-on-google

When i try to execute a command and that the device is offline, Assistant still tell me that the command as been successfully be done.
I don't have this problem when it's a QUERY request, but with EXECUTE...
This is my returned JSON:
{
"requestId": "XXXXXX",
"payload": {
"commands": [
{
"ids": [123],
"status": "ERROR",
"errorCode": "deviceTurnedOff",
"online": false
}
]
}
}
I have also try this:
{
"requestId": "XXXXXX",
"payload": {
"commands": [
{
"ids": [123],
"status": "OFFLINE",
"errorCode": "deviceTurnedOff",
"online": false
}
]
}
}
I expect that when i try to do a command on an offline device, google assistant tell me that the device is not available, but i have a Ok, i turn the light on instead.
So if you have any idea, because i have checked my JSON response 1 million times and read the documentation many times but i can't find my mistake.

The documentation here is a bit confusing because the example shows the response payload for the QUERY intent.
The response payload for an EXECUTE intent is slightly different and is documented here.
The JSON using the correct reference the EXECUTE response payload will look like:
{
"requestId": "XXXXXX",
"payload": {
"commands": [{
"ids": ["123"],
"status": "OFFLINE",
"errorCode": "deviceTurnedOff"
}]
}
}
Note: deviceId should be a string, as noted in the EXECUTE Response payload details.
Quoting from the doc:
ids: Array. Required. Partner device IDs of the response

Related

Telegram: no answer sent with answerInlineQuery

I make a POST request in response to an inline request with the following url
https://api.telegram.org/bot<some-token>/answerInlineQuery
and body
{
"inline_query_id": "${inline_query_id}",
"result": {
"InlineQueryResultArticle": [
{
"type": "article",
"id": "111",
"title": "some-title",
"input_message_content": {"message_text": "TEXT 1"}
}
]
}
}
Telegram responds 200 OK but there is no changes/answers in the bot.
I've also tried so many modifications of the body to sent. No one was successfull, but no one error I`ve got too.
Finally, this one works.
{
"inline_query_id": "${inline_query_id}",
"results": [{
"type": "article",
"id": "111",
"title": "some-title",
"input_message_content": {"message_text":"TEXT 1" }
}]
}
It needs results instead of result. And no definition of InlineQueryResultArticle

Watson assistant error "Http response code is [401]"

I created a very simple cloud function in IBM, that I try to call via Watson assistant. When I call it the error "Direct CloudFunctions call was not successful. Http response code is [401]" appears.
Underneath is the code I am using. "prodname" is taken from the user and sent to the function to get an answer. The function is working fine when I invoke it. I get the ID and password from https://cloud.ibm.com/openwhisk/learn/api-key.
{
"context": {
"credentials": {
"user": "userID",
"password": "password"
}
},
"output": {
"text": {
"values": [
"$answer"
]
}
},
"actions": [
{
"name": "arllambi%2540gmail.com_Only/Watson/MovieBot",
"type": "cloud_function",
"parameters": {
"prodname": "$prodname"
},
"result_variable": "answer",
"credentials": "$credentials"
}
]
}
Is it possible that there is some problem with the credentials?
Thanks in advance for any help.
****** reEDIT ******
As suggested by data_henrik I provide futher info. The function I am calling is the following, a very simple echo function:
function main(msg){
return {answer: "You said " +msg.prodname};
}
I changed the cloud_function to web_action, web_action works fine via postman:
{
"output": {
"text": {
"values": [
"$answer"
]
}
},
"actions": [
{
"name": "arllambi#gmail.com_Only/Watson/MovieBot.json",
"type": "web_action",
"parameters": {
"prodname": "<?input.text?>"
},
"result_variable": "context.answer"
}
]
}
The message I get now is "Direct CloudFunctions call was not successful. Http response code is [404]". Also the assistant answers "with {"cloud_functions_call_error":"The requested resource does not exist."}
AdriĆ 
Hi #data_henrik and thanks for the help. I did see the # and corrected it in the edited code, was giving the same problem. BUT I figured it out: the assistant was deployed in Washington... I moved it to London and now it works. Thanks again for the help and sorry for my newbie mistake...
My guess is that the org part in your action name is wrong. Try to replace any "#" with "%40". Else, it will be interpreted by Watson as something else. Next, after you update the dialog node, wait for some seconds for the changes to take effect.
I just tried something with my deployed web actions and could cause the 401 and 404.
"name": "arllambi%40gmail.com_Only/Watson/MovieBot.json"

Error "Empty speech response"

I tried to connect DialogFlow and Actions on Google, so I created some intents, connected the services, added explicit and implicit invocations etc, but when I try the bot in the simulator https://console.actions.google.com/project/[projectId]/simulator/ it always gives me the error:
"Failed to parse Dialogflow response into AppResponse, exception
thrown with message: Empty speech response"
even tough inputType was "KEYBOARD".
What I tried so far:
I did set "Response from this tab will be sent to the Google Assistant integration" in Dialog Flow (do you have to set it for every single intent?), but I don't see any extra setting for speech.
I disabled the second language, first I had also intents in German
I also turned off the Fullfillment Webhook (implemented in API v1 and then also v2) with no change
I only found this user with the same problem https://productforums.google.com/forum/#!topic/dialogflow/xYjKlz31yW0;context-place=topicsearchin/dialogflow/Empty$20speech$20response but no resolution.
the fulfillment checkbox is checked at the intents
The bot works fine when I use it through "Try it now" on the very right in Dialog Flow or in the Web Demo https://bot.dialogflow.com/994dda8b-4849-4a8a-ab24-c0cd03b5f420
Unfortunately the docs don't say anything about this error. Any ideas?
Here a screenshot of the error on the Actions integration:
This is the full debug output:
{
"agentToAssistantDebug": {
"agentToAssistantJson": {
"message": "Failed to parse Dialogflow response into AppResponse, exception thrown with message: Empty speech response",
"apiResponse": {
"id": "c12e1389-e887-49d4-b399-a332188ca946",
"timestamp": "2018-01-27T03:55:30.931Z",
"lang": "en-us",
"result": {},
"status": {
"code": 200,
"errorType": "success"
},
"sessionId": "1517025330705"
}
}
},
"assistantToAgentDebug": {
"assistantToAgentJson": {
"user": {
"userId": "USER_ID",
"locale": "en-US",
"lastSeen": "2018-01-27T03:55:03Z"
},
"conversation": {
"conversationId": "1517025330705",
"type": "NEW"
},
"inputs": [
{
"intent": "actions.intent.MAIN",
"rawInputs": [
{
"inputType": "KEYBOARD",
"query": "Talk to Mica, the Hipster Cat Bot"
}
]
}
],
"surface": {
"capabilities": [
{
"name": "actions.capability.MEDIA_RESPONSE_AUDIO"
},
{
"name": "actions.capability.WEB_BROWSER"
},
{
"name": "actions.capability.AUDIO_OUTPUT"
},
{
"name": "actions.capability.SCREEN_OUTPUT"
}
]
},
"isInSandbox": true,
"availableSurfaces": [
{
"capabilities": [
{
"name": "actions.capability.AUDIO_OUTPUT"
},
{
"name": "actions.capability.SCREEN_OUTPUT"
}
]
}
]
},
"curlCommand": "curl -v 'https://api.api.ai/api/integrations/google?token=TOKEN' -H 'Content-Type: application/json;charset=UTF-8' -H 'Google-Actions-API-Version: 2' -H 'Authorization: AUTH_TOKEN' -A 'Mozilla/5.0 (compatible; Google-Cloud-Functions/2.1; +http://www.google.com/bot.html)' -X POST -d '{\"user\":{\"userId\":\"USER_ID\",\"locale\":\"en-US\",\"lastSeen\":\"2018-01-27T03:55:03Z\"},\"conversation\":{\"conversationId\":\"1517025330705\",\"type\":\"NEW\"},\"inputs\":[{\"intent\":\"actions.intent.MAIN\",\"rawInputs\":[{\"inputType\":\"KEYBOARD\",\"query\":\"Talk to Mica, the Hipster Cat Bot\"}]}],\"surface\":{\"capabilities\":[{\"name\":\"actions.capability.MEDIA_RESPONSE_AUDIO\"},{\"name\":\"actions.capability.WEB_BROWSER\"},{\"name\":\"actions.capability.AUDIO_OUTPUT\"},{\"name\":\"actions.capability.SCREEN_OUTPUT\"}]},\"isInSandbox\":true,\"availableSurfaces\":[{\"capabilities\":[{\"name\":\"actions.capability.AUDIO_OUTPUT\"},{\"name\":\"actions.capability.SCREEN_OUTPUT\"}]}]}'"
},
"sharedDebugInfo": [
{
"name": "ResponseValidation",
"subDebugEntry": [
{
"debugInfo": "API Version 2: Failed to parse JSON response string with 'INVALID_ARGUMENT' error: \": Cannot find field.\".",
"name": "UnparseableJsonResponse"
}
]
}
]
}
Also "debugInfo" sounds like an internal problem:
"API Version 2: Failed to parse JSON response string with
'INVALID_ARGUMENT' error: \": Cannot find field.\"."
Here a screenshot of the welcome intent:
ps.
It took me AGES to figure out, what
"Query pattern is missing for custom intent"
means - so I just document it here: In Dialog Flow - Intent - "User says" you have to DOUBLE CLICK on a word in the text input field when you want to set it as query parameter - which seems to be required for Actions on Google.
This happened to me. If this happens for an Intent you just added in the Dialogflow console and you are using Webhook fulfillment for the action, check the intent's fulfillment settings and ensure that the Webhook fulfillment slider is on. Evidently new intents don't automatically get webhook fulfillment: you have to opt each one in piecemeal (or at least, that was my experience).
I experienced this situation too.
My problem was that I used a SimpleResponse in my fulfillment index.js without referencing to it. So the solution for me was to add SimpleResponse like this in index.js:
const {dialogflow, SimpleResponse} = require('actions-on-google');
So, always check if you aren't using any dependencies without including it in your js-file.
Probably not the most common cause of the problem, but it can be.
I got this when running through the codelabs tutorial (https://codelabs.developers.google.com/codelabs/actions-1/index.html#4) and didn't name my intent the same name as it is referenced in the webhook script:
I came across this error when trying to develop my own WebHook. I first verified that my code was called by looking into the Nginx log, after which I knew there was a problem in my JSON output because I based my output on outdated examples.
The (up-to-date) documentation for both V1 and V2 of the API can be found here:
https://dialogflow.com/docs/fulfillment/how-it-works
This example response for v2 of the dialogflow webhook API helped me to resolve this error:
{
"payload": {
"google": {
"expectUserResponse": true,
"richResponse": {
"items": [
{
"simpleResponse": {
"textToSpeech": "this is a simple response"
}
}
]
}
}
}
}
Source: https://github.com/dialogflow/fulfillment-webhook-json/blob/master/responses/v2/ActionsOnGoogle/RichResponses/SimpleResponse.json
You can find more examples in the official github repository linked above.
Another possibility is if you have a text response (even an empty one) like so:
Then you need to click the trash can next to the response to clear it out to use the webhook.
The Actions on Google support helped me fix this problem:
I needed to add a text as Default Response to the intent used for Explicit Invocation.

Error Response with Google Smart Home (Thermostat)

I am unable to understand the syntax of Json for errors
I have tried
return {
"requestId": self.request_id,
"payload": {
"commands": [{
"ids": [self.device_id],
"status": "OFFLINE",
"errorCode": "deviceTurnedOff"
}]
}
}
and
return {
"requestId": self.request_id,
"payload": {
"errorCode": "authFailure",
"commands": [{
"devices": [{
"ids": [self.device_id],
"status": "ERROR",
"errorCode": "deviceTurnedOff"
}]
}]
}
}
and
return {
"requestId": self.request_id,
"payload": {
"errorCode": self.error_code
}
}
none of above syntax are working, most of the time google home says that your actions is performed but I am returning error Json there.
I have read google actions documentation but failed to understand.
I have come up with a few payloads and have managed to get them successfully triggering errors using the AoG simulator after consulting the docs.
Node.js snippet:
let resBody = {
requestId: request.requestId,
payload: {
"errorCode": "notSupported"
}
}
response.status(200).json(resBody);
Are you sure that the requestId is the same from the smart home request? How are you testing these errors?

Facebook - Get All Messages from Page

Response from request for getting messages about specific conversation are returning just IDs from the all separate messages that are contained in that conversation. So, if I want to get all of the messages from all conversation, there will be a lot of request...
Are there any solution for getting all of the messages(text from messages) from specific conversation in one request? Or any other workaround for this kind of issue?
Here is the example:
Request: XXX?fields=subject,message_count,messages -> (where XXX are id of conversation)
Response:
{
"message_count": 4,
"id": "XXX",
"messages": {
"data": [
{
"created_time": "2016-05-11T08:29:56+0000",
"id": "id1"
},
{
"created_time": "2016-05-11T08:29:54+0000",
"id": "id2"
},
{
"created_time": "2016-05-11T08:21:56+0000",
"id": "id3"
},
{
"created_time": "2016-05-09T14:04:17+0000",
"id": "id4"
}
]
}
}
I suppose you are using the conversation details endpoint; have you tried using the /messages/edge of the same endpoint?
Try to rewrite your request as:
XXX/messages?fields=message,subject,to