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“でベストショットな写真素材を販売中です。是非ご覧下さい。