Raspberry Pi + Node-RED + Google Home で明日の天気を定刻にアナウンス

Raspberry Pi + Node-RED + Echo Show 5 + Google Home で「こっちに来て!」メッセージ
最近、”はじめてのNode‐RED (I・O BOOKS) “を読んでみました”の続きです。

 

今回のTALKでは、“Node-RED”をインストールした“Raspberry Pi”から、

定時に“Google Home”で今日の天気予報をアナウンスする仕組みを作ります。

 

< Raspberry PiにNode-REDをインストールする >

“Raspberry Pi”には”Node-RED”がプレインストールされていますが、最新の状態で使いたいので、まずはバージョンアップ作業からスタート。

 

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

インストール後、”Node-RED”を起動します。

node-red-start

“ターミナル”画面に表示された”http://127.0.0.1:1880″部分をメモります。一旦、Control + cで”Node-RED”を終了します。

※ Control + cだと”Node-RED”はバックグラウンドで実行し続けるそうです。”Node-RED”をしっかり終了させたい場合は、”node-red-stop”を実行して下さい。

 

ラズパイを再起動しても、”Node-RED”が自動的に起動するようにしておきます。

sudo systemctl enable nodered.service

 

< Google HomeのIPアドレスを確認する >

前準備として、お手元にある”Google Home”に割り当てらているIPアドレスを確認します。

“Google Home” iOSアプリを開き、”自宅”画面で”Google Home”のアイコンをタップします。

画面右上の歯車アイコンをタップし、”デバイス設定”画面を開いて下さい。

“デバイス設定”画面の末尾に、”Google Home”に割り当てらているIPアドレスが表示されていますのでメモって下さい。

 

< Node-REDの専用ノードでGoogle Homeに手軽にアクセスする >

“Raspberry Pi”を使って”Google Home”に喋らせるたい場合は、”google-home-notifier“が定番なアプローチですが、今回は”Node-RED”の”google-home-notify“ノードを利用します。

普段使い慣れているPCのWebブラウザで、”Raspberry Pi”上の”Node-RED”にアクセスします。

http://Raspberry PiのローカルIPアドレス:1880

“パレットの管理”->”ノードを追加”と進み、”node-red-contrib-google-home-notify”を検索し、ノードを追加して下さい。

追加した”Google Home Notify”ノードをパレットからワークスペースにドラッグ&ドロップし、ノードをダブルクリックして下さい。

“Google Home Notify”ノードのプロパティ画面の鉛筆アイコンボタンをクリックします。

“IP Address”欄に先程メモった”Google Home”に割り当てらているIPアドレスを入力し、”追加”ボタンをクリック。この時点では、”Language”欄の言語は英語以外、選択できません。

“Google Home Notify”ノードに分かりやすい名前を設定し、”完了”ボタンをクリックして下さい。

 

“Node-RED”画面の右上にある”デプロイ”ボタンをクリックすると、”Google Home Notify”ノードが”ready”状態になります。

ここでもう一度、”Google Home Notify”ノードのプロパティ画面を開くと、”Language”欄で使用言語を選択できるようになっていますので、”Japanese”を設定後、”更新”ボタンをクリックして下さい。

 

以上で基本的な準備は完了です。実際に”Node-RED”で簡単に描いたフローを使って”Google Home”に喋ってもらいましょう。

パレットから”inject”、”template”の各ノードをワークスペースに配置し、”inject”-“template”-“Google Home Notify”ノードを左から順に接続します。

“inject”ノードのプロパティ画面を開き、”ペイロード”欄を”日時”から”文字列”に変更し、”Google Home”に喋ってもらうフレーズを入力後、”完了”ボタンをクリック。

続いて、”template”のプロパティ画面を開き、”テンプレート”欄に”{{payload}}”という文字だけ残し、”完了”ボタンをクリック。

“Node-RED”画面の右上にある”デプロイ”ボタンをクリックした後、”inject”ノードの左端にあるタブをクリックすれば、”Google Home”が喋るはずです。

 

< Weather Hacksで東京の天気を調べる >

“Node-RED”には、IBMの”The Weather Company“のデータを扱える”Weather Insights”ノードがプレインストールされていますが、以前と違い有料なので、今回は無料で使える“Weather Hacks(気象データ配信サービス)”でお手軽に天気予報のデータを取得することにします。

 

“Weather Hacks”は、”RESTful“なWebサービスなので、例えば、東京の天気予報をWebブラウザ画面に表示したければ、

