CoffeeScript google スマートホーム

[Google Home]IFTTTで複数処理などの複雑な処理を実行する(IFTTT+Slack+Hubot)

投稿日:

スポンサードリンク

はじめに

以前「IFTTT+SwitchBot Hub Plusで自宅をスマートホーム化 第1弾(照明の自動ON/OFF)」でIFTTTで家電を操作して試しに照明をつけました。これはこれで便利なのですがIFTTTにはロジックを組むブロックが無いということに気が付きました。つまり、条件分岐させたり、複数処理をさせたり、繰り返し処理をさせたりといったプログラムの基本文法みたいな処理が無いということです。

しょうがないので、「IFTTT+Slack+HubotでGoogle Homeとおしゃべりができるようにする[Windows10]」で使ったやり方を用いて複数処理をやらせたいと思います。

ちなみに、多少調べてみると「Maker」というチャンネルから複雑な処理はできるらしいのですが、そのリンクを見つけることができませんでした… 見つけたらチャレンジしたいと思いますが、今回はこのめんどくさいやり方でやってみました。

実現手段

こんな感じをイメージしています。

IFTTTはGoogle Homeの何かしらのフレーズをトリガーとしてSlackに投稿するアクションを実行します。SlackにはHubotというチャットボットを連携しておいて、特定のフレーズが投稿されたときにCoffeeScriptを走らせるようにしておくという寸法です。

このCoffeeScript内に色々と自由にスクリプトを組めば自由になんでもできます。今回は家電を操作する2パターンの例についてご紹介します

IFTTTとSlackとHubotの連携に関しては「IFTTT+Slack+HubotでGoogle Homeとおしゃべりができるようにする[Windows10]」を参照してください。

エアコンと照明を同時につける

今回はのフローチャートを示します。

Google Homeに話しかける

IFTTT経由でSlackに投稿される

Slackの投稿にHubotが反応してCoffeeScriptが走る

CoffeeScriptからWebHooksで複数の家電を操作する

この一番最後の処理でエアコンと照明を同時につけてみました。家電をIFTTT経由で操作するにはインターネットに接続できてIFTTT対応のスマートリモコンが必要です。

私はSwitchBot Hub Plusを使いましたが、ほかのNature Remoなどの対応デバイスでも大丈夫だと思います。

Nature Japan Nature Remo REMO-1W2

Nature Japan Nature Remo REMO-1W2

posted with amazlet at 19.08.01
Nature Japan
売り上げランキング: 295

Hubot CoffeeScript

HubotについているCoffeeScriptのサンプルスクリプト(example.coffee)を改造しました。該当箇所のみ引っ張ってくるとこんな感じになります。

module.exports = (robot) ->
  robot.respond /allon/i, (res) ->
    request = robot.http("https://maker.ifttt.com/trigger/lighton/with/key/xxxxxxxxxx").get()
    request (err, msg, body) ->
      res.send "light on"        
    request = robot.http("https://maker.ifttt.com/trigger/cooleron/with/key/xxxxxxxxxx").get()
    request (err, msg, body) ->
      res.send "cooler on"     

"allon"というキーワードにHubotが反応して処理を開始できるようになっています。処理はIFTTTのWebHooksで電気をつけるイベント(lighton)とエアコンをつけるイベント(cooleron)の2つのリクエストを送信するようにしています。イベント名やキーは自分のものに書き換えてください。

IFTTTのWebHooksの書き方については「IFTTT+SwitchBot Hub Plusで自宅をスマートホーム化 第1弾(照明の自動ON/OFF)」で紹介しているのでわからない方はそちらを参考にしてください。

IFTTTトリガー&アクション

IFTTTのトリガーとアクションを作成します。
Google Homeに「全てつけて」と話しかけるのをトリガーにします。

そして、Slackに「myhubot allon」と投稿するのをアクションとします。

実行結果

Google Homeに「全てつけて」と話しかけるとSlackに「myhubot allon」が投稿されて、Hubotはそれに反応してスクリプトを動かしました。

その間、WebHooksのリクエストが送信されてめでたくエアコンと照明が付きました。

エアコンをつけて〇分後に消す

今度はエアコンをつけて指定の時間が経過したら消すようにしました。フローチャートは先ほどと同じですが、CoffeeScriptで指定時間後に処理を走らせる関数の"setTimeout"を使って時間差でエアコンを消すようにしました。

Hubot CoffeeScript

任意の時間後にクーラーを消したいためキーワードには正規表現で数字を取得できるようにしました。この時間(分)後に停止させるようにします。

エアコンの入り切りは先ほど同様にWebHooks経由のスマートリモコンで操作しています。

  robot.respond /cooler([0-9]+)m/i, (res) ->
    millsec = 1000*60*parseInt(res.match[1])
    request = robot.http("https://maker.ifttt.com/trigger/cooleron/with/key/xxxxxxxxxx").get()
    request (err, msg, body) ->
        res.send "cooleron after " + res.match[1] + "minutes off"    
    cooleroff = () ->
      request = robot.http("https://maker.ifttt.com/trigger/cooleroff/with/key/xxxxxxxxxx").get()
      request (err, msg, body) ->
        res.send "cooleroff"
    setTimeout () -> 
        cooleroff()
    ,millsec

"cooler([0-9]+)m"で正規表現で任意の時間に反応できるようにします。例えば10分後にクーラーを消したいのであれば"cooler10m"のキーワードを入力するようにします。

そして、クーラーをON(cooleron)すると同時に指定分後にクーラーをOFF(coloroff)する処理をsetTimeoutに設定します。ここで指定するミリ秒はさきほどの正規表現で得た値を変換しています。これにより、例えば"cooler10m"なら10分後にcooleroffが呼ばれてクーラーが止まるはずです。

※ここでエラーが頻発するときはインデントを疑ってください。CoffeeScriptは初めてだったのでなかなか気づけませんでしたが、インデントをきちんと設定しないとすぐエラーがでます。特にsetTimeout周りが気づきにくかったです。

IFTTTトリガー&アクション

トリガーはGoogle Homeに「エアコンを〇分だけつけて」と言ったら反応するようにします。

アクションにはSlackに先ほどのHubotのCoffeeScriptを動かすようなものを指定します。

動作確認

試しに「エアコンを6分だけつけて」と言ってみたところ次のようになりました。

エアコンが付いたのち6分後にエアコンが消えました。このメッセージのタイムスタンプからもその挙動が確認できると思います。

(参考)MESHを使う方法

ソニーから販売しているMESHというタグ型のセンサがあります。このセンサはIFTTTに対応しており、MESH用のアクションが用意されているのですが、その中でブロック図を組めるようになっているようです。

[ソニー] Sony(ソニー) MESH 人感タグ(Motion) MESH-100MD
ソニー
売り上げランキング: 18,412

この仕組みを使えば多少複雑な処理が実現可能らしいのですが、MESH用のアプリを常に立ち上げてある端末が必要であることと、このMESHタグ製品(多少高価)とその端末をBluetooth通信させておかないと永続的に使えないという理由から今回は断念しました。

MESHアプリの端末はスマホやラズパイ、WindowsPCも対応しているみたいなのでお持ちの方は試してみてください。

まとめ

IFTTTではアクションに複雑なロジックを組み込めないため、Slack+Hubotとを連携して実現させました。

しかし、この記事を書いていてGAS(Google Apps Script)でお手軽に実現できるのでは…?と気が付いたので次回はそれをやりたいと思います。

スポンサードリンク

-CoffeeScript, google, スマートホーム

Copyright© めめんと , 2019 All Rights Reserved Powered by AFFINGER5.