ECS 小型PC LIVA MINI PC KIT
Google Home Mini(右)とコントローラ(左) |
ハードウェア
- Processor: Intel(R) Celeron(R) CPU N2807 @ 1.58GHz
- Memory: 2GB (DIMM DDR3 65535 MHz)
- Storage: eMMC 64GB
ソフトウェア
- OS: Ubuntu 16.04 LTS
- node 10.16.3
- npm 6.9.0
- google-home-notifier 1.2.0
- ngrok 3.2.5
インストール
アカウント作成
専用のアカウントを作成する。
mtanaka@semi2014vpn:~$ sudo adduser semi2020kumw
リスト1.アカウントの作成
sudoグループに追加
作成したアカウントをsudoグループに追加する。
mtanaka@semi2014vpn:~$ sudo gpasswd -a semi2020kumw sudo
リスト2.sudoグループに追加
/etc/ssh/sshd_configを修正
作成したアカウントでsshが利用できるように/etc/ssh/sshd_configを修正する。
AllowUsers mtanaka semi2020kumw
リスト3./etc/ssh/sshd_configを修正
sshを再起動
設定を反映させるためにsshを再起動する。
mtanaka@semi2014vpn:/home$ sudo service ssh restart
リスト4.sshを再起動
~/pill-reminderにデプロイ
ホームディレクトリにpill-reminderを作成する。
semi2020kumw@semi2014vpn:~$ mkdir pill-reminder
リスト5.pill-reminderを作成
Node.js初期化
pill-reminderをカレントディレクトリに設定し,Node.jsを初期化する。
semi2020kumw@semi2014vpn:~$ cd pill-reminder/ semi2020kumw@semi2014vpn:~/pill-reminder$ npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to guess sensible defaults. See `npm help json` for definitive documentation on these fields and exactly what they do. Use `npm install` afterwards to install a package and save it as a dependency in the package.json file. Press ^C at any time to quit. package name: (pill-reminder) version: (1.0.0) description: entry point: (index.js) test command: git repository: keywords: author: license: (ISC) About to write to /home/semi2020kumw/pill-reminder/package.json: { "name": "pill-reminder", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } Is this OK? (yes) y semi2020kumw@semi2014vpn:~/pill-reminder$
リスト6.Node.jsの初期化
google-home-notifierインストール
google-home-notifierをインストールする。
semi2020kumw@semi2014vpn:~/pill-reminder$ npm install google-home-notifier npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 npm WARN deprecated har-validator@5.1.5: this library is no longer supported > mdns@2.7.2 install /home/semi2020kumw/pill-reminder/node_modules/mdns > node-gyp rebuild make: ディレクトリ '/home/semi2020kumw/pill-reminder/node_modules/mdns/build' に入ります CXX(target) Release/obj.target/dns_sd_bindings/src/dns_sd.o CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_browse.o CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_enumerate_domains.o CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_get_addr_info.o CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_process_result.o CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_ref.o CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_ref_deallocate.o CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_ref_sock_fd.o CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_register.o CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_resolve.o CXX(target) Release/obj.target/dns_sd_bindings/src/dns_service_update_record.o CXX(target) Release/obj.target/dns_sd_bindings/src/mdns_utils.o CXX(target) Release/obj.target/dns_sd_bindings/src/network_interface.o CXX(target) Release/obj.target/dns_sd_bindings/src/socket_watcher.o CXX(target) Release/obj.target/dns_sd_bindings/src/txt_record_ref.o CXX(target) Release/obj.target/dns_sd_bindings/src/txt_record_create.o CXX(target) Release/obj.target/dns_sd_bindings/src/txt_record_deallocate.o CXX(target) Release/obj.target/dns_sd_bindings/src/txt_record_set_value.o CXX(target) Release/obj.target/dns_sd_bindings/src/txt_record_get_length.o CXX(target) Release/obj.target/dns_sd_bindings/src/txt_record_buffer_to_object.o SOLINK_MODULE(target) Release/obj.target/dns_sd_bindings.node COPY Release/dns_sd_bindings.node make: ディレクトリ '/home/semi2020kumw/pill-reminder/node_modules/mdns/build' から出ます > protobufjs@6.11.2 postinstall /home/semi2020kumw/pill-reminder/node_modules/protobufjs > node scripts/postinstall > ngrok@2.3.0 postinstall /home/semi2020kumw/pill-reminder/node_modules/ngrok > node ./postinstall.js ngrok - downloading binary https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip ngrok - downloading progress: 13832437/13832437 ngrok - binary downloaded to /home/semi2020kumw/.ngrok/aHR0cHM6Ly9iaW4uZXF1aW5veC5pby9jLzRWbUR6QTdpYUhiL25ncm9rLXN0YWJsZS1saW51eC1hbWQ2NC56aXA=.zip ngrok - unpacking binary ngrok - binary unpacked to /home/semi2020kumw/pill-reminder/node_modules/ngrok/bin/ngrok npm notice created a lockfile as package-lock.json. You should commit this file. npm WARN pill-reminder@1.0.0 No description npm WARN pill-reminder@1.0.0 No repository field. + google-home-notifier@1.2.0 added 142 packages from 169 contributors and audited 142 packages in 121.359s found 1 low severity vulnerability run `npm audit fix` to fix them, or `npm audit` for details semi2020kumw@semi2014vpn:~/pill-reminder$
リスト7.google-home-notifierのインストール
google-tts-apiの更新
google-tts-apiのバージョンを0.0.6に変更してから更新する。google-tts-apiにまつわる問題点はここに詳しい。
$ vi ~/pill-reminder/node_modules/google-home-notifier/package.json "dependencies": { "body-parser": "^1.15.2", "castv2-client": "^1.1.2", "express": "^4.14.0", "google-tts-api": "0.0.6", ←ココを修正!!! "mdns": "^2.3.3", "ngrok": "^2.2.4" }, semi2020kumw@semi2014vpn:~/pill-reminder/node_modules/google-home-notifier$ npm update google-tts-api npm WARN google-home-notifier@1.2.0 No repository field. + google-tts-api@0.0.6 removed 7 packages, updated 1 package and audited 1 package in 0.67s found 0 vulnerabilities
リスト8.google-tts-apiの更新
テストプログラム test.js 作成
Google Homeを発話させるテストプログラム~/pill-reminder/node_modules/google-home-notifier/test.jsを作成する。
var googlehome = require('google-home-notifier'); //googlehome.device('Google Home'); // Change to your Google Home name // or if you know your Google Home IP googlehome.ip('192.168.0.2'); googlehome.device('Pills','ja'); googlehome.notify('こんにちは', function(res) { console.log(res); });
リスト9.テストプログラム
テストプログラム実行
作成したテストプログラムを実行する。
semi2020kumw@semi2014vpn:~/pill-reminder/node_modules/google-home-notifier$ node test.js
リスト10.テストプログラムの実行
Google Homeから「こんにちは」と発声すればOK。また,test.jsを~/pill-reminder/に移動して実行し,発声を確認する。
ngrokのインストール
ngrokをインストールする。
semi2020kumw@semi2014vpn:~/pill-reminder$ npm install ngrok npm WARN deprecated uuid@3.4.0: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142 npm WARN deprecated har-validator@5.1.5: this library is no longer supported > ngrok@2.3.0 postinstall /home/semi2020kumw/pill-reminder/node_modules/google-home-notifier/node_modules/ngrok > node ./postinstall.js ngrok - unpacking binary ngrok - binary unpacked to /home/semi2020kumw/pill-reminder/node_modules/google-home-notifier/node_modules/ngrok/bin/ngrok > ngrok@4.0.1 postinstall /home/semi2020kumw/pill-reminder/node_modules/ngrok > node ./postinstall.js ngrok - cached download found at /home/semi2020kumw/.ngrok/aHR0cHM6Ly9iaW4uZXF1aW5veC5pby9jLzRWbUR6QTdpYUhiL25ncm9rLXN0YWJsZS1saW51eC1hbWQ2NC56aXA=.zip ngrok - unpacking binary (node:9936) ExperimentalWarning: The dns.promises API is experimental ngrok - binary unpacked to /home/semi2020kumw/pill-reminder/node_modules/ngrok/bin/ngrok npm WARN pill-reminder@1.0.0 No description npm WARN pill-reminder@1.0.0 No repository field. + ngrok@4.0.1 added 34 packages from 39 contributors, removed 1 package and updated 1 package in 19.405s semi2020kumw@semi2014vpn:~/pill-reminder$
リスト11.ngrokのインストール
YakuShare.jsのデプロイ
~/pill-reminder/にYakuShare.jsを保存し,config.serverPort=8093に修正する。
YakuShare.jsを起動
YakuShare.jsをforeverで永続化起動する。
semi2020kumw@semi2014vpn:~/pill-reminder$ forever start YakuShare.js warn: --minUptime not set. Defaulting to: 1000ms warn: --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms info: Forever processing file: YakuShare.js semi2020kumw@semi2014vpn:~/pill-reminder$ forever list info: Forever processes running data: uid command script forever pid id logfile uptime data: [0] D-0E /usr/local/bin/node YakuShare.js 10388 10395 /home/semi2020kumw/.forever/D-0E.log 0:0:0:7.199 semi2020kumw@semi2014vpn:~/pill-reminder$ tail -f /home/semi2020kumw/.forever/D-0E.log 2021-07-13 16:08:55.096: show timer: 2021-07-13 16:08:55.096: event_id=kca114gak67tl2mc4gvs47t7ss@google.com, timer_id=[object Object] 2021-07-13 16:08:55.097: event_id=2021-07-14, timer_id=[object Object] 2021-07-13 16:08:55.097: YakuShare.js usage: 2021-07-13 16:08:55.098: curl -X POST -d "text=Hello Google Home" https://ed4eb987b148.ngrok.io/google-home-notifier 2021-07-13 16:08:55.098: curl -X GET https://ed4eb987b148.ngrok.io/google-home-notifier?text=Hello+Google+Home 2021-07-13 16:08:55.098: curl -X GET https://ed4eb987b148.ngrok.io/reload 2021-07-13 16:08:55.098: curl -X GET https://ed4eb987b148.ngrok.io/config 2021-07-13 16:08:55.099: curl -X GET https://ed4eb987b148.ngrok.io/help 2021-07-13 16:08:55.748: ****** sendNgrokUrl 成功 ******
リスト12.YakuShare.jsの起動
ここで,もし key failure エラーが発生したら,google-tts-apiを再度更新する(リスト8参照)。その後,~/pill-reminder/node_modules/google-tts-apiをフォルダごと削除する。
$ rm -rf ~/pill-reminder/node_modules/google-tts-api
リスト13.~/pill-reminder/node_modules/google-tts-apiの削除
デフォルトのgoogle-tts-apiのままでは今のGoogle Homeはしゃべらない。で,リスト8に示したように0.0.6にして更新するとしゃべりだす。ところが,今回の作業でngrokをインストールした際に先祖返りしたのか,またしゃべらなくなった。そこで慌てて再度更新した次第である。その際,~/pill-reminder/node_modules/google-tts-apiが作られていた。エラー発生源のkey.jsはこの中にある。しかし,0.0.6ではこれは利用されていないようなので削除した。しかし,本当はこのあたりの依存関係は理解できていない。経験的にこうすればうまくいくとわかっているだけである。ちなみに0.0.6のgoogle-tts-apiは~/pill-reminder/node_modules/google-home-notifier内のnode_modulesにある。複雑で理解できない・・・。
/etc/rc.localの修正
起動スクリプト/etc/rc.localを修正する。
# Speak Push Service (pill-reminder system) forever start /home/semi2020kumw/pill-reminder/YakuShare.js
リスト14./etc/rc.localの修正
システム停止
コントローラを停止する。
$ sudo shutdown -h now
リスト15.システム停止コマンド
電源LEDが消えたら電源プラグを抜く。
システム起動
設定ファイル(スプレッドシート「pill-reminder」)にGoogle Home MiniのIPアドレスを設定してからコントローラの電源を入れる。電源投入すると、しばらくしてpill-reminderのngrok_urlが更新される。その後、ngrokのダッシュボードのメニューから[Status]->[Endpoints]を選択すると以下のような表示が確認できる。
図2.ngrokのダッシュボード |
図2に表示された払い出しURLの「tcp://0.tcp.ap.ngrok.io:*****」はssh(ポート番号22)接続のためのもので,TeraTermのホストに入力するとコントローラに接続できる。
2行目のURLはYakuShare.jsのWebAPIのURLである。これを使ってブラウザから以下のURLを入力するとGoogle Homeから「ハローグーグルホーム」と発話される。
https://XXXXXXXXXXXX.ngrok.io/google-home-notifier?text=Hello+Google+Home
リスト16.発話コマンド
「https://XXXXXXXXXXXX.ngrok.io」は図2に表示されていたWebAPIのURLである。
YakuShareのログを表示するスクリプト
YakuShareのログを出力には次の手順を実行する。
- sudo suで管理者になる。
- forever listコマンドでログファイルを探す。
- 上記で探したログファイルをtail -fコマンドで出力する。
この手順を自動化したスクリプトファイルyakulogをホームディレクトリに作成した。
#!/bin/sh tail -f `forever list | grep /.forever/ | sed -r 's/.*(\/root\/\.forever\/.+\.log).*/\1/'`
リスト17.yakulog
sudo suで管理者になったあとこのコマンドを実行するとよい。
root@semi2014vpn:/home/semi2020kumw# ./yakulog "startTime": "2021-07-17T23:30:00.000Z", "endTime": "2021-07-18T00:30:00.000Z", "color": "9" } ], "num_reminder": "3", "taiking_status": "1", "status": "0" } 2021-07-18 08:40:17.313: dosing_remind: 済になったか催促上限オーバーになったので催促を終了します。
リスト18.yakulogの実行
0 件のコメント:
コメントを投稿