Amazon Dash Button でSlackにデータを送信する

Amazon Dash Buttonのハックが流行ってますね。
- [Amazon Dash Buttonを(正しくない方向で)使ってみた](http://qiita.com/takustaqu/items/8539b33780c9675c8657)
- [Amazon Dash ButtonをただのIoTボタンとして使う](http://qiita.com/jsoizo/items/3b8bba4160f41aef20f4)


面白そうです。
わたしもこれらのサイトを参考にさせていただきながらやってみました。


# ボタンを押したら、Slackに通知がくるようにする
![result.png](https://qiita-image-store.s3.amazonaws.com/0/73777/6fa23c47-2577-c7da-5c73-70d5da3058c2.png "result.png")


たとえば子供が家に帰ったらフルグラのボタンを押させると、[Slack](https://slack.com/)に通知が来る、みたいなそんな使い方ができそうです。


# 構成
![環境.png](https://qiita-image-store.s3.amazonaws.com/0/73777/63331bbc-b269-9ec8-6729-0df543206ae1.png "環境.png")

家のLANにぶら下がったAmazon Dash Buttonと、そのボタン押下をフォークするdash-buttonというライブラリを起動してあるラズパイ(同じく家のLANにぶら下がっている)、でホントは直接Wehbook飛ばせばいいんでしょうけど、今回は[IFTTT](https://ifttt.com/)も使ってみたかったので、[IFTTT](https://ifttt.com/)の Maker ChannelでラズパイからのRequestをうけて、それをトリガーに[Slack](https://slack.com/)に通知してみました。



# 環境構築
Raspberry Pi に Node.js v6.9.1 がインストールされてる環境で試してます。Node.jsのインストールまではこんな感じ。

```bash
$ sudo apt-get install -y nodejs npm
$ node --version
v0.10.29

$ sudo npm cache clean
$ sudo npm install n -g
/usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n
n@2.1.4 /usr/local/lib/node_modules/n
$ sudo n 6.9.1
$ node --version
v6.9.1
$ sudo apt-get install libpcap-dev
```

Node.jsのバージョン管理には [n](https://github.com/tj/n) だったり [nodebrew](https://github.com/hokaccha/nodebrew) だったりいろいろあるようですが、今回は [n](https://github.com/tj/n) を使いました。


# dash-buttonのセットアップ
[Dash Button for Node](https://www.npmjs.com/package/dash-button) をインストールします。基本的にこの[作者のサイト](https://www.npmjs.com/package/dash-button)に従って、

```bash
npm init
```

で適当にプロジェクトを作成し、


```bash
npm install  --save dash-button
```

でモジュールのインストールは完了。続いて、作成されたpackage.jsonの一部を下記のように書き換えておきます。

```json:package.json
 "scripts": {
   "scan": "dash-button scan"
 }
```

あとは下記のコマンドで、同一ネットワーク上のAmazon Dash Buttonを探しに行く処理が動き出します。

```bash
pi@raspberrypi:~/adb $ sudo npm run scan
 
> adb@0.0.0 scan /home/pi/adb
> dash-button scan

Scanning for DHCP requests and ARP probes on wlan0...
Detected a DHCP request or ARP probe from xx:xx:xx:xx:xx:xx
Detected a DHCP request or ARP probe from xx:xx:xx:xx:xx:xx
```

Amazon Dash Buttonのボタンを押すと、ボタンがLANに接続しにいく際に、ボタンのMacアドレスがネットワークを流れます。で、それを検知する仕組みになってるようです。

上記のようにMacアドレスが表示されれば、環境としては完成っぽいですね。


# IFTTTのMaker Channelへイベントを送る

```bash
npm install  --save request
```

でHTTPのリクエストを投げるライブラリをインストールしておきます。

[IFTTT](https://ifttt.com/)のMaker Channelへリクエストを送るコードは以下のようにしました。

```javascript:index.js
const DashButton = require('dash-button');
const DASH_BUTTON_MAC_ADDRESS = 'xx:xx:xx:xx:xx:xx'; //←検知されたMacアドレス。小文字で。

let button = new DashButton(DASH_BUTTON_MAC_ADDRESS);


const request = require('request');
const url = 'https://maker.ifttt.com/trigger/{event}/with/key/{your key}'
const headers = {
    'Content-Type': 'application/json'
}

const options = {
    url: url,
    method: 'GET',
    headers: headers,
    json: true,
    form: {"value1": "フルグラボタンが押されました！", "value2": "bb", "value3": "cc"}
}

console.log('listen...');
let subscription = button.addListener(function () {
    console.log('Clicked.. ' + new Date());

    request(options, function (error, response, body) {
        if (!error) {
            console.log(body);
        }
    });
});
```

下記のコマンドで起動しておきます。

```bash
sudo node index.js
```


Amazon Dash Buttonのボタンを押下すると、登録されたイベントハンドラが動き出し、IFTTTのMaker Channelへリクエストを送信します。Maker Channelは送信時にイベント名を指定しますが、そのイベント名は上記では{event}とプレースホルダのままです。実際は好きな値を設定しておきましょう。

# IFTTT の設定。

IFTTT側は、this を Maker Channelにして、thatをSlackにしたレシピを作成します。

具体的には下記の通りです。

## this の設定
右上のアイコン部分から New Applet を選択し、this には Makerを選択します。
![this.png](https://qiita-image-store.s3.amazonaws.com/0/73777/037ce5eb-0a2f-ebe4-e4fd-6cfd9b6e902c.png "this.png")

さて作成する際には受信待ちするイベント名を指定しますが、その値は先ほど{event}に実際に設定した値を指定しておきます。

![this_result_pre.png](https://qiita-image-store.s3.amazonaws.com/0/73777/27b6618c-e89e-3193-3c6f-0c04f63bcbcd.png "this_result_pre.png")


以上で thisの設定はおしまいです。さきほどのラズパイからのリクエストを待ち受ける側が完成しました。

![this_result.png](https://qiita-image-store.s3.amazonaws.com/0/73777/aebf043f-ff16-d396-accf-3e3775e0604a.png "this_result.png")

↑完成です。。



## thatの設定
つづいてthatの設定つまり、Slackを設定していきます。Slackを検索して、、
![that.png](https://qiita-image-store.s3.amazonaws.com/0/73777/865b2c43-2b98-46be-7143-bbf0a7df5371.png "that.png")


送信したいチャンネルや、送信する際のメッセージなどを指定します。
![that_result_pre.png](https://qiita-image-store.s3.amazonaws.com/0/73777/395eb6b3-828b-a4d7-bf85-9066f088dffe.png "that_result_pre.png")


以上で設定完了です。
![that_result.png](https://qiita-image-store.s3.amazonaws.com/0/73777/d94e0a6d-bc90-36ea-df6b-1207cd8bed08.png "that_result.png")


# 疎通確認する
ようやく疎通確認です。フルグラのボタンを押して、Slackに通知が来るか、それとも注文完了通知が来るかを確認します。

[![ビデオが開けなかった場合に表示されるテキスト](http://img.youtube.com/vi/2sZg63h0gig/0.jpg)](https://youtu.be/2sZg63h0gig)


無事に、Slackに通知が来たようですね。。。