Amazon Dash ButtonをiTunesプレイヤーにしてみた

※この記事は[IoTLTアドベントカレンダー](http://qiita.com/advent-calendar/2016/iotlt)の12/8分の記事です。

初めましてこんにちは。
[しくみ製作所](https://sikmi.com/)のNotchです。
今回はAmazon Dash Buttonを使ってiTunesプレイヤーにしてみました。
・・・と書くと、ボタンを改造してMP3プレイヤーでも埋め込んだのかと思われるかもしれませんが、
残念ながらただmacで音を鳴らすだけです（本当に再生・停止するだけ）
期待させてしまったらすみません（嘘はついてない・・・はず）

# 動機
Amazon Dash Button発売のニュースを見て、
「うわー、すげー、いいなぁ」
と思い、勢いで購入（アリエール、NESCAFE）
wkwkしながら待っていると翌日到着！
「よし、早速使ってみよう！アプリ起動して、設定して・・・。うん、簡単だな、これ。」

ポチッ（緊張の一瞬）

「おぉ、注文できた。マジパネェ、物理ボタンやべぇ！」
えっと、で、次はいつ使うんだっけ・・・？

せっかく買ったAmazon Dash Buttonですが、一度押したら満足してしまい、使い道が案外少ない・・・。
（これ、次押すのは半年後ぐらいじゃね？）
と、ふと思うと、なんだかもったいない気分になりました。

そして周りを見るとハックしている人いっぱい。やべぇ、楽しそう。
乗るしかない・・・このビッグウェーブに。

普段、音楽再生専用機と化しているmacに、一々ログインしてからiTunesを起動するのがストレスだったので（<-iPhone使えよ）、
ここはAmazon Dash Buttonをトリガーにして起動してやろうと思い、実装してみました。
（ついでにSlackにトラック名とアーティスト名を通知するようにしました。）
※ かなり初級者向けの内容ですし、二番煎じを独走中。アイデア勝負です。

# 動作環境
動作環境は以下のとおり

* OS X El Capitan
* NECの無線LAN
* node.js v6.9.1

# 事前準備
## node.jsのインストール
* まずはnodeのインストールですね（もちろん既に終わってたけど一応）
* [anyenv](https://github.com/riywo/anyenv)をリンク先に書いてある通りにインストールして、
以下のコマンドをターミナルで順に叩けばOK

```
anyenv install ndenv
exec $SHELL -l
ndenv install v6.9.1
ndenv rehash
ndenv global 6.9.1
ndenv rehash
```

## Amazon Dash Buttonの同期
[【届いた！】「Amazonダッシュボタン」の使い方・設定方法・レビュー](http://usedoor.jp/howto/life/shopping/amazon-dash-button-setup/ '【届いた！】「Amazonダッシュボタン」の使い方・設定方法・レビュー')
こちらの記事に丁寧に書いてありました。参照しながら順に設定すればOK。
ただし気をつけて欲しいのが、
> ボタンを押したら届けて欲しい商品を選択します。商品を選択したら「次へ」を押します。

このタイミングで操作をやめること。（商品を選ばない）
そうすると、設定終わってないっすよ先輩！保存できないっすよ先輩！って怒られるんですが、無視して終了。
アカウントサービス -> 端末を管理を見ると、こんな感じに警告が出てます。これで大丈夫b
![amazon_dash_memo.png](https://qiita-image-store.s3.amazonaws.com/0/134905/18f12db0-3dd8-241a-1944-6b6cee9a3698.png "amazon_dash_memo.png")


# 実装準備
先人たちの調査により、非常に簡単でした。
[Amazon Dash Buttonを(正しくない方向で)使ってみた](http://qiita.com/takustaqu/items/8539b33780c9675c8657 'Amazon Dash Buttonを(正しくない方向で)使ってみた')
上記記事を参考にしながら、
[dash-button](https://www.npmjs.com/package/dash-button)
の通りに進めていくだけです。

```
mkdir node-button
cd node-button
npm init
```
を叩いてあとはEnterを連打。

```
npm install --save dash-button jxa slack-node
```
で[dash-button](https://www.npmjs.com/package/dash-button)と[jxa](https://www.npmjs.com/package/jxa)をインストールしたら、
同フォルダのpackage.jsonの中身で"script"と書いてある箇所を探して以下のとおりに変更。

```
{
  "scripts": {
    "scan": "dash-button scan"
  }
}
```

これでAmazon Dash ButtonをPCから探せます。
以下のコマンドを打った後、事前にwifiに登録しておいたボタンを押すと、探した結果が返ってきます。

```
sudo npm run scan
```

帰ってきたMACアドレスをメモりましょう。
この辺の手順は、
[Amazon Dash Buttonを(正しくない方向で)使ってみた](http://qiita.com/takustaqu/items/8539b33780c9675c8657 'Amazon Dash Buttonを(正しくない方向で)使ってみた')
こちらの記事により詳細な情報がありますので、ここでは割愛。
これで全ての準備が終わりました。

## 実装
ほとんど[dash-button](https://www.npmjs.com/package/dash-button)にあるサンプルの通りです。
以下、ソースを読んでいただければ良いかと。

```Node:app.js
// dash-buttonモジュールの読み込み
const DashButton =  require('dash-button')

// 上でメモしたAmazon Dash ButtonのMACアドレスを登録
const DASH_BUTTON_MAC_ADDRESS = 'XX:XX:XX:XX:XX:XX'

// JXAモジュールの読み込み
const Application = require('jxa').Application

// iTunesアプリケーションを指定
const iTunes = Application('iTunes');

// slackモジュールの読み込み
const Slack = require('slack-node')

// slackのtokenを登録
const apiToken = "ここにslackで発行したtokenをコピーして貼り付け"

let button = new DashButton(DASH_BUTTON_MAC_ADDRESS)
let slack = new Slack(apiToken);

// 再生・停止管理
let play = true
let [name, artist, currentPlay] = ["", "", ""]

// 処理
let subscription = button.addListener(() => {
 if (play) {
   // "RWBY"プレイリストの再生
   iTunes.playlists["RWBY"].play()
   // トラック名取得
   name   = iTunes.currentTrack.name()
   // アーティスト名取得
   artist = iTunes.currentTrack.artist()
   // slack表示文言
   currentPlay = 'Now Playing: ' + name + ' by ' + artist
   console.log("==================================================")
   console.log(currentPlay)
   console.log("==================================================")
   // slack送信
   slack.api('chat.postMessage', {
     username: "Dash Button",
     text: currentPlay,
     channel:'飛ばしたいslackのチャンネル'
   }, function(err, response){
     // console.log(response);
   })
   // 停止待機
   play = false
 } else {
   // 停止
   iTunes.stop()
   console.log("==================================================")
   console.log("                      Stop!!")
   console.log("==================================================")
   // 再生待機
   play = true
 }
})
```
正直Slack通知部分はおまけなので、なくても普通に動きます。
以下のコマンドで実行してボタンを押すと、再生・停止を繰り返します。

```
sudo node src/app.js
```

# 実行結果
再生・停止についてはYoutubeに動画をあげました。

[![実行結果の動画はこちら](http://img.youtube.com/vi/A3BO5l6rbIM/0.jpg)](http://www.youtube.com/watch?v=A3BO5l6rbIM)

Slackにはこんな感じで飛ぶようにしています。
<img width="641" alt="Slack画像.png" src="https://qiita-image-store.s3.amazonaws.com/0/134905/d79437e4-c17e-5180-9577-1007e494066f.png">



## 感想
やっぱ物理ボタンはいいですね。
いろんなところで言われているように、レイテンシは正直気になりますが、
今回のようなケースではほとんど関係ないので、用途次第だと思います。
たくさんボタンを用意して、ちょっと面倒だった作業を簡単にしてみませんか？

## 参考記事
* [Amazon Dash Buttonを(正しくない方向で)使ってみた](http://qiita.com/takustaqu/items/8539b33780c9675c8657 'Amazon Dash Buttonを(正しくない方向で)使ってみた')
* [【届いた！】「Amazonダッシュボタン」の使い方・設定方法・レビュー](http://usedoor.jp/howto/life/shopping/amazon-dash-button-setup/ '【届いた！】「Amazonダッシュボタン」の使い方・設定方法・レビュー')

先人方、大変参考にさせていただきました。ありがとうございます。