目的 Amazon Dash Buttonが押されたら、LINEへ通知できるようにしたい
Amazon Dash Button(以下Dash Button)は大変便利なIoTツールで、ただ、モノを購入するだけでなく、様々な用途で使われています。そこで、おウチのDash Buttonが緊急連絡ツールとして使えるんじゃない?と思い、試してみました。
構成
Slackへ通知するのと同じやり方です。
- Dash Buttonが押されたときに発信されるARPリクエストをRaspberry Piで受信する。
- IFTTTを通じてRaspberry PiからLINEへDash Buttonが押されたことを通知する
Raspberry Piを常時動かしておく必要がありますが、我が家ではセンサゲートウェイとして稼働しているので都合が良いのです。Raspberry Pi以外でも、Linuxが入ったNASなどで代用できます。
また、この続きの前提として、Raspberry PiからIFTTTを通じてLINEへ通知する仕組みづくりを用意しておく必要があります。詳しくはこちらのエントリをご覧ください。
Dash Button のセットアップ
Amazon公式に記載されているとおり、セットアップを行います。ただし、下の画像のように支払い設定をせず、セットアップを中断した状態にすれば、ボタンを押しても商品が注文されることはありません。
また、「通知の設定」でDash Buttonの通知をオフにしないと、ボタンを押すたびにセットアップが完了していない旨の通知がきます。
Raspberry Pi のセットアップ
私が検証したRaspberry Piは以下の状態です。
Raspberry Pi 2 Model B
OS : RASPBIAN JESSIE LITE / kernel 4.9 (2017-07-05)」
まず、Dash ButtonのARPを検知ために、Node.jsの便利なライブラリを使用します。Node.jsは初期から入っていますが、npm、gitなどが必要なので、もろもろインストールします。
$ sudo apt-get install libpcap-dev npm git
つづいてdash-buttonパッケージをインストールします。
$ npm install node-dash-button --save
※ユーザーディレクトリへインストールするため、sudoは不要です。
※エラーが出た場合は、gitが入っていないとか、/tmpディレクトリの容量が足りないなど考えられます。(両方とも私が詰まったエラーです)
LANに接続された機器の中から、Dash ButtonのARPを検知するために、MACアドレスを調べます。先程インストールしたパッケージの’findbutton’という機能を用いて調査します。
’findbutton’実行のため、インストールディレクトリへ移動します。
$ cd {HOME}/.npm/node_modules/node-dash-button
次のコマンド実行後、受信したarp一覧がコマンドラインに流れるようになります。
$ sudo node bin/findbutton
この状態でDash Buttonを一度押します。Manufacturer: Amazon~と表示される行がDash ButtonのARPなので、その行のMACアドレスを控えます。以下の例の場合、「ac:63:be:a1:a2:a3」がDash ButtonのMACアドレスです。
Possible dash hardware address detected: ac:63:be:a1:a2:a3 Manufacturer: Amazon Technologies Inc. Protocol: arp
あとは、Dash ButtonのARPを検知した場合、何かを行うプログラムを作ります。同ディレクトリに”app.js”という名前で作りました
$ vi app.js
const dash_button = require('node-dash-button');
const execSync = require('child_process').execSync;
// Dashボタンのアドレスを入力
const dash = dash_button('ac:63:be:a1:a2:a3', null, null, 'all');
// ボタンを押したときのアクション
dash.on('detected', () => {
//シェルコマンドを実行
//IFTTTを通してLINEへ通知する
const exec = require('child_process').exec;
exec(' /home/pi/post.sh Amazon dash buttonが押されました', (err, stdout, stderr) => {
if (err) { console.log(err); }
console.log(stdout);
});
});
Dash Buttonが押されたとき、(piユーザの)ホームディレクトリにあるpost.shが実行されるプログラムです。post.shは引数で受けたメッセージを、IFTTTを通じてLINEへ通知するシェルスクリプトになっています。
詳しくはこちらのエントリをご覧ください。
実行方法
同ディレクトリで次のコマンド実行後、Dash buttonを待ち受けるようになります。
$ sudo node app.js
この状態でDash Buttonを押すと、次のメッセージがLINEへ届きます。