Мы продолжаем играть с Алекса. На этот раз я хочу создать один навык, который использует совместимое устройство (например, один Raspberry Pi 3 ). Здесь вы можете увидеть документацию и примеры, которые люди из Alexa предоставляют нам . По сути, нам нужно создать новый гаджет Product / Alexa в консоли. Это дает нам один amazonId и alexaGadgetSecret.
Вам также может понравиться:
Учебное пособие по умному дому: ESP8266, Alexa и Amazon Echo
Затем нам нужно установить SDK в нашем Raspberry Pi (он устанавливает несколько библиотек Python). Затем мы можем создать наш скрипт гаджета, работающий на Raspberry Pi, используя AmazonId и alexaGadgetSecret. Мы можем прослушать несколько событий Alexa. Например: когда мы говорим wakeword, с таймером, будильником, а также мы можем создавать наши собственные события.
Я собираюсь создать один навык, который позволит мне сказать что-то вроде: «Алекса, используйте демонстрацию устройства и установите цвет на зеленый» или «Алекса, используйте демонстрацию устройства и установите цвет на красный», и я добавлю этот цвет в светодиодная матрица, которая у меня есть (одна Raspberry Pi Sense Hat)
Это скрипт Python:
питон
1
import logging
2
import sys
3
import json
4
from agt import AlexaGadget
5
from sense_hat import SenseHat
6
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
8
logger = logging.getLogger(__name__)
9
sense = SenseHat()
11
sense.clear()
12
RED = [255, 0, 0]
14
GREEN = [0, 255, 0]
15
BLUE = [0, 0, 255]
16
YELLOW = [255, 255, 0]
17
BLACK = [0, 0, 0]
18
class Gadget(AlexaGadget):
20
def on_alexa_gadget_statelistener_stateupdate(self, directive):
21
for state in directive.payload.states:
22
if state.name == 'wakeword':
23
sense.clear()
24
if state.value == 'active':
25
sense.show_message("Alexa", text_colour=BLUE)
26
def set_color_to(self, color):
28
sense.set_pixels(([color] * 64))
29
def on_custom_gonzalo123_setcolor(self, directive):
31
payload = json.loads(directive.payload.decode("utf-8"))
32
color = payload['color']
33
if color == 'red':
35
logger.info('turn on RED display')
36
self.set_color_to(RED)
37
if color == 'green':
39
logger.info('turn on GREEN display')
40
self.set_color_to(GREEN)
41
if color == 'yellow':
43
logger.info('turn on YELLOW display')
44
self.set_color_to(YELLOW)
45
if color == 'black':
47
logger.info('turn on YELLOW display')
48
self.set_color_to(BLACK)
49
if __name__ == '__main__':
52
Gadget().main()
Вот INI-файл нашего гаджета:
питон
xxxxxxxxxx
1
[GadgetSettings]
2
amazonId = my_amazonId
3
alexaGadgetSecret = my_alexaGadgetSecret
4
[GadgetCapabilities]
6
Alexa.Gadget.StateListener = 1.0 - wakeword
7
Custom.gonzalo123 = 1.0
В этом ini-файле я говорю, что мой гаджет вызовет функцию, когда будет сказано wakeword и с моим пользовательским событием "Custom.gonzalo123".
Это умение:
питон
xxxxxxxxxx
1
const Alexa = require('ask-sdk')
2
const RequestInterceptor = require('./interceptors/RequestInterceptor')
4
const ResponseInterceptor = require('./interceptors/ResponseInterceptor')
5
const LocalizationInterceptor = require('./interceptors/LocalizationInterceptor')
6
const GadgetInterceptor = require('./interceptors/GadgetInterceptor')
7
const LaunchRequestHandler = require('./handlers/LaunchRequestHandler')
9
const ColorHandler = require('./handlers/ColorHandler')
10
const HelpIntentHandler = require('./handlers/HelpIntentHandler')
11
const CancelAndStopIntentHandler = require('./handlers/CancelAndStopIntentHandler')
12
const SessionEndedRequestHandler = require('./handlers/SessionEndedRequestHandler')
13
const FallbackHandler = require('./handlers/FallbackHandler')
14
const ErrorHandler = require('./handlers/ErrorHandler')
15
let skill
17
module.exports.handler = async (event, context) => {
19
if (!skill) {
20
skill = Alexa.SkillBuilders.custom().
21
addRequestInterceptors(
22
RequestInterceptor,
23
ResponseInterceptor,
24
LocalizationInterceptor,
25
GadgetInterceptor
26
).
27
addRequestHandlers(
28
LaunchRequestHandler,
29
ColorHandler,
30
HelpIntentHandler,
31
CancelAndStopIntentHandler,
32
SessionEndedRequestHandler,
33
FallbackHandler).
34
addErrorHandlers(
35
ErrorHandler).
36
create()
37
}
38
return await skill.invoke(event, context)
40
}
Одна важная вещь здесь - GadgetInterceptor. Этот перехватчик находит endpointId из запроса и добавляет его в сеанс. Эта конечная точка существует, потому что мы создали наш гаджет Product / Alexa, а также на устройстве запущен скрипт python . Если конечная точка отсутствует, возможно, наш навык должен сказать пользователю что-то вроде «Гаджеты не найдены. Повторите попытку после подключения гаджета».
питон
1
const utils = require('../lib/utils')
2
const GadgetInterceptor = {
4
async process (handlerInput) {
5
const endpointId = await utils.getEndpointIdFromConnectedEndpoints(handlerInput)
6
if (endpointId) {
7
utils.appendToSession(handlerInput, 'endpointId', endpointId)
8
}
9
}
10
}
11
module.exports = GadgetInterceptor
Наконец, обработчики для запуска пользовательского события:
питон
xxxxxxxxxx
1
const log = require('../lib/log')
2
const utils = require('../lib/utils')
3
const buildLEDDirective = (endpointId, color) => {
5
return {
6
type: 'CustomInterfaceController.SendDirective',
7
header: {
8
name: 'setColor',
9
namespace: 'Custom.gonzalo123'
10
},
11
endpoint: {
12
endpointId: endpointId
13
},
14
payload: {
15
color: color
16
}
17
}
18
}
19
const ColorHandler = {
21
canHandle (handlerInput) {
22
return handlerInput.requestEnvelope.request.type === 'IntentRequest'
23
&& handlerInput.requestEnvelope.request.intent.name === 'ColorIntent'
24
},
25
handle (handlerInput) {
26
const requestAttributes = handlerInput.attributesManager.getRequestAttributes()
27
const cardTitle = requestAttributes.t('SKILL_NAME')
28
const endpointId = utils.getEndpointIdFromSession(handlerInput)
30
if (!endpointId) {
31
log.error('endpoint', error)
32
return handlerInput.responseBuilder.
33
speak(error).
34
getResponse()
35
}
36
const color = handlerInput.requestEnvelope.request.intent.slots['color'].value
38
log.info('color', color)
39
log.info('endpointId', endpointId)
40
return handlerInput.responseBuilder.
42
speak(`Ok. The selected color is ${color}`).
43
withSimpleCard(cardTitle, color).
44
addDirective(buildLEDDirective(endpointId, color)).
45
getResponse()
46
}
47
}
48
module.exports = ColorHandler
Вот одно видео с рабочим примером:
Исходный код в моем GitHub .
Дальнейшее чтение
Развитие навыков Alexa с помощью Spring Boot REST Services в уме