Androidのメモとか

ポキオの日記です。今日も遅延してない。

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

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

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。