1. Qiita
  2. 投稿
  3. アドベントカレンダー

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

  • 20
    いいね
  • 0
    コメント

※この記事はIoTLTアドベントカレンダーの12/8分の記事です。

初めましてこんにちは。
しくみ製作所の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をリンク先に書いてある通りにインストールして、 以下のコマンドをターミナルで順に叩けば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ダッシュボタン」の使い方・設定方法・レビュー
こちらの記事に丁寧に書いてありました。参照しながら順に設定すればOK。
ただし気をつけて欲しいのが、

ボタンを押したら届けて欲しい商品を選択します。商品を選択したら「次へ」を押します。

このタイミングで操作をやめること。(商品を選ばない)
そうすると、設定終わってないっすよ先輩!保存できないっすよ先輩!って怒られるんですが、無視して終了。
アカウントサービス -> 端末を管理を見ると、こんな感じに警告が出てます。これで大丈夫b
amazon_dash_memo.png

実装準備

先人たちの調査により、非常に簡単でした。
Amazon Dash Buttonを(正しくない方向で)使ってみた
上記記事を参考にしながら、
dash-button
の通りに進めていくだけです。

mkdir node-button
cd node-button
npm init

を叩いてあとはEnterを連打。

npm install --save dash-button jxa slack-node

dash-buttonjxaをインストールしたら、
同フォルダのpackage.jsonの中身で"script"と書いてある箇所を探して以下のとおりに変更。

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

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

sudo npm run scan

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

実装

ほとんどdash-buttonにあるサンプルの通りです。
以下、ソースを読んでいただければ良いかと。

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に動画をあげました。

実行結果の動画はこちら

Slackにはこんな感じで飛ぶようにしています。
Slack画像.png

感想

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

参考記事

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