Node.js
RaspberryPi
IoT
GoogleHome

Google Homeで時報を知らせる

More than 1 year has passed since last update.

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

必要なもの

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

セットアップ

こちらの記事を参考に、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に従い、ファイルを編集していく

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()
];

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

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);
 :
 :
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で1時間ごとに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>>", 
    }
};

<の部分をを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