背景
- AmazonPrimeDayで、DashButtonが100円!?だったので、2個も買っちゃいました
- プライム会員万歳
- IoTをかじってみたい
=>インターネットラジオの再生/停止ボタンとして改造してみよう
筆者の環境
- RaspberryPi 3.0ModelB
- すでにnode.jsがインストールされている
- USBスピーカ
- Mac Book Pro (ssh接続用)
tl;dr
- DashButtonの初期注文と初期設定
- プラグインのインストール
- DashButtonからのARPをlistenするスクリプト作成
- ラズパイ起動時に自動実行されるよう設定
DashButtonの初期注文と初期設定
まずは届いたAmazonDashButtonを、自宅のWifiにつなげて初期設定を行う
AmazonDashButtonによる自動注文は、初回に限り、DashButtonの購入代金が割引されるので、無駄にしないように、初回の注文は行いましょう
- iPhoneの、Amazonアプリの左メニューから、アカウントサービス>(ページ下部)新しいDashButton端末の割り当て
- DashButtonが、点灯するまで長押し
- アプリが自動で接続を試みる
- 初回は、wifiのパスを聞かれるので入力
- 商品を設定しよう(500円引きされるので、500円以上がオススメ)
- ここまで終わったら、一度DashButtonを押下
- iphoneなりメールなりで、自動で注文ができたことが通知されるか確認
- ここで、DashButtonを工場出荷時に戻しましょう
- Amazonアプリの左メニューから、アカウントサービス>(ページ下部)端末の管理から、DashButtonの設定をリセット
- 再度、DashButtonを長押しし、アプリで接続をすると、前のwifiパスが効いてるのでパスが省略されるはず(※ここで商品を選択してはいけない)
ここまでできたらOK
プラグインのインストール
DashButtonを操作するプラグインは複数あるのですが、超有名どころなide/dash-buttonを使ってみたいと思います
$ cd {環境を構築したいディレクトリ}
$ npm install --save dash-button
$ vi package.json //package.jsonというファイルを新規作成する
ここで、以下の内容を記述する
{
"scripts": {
"scan": "dash-button scan"
}
}
追記したあと、以下のコマンドを叩く
$ sudo npm run scan //AmazonDashButtonの検索を開始
> @ scan /home/pi/amazon_dash
> dash-button scan
Scanning for DHCP requests and ARP probes on wlan0...
// この間に、DashButtonを押下する
// うまく検出されると、以下のような感じで表示される
Detected a DHCP request or ARP probe from {DashButtonのMACアドレス}
ここの{DashButtonのMACアドレス}
をメモしておくこと
DashButtonからのARP(ようわからんけど)をlistenするスクリプト作成
node.jsで実行させるスクリプトを作成
ほとんどこちらを参考にしました(汗
const DashButton = require("dash-button");
// 今回は2台をセットアップしました
const PHY_ADDR = "??????";
const PHY_ADDR_2 = "??????";
let button = new DashButton(PHY_ADDR);
let button2 = new DashButton(PHY_ADDR_2);
button.addListener(() => {
console.log("My name is ["+PHY_ADDR+"]. I'm listening.");
});
button2.addListener(() => {
console.log("My name is ["+PHY_ADDR_2+"]. I'm listening.");
});
で、これを、起動
$ node my app.js
権限云々で怒られたので、sudoで実行
$ sudo node my app.js
DashButtonを押して、出力がされれば、動作確認OK
んで、音楽を流す音源は、インターネットラジオからchiptuneを流す前回の記事から、chipbitを使っています
apt-get install mplayer
// 出力されているか確認
mplayer http://stream.chipbit.net:8000/live
jsからコマンドラインを実行するスクリプトを含めると、最終形態はこんな感じ
const DashButton = require("dash-button");
const PHY_ADDR = "???????";
const PHY_ADDR_2 = "???????";
let button = new DashButton(PHY_ADDR);
let button2 = new DashButton(PHY_ADDR_2);
// こちらのボタンは、音楽を再生するためのボタン
button.addListener(() => {
console.log("My name is ["+PHY_ADDR+"]. I'm listening.");
const exec = require('child_process').exec;
exec('mplayer http://stream.chipbit.net:8000/live', (err, stdout, stderr) => {
if (err) { console.log(err); }
console.log(stdout);
});
});
// こちらのボタンは停止させるためのボタン
button2.addListener(() => {
console.log("My name is ["+PHY_ADDR_2+"]. I'm listening.");
const exec = require('child_process').exec;
exec('killall mplayer', (err, stdout, stderr) => {
if (err) { console.log(err); }
console.log(stdout);
});
});
この状態で、
node my app.js
で起動して、DashButtonを押してみましょう!
再生されるはずです
ラズパイ起動時に自動実行されるよう設定
まず、node.jsの実行パスをメモ
$ which node
etc/rc.local
に、以下のコマンドを追加
# set MyMusic
sudo -u pi sudo {先ほどメモしたnode.jsのパス}/node {環境構築したディレクトリ}/myapp.js
これで、自動で起動されるはずです、
課題/所感
- 一つのボタンで、再生/停止の管理をやりたい
- 一つのクリックで複数回検知されることがあるので、断念(前回実行時間の域値をつければ可能だが,,,)
- 意外とサクッとできて驚き
- 海外で見たガレージの開閉/ピザの注文も、案外簡単にいけそう - なぜか20分ぐらいすると、突然強制終了する(泣泣泣
- pm2を使って、デーモン化させるべき、、、
- こちらの記事が参考になりそうhttp://qiita.com/n0bisuke/items/781eac201a907a524f8e
参考サイト
- shからコマンドライン実行
- http://tkybpp.hatenablog.com/entry/2016/04/25/163246
- DashButtonの基本的な仕組み・ハックの流れ
- http://qiita.com/takustaqu/items/8539b33780c9675c8657
- ide/dash-buttonのgitHub
- https://github.com/ide/dash-button