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


Amazon Dash Buttonのハックが流行ってますね。
- Amazon Dash Buttonを(正しくない方向で)使ってみた
- Amazon Dash ButtonをただのIoTボタンとして使う

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

ボタンを押したら、Slackに通知がくるようにする

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

構成

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

環境構築

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

$ 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
[email protected] /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 だったり nodebrew だったりいろいろあるようですが、今回は n を使いました。

dash-buttonのセットアップ

Dash Button for Node をインストールします。基本的にこの作者のサイトに従って、

npm init

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

npm install  --save dash-button

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

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

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

pi@raspberrypi:~/adb $ sudo npm run scan

> [email protected] 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へイベントを送る

npm install  --save request

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

IFTTTのMaker Channelへリクエストを送るコードは以下のようにしました。

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);
        }
    });
});

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

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を選択します。

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

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

↑完成です。。

thatの設定

つづいてthatの設定つまり、Slackを設定していきます。Slackを検索して、、

送信したいチャンネルや、送信する際のメッセージなどを指定します。

以上で設定完了です。

疎通確認する

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

ビデオが開けなかった場合に表示されるテキスト

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