http://weather.livedoor.com/forecast/webservice/json/v1?city=130010 (東京のcityコード。)

とアクセスすれば、Webブラウザ画面に結果が表示されます。とは言っても、”JSON“形式で、かつUNICODEのまま表示されるので、パット見では理解できないと思います。

以降、この仕組みを”Node-RED”で再現することにします。

 

“Node-RED”画面で新しいフローを追加し、

パレットから”inject”、”http request”、”debug”の各ノードをワークスペースに配置し、”inject”-“http request”-“debug”ノードを左から順に接続します。

“inject”ノードのプロパティ画面を開き、”ペイロード”欄を”日時”から”文字列”に変更し、”Google Home”に喋ってもらうフレーズを入力後、”完了”ボタンをクリック。

“http request”ノードのプロパティ画面を開き、

“メソッド”欄を”GET”のまま、

“URL”欄に”http://weather.livedoor.com/forecast/webservice/json/v1?city={{payload}}”と入力、

“出力形式”欄で”JSONオブジェクト”を選択後、”完了”ボタンをクリック。

“Node-RED”画面の右上にある”デプロイ”ボタンをクリックした後、”inject”ノードの左端にあるタブをクリックすると、右端のデバッグ画面に結果が表示されるはずです。

結果のうち、”description”オブジェクトの”text”部分を”Google Home”に喋ってもらえば良いわけです。

 

< 東京の天気予報をGoogle Homeが喋る >

“Node-RED”画面で新しいフローを追加し、2つのフローで作成した内容を合体してみましょう。

始めに、天気予報を調べるフローで、”http request”-“debug”ノードの間に”function”ノードを追加します。

天気予報の結果のなかから、”description”オブジェクトの”text”だけを切り出したので、”function”ノードのプロパティ画面を開き、”コード”欄に、

var msg = { payload: msg.payload.description.text };
return msg;

と入力後、”完了”ボタンをクリック。”デプロイ”後に実行すると、デバッグ画面に”description”オブジェクトの”text”部分だけが表示されるはずです。

それでは、天気予報を調べるフローの続きに、”Google Home”にフレーズを喋ってもらうフローを連結します。”Node-RED”画面では、個々に作成したフローをコピー&ペーストして編集できます。

“デプロイ”後に実行すると、想定通り結果は表示される一方で、”Google Home”ノードの下に、”text length (369) should be less than 200 characters”というエラーが表示されました。原因は、”node-red-contrib-google-home-notify”ノードが200文字より短いフレーズしか扱えないからです。

 

それでは、戦術を変えて、天気予報の結果のなかから、”description”オブジェクトの”text”部分を採用するのは諦めて、”forecasts”オブジェクトの2番目の配列に記述している明日の天気を採用することにします。

先程の”function”ノードのプロパティ画面を開き、”コード”欄の内容を編集します。

var new_msg = { payload: '明日の天気は' + msg.payload.forecasts[1].telop + '、' + '最高気温は' + msg.payload.forecasts[1].temperature.max.celsius + '度、' + '最低気温は' + msg.payload.forecasts[1].temperature.min.celsius + '度です。' };
return new_msg;

“デプロイ”後に実行すると、”Google Home”から「明日の天気は◯◯、最高気温は◯度、最低気温は◯度です。」とアナウンスしてくれるはずです。

 

< 完成したフローを定時点に実行する >

“inject”ノードの左端にあるタブをクリックすればフローを実行できますが、毎回そうするわけにもいかないので、完成したフローを定時点に実行するようにします。

“inject”ノードをダブルクリックしてプロパティ画面を開き、”繰り返し”欄で”指定した日時”を設定し、フローを実行する時刻と曜日を選択、”完了”ボタンをクリックします。

“デプロイ”を実行すれば、以降、指定した曜日の時間に、”Google Home”が明日の天気を伝えてくれます。

 

 

 

 

ホームページ “THE POOH FILES”にも是非お立ち寄り下さい。
Adobe Stock“でベストショットな写真素材を販売中です。是非ご覧下さい。

tomohiko

長年に渡りMacintosh向けの自作アプリを作り続けているPOOHです。最近はiPhone,iPad向けアプリ開発にも挑戦中。グルメ、旅行、露天風呂、写真、サイクリング、映画、STAR TREKが大好き。レトロでSFなおもちゃを大量にコレクション。プレーリードッグと同居中。

おすすめ

コメントを残す