Google Home + IRKit로 기존 가전 기기를 조작하는 앱을 만들어 보았습니다. #dialogflow
Google 홈에 말을 걸어 가전 기기를 조작합니다.
'전기를 붙이고'나 'TV를 끄고'라는 요청에 대응하는 앱을 만들었습니다. 동영상 데모는 여기에서 볼 수 있습니다.
가전을 조작하는 구조
IRKit을 사용하여 가전 제품과 함께 제공된 리모컨과 동일한 적외선 신호를 전송합니다.
왜 적외선 신호인가?
이번에는 Google 홈과 IRKit을 사용했지만 라즈파이에서도 만들 수 있다고 생각합니다.
준비편
IRKit을 Wi-fi에 연결
terminal
User$ dns-sd -B _irkit._tcp
//iRKitxxxみたいな名前があったら下記のコマンドを実行します
User$ dns-sd -G v4 iRKitxxxx.local
//iRKitxxxxのIPAddressを使いclienttokenを取得します
curl -i "http://192.168.43.242/keys" -d '' -H "X-Requested-With: curl"
//clienttokenを使いdeviceidとclientkeyを取得します
curl -i -d "clienttoken=xxxxxxxx" "https://api.getirkit.com/1/keys"
terminal
curl -i "https://api.getirkit.com/1/messages?clientkey=xxxxxx&clear=1"
이 API를 두드리면 신호 읽기 상태가 되므로 리모컨을 IRKit용으로 등록하고 싶은 버튼을 누르세요. 그러면 이러한 신호의 배열을 얻을 수 있다고 생각합니다.
terminal
[3968,1927,10762,1927,3013,935,3013,935,1073,968,1073,968,1073,968,1073,968,968,1073,1073,968,3013,935,1073,968,1073,968,1073,968,1073,968,1073,968,968,1073,3013,935,1073,935,3013,935,1073,935,1073,935,1073,935,1073,935,935,1073,1073,935,1073,935,1073,935,1073,935,1073,935,1073,935,1073,935,935,1073,1073,935,1073,935,3013,935,1073,968,3013,935,3013,935,1037,1037,3013,935,3013,935,935]
이 신호를 기록해 둡니다.
실장편
API.AI에서 수신한 동작에 따라 IRKit의 API로 적외선 신호를 전송합니다.
index.js
'use strict';
process.env.DEBUG = 'actions-on-google:*';
const App = require('actions-on-google').ApiAiApp;
const request = require('request');
//IRKit API
//先ほど取得したclientkeyとdeviceidをURLに入れる
var IRKIT_URL = 'https://api.getirkit.com/1/messages?clientkey=xxxx&deviceid=xxx&message={"format":"raw","freq":38,"data":[]}'
// 取得した赤外線信号を入れる
const LIGHT_ON_IR = '[0000,0000]';
var options = {
url: IRKIT_URL,
method: 'POST'
}
function postIR () {
return new Promise(function (resolve, reject) {
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
resolve(body);
} else {
reject(error);
}});
});
}
//API.AI actions
const LIGHT_ON = 'light.on';
exports.HomeIRKit = (request, response) => {
const app = new App({request, response});
console.log('Request headers: ' + JSON.stringify(request.headers));
console.log('Request body: ' + JSON.stringify(request.body));
function light_on_handler (app) {
//IRKitに赤外線信号を送信
options.url = IRKIT_URL.replace('[]', LIGHT_ON_IR);
postIR().then(function(result){
console.log(result.msg);
}).catch(function (error) {
console.log(error);
});
app.ask('Okay, turn on light');
console.log('Requested ' + LIGHT_ON);
}
const actionMap = new Map();
actionMap.set(LIGHT_ON, light_on_handler);
app.handleRequest(actionMap);
};
이번에는 request 모듈을 사용하고 있으므로 package.json의 dependencies에 모듈 이름을 추가합니다.
package.json
"dependencies": {
"request" : "^2.76.0"
}
테스트
API.AI 콘솔의 Integration의 Actions on Google에서 테스트해 보세요. 시뮬레이터에서도 움직이지만, Google home을 가지고 계신 분은 모처럼이므로 그쪽에서도 시도해 주세요. 같은 Google 계정이라면 'Talk to my test app'라고 말하면 움직인다고 생각합니다.
요약
어땠습니까? 생각보다 쉽게 가전을 대응시킬 수 있었다고 생각합니다. 꼭 다양한 가전을 조작해 보세요.
사용해보고 느낀 것
Reference
이 문제에 관하여(Google Home + IRKit로 기존 가전 기기를 조작하는 앱을 만들어 보았습니다. #dialogflow), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/flatfisher/items/8e2da20b054674a23021텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)