カイワレスタイル

ゲーム、アニメ、プログラム、興味のあることをツラツラと。

Raspberry Pi 2 でエアコン操作(slack&hubot編)

前回に続いて、Raspberry Pi 2を使って自宅のエアコンを操作する仕組みを構築していく。

今回はslackとhubotを連携させて外部からエアコンを操作するようにする。


Raspberry Pi 2にhubotをインストールする

Raspberry Pi 2にhubotをインストールしていく。

$ mkdir homebot
$ cd homebot
$ sudo npm install -g hubot coffee-script yo generator-hubot

インストール後、yoでhubotを作成する。

$ yo hubot

色々聞かれるので適当に入力すればいいと思うが、 今回はslackを使うので、bot adapter: には slack と入力する。

普通にhubotをインストールすると、デフォルトでhubot-heroku-keepalive が有効になっているが、今回は Raspberry Pi 2 で動かす為、不要なのでアンインストールする。

$ npm uninstall hubot-heroku-keepalive --save

external-scripts.json からも "hubot-heroku-keepalive" を削除する。
また、今回はデータを永続化する必要がないので "hubot-redis-brain" も削除した。
これはお好みで。


slackとhubotの連携

slack側のhubot設定

slackのクライアントでもwebページでもいいので、 [Menu] -> [Integrations] -> All Integrationshubot[view] ボタンを押す。 f:id:kaiware007:20150830003712p:plain

hubotのユーザー名を入力して[Add Hubot Integration]を押す

f:id:kaiware007:20150830003738p:plain

[Add Hubot Integration]を押すと設定画面に移行する。
HUBOT_SLACK_TOKEN=xoxb-********* をコピーしておく。

f:id:kaiware007:20150830003805p:plain

Raspberry Pi 2側の設定

Raspberry Pi 2に戻り、bin/hubot に先ほどのHUBOT_SLACK_TOKENを追加する。

$ vim bin/hubot
export HUBOT_SLACK_TOKEN=xoxb-******

設定を保存したら、hubotを起動して動作確認する。

bin/hubot -a slack

slackの#generalチャンネルに作成したbotがログインしてきたら連携は成功している。

f:id:kaiware007:20150830004413p:plain

ping と打って PONG と返事が返ってきたら正常に動作しているので、一旦hubotをCTRL-Cで止める。

hubotに独自コマンドを追加する

独自コマンドを追加する為、scripts/以下にスクリプトを新規作成する。
頭の方のコメントのDescription:を書かないとhubot起動時に警告が出る。

# Description:
#   自宅のエアコンを操作する

# 外部コマンドを呼ぶためのライブラリ
child_process = require 'child_process'

# コマンドを受け付けるユーザーのID(ユーザー名ではない)
user_id_list = [ 'ユーザーID' ]

# エアコン操作関数
aircon = (command, success, msg) ->  
  if msg.message.user.id in user_id_list
    child_process.exec "irsend SEND_ONCE aircon #{command}", (error, stdout, stderr) ->
      if !error
        msg.reply "#{success}"
      else
        msg.reply "#{error}"
  else
    msg.reply 'ご主人様以外のお方からのご命令はお受けできません'

module.exports = (robot) ->
  robot.respond /airon/i, (msg) ->
    aircon('on', 'エアコンのスイッチを入れました', msg)

  robot.respond /airoff/i, (msg) ->
    aircon('off', 'エアコンのスイッチを切りました', msg)

  robot.respond /cooler/i, (msg) ->
    aircon('cooler28', 'お部屋、冷やしておきますね', msg)

  robot.respond /heater/i, (msg) ->
    aircon('heater26', 'お部屋、暖めておきますね', msg)

他人にエアコンを操作されると困るので、特定のユーザーIDからのリクエストのみ受け付けるようにした。
管理画面などから自分のユーザーIDの調べ方がわからなかったので、リクエストを受け取ってログに出して確認した…。

スクリプトを作成したら、もう一度hubotを起動する。

bin/hubot -a slack

先ほど追加したコマンドをhubotに送る。

f:id:kaiware007:20150830004859p:plain

エアコンが起動したら成功!


まとめ

チャットでbotにお願いして自宅のエアコンの電源を入れてもらうのは、自宅に執事がいるみたいでとてもワクワクする。
今後の予定としては、Raspberry Pi 2に温度センサを付けて、自宅の室温を教えてもらったり、冷房にするか暖房にするか自動で判断するようにしてみたい。


参考資料

Teach Your Raspberry Pi To Talk In Slack

CoffeeScript関連資料