Google Homeで時報を知らせる


Google Home を購入したので、何か遊べないかと思い時報を作ってみことにしました。
Raspberry Piで１時間ごとににGoogle Homeへリクエストを送ることで実現します。

# 必要なもの

- Google Home(IPアドレスが固定されていること)
- Raspberry Pi(Node.jsがセットアップ済みであること)

# セットアップ
[こちらの記事](https://qiita.com/azipinsyan/items/db4606aaa51426ac8dac)を参考に、Raspberry Piにgoogle-home-notifier をセットアップします。

## google-home-notifierのセットアップ

**インストール**

```
git clone https://github.com/noelportugal/google-home-notifier
cd google-home-notifier
npm install
```

**各種ファイルの編集**
https://github.com/noelportugal/google-home-notifier
上記のREADMEに従い、ファイルを編集していく

```js:node_modules/mdns/lib/browser.js

Browser.defaultResolverSequence = [
  rst.DNSServiceResolve(), 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo()
, rst.makeAddressesUnique()
];

↓

Browser.defaultResolverSequence = [
  rst.DNSServiceResolve(), 'DNSServiceGetAddrInfo' in dns_sd ? rst.DNSServiceGetAddrInfo() : rst.getaddrinfo({families:[4]})
, rst.makeAddressesUnique()
];
```


起動するプロセスのポートを変更したい場合は下記を編集する

```js:example.js

var express = require('express');
var googlehome = require('./google-home-notifier');
var ngrok = require('ngrok');
var bodyParser = require('body-parser');
var app = express();
const serverPort = 8080;  // ポート番号を変更したい場合はここを編集

var deviceName = 'Google Home';
googlehome.device(deviceName);
 :
 :
```


```js:google-home-notifier.js
var Client = require('castv2-client').Client;
var DefaultMediaReceiver = require('castv2-client').DefaultMediaReceiver;
var mdns = require('mdns');
var browser = mdns.createBrowser(mdns.tcp('googlecast'));
var deviceAddress = '192.168.1.100';  // Google Home のIPアドレスに修正する
var language;

var device = function(name, lang = 'ja') {  // "ja"に修正する
    device = name;
    language = lang;
    return this;
};

var ip = function(ip) {
  deviceAddress = ip;
  return this;
}

var googletts = require('google-tts-api');
var googlettsaccent = 'ja';  // "ja"に修正する
var accent = function(accent) {
  googlettsaccent = accent;
  return this;
}

var notify = function(message, callback) {
 :
 :
```

**サービスとして登録する**
Raspberry Piが再起動しても自動で立ち上がるようにサービスとして登録する

```
sudo vi /etc/systemd/system/googlehomenotifier.service
```

```/etc/systemd/system/googlehomenotifier.service
[Unit]
Description=google-home-notifier Server
After=syslog.target network-online.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/node example.js # nodeコマンドの絶対パスを指定すること
Restart=on-failure
RestartSec=10
KillMode=process
WorkingDirectory=/home/pi/google-home-notifier #google-home-notifierをクローンしたディレクトリパス

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

**サービスを有効にする**

```
sudo systemctl list-unit-files --type=service | grep googlehomenotifier
sudo systemctl enable googlehomenotifier
sudo systemctl status googlehomenotifier
sudo systemctl start googlehomenotifier
```

**ログを確認**

```
journalctl -u googlehomenotifier
```

下記のように出力されていればOK

```
● googlehomenotifier.service - google-home-notifier Server
   Loaded: loaded (/etc/systemd/system/googlehomenotifier.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2017-10-14 14:51:23 JST; 6s ago
 Main PID: 3014 (node)
   CGroup: /system.slice/googlehomenotifier.service
           ├─3014 /usr/local/bin/node example.js
           └─3033 ./ngrok start --none --log=stdout
```

**動作確認**

```
curl -X POST -d "text=Hello Google Home" http://<<Google HomeのIPアドレス>>:8080/google-home-notifier
```
これでGoogle Homeが喋りだせばOK

## 時報アプリケーションの作成
node.jsで１時間ごとにgoogle-home-notiferを叩くプログラムを書いてみました
https://github.com/udon11/googlehome-time-signal
こちらのプログラムを使って時報を喋らせてみます

### セットアップ

```
git clone https://github.com/udon11/googlehome-time-signal.git
cd googlehome-time-signal
```

**config.jsファイルの編集**

```
cp config/default.js.template config/default.js
```

```config/default.js
module.exports = {
    googlehomenotifier: {
        address: "<<your Raspberry Pi address>>", 
    }
};
```

<<your Raspberry Pi address>の部分ををRaspberry Piのアドレスにする(同じRaspberry Pi上で動かす場合は localhost:8080 などにする

### サービスとして登録

google-home-notifierと同じく、Raspberry Piを再起動しても自動で立ち上がるようにサービスとして登録する

```
sudo vi /etc/systemd/system/timesignal.service
```

```/etc/systemd/system/timesignal.service
[Unit]
Description=Google Home Time Signal
After=syslog.target network-online.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/node app.js
Restart=on-failure
RestartSec=10
KillMode=process
WorkingDirectory=<<googlehome-time-signalをクローンしたパス>>

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

**サービスの起動**

```
sudo systemctl enable timesignal
sudo systemctl start timesignal
```

**ログの確認**

```
sudo systemctl status timesignal
```

下記のように出力されていればOK

```
● timesignal.service - Google Home Time Signal
   Loaded: loaded (/etc/systemd/system/timesignal.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2017-10-14 16:16:36 JST; 3s ago
 Main PID: 3719 (node)
   CGroup: /system.slice/timesignal.service
           └─3719 /usr/local/bin/node app.js
```



これで完了です。
毎時ごとに「xx時です」と喋るようになります。

# 時報を作ってみて
google-home-notifier を起動しておけば、外から好きな言葉を喋らせることができました。

Google Home はリビングなどに置かれるものなので、たとえスマホをカバンの中に入れたままでも通知を受け取れるので、家にいる間は常に気づくことができますね。
他にも色々なことに応用できそうです。

## 余談
有楽町のビックカメラでGoogle Homeを買いましたが、2個セットで2万円だったり、chromecastがタダでついてきたり、力の入れようがすごかったです。
店頭の特設コーナーもエアコンやスピーカーとの連携の説明に力を入れていて、ビックカメラはIoT分野での消費に力を入れていくのかなと思いました。

あと、Goole HomeとChromecastのセットを買ったのですが、なぜか紙袋の中に3つ箱が入っていまして、一つはGoogle Homeロゴが入ったマグカップでした。どこにもマグカップがもらえると書いていなくて、ちょっと得した気分w