Amazon Dash Button でおうちハックしようその2 Dasher でIFTTT Maker チャンネルに連携編

前回の記事ではなぜAmazon Dash Button をハックするのか、
またハックの前準備をさらっと書きました。

[Amazon Dash Button でおうちハックしようその1 セットアップ編](http://qiita.com/tokio-takeda/items/02bae474f8f20f35a02c)

今回は[Dasher](https://github.com/maddox/dasher) を利用して、[IFTTT のMakerチャンネル](https://ifttt.com/maker)に連携してみましょう。

Dasher とは、[node-dash-button](https://github.com/hortinstein/node-dash-button) をラッピングしてHTTPリクエストを発行することに特化したnodeモジュールです。
直接node-dash-button を使えば、さらに柔軟なおうちハックが可能となりそうです。
その辺は次回以降の記事でまとめる予定です。

こんなことをやってみます

 - Amazon Dash Button をPhilips Hue のモバイルスイッチにする
 - twitter に投稿しつつToDo としても登録する
 - Slack に定型メッセージを投稿する

# 環境
- macOS sierra
- node.js　6.4.0
- npm 3.10.3

# 前準備
事前に以下の準備が必要です。

- node.js, npm をインストールしよう
- IFTTT のMaker チャンネルを有効にしよう

この辺りは日本語の記事も充実しているので、ここでは手順は省くこととします。
Maker チャンネルからキーが生成されればOKです。

# Dasher のインストールからボタンの登録まで
README を見ながら順番に設定していきましょう。
## Dasher のインストール
clone してnpm install するだけ。
### GitHub からDasherモジュールをclone
適当なディレクトリを作成してclone しましょう。
>$ git clone https://github.com/maddox/dasher.git
Cloning into 'dasher'...
remote: Counting objects: 179, done.
remote: Total 179 (delta 0), reused 0 (delta 0), pack-reused 179
Receiving objects: 100% (179/179), 31.63 KiB | 0 bytes/s, done.
Resolving deltas: 100% (81/81), done.
Checking connectivity... done.

### インストール
>$ cd dasher
$npm install
\> socketwatcher@0.3.0 install /Users/tokio/Projects/dasher/node_modules/socketwatcher
\> node-gyp rebuild
>
>  CXX(target) Release/obj.target/socketwatcher/socket_watcher.o
>  SOLINK_MODULE(target) Release/socketwatcher.node
>......

以上でインストール完了です。

## ボタンを登録
### ボタンのmacアドレスを調べる
下記スクリプトを実行した状態で登録したいボタンを押すと、ボタンのmacアドレスが標準出力に表示されます。
>$ ./script/find_button
Password:
Watching for arp & udp requests on your local network, please try to press your dash now
Dash buttons should appear as manufactured by 'Amazon Technologies Inc.'
Possible dash hardware address detected: [Amazon Dash Button のmacアドレス] Manufacturer: Amazon Technologies Inc. Protocol: udp

### config.json にボタンのmacアドレスを記入する
標準出力に表示されたmacアドレスをconfig.json に記入しましょう。
ここまででとりあえずサーバ側の設定は完了です。

```config/config.json
{"buttons":[
  {
    "name": "Notify",
    "address": "[Amazon Dash Button のmacアドレス]",
    "interface": "en0",
    "timeout": "60000",
    "url": "https://maker.ifttt.com/trigger/Notify/with/key/5212ssx2k23k2k",
    "method": "POST",
    "json": true,
    "body": {"value1": "any value", "value2": "another value", "value3": "wow, even more value"}
  }
]}
```

# 早速使ってみよう！
## Philips Hue をON/OFF
IFTTT のNew Applet から、Maker → Philips Hue のレシピを作成します。
<img width="496" alt="スクリーンショット 2016-12-19 21.59.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/113652/751155c0-6981-e9ca-f0ae-f5da9227bd3e.png">

config/config.json のurl を編集します。

```config.json
{"buttons":[
  {
    "name": "toggle all",
    "address": "[Amazon Dash Button のmacアドレス]",
    "interface": "en0",
    "timeout": "60000",
    "url": "https://maker.ifttt.com/trigger/toggle_all/with/key/[Maker チャンネルで発行されたキー]",
    "method": "POST"
  }
]}
```

### ライトを操作してみよう
>$ sudo npm run start
Password:

> dasher@1.1.1 start /Users/tokio/Projects/dasher
> node app.js
>
>[2016-12-19T13:04:47.987Z] toggle all added.

待ち受け状態になりました。ボタンを押してみます。
![IMG_0742.JPG](https://qiita-image-store.s3.amazonaws.com/0/113652/479ee736-16fb-9b3f-8035-b6b21a488a9e.jpeg)

>[2016-12-19T13:05:04.942Z] toggle all pressed.

・・・なかなかつきません。あ、つきました。
![IMG_0734.JPG](https://qiita-image-store.s3.amazonaws.com/0/113652/2127dd9d-a7d0-43a5-7f95-0bd1257b09fa.jpeg)


今度は消してみましょう。
>[2016-12-19T13:10:09.992Z] toggle all pressed.

消えません。消えました。またつきました。

ボタンを押してから10秒程度でライトが消えました。
そして、消えた直後に再度点灯しました。
IFTTT の実行ログを見ると、２度イベントが発生しているようです。
<img width="725" alt="スクリーンショット 2016-12-19 22.22.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/113652/da57473e-8b51-5b53-7462-f34c15e8a0f2.png">


原因がボタン側にあるのかIFTTT 側にあるのかは判然としませんが、
ライトつけるのに10秒かかってしまったので実用性があるとは言い難いでしょう。

その辺の調査は今後のお楽しみにとっておくとして、今日はどんどん試していきます。

## 朝一で決意表明
あなたが素晴らしい朝を迎えたとしたら、頭の中はその日やりたいことでいっぱいでしょう。

 - 溜まっている本を読破しよう
 - 気になっていた技術を調べてみよう
 - 10km ランニングしよう

しかし、家事を済ませたりふと目についた漫画を読み返したり、ダラダラしているうちに気が付けば夕方。
もう何かを始めるには時機を逸したと感じてしまい、結局モヤモヤしたままサザエさんを観て寝るだけ・・・。

なぜ行動に至れないのでしょうか？
実行に移すまでの最初の一歩、そのハードルが高いと感じてしまっているのではないでしょうか。
そのハードルを下げましょう。具体的にはボタンを一回押すだけ、にまで下げましょう。

やろうと決めたことをTwitter で投稿し、さらにiOS のリマインダーにToDo 登録します。

まずはtwitter 投稿のレシピを作成します。

<img width="547" alt="スクリーンショット 2016-12-21 22.43.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/113652/84a84f83-3960-88cc-373b-3ee565750bb5.png">


投稿内容はこんな感じです。
<img width="509" alt="スクリーンショット 2016-12-21 22.44.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/113652/db58ee4c-bea5-4275-dbe7-402501b3e5b8.png">

さらに、同じイベントでToDo 登録するレシピも作ります。

<img width="548" alt="スクリーンショット 2016-12-21 22.23.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/113652/6613da2f-f4de-0a6d-8dcf-5da25d0ccbcc.png">

同じく、ToDo の内容はこんな感じ。
<img width="552" alt="スクリーンショット 2016-12-21 22.49.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/113652/98876702-9a72-2a23-c3d3-9d449986cd3f.png">

では、config/config.json を修正します。
今回はbody プロパティにやりたいことの内容を記述します。

```config.json
{"buttons":[
  {
    "name": "declaration",
    "address": "[Amazon Dash Button のmacアドレス]",
    "interface": "en0",
    "timeout": "60000",
    "url": "https://maker.ifttt.com/trigger/declaration/with/key/[Maker チャンネルで発行されたキー]",
    "method": "POST",
    "json": true,
    "body": {"value1": "10km ランニング"}
  }
]}
```

### 決意表明してみよう
>$ sudo npm run start
Password:

> dasher@1.1.1 start /Users/tokio/Projects/dasher
> node app.js

>[2016-12-21T13:57:55.247Z] declaration added.
[2016-12-21T13:58:05.214Z] declaration pressed.

#### twitter
<img width="642" alt="スクリーンショット 2016-12-21 23.00.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/113652/51e03992-c339-56f3-3518-0fba0f9bcfdf.png">

#### リマインダー
<img width="414" alt="fullsizeoutput_1601.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/113652/87959afa-c106-7836-bcfc-ad1baba88a7e.jpeg">

**良い1日を！**

## Slack に「今日は休みます」とお気軽ポスト
最近めっきり冷え込んできて、布団から出難い日も増えてきました。
そんな日でも、なんとなくスマホをいじったりしているうちに目が覚めてしまい
のそのそと不本意な朝を始めてしまうものです。

そんな時に、枕元に「押すだけで休みの連絡をしてくれるボタン」があったら素敵だと思いませんか？
あなたの眠気、もっと大事してあげませんか？

その夢、叶います。

Maker チャンネル → Slack で叶います。
<img width="526" alt="スクリーンショット 2016-12-19 22.51.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/113652/67314539-0ad4-a1f5-3e77-22327133f76d.png">


```config/config.json
{"buttons":[
  {
    "name": "do not disturb",
    "address": "[Amazon Dash Button のmacアドレス]",
    "interface": "en0",
    "timeout": "60000",
    "url": "https://maker.ifttt.com/trigger/do_not_disturb/with/key/[Maker チャンネルで発行されたキー]",
    "method": "POST"
  }
]}
```

### 投稿してみよう
>$ sudo npm run start
Password:

> dasher@1.1.1 start /Users/tokio/Projects/dasher
> node app.js
>
>[2016-12-19T13:54:03.293Z] do not disturb added.
>[2016-12-19T13:54:29.756Z] do not disturb pressed.

<img width="578" alt="スクリーンショット 2016-12-19 23.02.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/113652/ea1a5193-0793-d783-b2e7-b656110d4f6c.png">

素晴らしいですね。あとは何も気にせず二度寝してしまいましょう。
布団の中で閉じられた世界、ビオトープの完成です。

## 休み申請を承認してみよう
同僚が突然BOT 経由でSlack に休みます投稿をしてきたらあなたはどう思うでしょうか？
私なら戸惑います。「え、これ許されんの？」と思います。

私たちは日頃経験する出来事に、都度自分の中の判断基準をもって価値を決めています。
いわば「価値を計るものさし」を持っているのです。
全く新しい出来事を体験をすると、それに対応した「価値を計るものさし」が無いためどう判断していいのかわからず戸惑ってしまうのです。
では、この「価値を計るものさし」はどうやって作られるのでしょうか？

隣人の意見です。
### [ナプキンを取ろう](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%BB%E3%83%9C%E3%83%BC%E3%83%AB%E3%83%BB%E3%83%A9%E3%83%B3)

Dasher には複数のボタンを登録することが出来ます。
これを利用して「休みます投稿をするボタン」に加えて「了解しました投稿をするボタン」を作ってみましょう。

<img width="540" alt="スクリーンショット 2016-12-21 23.24.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/113652/650c231f-ecdf-b9c8-87db-a2f02e9aed1d.png">

```config.json
{"buttons":[
  {
    "name": "do not disturb",
    "address": "[1個目のAmazon Dash Button のmacアドレス]",
    "interface": "en0",
    "timeout": "60000",
    "url": "https://maker.ifttt.com/trigger/do_not_disturb/with/key/[Maker チャンネルで発行されたキー]",
    "method": "POST"
},
  {
    "name": "approval",
    "address": "[2個目のAmazon Dash Button のmacアドレス]",
    "interface": "en0",
    "timeout": "60000",
    "url": "https://maker.ifttt.com/trigger/approval/with/key/[Maker チャンネルで発行されたキー]",
    "method": "POST"
  }
]}
```

>$ sudo npm run start

> dasher@1.1.1 start /Users/tokio/Projects/Kerberos/dasher
> node app.js

>[2016-12-21T14:41:37.783Z] do not disturb added.
>[2016-12-21T14:41:37.785Z] approval added.
>[2016-12-21T14:41:48.110Z] do not disturb pressed.
>[2016-12-21T14:42:43.918Z] approval pressed.

![スクリーンショット 2016-12-21 23.43.16.png](https://qiita-image-store.s3.amazonaws.com/0/113652/56ae12d2-def6-2dae-3b51-2d64460d27b2.png)

・・・BOTの独り言になってしまいました。
自作自演にも程があります。これでは皆の共感は得られないでしょう。
上手くいっていたら下記のような感じでこの記事を締めようと思っていたのですが・・・。

>「Slack での勤怠報告」が受け入れられました。
この判断は新たな「ものさし」として万人の心に深く刻まれ、[事実上の標準](https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%95%E3%82%A1%E3%82%AF%E3%83%88%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%80%E3%83%BC%E3%83%89)となることでしょう。

「了解しました投稿をするボタン」はSlack API を直接叩くようにすれば、
別人感を上手く演出できるかもしれません。

良い課題が見つかったところで、今回の記事は終了させていただきます。
次回はnode-dash-button を利用して、よりおうちハックらしいことをします。