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に従い、ファイルを編集していく
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()
];
起動するプロセスのポートを変更したい場合は下記を編集する
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);
:
:
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
[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
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
[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