amazonDashButtonで、ラズパイジュークボックスを作った件

## 背景
- AmazonPrimeDayで、DashButtonが100円!?だったので、２個も買っちゃいました
- プライム会員万歳
- IoTをかじってみたい

=>インターネットラジオの再生/停止ボタンとして改造してみよう

## 筆者の環境
- RaspberryPi 3.0ModelB
 - すでにnode.jsがインストールされている
- [USBスピーカ](https://www.amazon.co.jp/iBUFFALO-スピーカー-USB接続-コンセント不要-BSSP01UBK/dp/B0017U7U96/ref=zg_bs_171351011_11?_encoding=UTF8&psc=1&refRID=FE2MA4BFTB58FQKT5M9A)
- Mac Book Pro (ssh接続用)

## tl;dr
- DashButtonの初期注文と初期設定
- プラグインのインストール
- DashButtonからの**ARP**をlistenするスクリプト作成
- ラズパイ起動時に自動実行されるよう設定

## DashButtonの初期注文と初期設定
まずは届いたAmazonDashButtonを、自宅のWifiにつなげて初期設定を行う

**AmazonDashButtonによる自動注文は、初回に限り、DashButtonの購入代金が割引されるので、無駄にしないように、初回の注文は行いましょう**

1. iPhoneの、Amazonアプリの左メニューから、アカウントサービス>（ページ下部）新しいDashButton端末の割り当て
2. DashButtonが、点灯するまで長押し
3. アプリが自動で接続を試みる
4. 初回は、wifiのパスを聞かれるので入力
5. 商品を設定しよう(500円引きされるので、500円以上がオススメ)
6. ここまで終わったら、一度DashButtonを押下
7. iphoneなりメールなりで、自動で注文ができたことが通知されるか確認
8. ここで、DashButtonを工場出荷時に戻しましょう
9. Amazonアプリの左メニューから、アカウントサービス>（ページ下部）端末の管理から、DashButtonの設定をリセット
10. 再度、DashButtonを長押しし、アプリで接続をすると、前のwifiパスが効いてるのでパスが省略されるはず(※ここで商品を選択してはいけない)

ここまでできたらOK

## プラグインのインストール
DashButtonを操作するプラグインは複数あるのですが、超有名どころな[ide/dash-button](https://github.com/ide/dash-button)を使ってみたいと思います

```shell-session
$ 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で実行させるスクリプトを作成

ほとんど[こちら](http://qiita.com/takustaqu/items/8539b33780c9675c8657#試してみよう)を参考にしました(汗

```myapp.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.");
});

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を流す前回の記事](http://qiita.com/diggymo/items/4dea0ee81a8e9e119105)から、chipbitを使っています

```
apt-get install mplayer
// 出力されているか確認
mplayer http://stream.chipbit.net:8000/live
```

jsからコマンドラインを実行するスクリプトを含めると、最終形態はこんな感じ

```myapp.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