SAY YES。
前回はJavaScriptからGoogle Homeを喋らせました
JSでできるんならNode-REDでもイケるんじゃね?って思ってやってみた。
Functionノードではrequire
できない
この前、こんなコードを書きました。
const googlehome = require('google-home-notifier') const language = 'ja'; googlehome.device('Google Home Mini', language); googlehome.notify('こんにちは!ポキオです!', function(res) { console.log(res); });
この前のコードをFunctionノードに書けばイイんじゃね?そう思って、やってみると、
"ReferenceError: require is not defined (line 2, col 20)"
こんな感じで、怒られてしまいます。Functionノードではrequire
が使えないようです。
require
が必要なものは予めrequire
する
このページを参考にさせていただきました。
グローバルコンテクストはNode-REDの起動時にオブジェクトと共に前もって生成しておくこともできます。メインのsettings.jsの中のfunctionGlobalContextプロパティの中で定義することでそのように動作します。
とどのつまりが、~/.node-red/settings.js
で予めrequire
して、それをグローバル変数のように使えば良さそうです。
functionGlobalContext: { googlehomenotifier:require('google-home-notifier'), (省略) },
こんな感じでfunctionGlobalContext
の部分で、google-home-notifier
を取り込んでおきます。Functionノードでは、この変数を呼び出せばいいので、
const googlehome = context.global.googlehomenotifier; const language = 'ja'; googlehome.device('Google Home Mini', language); googlehome.notify('こんにちは!ポキオです!', function(res) { console.log(res); });
context.global.googlehomenotifier
で呼び出せばOKです。
せっかくなので喋らせるフレーズを可変にする
せっかくなので。喋るフレーズをmsg.payload
を読み込むようにして、別のNodeから与えられるようにしました。
const googlehome = context.global.googlehomenotifier; const language = 'ja'; googlehome.device('Google Home Mini', language); googlehome.notify(msg.payload, function(res) { console.log(res); }); return msg;
Nodeを繋いでいきます
今回は、Injectノードでトリガーを与えてみます。また、Injectノードを複数用意して、それぞれのmsg.payload
を変えています。
ちゃんと喋りましたー。ここまで来たら、トリガーを自動化したり、喋る文言を動的に作り変えたり、なんでもできそうですね!
- 作者:Node‐REDユーザーグループジャパン
- 発売日: 2017/09/01
- メディア: 単行本