どこでも Amazon Dash Button を使えるようにしてみた

お家で、おふぃーすで、そして、お外でも Amazon Dash Button を利用できる環境を考えてみました。
無線LANルータや Raspberry Pi がなくても、どこでも Amazon Dash Button を使うことができます。
試しに、[もういい加減話を切り上げたいから、Amazon Dash Buttonを押して、自分に電話が来たように振る舞ってみた](http://qiita.com/somainit/items/c3896713483a48b4377e)の、どこでも使えるバージョンを構築してみました。


便利な仲間たち（動作確認環境）
---
1. Androidスマホ（Nexus4, Nitrogen OS 7.1.2, root化済で動作確認。roo化必須です）
2. Amazon Dash Button（好きなのを）


ポイント
---
1. 無線LANルータの代わりは、AndroidスマホのWi-Fiテザリングを使います。
2. Raspberry Piの代わりは、Androidアプリの [Termux](https://termux.com/) を使います。
3. [IFTTT - Webhooks](https://ifttt.com/maker_webhooks) と  [IFTTT - VOIP Calls](https://ifttt.com/voip_calls) を使ってVOIPコールを実現します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/ecb44e64-35a9-530d-c881-bfefd6bcdbc9.png">


Termuxのインストール
---
スマホ上でLinux環境を構築し、無線LANルータや Raspberry Pi の機能を代替えします。

1. [Operation KiWi - スマホ上にLinux環境が作れるTermuxが最高に楽しい](http://www.kiwi-bird.xyz/entry/2017/06/24/192957)さん通りに [Termux](https://play.google.com/store/apps/details?id=com.termux&hl=ja) をインストールします。ssh のところまででＯＫです。リモート接続すると文字入力が簡単です。


2. [termux-sudo](https://github.com/st42/termux-sudo) で sudo できるようにし、その後 tcpdump が動作するか確認します。

```shell-session
$ cd
$ pkg update
$ pkg upgrade
$ pkg install curl
$ pkg install ncurses-utils
$ pkg install git
$ git clone https://github.com/st42/termux-sudo
$ cd termux-sudo
$ cat sudo > /data/data/com.termux/files/usr/bin/sudo
$ chmod 700 /data/data/com.termux/files/usr/bin/sudo
$ pkg install tcpdump
$ sudo tcpdump
```
”sudo tcpdump" を実行すると、一旦スマホ側でスーパーユーザーリクエストが表示されるので、
【選択を記憶する】→【許可】します。その後パケット情報が表示されれば問題ありません。

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/2948971e-2b45-ef3d-a458-8fac23efbe32.png" width=25%>


AndroidスマホでWi-Fiテザリングの設定をする
---
1.【設定】→【無線とネットワーク】→【もっと見る】→【テザリングとポータブルアクセスポイント】→【Wi-Fiアクセスポイントをセットアップ】で、「ネットワーク名」や「パスワード」などを設定して【保存】します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/d0fe2139-2465-e97e-2893-4add14d707e1.png" width=25%>

　ポータブルWi-Fiアクセスポイントを「ＯＮ」にします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/0d02ccf9-e31c-44d5-60ec-fd83b91c9fcf.png" width=25%>


 Amazonアプリで、Amazon Dash Button のWi-Fiアクセスポイントを、スマホのWi-Fiアクセスポイントに切り替える
---
1. 一旦 Amazon Dash Button を無効にし、再セットアップします。

【アカウントサービス】→【Dash端末】→【端末を管理】→【Dash Button】→【このDash Buttonを無効にする】

【アカウントサービス】→【Dash端末】→【新しい端末をセットアップ】

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/c29ce153-89c0-538f-7ab9-47a2414c301e.png" width=25%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/bcbc491a-1818-1024-816b-6df631f68d27.png" width=25%>

【別のWi-Fiネットワークを選択】をクリックします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/00f4790b-5456-4898-d7df-5213381249d5.png" width=25%>

「周辺のネットワーク」にスマホのWi-Fiアクセスポイントが表示されるので、それを選び、「パスワード」を入力します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/9c2266a5-9d71-53ce-4d99-73877a7bd46e.png" width=25%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/0307d51f-948d-66bd-d588-389ff27d629d.png" width=25%>




[IFTTT](https://ifttt.com/) で Amazon Dash Button が押されたら、VOIPコールするように設定する
---

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/dbb9c8cd-920c-5678-9f46-96325ac4c2af.png" width=25%>

「Webhooks」を選びます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/becfdde8-bf43-a5e5-e0e3-da7074601a15.png" width=25%>

「Event Name」を入力します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/ace77aef-9f72-5c03-3eff-f71d125c71f7.png" width=25%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/ba679528-df64-ff20-9f41-2c7232a5da08.png" width=25%>

「VoIP Calls」を選びます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/1db52918-03ff-3e5d-976f-a7e255f4e9e8.png" width=25%>

「Voice Message」を入力します。日本語でも大丈夫です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/845297a8-2097-83b2-69ff-fdc1aca07526.png" width=25%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/db277304-a3ee-315b-a617-774a5e23e2f0.png" width=25%>

【[IFTTT - Webhooks](https://ifttt.com/maker_webhooks)】→【Settings】で、「secret key」を確認します。
スマホだと画面が小さいので途中までしか表示されません。パソコンで確認するのがよいと思います。

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/8e198902-d227-2596-d3b7-bec717b4a865.png" width=25%>

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/9141d721-8bc1-f829-ca34-34f5126035b4.png" width=25%>


Termuxの設定
---

（注意）スクリプトを実行するときは、ポータブルWi-Fiアクセスポイントが「ＯＮ」になっているのを確認してください。

1. スクリプト find_button.sh を作成し、Amazon Dash Button の Macアドレスを調べます。

 [uepon日々の備忘録 - RaspberryPiでも消臭力してみた](http://uepon.hatenadiary.com/entry/2017/02/21/003426)さんを参考にしました。

```shell-session:find_button.sh
#!/data/data/com.termux/files/usr/bin/bash

tcpdump -i wlan0 -e | while read line
do
  if [[ $line = *Broadcast,\ *ethertype\ ARP*Request* ]]; then
    set -- $line
    echo "found" $2
  fi
done
```

```shell-session
$ chmod 700 ./find_button.sh
$ sudo ./find_button.sh
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes
found XX:XX:XX:XX:XX:XX
```

2. スクリプト fire_button.sh を作成し、Amazon Dash Button を押すと VOIPコールが来るようにします。
   変数 adb_mac, ifttt_event_name, ifttt_secret_key を環境に合わせて変更します。

```shell-session:fire_button.sh
#!/data/data/com.termux/files/usr/bin/bash

adb_mac="XX:XX:XX:XX:XX:XX"
ifttt_event_name="XXXXXXXX"
ifttt_secret_key="XXXXXXXXXXXXXXXXXXXXXX"

tcpdump -i wlan0 -e | while read line
do
  if [[ $line = *$adb_mac*Broadcast,\ *ethertype\ ARP*Request* ]]; then
    set -- $line
    echo "found" $2
    curl https://maker.ifttt.com/trigger/$ifttt_event_name/with/key/$ifttt_secret_key
  fi
done

```shell-session
$ chmod 700 ./fire_button.sh
$ sudo ./fire_button.sh
```

Amazon Dash Button を押すと VOIPコールが来ます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/d20542c2-9133-a8bf-f27e-d4c46bbab4cc.png" width=25%>

「ACCEPT」を押すとこんな画面になります。
<img src=https://qiita-image-store.s3.amazonaws.com/0/63318/eef9d949-9e70-1c4d-7c62-c7b980e66ba1.png width=25%>


気になる点
---
1. スマホのWi-Fiテザリングを使うと、スマホのバッテリ消耗が激しいです。
2. 【設定】からWi-Fiテザリングを「ＯＮ」にすると動作しますが、ウィジェットから直接だと動作しないです。
3. 定番の [Dash Button for Node](https://www.npmjs.com/package/dash-button) などを使いたかったのですが、うまくいきませんでした。

という訳で、とりあえず下記アプリをインストールし、使いたいときだけ「ＯＮ」にして運用しています。
[Termux:Widget add-on](https://play.google.com/store/apps/details?id=com.termux.widget)
[テザリングのショートカット](https://play.google.com/store/apps/details?id=com.prefectminders.wifitethering&hl=ja)
[WiFi OnOff](https://play.google.com/store/apps/details?id=com.curvefish.widgets.wifionoff)

<img src="https://qiita-image-store.s3.amazonaws.com/0/63318/206e6eff-9521-d11d-2729-38cac2ef8f3b.png" width=25%>

最後に
まだ不完全ですが、とりあえずお外でも Amazon Dash Button を使える環境はできたので、後はいろいろと応用していきたいと思います。