【Google Assistant】家電をIRKitで音声操作する
我が家の家電制御の方法が変化したので、ここに書き記す。
なお、IRKit × IFTTT × GASの組み合わせで実現している。
大まかな流れ
- Google Homeに「リモコン 電気つけて」と話しかける
- IFTTTでメッセージを読み取り、GASへ「電気つけて」と送られる
- GASで「電気つけて」に対応した赤外線信号をIRKitへ送信
- IRKitが赤外線で照明をつける
という流れだ。
余談 これまでどうしていたか
今までラズベリーパイでJuliusを用いた音声認識、curlでのローカル内での信号送信を行っていた。
方法を変えようと思ったのは、Juliusの音声認識よりも、Google Homeでの音声認識の方が精度が高かったから。
GAS
GASとは、Google Apps Scriptのこと。Google Drive上に置いたGASファイルをサーバーとかを用意しなくても実行することが出来る。GASの中身はJavaScriptで記述が出来る。ただしJSの中でも、使えない関数などがあったりするので、そこは注意が必要だ。
GASを記述する
最初に全貌
function doPost(e) { var str = e.postData.getDataAsString();//str:電気つけて str = str.replace(/\s+/g, "");//不要な空白を削除 readSpreadsheets(str); } //スプレッドシートから検索して、送信するデータを決定する function readSpreadsheets(str){ var spreadsheet = SpreadsheetApp.openById('<スプレッドシートのID>'); var sheet=spreadsheet.getSheetByName('irkit'); var values = sheet.getRange(1,1,sheet.getLastRow(),sheet.getLastColumn()).getValues(); values.forEach(function(elem){ if(elem.indexOf(str)!=-1){ sendMessage(elem[0]); } }); } //データを送信する function sendMessage(message){ var postUrl='https://api.getirkit.com/1/messages'; var jsonData= { "clientkey":"<クライアントキー>", "deviceid":"<デバイスID>", 'message':message }; var payload=JSON.stringify(jsonData); var options= { "method":"post", "contentType":"application/json", "payload":payload }; UrlFetchApp.fetch(postUrl,options); }
関数を1つづつ見ていこう
function doPost(e) { var str = e.postData.getDataAsString();//str:リモコン 電気つけて str = str.replace(/\s+/g, "");//不要な空白を削除 readSpreadsheets(str); }
doPost(e)は、IFTTTからデータを受信するための関数だ。
function readSpreadsheets(str){ var spreadsheet = SpreadsheetApp.openById('<スプレッドシートのID>'); var sheet=spreadsheet.getSheetByName('irkit'); var values = sheet.getRange(1,1,sheet.getLastRow(),sheet.getLastColumn()).getValues(); values.forEach(function(elem){ if(elem.indexOf(str)!=-1){ sendMessage(elem[0]); } }); }
この関数では、スプレッドシートをスプレッドシートのIDで開き、その中の"irkit"というシートの情報を2次元配列で取得している。
ちなみにこのスプレッドシートの情報は以下のようになっている。
function sendMessage(message){ var postUrl='https://api.getirkit.com/1/messages'; var jsonData= { "clientkey":"<クライアントキー>", "deviceid":"<デバイスID>", 'message':message }; var payload=JSON.stringify(jsonData); var options= { "method":"post", "contentType":"application/json", "payload":payload }; UrlFetchApp.fetch(postUrl,options); }
最後に、IRKitに信号を送るためのプログラムだ。POSTデータを送信する。
外部からGASを実行できるようにする
[公開]の[ウェブ アプリケーションとして導入]
アクセスできるユーザーを匿名ユーザーも含むように変更し、[導入]
ここにアクセスするためのURLが記されているので、控えておく。
IFTTT
IFTTTについての説明は省略する。簡単にいうと「アレをしたらコレをする」というサービス。
thisを設定
Google Assistantを選択
左から3つ目を選択
以下のように設定
thatを設定
Webhooksを選択
選択肢がひとつなので、それを選択
URLに先程控えたURLを設定
これで設定完了だ。
まとめ
IFTTT×GASによる可能性は無限大だ。IFTTTだけでも様々なことができるが、GASを組み合わせると、さらにいろんなことができるようになる。興味を持った人は、ぜひチャレンジしてみてほしい。
IFTTTの過去記事
seisyo58.hatenablog.com