Skip to main content

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

はてなブログから引っ越しました(2019/10/21)

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

Lambda関数作成

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

Lambda関数の作成

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 *

Lambda関数の画面

環境変数の設定

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

環境変数の画面

Alexaスキル作成

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

呼び出し名

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

呼び出し名の画面

インテント

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

照明オンのインテント設定画面

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

照明オフのインテント設定画面

エンドポイント

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

エンドポイントの設定画面

動作確認

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

照明オン

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

照明オフ

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

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

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


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