LINEからGoogle Homeを喋らせる

LINEの送信メッセージをGoogle Homeに喋らせるようにします。家族に　LINEでの帰宅連絡を知らせるのに便利です。初期セットアップ〜ライズパイの自動起動まで通しの手順をメモに残しておきます。

2018/9/24追記：
google-home-notifierが「Error: get key failed from google」で動作しなくなってしまっいました。解決された方がいたので、参考にさせていただきました。
[google-home-notifierが「Error: get key failed from google」を吐いたので対策してみた](https://qiita.com/ezmscrap/items/24b3a9a8548da0ab9ff5)を参考に
  ~/node_modules/google-tts-api/lib/key.js
を修正する必要があります。


# 設定方法の流れ
1. google-home-notifierをインストール
2. play_with_googlehomeをインストール
3. ngrokでローカル環境を外部に公開
4. LINEボットの作成
5. ラズパイの自動起動設定

# google-home-notifierのインストール

長くなったので[ここ](https://qiita.com/yuppejp/items/db528407d6eed57a6e11)に別掲。

# play_with_googlehomeのインストール
LINEのWebhookを処理するためにplay_with_googlehomeを使用。

gitからダウンロード（qiitaタグから引っ張ってくる)

```
$ git clone --branch qiita https://github.com/DaaasukeMurata/play_with_googlehome.git
```

default.jsonをmyconfig.jsonにコピーする。

```
$ cd ~/play_with_googlehome/speak_message/config
$ cp default.json myconfig.json
```

server_ipをGoogle HomeデバイスのIPアドレスを指定する。Google HomeのIPアドレスはスマホのGoogle Homeアプリを使って調べるのが手っ取り早い。その他はデフォルトのままでとりあえずOK。

```js:myconfig.json
{
    "server_port": "8080",
    "server_ip": "localhost",

    "googlehome_ip": "192.168.xxx.xxx",
    "googlehome_name": "device name of google home",

    "beginning_sentence": "メッセージが届きました。",
    "speakable_userid": ""
}
```

起動してみる

```
$ ~/play_with_googlehome/speak_message
$ node server_for_line.js
```

WARNINGがいつくが出るが、エラーが出なければOK。

# ngrokでローカル環境を外部に公開
ラズパイはローカルネットワークに閉じているので、LINEからwebhookが飛ぶように、ngrokを使って外部に公開する。

##公式サイトでサインアップ
アカウントなしでngrokを起動すると一定時間でURLが失効するようなので、アカウントを取得しておく。
https://dashboard.ngrok.com/

## Linux (ARM)版をインストール

```
$ wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-arm.zip
$ unzip ngrok-stable-linux-arm.zip
$ sudo mv ngrok /usr/local/bin/
$ ngrok version
ngrok version 2.2.8
```

authtokenを設定

```
$ ./ngrok authtoken (自分のauthtoken)
```

ngrokを起動

```
$ ngrok http 8080
ngrok by @inconshreveable                                  (Ctrl+C to quit)

Session Status                online
Account                       hogehoge (Plan: Free)
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://xxxxxxxx.ngrok.io -> localhost:8080
Forwarding                    https://xxxxxxxx.ngrok.io -> localhost:8080

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00
```

これで外部からアクセス可能になる。しかも、これだけでhpptsでアクセスできるので激しく便利。

# LINEボットの設定
[LINE Developers](https://developers.line.me/ja/)でチャネル(Messaging API)を作成する。WebhookのURLにngrokのURLを指定する。

![貼り付けた画像_2018_09_16_13_45.png](https://qiita-image-store.s3.amazonaws.com/0/77444/45c0ec69-5c90-37c5-19c0-ed9e1e723078.png)

接続確認でテストメッセージが飛ぶので、ngrokのコンソールに200 OKが表示されて、Google Homeが喋るとひとまず成功。LINEアプリでボットを追加して、メッセージを投稿すると、Google Homeが読み上げるはず。あとは、チャットグループを作成して、ボットを招待すれば完成。

# 自動起動
最後にラズパイを放置してても動作するように自動起動するように設定しておく。

##play_with_googlehomeを自動起動させる
参考:https://qiita.com/mochifuture/items/ed863857affc80d0189f

```
npm install -g forever
```

foreverの場所を確認

```
$ which forever
/home/pi/.nvm/versions/node/v8.12.0/bin/forever
```

起動書式

```bash
$ sudo -u [ユーザ名] [nodeのパス] [forever のパス] start -a -d [動かしたいスクリプトのパス]
```
(例)

```bash:/etc/rc.local
# 追加
sudo -u pi /home/pi/.nvm/versions/node/v8.12.0/bin/node /home/pi/.nvm/versions/node/v8.12.0/bin/forever start -a -d /suhome/pi/play_with_googlehome/speak_message/server_for_line.js
```

ラズパイを再起動する

```
$ sudo reboot
```

正常にサービスが起動しているか確認

```
$ forever list
info:    Forever processes running
data:        uid  command                                      script                                           forever pid id logfile  uptime
data:    [0] pUOq /home/pi/.nvm/versions/node/v8.12.0/bin/node /home/pi/play_with_googlehome/speak_message/server_for_line.js 674     763    /home/pi/.forever/pUOq.log 0:0:4:12.405
```


## ngrokを自動起動させる
参考: http://asukiaaa.blogspot.com/2016/06/ipmvnoraspberry-pingrokurlssh.html

ngrokのymlファイルにトンネル情報を定義

```yaml:~/.ngrok2/ngrok.yml
authtoken: (自分のauthtoken)
tunnels:
  http-default:
    proto: http
    addr: 8080
```

```bash:/etc/rc.local
# 追加
/usr/local/bin/ngrok start --all --config=/home/pi/.ngrok2/ngrok.yml --log=stdout >> /dev/null &

exit 0
```

ラズパイを再起動して、起動しているか確認。

```
pi@raspberrypi0:~$ ps aux | grep ngr
root       318  1.9  2.7 798044 12228 ?        Sl   14:36   0:09 /usr/local/bin/ngrok start --all --config=/home/pi/.ngrok2/ngrok.yml --log=stdout
pi        1021  0.0  0.4   3844  1868 pts/0    S+   14:44   0:00 grep ngr
```

毎回起動するたびに、ngrokのURLが変わってしまうので、[ngrokのダッシュボード](https://dashboard.ngrok.com/status)で確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/77444/b4d6018c-a128-8593-b6ba-32bc59ea4190.png)

httpsのURLを[LINE Developers](https://developers.line.me/ja/)で再設定すればOK。少々面倒なので、有料プランの場合はURLを固定することができる。

## 無線LANの省電力機能をオフ

/etc/rc.localにコマンドを追加

```bash:/etc/rc.local
iwconfig wlan0 power off
```

ラズパイを再起動して、状態を確認。

```
$ iw dev wlan0 get power_save
Power save: off
```

`Power save: off`と表示されたらOK。

# さいごに
LINEのメッセージを音声で知らせることができるのは、思ったより実用性があります。
課題としては、ラズパイを再起動するとngrokの外部URLが変わってしまうので、その度に、LINEボットのwebhookのURLを書き換える必要があります。お金で解決する(ngrokに課金)するのが手っ取り早いですが、他にいい方法がないか模索中です。


# 参考にしたサイト
- [LINEに送信したメッセージを、Google Homeで読み上げ、家族に通知 - Qiita](https://qiita.com/daaaaaasuke/items/5e95983166667094f42f)
- [【Node.js】 RaspberryPiのプログラムを自動起動・永続化・SSH ログアウト後もプロセスを残す](https://qiita.com/mochifuture/items/ed863857affc80d0189f)
- [固定ipが無いmvno配下のraspberry piに、ngrokで割り振られるurlでsshログインする方法](http://asukiaaa.blogspot.com/2016/06/ipmvnoraspberry-pingrokurlssh.html)