kano

Amazon Dashボタンでこれ買ってきてボタンを作る

Amazon Dashボタンについて

Amazon Dashボタンをご存知でしょうか。
Amazonが提供している物理ボタンで、ボタンを押すことで設定した商品をお手軽に購入することができる便利グッズです。最近、対応商品が大幅に増えて計100点を越えたらしいので今後ますます拡大されていくのかもしれません。

Amazon Dash Button お気に入りの商品をワンプッシュで

しかし、それだけ商品が増えても、欲しい商品がない、商品はあるが近所のスーパーで買った方が安い、など(個人的には)いろいろあったりします。我が家の朝食はだいたい食パンなのですが、AmazonDashボタンには食パンボタンはありませんし。
そんなこんなを解消すべく、自分の好きな商品を好きな場所で購入出来るように、設定した商品名をタスクリストに追加するボタン、を作ってみました。これで食パンがない場合にボタンを押せばタスクリストに追加され買い忘れを防ぐ事が出来ますね!

概要

タスクリストはWunderlistを家族で共有して利用しているので、Zapierで連携させ、同時にSlackにも投げるようにしました。(IFTTTにはWunderlistがありませんでした)
ですので、既存のライブラリやサービスの組み合わせのみで実現可能です。設定のJSONくらいしか書きません。(黒い画面でコマンドは打ちますが)

Amazon Dashボタンのセットアップ

購入

Dashボタンのページから普通に購入します(プライム会員限定です)。500円かかりますが、初回の商品注文時に500円差し引かれるため、通常は実質ボタン代は0円、という触れ込みです。

結構ちゃんとした箱に入っていて満足感があります。

設定

購入出来たらWi-Fiに接続すべく設定します。設定はスマートフォンのamazonアプリ上で行います。付属の説明書にも記載がありますので簡単です。(ちなみにDashボタンはWi-Fiの5GHz帯には対応していないようです)

Wi-Fi接続後、商品を選択する画面まで来たところで、おもむろに右上の×ボタンで画面を閉じ、セットアップを終了します。これで、Wi-Fiには接続されているが、商品は注文されない、という状態になります。(ただし、設定してしまった後でも解除することは出来るので、最初からやり直す事は可能です。なので初回分だけ注文してその後解除…(略))
ボタンを押して、白く光った後に赤く点滅する状態になったらOKです。

RaspberryPi

Dashボタンが押された事を検知するための仕組みは、以下のようにIPアドレス取得のタイミングを監視することで実現しているようです。

通常の動作の中で、Amazon Dash Buttonが「DHCPでIPを付与してもらうために頑張る」というところがキーです。
DHCPでIPを取得するなかで、割り当てられたIPが他のマシンと重複してないかを確認するときにARP要求をブロードキャストします。
Amazon Dash ButtonのMACアドレスからARP要求が飛んでくる事を監視するサーバをネットワーク内に置いておけば、ボタンを押されたタイミングでそのサーバから何かしらのアクションを起こすことができます。
http://qiita.com/dkawashi/items/e6621c4b712b509c73ec

そのため、常に起動しDashボタンの起動を監視するためのサーバが必要となります。今回はRaspberryPi2 ModelBを使用しました。

サーバの設定

RaspberryPiの起動やOSのインストールなどは以下などを参考にしてください。

Raspbianが起動して、sshでアクセス出来るようになっていればOKです。

dasher

RaspberryPi側にて、Dashボタンの監視には、dasherというDashボタン用の便利パッケージを使用します。

maddox/dasher: A simple way to bridge your Amazon Dash buttons to HTTP services

インストール

以下の手順でインストールを行います。dasherはNode.js製になるので、RaspberryPiにNode.jsなどを入れていきます。

$ sudo apt-get install libpcap-dev
$ sudo apt-get install npm

Node.jsはラズパイ用に簡単にインストール出来るという、node-arm、を利用します。

$ wget http://node-arm.herokuapp.com/node_latest_armhf.deb 
$ sudo dpkg -i node_latest_armhf.deb

dasherをクローンしてインストールします。

$ git clone https://github.com/maddox/dasher.git
$ cd dasher
$ sudo npm install

これでインストールは完了です。

Macアドレス

Dashボタンからのアクセスであることを識別するために、設定したいDashボタンのMacアドレスを取得します。dasherにはMacアドレスを取得するために仕組みが組み込まれているのでそちらを利用します。

$ sudo ./script/find_button

上記を実行すると接続待ちの状態となるので、その状態でDashボタンのボタンを押します。上手くいくと以下のように取得出来ます。

$ sudo ./script/find_button
Watching for arp & udp requests on your local network, please try to press your dash now
Dash buttons should appear as manufactured by 'Amazon Technologies Inc.'
Possible dash hardware address detected: xx:xx:xx:xx:xx:xx Manufacturer: unknown Protocol: udp

manufacturedに、Amazon Technologies Inc.と表示されるとの説明が出ていますが、実際にはunknownで表示されました。この、 xx:xx:xx:xx:xx:xx の部分がMacアドレスとなりますのでメモしておきます。

設定ファイル

監視するDashボタンのMacアドレス、送信先のURLなどを記述したJSON形式の設定ファイルを作成します。config ディレクトリ以下に config.json というファイルを作成します。

