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
- メディア: 単行本