daviemanchester
daviemanchester

Reputation: 109

Amazon Alexa Device Discovery for Smart Home API with Lambda Failing

I have setup an Alexa Smart Home Skill, all settings done, oauth2 processed done and skill is enabled on my Amazon Echo device. Lambda function is setup and linked to the skill. When I "Discover Devices" I can see the payload hit my Lambda function in the log. I am literally returning via the context.succeed() method the following JSON with a test appliance. However Echo tells me that it fails to find any devices.

{
  "header": {
    "messageId": "42e0bf9c-18e2-424f-bb11-f8a12df1a79e",
    "name": "DiscoverAppliancesResponse",
    "namespace": "Alexa.ConnectedHome.Discovery",
    "payloadVersion": "2"
  },
  "payload": {
    "discoveredAppliances": [
      {
        "actions": [
          "incrementPercentage",
          "decrementPercentage",
          "setPercentage",
          "turnOn",
          "turnOff"
        ],
        "applianceId": "0d6884ab-030e-8ff4-ffffaa15c06e0453",
        "friendlyDescription": "Study Light connected to Loxone Kit",
        "friendlyName": "Study Light",
        "isReachable": true,
        "manufacturerName": "Loxone",
        "modelName": "Spot"
      }
    ]
  }
}

Does the above payload look correct?

Upvotes: 5

Views: 2785

Answers (5)

Laurynas
Laurynas

Reputation: 175

I had the same problem. If you are creating discovery for "Entertainment Device", make sure you have wrapped the output in 'event' key for context.succeed

var payload = {
    endpoints:
        [
            {
                "endpointId": "My-id",
                "manufacturerName": "Manufacturer",
                "friendlyName": "Living room TV",
                "description": "65in LED TV from Demo AV Company",
                "displayCategories": [  ],
                "cookie": {
                    "data": "e.g. ip address",
                },
                "capabilities":
                    [

                        {
                            "interface": "Alexa.Speaker",
                            "version": "1.0",
                            "type": "AlexaInterface"
                        },

                    ]
            }
        ]
};
var header = request.directive.header;
header.name = "Discover.Response";
context.succeed({ event: {
    header: header, payload: payload
} });

Although, in the sample code, this is never mentioned and an incorrect example is given (https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/steps-to-create-a-smart-home-skill). However, the response body provided includes the "event" key.

Upvotes: 1

jotadepicas
jotadepicas

Reputation: 2493

According to https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/smart-home-skill-api-reference#discovery-messages the version attribute is required. Your response seems to be missing that attribute.

In my (very short) experience with this, even the smallest mistake in the response would generate a silent error like the one you are experiencing.

Upvotes: 2

XRAY Enabler
XRAY Enabler

Reputation: 201

Did you include the return statement in your function?

    return {
        "header": header,
        "payload": payload
    }

It was missing in the example and after adding it, I was able to 'discover' my device.

Upvotes: 0

master565
master565

Reputation: 795

Edit: Answer was wrong. Only useful information was this

This context.fail syntax is actually deprecated. Look up the Lambda context object properties, it should look more like "callback(null, resultObj)" now.

Upvotes: 0

rightaway717
rightaway717

Reputation: 2831

Recreating lambda function helped me fix the issue. I also set "Enable trigger" check button while creating, though I'm not sure if that matters. After that my device provided by skill was found successfully.

Upvotes: 0

Related Questions