中身は以下のように記述します。

{"buttons":[
  {
    "name" : "NAME",
    "address": "xx:xx:xx:xx:xx:xx",
    "url": "https://your.request.uri.com/",
    "method": "POST",
    "json": true,
    body": {"value1": "any value", "value2": "another value", "value3": "wow, even more value"}
  }
]}
  • name : 処理の名前
  • address : 監視するDashボタンのMacアドレス
  • url : リクエスト先のURL
  • method : リクエストメソッド
  • json : JSON形式なのでtrue
  • body : 送信内容

Zapier

あとは、ZapierにWebhookとWunderlistを連携するZap(Zapierでは設定をそう呼ぶ)を作成するだけです。

Webhook

まずはRaspberryPiから送信する先のURLをWebhookを使って設定します。

Catch Hookを選択します。

Edit Optionsは何も設定しなくてよいです。
設定が完了したらWeb Hook用のURLが表示されるのでコピーしておきます。

生成されたWeb Hook用のURLは一度送信しておかないと有効となりません。また、その際に送信された内容も読み取ってくれるため、RaspberryPiからこのURLに送信しておきます。送信するJSONファイルは以下のように設定しました。

{"buttons":[
  {
    "name": "Zapier web hook",
    "address": "xx:xx:xx:xx:xx:xx",
    "url": "https://hooks.zapier.com/hooks/catch/xxxxxx/xxxxxx/",
    "method": "POST",
    "json": true,
    "body": {"text": "送信内容"}
  }
]}

dasherを起動し、ボタンを監視状態にします。

$ sudo npm run start

> dasher@1.4.1 start /home/pi/dasher
> node app.js

[2017-07-21T05:53:28.481Z] Slack web hook added.

この状態でDashボタンを押すと上記設定ファイルより、WebHookへPOST送信されます。
送信後、設定が完了出来るようになっているはずですので、完了します。

しばらく待つと確認が完了します。

Wunderlist

次に起動するサービスを設定します。Wunderlistを選択します。

Wunderlistのアカウントと連携します。

連携完了後、どのようなタスクを作成するのかの設定を行います。
タスクを追加する先のリストはあらかじめ作成しておいた、「買い物リスト」という名前のリストに設定しました。追加するタスクの内容は、Webhookで受け取ったリクエスト内容の、 text を入れるようにします。

最後にタスクの動作をテストし、ZAPをオンにしたら完了です!

Zapierは一つのトリガから複数の動作を設定出来るため、Wunderlistへのタスク追加と同時に、Slackへの投稿も設定してやることも出来ます。Slackへの投稿の設定も同じようにポチポチしていけば出来ると思いますので割愛させて頂きます。

Dashボタンのカスタマイズ

こちらにDashボタンのテンプレートを公開してくださっている方がいますので、そちらを使わせてもらいDashボタンのラベルを作成しました。

Dashボタンのテンプレート(PDF)
Amazon Dash Buttonを(正しくない方向で)使ってみた - Qiita より)

アイコンはいらすとやさんを利用させてもらいました。
食パンのイラスト「一斤」 | かわいいフリー素材集 いらすとや

丸の部分を切り抜くのがなかなか大変でしたが、切り取ってはりつけます。シールに印刷して貼り付けるのが一番キレイだと思いますが、普通の紙に印刷して、のりで貼り付けても大丈夫でした。

稼働

最後に食パンボタンが押されたら食パンが追加タスクに追加されるようにするため、設定のJSONファイルを食パンに変更します。

{"buttons":[
  {
    "name": "shoku-pan button",
    "address": "xx:xx:xx:xx:xx:xx",
    "url": "https://hooks.zapier.com/hooks/catch/xxxxxx/xxxxxx/",
    "method": "POST",
    "json": true,
    "body": {"text": "食パン"}
  }
]}

(もし複数登録したい場合は、 buttons の中身を設定したいボタンの数だけ記述してやればよいです。)

前述の通り、Dasherを起動します。

$ sudo npm run start

おもむろにボタンを押し、タスクに登録されれば完成です!

(Slackへ投稿されている様子)

すごく長くなってしまいましたが以上となります。
お疲れ様でした。

まとめ

このようにRaspberryPiのセットアップが少し大変な印象もありますが、結構お手軽に作る事が出来ました。さらにRaspberryPi Zeroを使えばDashボタンと合わせても1000円程度で環境を揃える事ができるという安さも驚きです。
今回はZapierでお手軽に設定しましたが、自分でプログラムを書くことも出来るようなので組み合わせなどによってはもっと面白いことも出来そうです。

実はAmazonが公式に出している、IoT用のDashボタンなるものが存在しており、このボタンを使えばAWSとの連携などが簡単に出来たりするようです。ただし、日本未発売な上に、$19.95 とそれなりの値段がします。
AWS IoT ボタン (プログラミング可能な Dash Button) | AWS

ですので、このハック方式だといつまで使えるのかは正直不明(未設定のまま放置されているボタンは無効化される、とか)ですので、その辺は自己責任でよろしくお願いします。

とはいえ、まずはきっかけとして試してみてはいかがでしょうか。

参考

新しいウェブ体験を作ろう TAMのPWA開発
お問い合わせはこちら