'use strict';
const Alexa = require('alexa-sdk');
const APP_ID = process.env.IRKit_APPID; // IRKit app ID
// IRKitデバイス情報
const clientkey = process.env.My_ClientKey;
const deviceid = process.env.My_DeviceID;
// 応答カードのタイトル
const cardTitle = "IRKit";
// エラー情報
const sendError = Error("Send error");
const unknownError = Error("Unknown error");
// リモコン信号
const lightIR = {
on: { "format":"raw",
"freq":38,
"data":[18031,8755,1275,1037,1275,3228,1232,1037,1190,1037,1190,1037,
1190,1037,1190,1037,1190,3228,1232,3228,1232,1037,1190,3228,
1232,3228,1232,1037,1190,3228,1232,3228,1232,1037,1190,3228,
1232,3228,1232,3228,1232,3228,1232,3228,1232,1037,1190,1037,
1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,
1190,3228,1232,3228,1232,3228,1232,65535,0,18031,18031,4251,
1190,65535,0,65535,0,60108,18031,4251,1190]
},
off: {"format":"raw",
"freq":38,
"data":[18031,8755,1190,1073,1190,3228,1190,1073,1073,1073,1073,1073,
1190,1073,1073,1073,1073,3228,1190,3228,1190,1073,1073,3228,
1190,3228,1190,1073,1073,3228,1190,3228,1190,1073,1073,1073,
1073,3228,1190,3228,1190,3228,1190,3228,1190,1073,1073,1073,
1073,1073,1073,3228,1190,1073,1190,1073,1190,1073,1190,1073,
1190,3228,1150,3228,1150,3228,1150,65535,0,18031,18031,4400,
1190,65535,0,65535,0,60108,18031,4251,1275]
}
};
// 言語リソース
const languageStrings = {
"ja": { // 日本語
translation: {
WELCOME_MESSAGE: "ようこそ、アイアールキットリモコンで家電を制御します。何をしましょうか?",
HELP_MESSAGE: "アイアールキットリモコンで家電を制御します。",
CANCEL_MESSAGE: "アイアールキットリモコンを中止します。",
STOP_MESSAGE: "アイアールキットリモコンを終了します。",
UNKNOWN_MESSAGE: "すみません、分かりません。",
RETRY_MESSAGE: "すみません、もう一度お願いします。",
LIGHT_ON: "明りを点けます。",
LIGHT_OFF: "明りを消します。",
LIGHT_USAGE: "明りを点けて、明りを消して、などと指示してください。",
},
},
};
// リモコン信号の送信
function sendIR(ir, callback) {
var https = require("https");
var qs = require("querystring");
var postData = qs.stringify({
clientkey: clientkey,
deviceid: deviceid,
message: JSON.stringify(ir)
});
var req = https.request({
host: "api.getirkit.com",
path: "/1/messages",
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8",
"Content-Length": postData.length
}
}, function (res) {
var result = res.statusCode;
if (result == 200) {
console.log("res.statusCode=" + result); // ログ出力
callback(null, "success"); // 送信成功
}
else {
console.log(postData); // ログ出力
console.log("res.statusCode=" + result); // ログ出力
callback(sendError); // 送信エラーを通知
}
});
req.write(postData);
req.end();
}
function onLightOn(callback) {
sendIR(lightIR.on, callback); // 明かりを点ける
}
function onLightOff(callback) {
sendIR(lightIR.off, callback); // 明かりを消す
}
const handlers = {
'LaunchRequest': function () {
this.emit(":ask", this.t("WELCOME_MESSAGE"));
},
'LightControl': function () {
// 照明インテントのハンドラ
var session = this.event.session; // セッション
var apid = session.application.applicationId; // アプリケーションID
var now = this.event.request.timestamp; // 日付&時刻
var intent = this.event.request.intent; // インテント
var onoff = intent.slots.Switch.value; // スロット{Switch}の値
var msg;
console.log("LightControl: Switch=" + onoff); // ログ出力
switch(onoff){
case 'オン':
case '点け':
case '点灯':
msg = this.t("LIGHT_ON");
this.emit(":tellWithCard", msg, cardTitle, msg);
onLightOn(this.callback);
break;
case 'オフ':
case '消す':
case '消し':
case '切る':
case '消灯':
msg = this.t("LIGHT_OFF");
this.emit(":tellWithCard", msg, cardTitle, msg);
onLightOff(this.callback);
break;
default:
msg = this.t("RETRY_MESSAGE") + this.t("LIGHT_USAGE");
this.emit(":ask", msg);
break;
}
},
'AMAZON.HelpIntent': function () {
this.emit(":ask", this.t("HELP_MESSAGE"));
},
'AMAZON.CancelIntent': function () {
this.emit(":tell", this.t("CANCEL_MESSAGE"));
this.callback(null);
},
'AMAZON.StopIntent': function () {
this.emit(":tell", this.t("STOP_MESSAGE"));
this.callback(null);
},
'Unhandled': function() {
this.emit(":ask", this.t("UNKNOWN_MESSAGE"));
}
};
// Lambda関数ハンドラー
// パラメタ
// event: イベントデータ
// context: ランタイム情報
// callback: 呼び出し元へ情報を返すためのコールバック関数
exports.handler = function (event, context, callback) {
var session = event.session; // セッション
var apid = session.application.applicationId; // アプリケーションID
const alexa = Alexa.handler(event, context, callback);
if (apid != APP_ID) {
context.fail("Invalid Application ID"); // IRKitスキル以外からの呼び出しは拒否
return;
}
alexa.appId = APP_ID;
console.log("event.session.application.applicationId=" + apid); // ログ出力
// To enable string internationalization (i18n) features, set a resources object.
alexa.resources = languageStrings; // 言語リソースを設定
alexa.registerHandlers(handlers); // ハンドラを登録
alexa.execute();
};
|