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」を吐いたので対策してみたを参考に
~/node_modules/google-tts-api/lib/key.js
を修正する必要があります。
設定方法の流れ
- google-home-notifierをインストール
- play_with_googlehomeをインストール
- ngrokでローカル環境を外部に公開
- LINEボットの作成
- ラズパイの自動起動設定
google-home-notifierのインストール
長くなったのでここに別掲。
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。
{
"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でチャネル(Messaging API)を作成する。WebhookのURLにngrokのURLを指定する。
接続確認でテストメッセージが飛ぶので、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
起動書式
$ sudo -u [ユーザ名] [nodeのパス] [forever のパス] start -a -d [動かしたいスクリプトのパス]
(例)
# 追加
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ファイルにトンネル情報を定義
authtoken: (自分のauthtoken)
tunnels:
http-default:
proto: http
addr: 8080
# 追加
/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のURLをLINE Developersで再設定すればOK。少々面倒なので、有料プランの場合はURLを固定することができる。
無線LANの省電力機能をオフ
/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に課金)するのが手っ取り早いですが、他にいい方法がないか模索中です。