Slackから自宅のエアコンを操作する

##皆さんいかがお過ごしですか
暑い日が続いていますね
私も仕事から帰宅すると部屋がめちゃくちゃ蒸されてて
部屋が冷えるまでそれなりに時間がかかっています

そこで、今回はリモートで部屋のエアコンをオンにするシステムを作成してみました！

##概要・構成
Slackにメッセージを送るとRaspberryPi上のHubotがシェルスクリプトを実行して
RaspberryPiにUSB接続した赤外線リモコンからエアコンのスイッチを入れるという構成です
工作などは不要になっております
![構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407680/587d9fd1-cd06-3e70-f70d-b0c4ecdcbe3c.png)


##使ったもの
- RaspberryPi3
- [BitTradeOne 赤外線リモコンアドバンス ADIR01P](https://www.amazon.co.jp/%E3%83%93%E3%83%83%E3%83%88%E3%83%88%E3%83%AC%E3%83%BC%E3%83%89%E3%83%AF%E3%83%B3-ADIR01P-%E3%83%93%E3%83%83%E3%83%88%E3%83%BB%E3%83%88%E3%83%AC%E3%83%BC%E3%83%89%E3%83%BB%E3%83%AF%E3%83%B3-USB%E8%B5%A4%E5%A4%96%E7%B7%9A%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%E3%82%A2%E3%83%89%E3%83%90%E3%83%B3%E3%82%B9/dp/B013JG0WSG/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=usb+%E8%B5%A4%E5%A4%96%E7%B7%9A&qid=1564850671&s=gateway&sr=8-5)

##RaspberryPiの設定
[こちら](https://qiita.com/watari_eng/items/d996bf4617b0a3bee700)

##Node.jsとnpmのインストール
HubotをインストールするにはNode.jsとnpmが必要です
こちらを参考にさせて頂いてインストール
[Node.js と npm インストールとアップデート](https://qiita.com/jaxx2104/items/2277cec77850f2d83c7a)

```console:raspberry.pi
$ sudo apt install nodejs npm
$ sudo npm install -g n
$ sudo n latest
```

##Hubotのインストール
こちらを参考にさせて頂きインストール
[SlackのBot(hubot)を作ってみる](https://qiita.com/mochidamochiko/items/29c2d77715d8a1ff062a)


```console:raspberry.pi
$ sudo npm install -g hubot yo generator-hubot coffee-script
```

Hubot用のディレクトリを作成して、Hubotの作成

```console:raspberry.pi
$ mkdir hubot-wata
$ cd hubot-wata
$ yo hubot
? ==========================================================================
We're constantly looking for ways to make yo better!
May we anonymously report usage statistics to improve the tool over time?
More info: https://github.com/yeoman/insight & http://yeoman.io
========================================================================== Yes
                     _____________________________
                    /                             \
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             /
 ======= |[^_/\_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     \_\
   | |_\ /// HUBOT/\\
   |___/\//      /  \\
         \      /   +---+
          \____/    |   |
           | //|    +===+
            \//      |xx|

? Owner wata            //名前  
? Bot name wata         //Botの名前
? Description aircon    //説明
? Bot adapter slack     //slackと入力
~
略
~
                     _____________________________
 _____              /                             \
 \    \             |   Self-replication process   |
 |    |    _____    |          complete...         |
 |__\\|   /_____\   \     Good luck with that.    /
   |//+  |[^_/\_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     \_\
   | |_\ /// HUBOT/\\
   |___/\//      /  \\
         \      /   +---+
          \____/    |   |
           | //|    +===+
            \//      |xx|

```
続いてSlack側の設定です
Slackのアプリ一覧からHubotを登録します
画像の通り歯車マークから設定をクリックしてAPI TOKENを取得します
![Slack.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407680/eaadfc67-805a-c4ed-bc4a-897db44d4605.png)
その後、このトークンを環境変数にセットします

```console:raspberry.pi
$ export HUBOT_SLACK_TOKEN=XXXXXXXX
```

Hubotの設定は完了です
##スクリプトの作成
こちらを参考にさせて頂きました
[SlackからHubot経由で 、サーバのシェルを実行してみよう！](https://tech.sanwasystem.com/entry/2015/04/30/213521)

slackにairというメッセージを送信するとRaspberryPi上のシェルスクリプトが動くようにします


```aircon.coffee
module.exports = (robot) ->
  robot.respond /air/, (msg) ->
    @exec = require('child_process').exec
    command = "sh /home/pi/hubot-wata/scripts/shell/test.sh"
    msg.send "Command: #{command}"
    @exec command, (error, stdout, stderr) ->
      msg.send error if error?
      msg.send stdout if stdout?
      msg.send stderr if stderr?
```

```test.sh
#!/bin/sh
pwd
echo "DEKITERU"
```

試してみます
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407680/5b229ebd-933b-fa29-fab9-a9c8a0d897a6.png)

きちんと実行できていますね

##エアコンのリモコンを記録してコマンド化
こちらを参考にさせて頂きました
[USB赤外線リモコンアドバンス(BitTradeOne)をRaspberry-Piで操作する](https://qiita.com/orihomotakanat/items/8f735a73169ea5144503)
[RaspberryPiでスマートホーム 〜赤外線リモコン操作〜](https://my-scribble.net/raspberrypi%E3%81%A7%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%9B%E3%83%BC%E3%83%A0-%E3%80%9C%E8%B5%A4%E5%A4%96%E7%B7%9A%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%E6%93%8D%E4%BD%9C%E3%80%9C/)


まず必要なファイルをPCにダウンロードします
[こちら](http://bit-trade-one.co.jp/assemblydeskfiles/hobby/)のUSB赤外線リモコンアドバンスをダウンロードしてきます
解凍したファイル

- bto_advanced_USBIR_cmd.c
- Makefile

をSCPなどでRaspberryPiの任意のディレクトリに送信します

私はTeraTermを使っているのでTeraTermのSSH SCPを使い送信しました

必要なパッケージをインストールて、先ほどのファイルをコンパイルします

```console:raspberry.pi
$ sudo apt-get install libusb-1.0.0
$ make
$ sudo make install
```
これをすることで「bto_advanced_USBIR_cmd」というコマンドが使えるようになります

続いてリモコンを記録させます

```console:raspberry.pi
$ bto_advanced_USBIR_cmd -r                    //まず赤外線を受信開始
　記録したいリモコンのボタンを物理的に押して記録させます。成功すると光ります

$ bto_advanced_USBIR_cmd -s                    //赤外線を受信停止します
$ bto_advanced_USBIR_cmd -g | tee data.txt     //いま受信したデータをファイル(data.txt)に書き出す
$ bto_advanced_USBIR_cmd -d `cat data.txt`     //受信したデータ(data.txt)を使って赤外線送信
```
data.txtをaircon_on.txtとリネームして先ほどのシェルスクリプトのあるディレクトリへ移動します
あとはこのコマンドをシェルスクリプトの中に書き込めれば完成です！
##最終形

```aircon_on.sh
#!/bin/sh
bto_advanced_USBIR_cmd -d `cat /home/pi/hubot-wata/scripts/shell/aircon_on.txt` 
```

```aircon.coffee
module.exports = (robot) ->
  robot.respond /エアコン/, (msg) ->
    @exec = require('child_process').exec
    command = "sh /home/pi/hubot-wata/scripts/shell/aircon_on.sh"
    msg.send "了解シマシタ。"
    @exec command, (error, stdout, stderr) ->
      msg.send error if error?
      msg.send stdout if stdout?
      msg.send stderr if stderr?
```
![実行 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407680/c51a409c-1bf7-da90-7b1d-0a9113035ad8.gif)
エアコンがオンになるところは撮るのが難しかったので出来なかったのですが
メッセージを送ると緑の光が発行して送信していることが分かりますね
Hubotも返事してくれています笑

##感想
というわけで無事目的を達成しました！
とりあえず感じたのはSlackとHubot便利だなあということです

シェルスクリプトでできることならリモートでHubot君がなんでもやってくれますね

次回はHubot君をクラウドサーバー上に置いていつでも使えるようにしたいと思います

本稿を見て頂いてもわかる通り、いろいろな方の記事を参考にさせて頂きました
この場をお借りして御礼申し上げます

暑い日が続きますので体調管理には気を付けましょう！