Amazon Dash ButtonからGoogle Assistantにリクエストを送ってみた (ぴよログ連携)

# はじめに
3周遅れの位のネタですが、Amazon Dash Buttonを押すと、Google Assistantにリクエストが送れるサービスをラズパイに作りました。モチベーションは、

- [育児記録アプリ-ぴよログ](http://piyolog.mystrikingly.com/)の記録をもっと簡単に
- お蔵入りしていたガジェットの活用したい

です。[うんこボタン](https://unkobtn.com/)の再発明に近いですが、育児記録でなくてもGoogle Assistantのリクエストであれば何にでも使えます。TVの電源ON/OFF、とかでも。

|デモ|システム概要|
|---|---|
|![demo_jp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190000/de7e8a28-f0d9-898f-495c-d31c8d21a2e6.gif)|![dash-assistant.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190000/e2911270-2271-6e82-378d-6517b05c3963.png)|

作ったサービスは[eholic/dash-assistant](https://github.com/eholic/dash-assistant)にあります。

# 用意したもの
- (お蔵入りしていた) Amazon Dash Button
- (お蔵入りしていた) Raspberry Pi 3 Model B (Buster)
- [Googleアシスタント連携済みぴよログ](https://www.sakabou.co.jp/app/piyolog/google_assistant/)

> Amazon Dash Buttonはすでにサービス終了していますが、[AWS IoT Button](https://aws.amazon.com/jp/iotbutton/)で代替できるとは思います。

# 事前準備
## Pythonの仮想環境

```bash
python3 -m venv env
env/bin/python -m pip install --upgrade pip setuptools wheel
source env/bin/activate
```

## Google Assistantのセットアップ
[Configure a Developer Project and Account Settings](https://developers.google.com/assistant/sdk/guides/service/python/embed/config-dev-project-and-account)にしたがってDevice Credentialsをラズパイに作成します。作業手順は以下の通りですが、ほぼドキュメント通りです。

　1. [Actions Console](https://console.actions.google.com/)にプロジェクトを作成
　2. Device registrationでCredentialsをダウンロード
　3. [Google APIs](https://console.developers.google.com/apis/api/embeddedassistant.googleapis.com/overview)でGoogle Assistant APIを有効化
　4. ラズパイに認証用ライブラリをインストール [(参考)](https://developers.google.com/assistant/sdk/guides/service/python/embed/install-sample#generate_credentials)

```bash
(env) pip install --upgrade google-auth-oauthlib[tool]
```

　5. 2でダウンロードしたCredentialsファイルからDevice Credentialsを作成

```bash
(env) google-oauthlib-tool --client-secrets path/to/client_secret_<client-id>.json --scope https://www.googleapis.com/auth/assistant-sdk-prototype --save --headless
# 指定されたURLを開くと表示されるauthorization codeを入力
```

以上の手順で`~/.config/google-oauthlib-tool/credentials.json`が作成されます。

## テスト
Google Assistantのセットアップが問題なく出来ているかテストします。(しなくてもいいです。)

```bash
# サンプルコードをダウンロード
(env) pip install --upgrade google-assistant-sdk[samples]
(env) cd env/lib/python3.7/site-packages/googlesamples/assistant/grpc
# Google Assistant実行
(env) python -m textinput --device-id "'$(uuid)'" --device-model-id 'Actions Consoleで作成したプロジェクトのModel Id'
INFO:root:Connecting to embeddedassistant.googleapis.com
: hello
<you> hello
<@assistant> Hi
What can I do for you? 😀
: ぴよログに寝たことの記録を頼みたい
<you> ぴよログに寝たことの記録を頼みたい
<@assistant> 19:40に「寝る」を記録しました
: 
# 成功!
```
ここまでで、ラズパイからGoogle Assistantにリクエストを送信し、ぴよログに記録するところまでが実現できました。次はAmazon Dash Buttonのクリックイベントを掴みます。

## Amazon Dash Buttonのセットアップ
[Nekmo/amazon-dash](https://github.com/Nekmo/amazon-dash)を使います。

```bash
(env) sudo apt install tcpdump
(env) pip install amazon-dash
```

### Dash ButtonのWiFiが未設定の場合
Dash Buttonは最初にWiFi設定をする必要がありますが、すでにAmazonのサービスが終了しているため、AmazonアプリでのWiFi設定ができません。ただ、[Nekmo/amazon-dash](https://github.com/Nekmo/amazon-dash)という延命プロジェクトがあり、[Hack your device](https://docs.nekmo.org/amazon-dash/rescue.html#hack-your-device)でWiFiに接続できます。

ラズパイにイヤホンつけるのが手間だったので、macOSで実行しましたが、以下ライブラリが必要でした。

```bash
brew install portaudio iproute2mac
(env) pip install pyaudio
(env) sudo env/bin/amazon-dash hack
```

<img width="200" alt="IMG_20200618_080612.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190000/155db093-f8e8-6abc-b143-170487a0f292.jpeg">

また、[amazon-dash configure](https://docs.nekmo.org/amazon-dash/rescue.html#configure-wifi)がうまくいかず[こちらのスクリプト](https://gist.github.com/fffonion/d4960503ff6782640286163d47a30080)を使いましたが、[この記述にある通り](https://gist.github.com/fffonion/d4960503ff6782640286163d47a30080#gistcomment-3116629)、以下の修正が必要でした。

```diff
- r.content
+ r.content.decode('utf-8')
```

### Amazonサーバとの通信をブロック
必須かどうか分かりませんが、Dash ButtonがAmazonのサーバと通信しないようにルータのブロックリストにAmazonのサーバを追加しておきます。
[こちらを参照](https://docs.nekmo.org/amazon-dash/block_connections.html)

### Dash ButtonのMACアドレスを取得

```bash
# 通信を取得するためにはsudo権限が必要
(env) sudo env/bin/amazon-dash discovery
Welcome to Amazon-dash v1.4.0 using Python 3.7.3
December 31 is the last day to block requests from your Amazon-dash buttons to Amazon servers. In 2020 your buttons can be bricked in an update from Amazon servers.
The discovery command lists the devices that are connected in your network. Each device will only be listed once. After executing this command wait approximately 10 seconds before pressing the Amazon Dash button. After pressing the button, the Mac address of the button will immediately appear on the screen. Remember the address to be able to create the configuration file.
# ここでDash ButtonをクリックするとMACアドレスが取得できる
12:34:56:78:9a:bc (Amazon Device)
```

ここまででDash ButtonのMACアドレスを取得することができました。

# Dash ButtonとGoogle Assistantの連携
[eholic/dash-assistant](https://github.com/eholic/dash-assistant)を作りました。cloneして実行してみてください。

```bash
(env) git clone https://github.com/eholic/dash-assistant.git
(env) cd dash-assistant
(env) pip install -r requirements.txt
(env) vi dashes.yml  # DashのMACとGoogle Assistantの対応付けをする
(env) export DEVICE_MODEL_ID='Actions Consoleで作成したプロジェクトのModel Id'
(env) sudo -E path/to/env/bin/python main.py
Ready to press Amazon Dash Button
2020-06-17 21:32:02,384 - root - INFO - 11:11:11:11:11:11 is pressed.
2020-06-17 21:32:02,391 - root - INFO - ぴよログにおしっこの記録を頼みたい
2020-06-17 21:32:05,806 - root - INFO - 21:30に「おしっこ」を記録しました
2020-06-17 21:32:12,209 - root - INFO - 22:22:22:22:22:22 is pressed.
2020-06-17 21:32:12,210 - root - INFO - ぴよログに寝たことの記録を頼みたい
2020-06-17 21:32:15,686 - root - INFO - 21:30に「寝る」を記録しました
2020-06-17 21:32:15,686 - root - INFO - 33:33:33:33:33:33 is pressed.
2020-06-17 21:32:15,687 - root - INFO - ぴよログにうんちの記録を頼みたい
2020-06-17 21:32:18,218 - root - INFO - 21:30に「うんち」を記録しました
```

以上で、Dash Buttonで育児記録することができるようになりました！