コントローラのインストール

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のログを出力には次の手順を実行する。

  1. sudo suで管理者になる。
  2. forever listコマンドでログファイルを探す。
  3. 上記で探したログファイルを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 件のコメント:

コメントを投稿