Google Home + IRKit로 기존 가전 기기를 조작하는 앱을 만들어 보았습니다. #dialogflow

Google 홈에 말을 걸어 가전 기기를 조작합니다.



'전기를 붙이고'나 'TV를 끄고'라는 요청에 대응하는 앱을 만들었습니다. 동영상 데모는 여기에서 볼 수 있습니다.

Google Home + IRKit

가전을 조작하는 구조


  • Google Home에서 사용자의 목소리를 인식합니다
  • API.AI를 사용하여 사용자가 조작하고자하는 가전 및 조작 내용을 이해합니다.

  • IRKit을 사용하여 가전 제품과 함께 제공된 리모컨과 동일한 적외선 신호를 전송합니다.

    왜 적외선 신호인가?


  • 스마트 가전이 주류가 되고 있지만, 적외선 리모컨 부속의 가전은 아직도 많다
  • 스마트 가전은 비싸고 조금 손이 나기 어렵다
  • 현재 사용하고 있는 가전에 바로 대응할 수 있다

  • 이번에는 Google 홈과 IRKit을 사용했지만 라즈파이에서도 만들 수 있다고 생각합니다.

    준비편



  • IRKit을 Wi-fi에 연결
  • 공식 앱에서 IRKit을 Wi-fi에 연결하십시오.

  • 터미널에서 Clienttoken 얻기
  • 같은 Wi-fi에서 작업

  • Clienttaken을 사용하여 Device id 및 Client key를 얻습니다.
  • Device id와 Client key는 터미널을 재설정 할 때마다 다시 얻어야합니다.


  • 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"
    
  • 취득한 Clientkey와 IRKit의 공식 API를 사용해 적외선 신호를 취득한다

  • 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 준비
  • 새로운 Agent 작성
  • 언어는 영어를 선택

  • 새로운 Intent 만들기
  • 전기를 켜는 Intent를 만듭니다
  • Name
  • Turn on light

  • Action
  • light.on

  • User says
  • Turn on light

  • Fulfillment
  • Use webhook에 확인


  • Fulfillment Webhook을 Enable로 설정
  • URL에 Cloud functions URL을 붙여 넣기
  • API.AI와 functions의 연계는 이쪽을 참조해 주세요



  • 실장편



    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'라고 말하면 움직인다고 생각합니다.

    요약



    어땠습니까? 생각보다 쉽게 ​​가전을 대응시킬 수 있었다고 생각합니다. 꼭 다양한 가전을 조작해 보세요.

    사용해보고 느낀 것


  • 요리 등을 하고 있어 양손이 자유롭게 사용할 수 없을 때에 편리
  • 원격 제어가 멀리 떨어져 있고 가는 것이 귀찮을 때 유용합니다
  • 스마트 가전이 완전히 보급될 때까지 연결될 것
  • 좋은 웹페이지 즐겨찾기