0
votes

I have problems with the discovery of devices of my Alexa Smart Home skill.

Steps which work:

  • activate Alexa skill
  • OAuth login screen appears. After successful login, the discovery of devices is triggered
  • in the lambda function I get the bearer token which I use to call the .../devices endpoint
  • I get the devices from the REST endpoint and construct the payload as described in https://developer.amazon.com/de/docs/smarthome/steps-to-build-a-smart-home-skill.html
  • The payload (same structure as in the example) is provided to context.succeed

My problem: After the Alexa Skill returns from discovery of devices task, no new devices are visible in the Alexa Skill.

When I use the code from the sample (where no request to an external Rest API happens), the device is visible in the Alexa skill after the Alexa discovery task.

var https = require('https');
const AWS = require('aws-sdk');

exports.handler = function(request, context) {
var options = {
	method: 'GET',
	hostname: 'xyz.azurewebsites.net',
	path: '/devices',
	headers: {
		Authorization: 'Bearer ' + request.directive.payload.scope.token,
		'Content-Type': 'application/json'
	}
};

var req = https.get(options, (response) => {
	var data = '';
	response.setEncoding('utf8');
	response.on('data', function(x) { data += x; } );
	response.on('error', console.error);
	response.on('end', () => {
		var dataObj = JSON.parse(data);
		console.log("Retrieved response: " + JSON.stringify(dataObj.items));

		const payload = {
		  "endpoints": []
		};
		dataObj.items.forEach(item => {
			const device = {
					"endpointId": item.id,
					"manufacturerName": item.manufacturer,
					"friendlyName": item.displayName,
					"description": item.description,
					"displayCategories": ["SWITCH"],
					"cookie": {
							"key1": "arbitrary key/value pairs for skill to reference this endpoint.",
							"key2": "There can be multiple entries",
							"key3": "but they should only be used for reference purposes.",
							"key4": "This is not a suitable place to maintain current endpoint state."
					},
					"capabilities":
					[
							{
								"type": "AlexaInterface",
								"interface": "Alexa",
								"version": "3"
							},
							{
									"interface": "Alexa.PowerController",
									"version": "3",
									"type": "AlexaInterface",
									"properties": {
											"supported": [{
													"name": "powerState"
											}],
											 "retrievable": true
									}
							}
					]
			};
			payload.endpoints.push(device);
		});
		console.log('payload ' + JSON.stringify(payload));

		var header = request.directive.header;
		header.name = "Discover.Response";
		console.log("DEBUG", "Discovery Response: ", JSON.stringify({ header: header, payload: payload }));
		//NEXT LINE IS EXECUTED WITHOUT ANY ERROR
		context.succeed({ event: { header: header, payload: payload } });
	});	
});
req.on('error', (e) => {
  console.log('problem with request: ' + e.message);
});
};
2

2 Answers

2
votes

I found the problem... The value of the property 'endpointId' contained a '@'. Then I changed the name to only letters, and it worked. Although in this article it says '@' can be used, the discovery of devices then has problems. Hope this answer helps others from wasting time...

1
votes

I found another cause for the same symptom: for the entity's additionalAttributes (manufacturer, model etc.), one cannot use non-English characters. You can actually use any character ASCII from 32 to 126 (space to tilde), but you cannot use the backslash. So, no accent characters (international or extended ASCII) allowed.

On the other hand, I could include a entity with '@' inside its endpointId. I cannot explain why you couldn't.