たねやつの木

Photos and Programming

Raspberry PiでAmazon Dash Buttonの入力を受け取る

こんにちは。たねやつです。

Amazonのサイバーマンデーでは皆さん何を購入されたでしょうか?VRとかほしかったんですが、 あんまり安くなっていなかったのでスルーでした笑。

今回のサイバーマンデーではAmazon Dash Buttonが250円になっていたので、 ノリと好奇心で2個購入してみました。そして一個は正しくない使い方で(´ω`)

Dash Buttonを押した時にRaspberry Pi上で「押した」ということを受け取れるようにします。 そこからIRKitでシーリングライトを操作したりといろいろできるようになります。

できたこと

こんな感じでボタンを押したらnodejs上でスクリプトを実行できます。

とりあえずの動作確認です。シーリングライトにリモコンあるからね...(´ω`)

使うもの

  • Raspberry Pi 3 (Raspbian 9.2)
  • Amazon Dash Button (なんでもおk! CyberMondayで250円/個で購入)

Node.jsを導入

# apt-get install nodejs npm
$ nodejs

> console.log('hogehoge');
hogehoge
undefined

何か出力できればインストールは完了です。末のundefinedは不明。 undefinedはconsole.log()の戻り値のundefinedという値(?)。 nullとはまた異なった種類の値らしいです、javascriptはよく知りません笑。

node-dash-buttonの導入

node-dash-buttonのreandmeに設定方法があるのでそれを参考にする。

node-dash-button

必要ファイルのインストール

libpcap-devというパッケージが必須です。

# apt-get install libpcap-dev

npmからnode-dash-buttonをインストール。

$ npm install node-dash-button

node-gyp rebuild
/bin/sh: 1: node: not found
gyp: Call to 'node -e "require('nan')"' returned exit status 127 while in binding.gyp. while trying to load binding.gyp
gyp ERR! configure error 
gyp ERR! stack Error: gyp failed with exit code: 1

ビルド中にエラー発生。

ココ に書いてある曰く、node-gyp内部でnodejsを実行する際には'node'(/usr/bin/node)コマンドでnode.jsを 実行しているのだが、Debianでは別のパッケージとの名前の衝突を避けるため nodejsというコマンド名になっている。

これを解決するためにはnodeコマンドが使われていないことを確認 (which nodeで何も表示されないことを確認)して、 シンボリックリンクを作成してしまえばいいようです。

$ cd /usr/bin
$ sudo ln -s nodejs node

$ node 
> ... ←nodejsではなくnodeコマンドが使えることを確認

これでnpm install node-dash-buttonを再実行すると上手く行けました!

Amazon Dash Buttonの初期化

Amazon準拠の手順に沿って進めていくが注文する商品の選択は行わない。

スマホのアプリから設定を行う。左上のハンバーガーボタン > アカウントサービス > Dash端末 > 新しい端末をセットアップ (Androidの場合)

設定を進めていき、以下の部分で右上のXを押して設定を中断してください。

f:id:ibuquicallig:20171214182748p:plainf:id:ibuquicallig:20171214182742p:plain

Dash端末 > 端末を管理 より、新たに追加されていることが確認できます。 (商品を設定していないので警告は表示されたまま、、、)

node-dash-buttonでボタンを探す。

以下のコマンドでDash ButtonのMACアドレスを探す。

$ cd node_modules/node-dash-button/bin ←node_modulesのある場所はnpm install node-dash-buttonを行った所。
$ sudo node ./findbutton ←root権限で実行する必要アリ

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
Possible dash hardware address detected: xx:xx:xx:xx:xx:xx Manufacturer: unknown Protocol: arp
Possible dash hardware address detected: xx:xx:xx:xx:xx:xx Manufacturer: unknown Protocol: arp
Possible dash hardware address detected: yy:yy:yy:yy:yy:yy Manufacturer: BUFFALO.INC Protocol: arp

Dash Buttonを押すとDash ButtonのMACアドレスと思しきものが表示されます。

node-dash-buttonのinstructionには「Manufacturer: Amazon Technologies Inc.と表示されるはず」 とありますが、Unknownと表示されている(初代Dash Buttonじゃないから?)。

何度か押してみて正しいMACアドレスを特定してください。

Manufacturerの部分がIntelだったりBUFFALOだったりするものはDash Buttonではないです。

テスト用スクリプトを書いてみる

公式を参考に以下のようなスクリプトを作成します。 とりあえずfindbuttonと同じディレクトリで(何でもいいのですが) test.jsとして作成します。

#!/usr/bin/env node

var dash_button = require("node-dash-button");
var dash = dash_button("xx:xx:xx:xx:xx:xx", null, null, null);

console.log("awaiting...");

dash.on("detected", function () {
    console.log("button clicked!");
    }
);

xx:xx:xx:xx:xx:xxの部分には先程取得したDash ButtonのMACアドレスを 入れます。それ以外の引数はとりあえずnullで(デフォルト値を使用)。

作成したファイルに実行権限をつけて(chmod 775 test.js)、sudo node test.jsで実行します。 ここでもroot権限で実行しないとエラーとなりますのでご注意を。

実行してDash Buttonを押してみると以下のようになると思います。

$ sudo node test.js
awaiting...
button clicked! 

無事にボタンを押したという情報をRaspberry Pi上で受け取ることができました!

うまいこと行かない場合はもしかしたらDash ButtonのMACアドレスが間違っているのかもしれません。。。

ボタンを押してから5秒ぐらいの遅延がありますが、仕方ないでしょう(_)

応用(?)

ここまでで、なんとかDash Buttonを押すというイベントをRaspberry Pi上で取得することができました。

取得さえできれば、あとはこっちのターンでシェルスクリプトを実行したり、PHPの実行やSQL文の発行も Raspberry Pi上でできることは自由自在です(多分)。

冒頭のライトをつけるなどの細かい内容はまた後日追加していきます!(´ε` )

Dash Buttonの通知の設定

デフォルトの状態だとDash Buttonを押す度に、Amazonのアプリを入れている スマホに通知が飛んで鬱陶しいので通知を消したいとおもいます。

アプリの設定の[端末の管理]より通知を切ることができます。

Dash Buttonごとに設定できる(っぽい)ので、ちゃんとしたDash Buttonとして 使いたいDash Buttonは通知を飛ばし続けることも可能かと(´ω`)

詰まった点...

libcap-devを間違えてインストール

本当に初歩的なミスなのですが、node-dash-buttonをインストールする際の、 必須パッケージにlibpcap-devがあるのですが、間違えてlibcap-dev をインストールしていました...

npm install node-dash-buttonの段階でビルドエラーとなります。 fatal error: pcap/pcap.h: No such file or directory

apt-get install libpcap-devと間違えさえしなければこの点ではエラーと なりません。libcap-devが存在してさえいなければ...笑

最後に

Amazon Dash Buttonはめちゃくちゃいい匂いがする。新築の家みたいな(´ω`)