Amazon Dash Button で「ボスが来た」ボタンを作る (加筆修正版)

# こんにちは
@albno273 です。
この記事は2016年12月5日に投稿した[自分のブログのエントリ](http://albno273.hatenablog.com/entry/2016/12/07/Amazon_Dash_Button_%E3%81%A7%E3%80%8C%E3%83%9C%E3%82%B9%E3%81%8C%E6%9D%A5%E3%81%9F%E3%80%8D%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E4%BD%9C%E3%82%8B)の加筆修正版です。
node.js を触り始めるきっかけになった記事です。
今思い返すと何もわかってなくて恥ずかしい……。

---

# こんなとき
「<b><span style="color: #ff5252">エロ画像漁ってる時にかーちゃんがきた！</span></b>」そんな学生に…
「<b><span style="color: #1464b3">オフィスでニコニコ見てたら上司が通りかかった！</span></b>」そんな社会人に…

デスクトップを見られると社会的に殺される、そんなときにおすすめです。

# きっかけ
日本での発売初日に Amazon Dash Button を購入しました。朝食にフルグラをよく食べるのでこれにしました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">500円のおもちゃが手に入ったぞ <a href="https://t.co/DtD6fmkKIy">pic.twitter.com/DtD6fmkKIy</a></p>&mdash; Albireo (@ALBNo273) <a href="https://twitter.com/ALBNo273/status/806087474342547457">2016年12月6日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

せっかくなのでいじってなんか遊んでみようと思ったわけですが、でも結局このボタンって押したことを監視して何かするだけだし、確かにすごいんだけどハックしたところで使い道がいまいち思いつかなくて、そもそも自宅に Raspberry PI とかでサーバ立てておかないと常には監視できないし。
じゃあ逆に普通に使ってるノートPCとかで、かつ使ってる間だけ監視してても活きる使い道ってあるんだろうか。
と思って、「ボスが来た」ボタンを思いつきました。

# 先駆者の方々
[Amazon Dash Buttonを(正しくない方向で)使ってみた / Qiita](http://qiita.com/takustaqu/items/8539b33780c9675c8657)
[Amazon Dash ButtonをただのIoTボタンとして使う / Qiita](http://qiita.com/jsoizo/items/3b8bba4160f41aef20f4)

以下はこれらの2記事を参考にしました。アメリカで先行して発売されていたので、ハックされまくっていろいろとモジュールができているようです。先人は偉大。

# つよいところとよわいところ
## ここがすごい
+ ボスが来た時に隠せる
+ キーボードから手が離れてる(意味深)ときでもボタン一発で起動可能

## ここ直したい
+ 音をミュートにできない
  + RobotJS を使いこなせていないだけかもしれない
+ 監視してるターミナルの入力ソースを英語にしておく必要がある
  + 入力ソースが Google 日本語入力とかのままだと RobotJS に ``Segmentation Fault: 11`` を吐かれる
    + issue 立てたほうがいいのだろうか……
+ 時間がかかる
  + レイテンシ3 - 5秒は覚悟しないといけない
    + その間に見られたら死ぬしかない

有用性が……ない……。

# 用意するもの
+ Wi-Fi につながってるPC
今回は MacBook Air (Mid 2015) / macOS Sierra でやってみました。Windows でも Linux でもなんでもいいです。

+ Amazon Dash Button
とりあえず[ここ](https://www.amazon.co.jp/b?ie=UTF8&node=4752863051)でポチりましょう。
えっ、プライム会員じゃない？年3900円お布施しよう！学生は1900円だぞ！

+ node.js
実は node.js を使ったことがなかったので[ここ](http://qiita.com/tagosaku324/items/bf1fe149c38c99728c72)を参考に導入しました。
Windows の人は[こっち](http://qiita.com/taipon_rock/items/9001ae194571feb63a5e)。

# やりかた
## 1. Dash Button をセットアップする
[Amazon 公式のセットアップガイド](https://www.amazon.co.jp/gp/help/customer/display.html?nodeId=201746340)の通りに進めます。
ただし商品は選ばずに ✗ を押してキャンセルしてください。ボスが来るたびに注文されるはめになります。

## 2. モジュールの導入
適当なディレクトリを作って [Dash Button for Node](https://www.npmjs.com/package/dash-button) と [RobotJS](http://robotjs.io/) を導入します。

```sh
$ npm init
$ npm install --save dash-button
$ npm install robotjs 
```

## 3. MACアドレスを調べる

```sh
$ sudo npm run scan
```

## 4. スクリプトを書く

```js
// The Boss incoming button
const DashButton = require("dash-button");
var robot = require("robotjs");

const PHY_ADDR = "88:71:e5:c1:0f:f4"; // Set MAC address of dash button.
let button = new DashButton(PHY_ADDR);
console.log("Stand by...");

button.addListener(() => {
    console.log("The Boss incoming!");
    // robot.keyToggle('audio_mute', 'down');
    robot.keyTap('h', ['command', 'alt']);
    robot.keyTap('m', 'command');
});
```
MACアドレスは 3. で調べたものに書き換えてください。

## 5. 監視スタート
ボスが来たらまずいことをする前に起動。

```sh
$ sudo node boss_incoming.js
```

たったこれだけ！

# 実際に使ってみる
「デレパ見ながらエッチなプログラム書くの楽しいなー！」
「ちょっといい？(ｶﾞﾁｬ」
「！！(ﾎﾟﾁｰ」

![20161207233740.gif](https://qiita-image-store.s3.amazonaws.com/0/163084/b4255fd5-82e9-cade-bab3-41d428e53c61.gif)

「……なにしてたの」
「星野源を眺めてたんだよ、文句あるかよ」

完璧。

# 感想
遅いです。そもそも速度必要ない用途なんだから当たり前なんですが。押したことを検知するのみで、検知までに数秒かかる……となると、一体どんなハックすれば有用なんでしょうかね。頭が貧弱なので思いつかぬ。

電気工事士の資格をゲットしておうちハックして、Pocket Wi-Fi と一緒に Dash Button を持ち出して、「家の電気消したっけ……？」な時にポチッと押すとスマホに消してあるかどうかプッシュ通知が届く、までいくとなかなか使えそうなんですが。あっでもこれじゃボタンいらないな……。

ともあれ1つ500円でおもちゃが買えると思えば安いので、Amazon プライム会員の方は是非買ってハックしてみてはいかがでしょうか。

---

今見返したら「Mac ならパッド3本指フリックすれば済む話やんけ」となっております。