ESP32와 AWSIoT와 Alexa를 연결해 보았다 (Alexa와 DynamoDB 편)

Alexa와 DynamoDB를 연결합시다.



Alexa와 DynamoDB를 연결하려면
Alexa skill에서 Lmabda 함수를 호출합니다.
Lambda 함수에서 DynamoDB의 데이터를 가져옵니다.

Alexa의 기술을 만들자



등록 방법 등은 생략합니다 スキル一覧>スキル 만들기
이름은 적당히 결정합시다 스킬의 템플릿을 선택합니다만 커스텀으로 합니다
개발 화면에 들어갔습니다!


먼저 호출 이름을 결정합시다.

이 호출 이름을 Alexa에게 말하면 스킬을 열어줍니다.


우선 기온을 취할 수 있도록 하고 싶기 때문에 이런 느낌의 인텐트를 만듭니다
인텐트란 설정한 워드를 들으면 시작하는 녀석입니다.
이 인텐트는 Lambda 함수를 호출합니다.


Lambda 함수를 만들자.



Alexa에서 무언가를 하기 위해서는 Alexa 스킬에서 Lambda 함수를 불러 일으키고 Lambda 함수로 Alexa를 조작한다고 하는 느낌이 듭니다Lambda>関数>関数の作成로 이동하여 청사진에서 alexa-skill-kit-sdk-factskill를 선택합니다.

Lambda에서 Alexa 기술과 DynamoDB에 연결하는 역할을 만듭니다.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "dax:*",
                "lambda:*",
                "dynamodb:*",
                "logs:CreateLogGroup",
                "logs:PutLogEvents",
                "a4b:*"
            ],
            "Resource": "*"
        }
    ]
}

Alexa 엔드포인트를 설정해 봅시다.



Lambda에 트리거를 설정합니다. 왼쪽에서 Alexa Skill Kit를 선택합니다.

일단 AlexaSkill 콘솔로 돌아가 엔드 포인트를 설정하십시오.
스킬 ID를 복사하여 Lambda의 Alexa Skill kit 트리거로 설정합니다.

다음은 Lambda의 오른쪽 상단에있는 ARN을 복사하여
기본 지역으로 설정합니다. 엔드포인트 저장이 완료되면 엔드포인트 설정이 완료됩니다!

Lambda 함수로 DynamoDB에 액세스



이런 느낌의 DB가 된다고 합니다


index.js
const Alexa = require('alexa-sdk');
const AWS = require("aws-sdk");
var docClient = new AWS.DynamoDB.DocumentClient();
const SKILL_NAME = 'SensAlexa';
const HELP_MESSAGE = '欲しいデータを教えてください';
const HELP_REPROMPT = '何か手伝いますか?';
const STOP_MESSAGE = 'さようなら';

const handlers = {
    'LaunchRequest': function () {
    this.emit(':ask');
    },

    'gettempreture': function () {
        var speechOutput = "";
        let self = this;
        const params = {
            TableName: "BME280", // DynamoDBのテーブル名
            ExpressionAttributeNames: {
                '#clientid': 'client_id' //lambda関数内で処理する変数に
            },
            ExpressionAttributeValues: {
                ':id': 'ESP-32-1'  //検索するID
            },
            KeyConditionExpression: '#clientid = :id', //client_id=idだったら
            ScanIndexForward: false, // 昇順か降順か(デフォルトはtrue=昇順)
            Limit: 1 // 取得するデータ件数
        };
        docClient.query(params, function(err, data){
            if(err){
                speechOutput = "気温が取得できませんでした"
            }else{
                data.Items.forEach(function(value, index){
                speechOutput = "今の気温は" + value.tempreture + "です";
                });
            }
            self.response.speak(speechOutput);
            self.emit(':responseReady');
        })
    },
    'AMAZON.HelpIntent': function () {
        const speechOutput = HELP_MESSAGE;
        const reprompt = HELP_REPROMPT;

        this.response.speak(speechOutput).listen(reprompt);
        this.emit(':responseReady');
    },
    'AMAZON.CancelIntent': function () {
        this.emit(':responseReady');
    },
    'AMAZON.StopIntent': function () {
        this.emit(':responseReady');
    },
};


exports.handler = function (event, context) {
    const alexa = Alexa.handler(event, context);
    // To enable string internationalization (i18n) features, set a resources object.;
    alexa.registerHandlers(handlers);
    alexa.execute();
};

결국 이런 느낌이 되었습니다. AWS.DynamoDB.DocumentClient();에 대해서는 살펴보십시오.

테스트해 보자.



Alexa 기술을 빌드하고 테스트로 이동



얻을 수 있었습니다! ! ! 완성! ! !

Lambda에서 HTTP Get Request를 던져 ESP32에서 직접 받는 것이 더 빠릅니다.

좋은 웹페이지 즐겨찾기