Умение умного дома Alexa: проблема с обнаружением устройств - PullRequest
0 голосов
/ 07 ноября 2018

У меня проблемы с обнаружением устройств моего умения Alexa Smart Home.

Шаги, которые работают:

  • активировать навык Алекса
  • Появляется экран входа OAuth. После успешного входа в систему происходит обнаружение устройств
  • в лямбда-функции я получаю токен на предъявителя, который я использую для вызова конечной точки ... / devices
  • Я получаю устройства от конечной точки REST и создаю полезную нагрузку, как описано в https://developer.amazon.com/de/docs/smarthome/steps-to-build-a-smart-home-skill.html
  • Полезная нагрузка (та же структура, что и в примере) предоставляется context.succeed

Моя проблема: После возвращения Alexa Skill из задачи обнаружения устройств новые устройства в Alexa Skill не видны.

Когда я использую код из примера (когда не происходит запроса на внешний API Rest), устройство отображается в навыке 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);
});
};

1 Ответ

0 голосов
/ 08 ноября 2018

Я нашел проблему ... Значение свойства 'endpointId' содержит '@'. Затем я изменил название только на буквы, и это сработало. Хотя в этой статье говорится, что можно использовать '@', обнаружение устройств в этом случае вызывает проблемы. Надеюсь, что этот ответ помогает другим тратить время ...

...