以下の内容はhttps://relativelayout.hatenablog.com/entry/2018/05/20/223149より取得しました。


Google HomeをNode-REDからgoogle-home-notifierを使って喋らせる

SAY YES。

前回はJavaScriptからGoogle Homeを喋らせました

relativelayout.hatenablog.com

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 Google Home google-home-notifier

ちゃんと喋りましたー。ここまで来たら、トリガーを自動化したり、喋る文言を動的に作り変えたり、なんでもできそうですね!




以上の内容はhttps://relativelayout.hatenablog.com/entry/2018/05/20/223149より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14