tatata’s blog(備忘録)

自分の備忘録として書いています。

Amazon Echoで照明をオン・オフする 4(Alexa編)

今回は、AlexaスキルからLabmda経由で前回作成したSQSにメッセージを送って、照明をオン・オフする処理を作成する。

Lambda関数作成

Alexaスキルからの命令を受け取って、SQSにメッセージを投げるLambda関数を作成する。

f:id:ysysy:20180506190645p:plain

alexa-sdkをインストール

$ npm install --save alexa-sdk

次の2つのファイルを作成

index.js

const AWS = require('aws-sdk');
const Alexa = require('alexa-sdk');
let sqs = new AWS.SQS({region:'ap-northeast-1'});
let url = process.env.SQS_QUEUE_URL;
var state = '-1';
AWS.config.update({accessKeyId: 'KEY', secretAccessKey: 'SECRET'});

function changeState(state) {
        var params = {
        MessageBody: state,
        QueueUrl: url,
        DelaySeconds: 0,
        MessageAttributes: {
            LightStatus: {
              DataType: 'Number',
              StringValue: state
            },
        },
    };
    sqs.sendMessage(params, function(err, data) {
        if (err) console.log(err, err.stack);
        else     console.log(data);
    });
};

const handlers = {
    'turnOn' : function() {
        changeState('1');
        this.emit(':responseReady');
    },
    'turnOff' : function() {
        changeState('0');
        this.emit(':responseReady');
    }
};

exports.handler = function(event, context, callback) {
    const alexa = Alexa.handler(event, context, callback);
    alexa.appId = process.env.APP_ID // APP_ID is your skill id which can be found in the Amazon developer console where you create the skill.
    alexa.registerHandlers(handlers);
    alexa.execute();
};

package.json

{
  "name": "light",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "alexa-sdk": "^1.0.25"
  }
}

zipファイルにしてアップロードする

$ zip -r light.zip *

f:id:ysysy:20180506190651p:plain

環境変数の設定

APP_IDには後ほど作成するAlexaスキルのIDを、SQS_QUEUE_URLには前回作成したSQSキューのURLを設定する。

f:id:ysysy:20180506190654p:plain

Alexaスキル作成

Alexaコンソールにログインしてスキルを作成する。 ログインに使用するアカウントは、Amazon Echoを買ったamazon.co.jpのアカウントを使う。*1

developer.amazon.com

呼び出し名

「スキルの呼び出し名」にAlexaで呼び出すときの名前を設定する。ここでは、「ほげほげまん」とした。

f:id:ysysy:20180506185808p:plain

インテント

インテントには照明をオンにするときのフレーズを設定する。 この例では、「Alexa、ほげほげまんであかるくして」、「Alexa、ほげほげまんでつけて」と言うと照明がオンになる。

f:id:ysysy:20180506185812p:plain

同様に照明をオフにするときのフレーズを設定する。

f:id:ysysy:20180506185816p:plain

エンドポイント

ここに表示されている「スキルID」をLamda関数の環境変数APP_IDに設定する。 「デフォルトの地域」にLambda関数のARNを設定する f:id:ysysy:20180506185820p:plain

動作確認

照明オン・オフをAmazon Echoからできことを確認

照明オン

  • 「Alexa、ほげほげまんであかるくして」
  • 「Alexa、ほげほげまんでつけて」

照明オフ

  • 「Alexa、ほげほげまんでくらくして」
  • 「Alexa、ほげほげまんできって」
  • 「Alexa、ほげほげまんでけして」

Lambda関数で使ったnode.jsは詳しくないのでもっと良い方法があると思う。スキルの設定ももっとスマートな方法があるはず。でもこれで動くことは動く。

作成して時間が経っているので、記憶があやふやになり、あまり詳しく書けなかったのが反省。

*1:amazon.comのアカウントでログインしたら、Echoと関連づけられていなかった。