Google home mini と slack とを連動させる

# やりたいこと

- [Google Homeで家族とSlackで会話する方法](https://scrapbox.io/smart-home/Google_Home%E3%81%A7%E5%AE%B6%E6%97%8F%E3%81%A8Slack%E3%81%A7%E4%BC%9A%E8%A9%B1%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
- [Google Homeを使って4歳児とSlackで会話する方法](https://qiita.com/otera05/items/c9b0e290695c4d67da74)

こういうのを自分でもやってみたい！

## このページについて

やりたいことにも書きましたが、せっかくある Google home で、家族とやりとりしたい！と思ったので、その環境整備の備忘録です。例によって、これに類する記事はいっぱいあるんですが、微妙に古くて現状に合わないケースもあったので、書き起こしました。この記事も数ヶ月もすれば、古くなりますねー

# 使ったもの

- 先人たちの共有知
- Google home mini
- Raspberry pi3 model B
- slack
- nodejs
    - npm
    - n
    - hubot
    - google-home-notifier

# slack から Google home mini を喋らせる

ひとまず、slack から Raspberry Pi で動かす bot 経由で、Google home mini を喋らせるところまでを目指します。

## nodejs 環境を整備

### nをインストール
今回、Raspbian Buster を使っているので、nodejs の version 的には別段不満はないのですが、そのうち別のバージョンの nodejs をインストールしたくなるかもしれないので、ひとまず n をインストールします(n……ググラビリティが低い……)

```
$ sudo npm install -g n
sudo n stable
```

### stable版の nodejs をインストール

```
$ sudo n stable

  installing : node-v10.16.3
       mkdir : /usr/local/n/versions/node/10.16.3
       fetch : https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-armv7l.tar.gz
   installed : v10.16.3 (with npm 6.9.0)
```

### nodejsのversionを確認

```
$ node -v
v10.15.2
```

おっと、システム側の nodejs を参照してますね。消しておきましょう。

```
$ sudo apt purge -y nodejs npm
```

## Bot作成環境の整備

### yo と generator-hubot をインストール

```
$ sudo npm install -g yo generator-hubot
```

これ、sudo つけないと

```
npm ERR! path /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
```

みたいなエラーが出たんだけど、安易に sudo つけずに、

[npmでpermission deniedになった時の対処法[mac]](https://qiita.com/okohs/items/ced3c3de30af1035242d)

の記事を参考に、`npm config set prefix` で回避した方がいいのかな？まぁ困ったらやり直す方向で。

### slack から hubot を追加する。
hubot と slack を連携させるには、HUBOT_SLACK_TOKEN が必要となる。このため、slack の管理者メニューから、`Manage apps`に飛ぶ。 

<img width="603" alt="Manage apps" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31956/ec09a26b-87cc-ad5c-1918-8baeefad4e4b.png">

で、hubot を検索して追加します。

<img width="794" alt="Search hubot app" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31956/d002de42-e067-34b2-be9b-731f27139c0a.png">

bot の名前はさておき xoxb- から始まる HUBOT_SLACK_TOKEN を控えておきましょう。

### bot の作成

google-home-notifier を使いたいので、先人の教えに従って、事前に

```
$ sudo apt-get install libnss-mdns libavahi-compat-libdnssd-dev
```

をインストールします。

```
$ mkdir -p ~/hubot/myhubot
$ cd ~/hubot/myhubot
$ npm install google-home-notifier --save
$ npm install multicast-dns --save
```

ここまでで

```
$ HUBOT_SLACK_TOKEN=xorb-ないしょ bin/hubot -a slack
```

して bot が動作することを確認しておきます。うまく動作すれば、bot がオンラインになるはずです。

<img width="209" alt="bot online" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31956/83781e8d-d581-d5ba-f978-b6d7829cb6c9.png">

### google-home-notifier が動作するように微調整

発話させるまで、あと少し。このままだと、google-home-notifier が利用している google-tts-api が古いので、

```
get key failed from 
```

みたいなエラーが出て、うまく動きません。このため、最新版に上げます。

https://www.npmjs.com/package/google-tts-api

を見ると、最新版は 0.0.4

```
$ cd node_modules/google-home-notifier
```

このディレクトリにある package.json に

```package.json
"google-tts-api": "https://github.com/darrencruse/google-tts/tarball/british-voice",
```

という行があるので、

```
"google-tts-api": "0.0.4"
```

と書き換えて

```
$ npm update google-tts-api
```

を実行。また、このままだと、mDNS がうまく動作せず、同一LAN上にいる Google home が検知できません。このため

[google-home-notifierの「Error: getaddrinfo -3008」に対処する](https://qiita.com/hideo-works/items/06e54359bc651a928b2f) 

を参考に

- node_modules/mdns/lib/browser.js
- node_modules/google-home-notifier/google-home-notifier.js 

を書き換えておきます。このページには本当に助けられました。ありがとうございます！

あとは

``` scripts/example.coffee
# Description:
#
# Commands:
#   hubot say <content> - Say something via Google home.
#
home = require 'google-home-notifier'
lang = 'ja'
module.exports = (robot) ->
  robot.respond /say (.*)$/i, (msg) ->
      content = msg.match[1]
      home.device('', lang);
      home.notify(content, (res) => console.log('said '+ content));
```

こんなコード書けば動作するかと思います。

とりあえずこれで

<img width="527" alt="hubot-work.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31956/fdb41049-60f3-9eea-40a7-d9fe6b986fc6.png">
Google home が発話するところまではできました！

### hubot を自動起動させる

Raspberry Pi を再起動しても動作するように、systemctl用のファイルを用意してやります。

```/etc/systemd/system/hubot.service
[Unit]
After=network-online.target
Description = hubot for google home

[Service]
WorkingDirectory=/home/pi/hubot/myhubot
ExecStart=/home/pi/hubot/myhubot/bin/hubot -a slack
Restart=always
Type=simple
User=pi
Group=pi

[Install]
WantedBy=multi-user.target
```

あと、 bin/hubot にも

```bin/hubot
export HUBOT_SLACK_TOKEN=xoxb-ないしょ
```

を追記しておきます。

これで

```
$ sudo systemctl daemon-reload
$ systemctl start hubot
$ systemctl enable hubot
```

とかしておけばOKなはず。

# Google home mini から、slack に投稿

今度は逆方向。IFTTT が一番簡単そうなので、これで試してみます。基本的には

- [Google Homeで家族とSlackで会話する方法](https://scrapbox.io/smart-home/Google_Home%E3%81%A7%E5%AE%B6%E6%97%8F%E3%81%A8Slack%E3%81%A7%E4%BC%9A%E8%A9%B1%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)

に書いてある通りですね。意外にも？ピッタリのレシピはなさそうなので、作っていきます。

<img width="847" alt="IFTTTメニュー" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31956/6bc7ec59-a47f-b6e7-2ea0-ca2ad3ab3a0b.png">

`Get more` をクリックして表示される上記メニューから、`ifThisThenThat`をクリック。

<img width="856" alt="ifThisThenThat" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31956/49056da7-9643-3b68-d809-12e64bdd1c5c.png">

まずは、`This`から。クリックして、Google Assistant を選択。トリガーはいくつか選択できますが、ここでは `Say a phrase with a text ingredient` を選択します。

<img width="435" alt="trigger" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31956/3ec3e5d0-fbf1-dda5-bedf-66dc5c22f86a.png">

こんな感じでトリガーに内容を埋めていきいます。ちなみに

> お父さんに 「$」って伝えたよ

は、実はNGで。$ の前後にスペースが必要とのこと。

> お父さんに 「 $ 」って伝えたよ

に修正。で、

<img width="450" alt="then this" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31956/7c888ea1-d33d-733c-298f-b15f7f2f65ba.png">

で、投稿する slack の channel をしてして、メッセージを記載します。上の図だと分かりづらいですが、Message には

> お父さん、「{{TextField}}」

と記載しています。このあたりも、上記のリンクに有る通りですね。

あとは実際に Google ホームに話しかけてみます。

## 実際に話してみる

実際に Google home に話しかけてみると……

slack と IFTTT のアプリに通知が来ました。

### ｓlackへの通知

<img width="311" alt="slack への通知" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31956/43f30c79-75ae-114d-ff7b-52ceac0da471.png">

### IFTTTアプリからの通知

<img width="430" alt="IFTTTアプリからの通知" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31956/05d2e7ff-9639-44f6-a595-42abad7ce921.png">

# 最後に

で、子どもたちが使ってくれるかどうかはさておき、こんなこともできるんだよーというデモとしては面白いかな？

ただね……家のGoogle home は、ほとんど電源Off 、電源OnでもマイクOff にしてあるんだよねー日の目を見る日は来るのか。