Alexa智能家居技巧:发现设备的问题

时间:2018-11-07 16:08:37

标签: node.js aws-lambda alexa alexa-skill

我在发现具有Alexa智能家居技能的设备时遇到问题。

可行的步骤:

我的问题: 从“发现设备”任务返回Alexa技能后,Alexa技能中将看不到新设备。

当我使用示例中的代码(不发生任何对外部Rest API的请求)时,在执行Alexa发现任务后,该设备就可以在Alexa技能中看到。

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 个答案:

答案 0 :(得分:1)

我发现了问题... 属性“ endpointId”的值包含“ @”。然后我将名称更改为仅字母,并且可以正常工作。 尽管在this article中说可以使用'@',但是发现设备存在问题。 希望这个答案可以帮助其他人避免浪费时间...

答案 1 :(得分:0)

我发现了相同症状的另一个原因:对于实体的AdditionalAttributes(制造商,模型等),不能使用非英文字符。实际上,您可以使用32到126之间的任何字符ASCII(空格到波浪号),但是不能使用反斜杠。因此,不允许使用任何重音符号(国际或扩展ASCII)。

另一方面,我可以在其endpointId中包含一个带有“ @”的实体。我无法解释为什么你不能。