GoogleHomeからRESTを叩いて、実行結果を喋らせる[その0~1]


普通にRESTを叩くだけなのであれば、IFTTTからGoogleAssistantとWebhookをつなげる等
あるが、ロボットの実行環境が外部公開していないローカルサーバーなので、何かを間に噛ませる必要がある。
また、GoogleHomeには自身で通知を受け取って喋る機能が無いので、RESTを叩いただけ
では結果を喋ってくれない。

[1] IFTTTからGoogleAssistant⇒GoogleSpreadSheetでタスク名を書き込む
[2] ローカルネットワークに繋いだRaspberrypiで[1]を受け取る
[3] Raspberrypiでそのまま[2]を叩く
[4] Raspberrypiで[3]の結果を受け取る
[5] Raspberrypiで[4]の結果をGoogleHomeに喋らせる

これでいける。

記事一覧

■用意するもの、使うツール

  • GoogleHome(mini可)
  • Raspberrypi3(ModelB)
  • RESTで実行したいツール(BizRoboを使用)
  • GoogleSpreadSheet

[0] Rasberrypiのセットアップ

参考:Raspbianのインストールと最強の初期設定 | 純規の暇人趣味ブログ
RaspbiaLiteを使った。
Desktopの方でも大丈夫。


入った。

[1] IFTTTからGoogleAssistant⇒GoogleSpreadSheetでタスク名を書き込む

レシピ作成

Discover IFTTT and Applets - IFTTT
アクセス、ログイン後、My Applets > New Appletで新しいレシピを作成

「this」は「Goole Assistant」を選択。
トリガー内容は「Say a phrase with a text ingredient」を選択。

参考:【日本語】IFTTT(イフト)で使える「Google Assistant」の解説|Google Homeに利用可能!

こんな感じで入れる。
因みに
・「\$」の前後には半角スペースを入れる。
・命令文の最初に「 \$ 」は入れない(「 \$ 実行予約」等はNG)
のルールを守る。

「that」は「Google Sheet」を選択。
アクション内容は「Add row to spreadsheet」を選択

参考:【日本語】IFTTT(イフト)で使える「Google Sheets」アクションの解説

こんな感じで入れる。

一旦テスト

GoogleHomeに直接喋らなくても、GooogleAssistantアプリから命令可。

GoogleDriveに「IFTTT」とフォルダと「cue」というシートが作られ、B1セルに入力が出来ていればテスト成功。

GASでシートの自動編集

このB1に入力されたフレーズをRaspberrypiにそのまま受け取らせてもよいが、
後々の管理のし易さを考え、GASを使って自動で書き換えさせるようにする。

ツール>スクリプトエディタ

コード.gs
var book = SpreadsheetApp.getActiveSpreadsheet();
var sheet = book.getSheetByName("シート1");


function input() {
  setNumber(1);
  setFunction(3);
  setDate(4, "yyyy/M/d H:m:s");
  setExecutionTime(7);
}
//----------------------------------------------------

//番号入力
function setNumber(col) {
  var lastrow = sheet.getLastRow();
    if (sheet.getRange(lastrow, col).getValue() == "") 
      sheet.getRange(lastrow, col).setValue(lastrow);
}

//関数入力
function setFunction(col) {
  var lastrow = sheet.getLastRow();
    if (sheet.getRange(lastrow, col).getValue() == "") 
      sheet.getRange(lastrow, col).setValue("=IFERROR(VLOOKUP(B"+lastrow+",'シート2'!A:B,2,false),\"\")");
}

//日付入力
function setDate(col, format) {
  var lastrow = sheet.getLastRow();
  if (sheet.getRange(lastrow, col).getValue() == "") 
    sheet.getRange(lastrow, col).setValue(formatDate(new Date(), format));
}

//F列-E列の関数入力
function setExecutionTime(col) {
  var lastrow = sheet.getLastRow();
    if (sheet.getRange(lastrow, col).getValue() == "") 
      sheet.getRange(lastrow, col).setValue("=if(F"+lastrow+"<>\"\",(F"+lastrow+"-E"+lastrow+")*86400,\"\")");
}

//----------------------------------------------------
function formatDate(date, format) {
  return Utilities.formatDate(date, 'Asia/Tokyo', format)
}

↑をそのままコピペして保存。
名前は適当に。

トリガーのボタン(虫眼鏡と時計みたいなの)を押下。

実行:input
イベント:スプレッドシートから、値の変更
を選択して保存。承認許可。

SpreadSheetに戻り、「シート2」を作成。
作成したシートに画像の様な感じで入力。

「シート1」のB1セルを弄るとA1、C1、D1セルに自動入力される。
味気ないのでヘッダー行も追加。この時A2セルを「2」にして、必ず上から連番になるようにする。

テスト

ちゃんと入った。成功。

続く