Google Home を使って、Bluemix の node-RED 経由で raspberry pi 上で動く赤外線リモコンを操作する


はじめに

「OK Google, 電気つけて」をやってみたかった。ただそれだけ。

Raspberry pi 3 を使って、 LINE から 赤外線リモコンを操作 のエントリーで
無理やり ルータのポート変換 を用いて、raspberry piにサーバーを立て家の外から
やり取りすることができるようになったが、ルータのポート変換はセキュリティホールになるため
別手段についてうっすら考えていたところ、
勉強会にて、node-RED の web socket を用いることで
ルータのポート変換 を利用せずに、今回の構成が実現可能であることがわかった。

今回は IFTTT を使って、Google Home から node-RED へ接続をする。

環境

Google Home mini
IFTTT
Bluemix node-RED
※ 今回利用するのは、Bluemix 上で動作している node-RED.
※ node-RED 自体は、処理をGUIで記載可能な オープンソース.
OS: Raspbian 9.1
赤外線リモコンデーモン:lircd 0.9.4c

構成

Google Home → (Google Assistant) → IFTTT → (Webhooks) → Bluemix(node-RED) → (WebSocket) → Raspberry pi(赤外線リモコン)

手順

Bluemix(node-RED) の登録

@KURO-BLACK さんの記事 「Bluemixでnode-redを立ち上げる」
がわかりやすかったので、参考にして登録してみてください

Bluemix(node-RED) と Raspberry pi を繋げる

Raspberry pi で赤外線リモコンを動かす

過去の記事、Raspberry pi 3 を使って、 LINE から 赤外線リモコンを操作 にて、
irsend コマンド を使えるようにしてください

Bluemix(node-RED)で 通信処理を作成

空の http request を受け、 WebSocket サーバとして、WebSocket クライアント に文字列を送る 仕組みを作成する。

http request、および、WebSocket のブロックをフィールドに置く

処理を記載するために、template ブロックをフィールドに置く

ブロック間での処理を繋げるため、線で結ぶ

html request ブロックの内容を記載する

URL 項目は IFTTT の設定で利用する

template ブロックの内容を記載する

websocketにて、クライアントに送りたい本文を テンプレートの中に記載する。
ここでは、 on を言う本文を記載する。

websocket ブロックの内容を記載する

URL 項目は raspberry pi にて、websocket クライアント の実装で利用する

処理を有効化する

websocketクライアントの作成

参考のソースコードを github にアップしました。
ソースコードの 変更必要なポイント は以下の通りです。
xxxxxxxx : node-Red でアクセスしていた、ホスト名を入れる
yyyyyyyy : node-Red 上で、websocket に指定していた パス名 を入れる
※ 上の例だと、 app = ws.WebSocketApp('ws://xxxxxxxx.mybluemix.net/ws/light' となる

wslight.py
         # xxxxxxx is your name of Bluemix site.
         # yyyyyyy is url in websocket setting of node-RED
         app = ws.WebSocketApp('ws://xxxxxxxx.mybluemix.net/yyyyyyyy', 
                                     ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・) 

raspberry pi と bluemix との接続 は以下のコマンド で行います。
Crtl + c で処理を終了できます。

terminal
$ python wslight.py

IFTTT 経由で Google Home と Bluemix(node-RED) を繋げる

IFTTT へログインする

IFTTT にアクセスし、「Continue with Google」を選択。
Google Home に登録した Google アカウントでログインする

アプレットの作成

新規作成

画面の上にある 「My Applets」を選択すると画面が切り替わり
「New Applet」ボタン が現れるので、選択する。

トリガーの設定

以下の画面に切り替わるので、「+ This」 を選択する。

検索窓(Search Service) に、「Google Assistant」 と入力して
現れたサービスを選択すると、選択できる項目が4つ現れ、
「Say a simple phrase」を選択する。

以下の画面の通り、今回は「電気をつけて」で喋りかけると、「電気つけるぜ」と返し、
「日本語」を設定する。
終了後、「Create Trigger」ボタンを選択する。

アクションの設定

以下の画面に切り替わるので、「+ That」 を選択する。

検索窓(Search Service) に、「Webhooks」 と入力して
現れたサービスを選択すると、選択できる項目が現れ
「Make a web request」を選択する。

以下の画面の通り、URLの項目に、「Bluemix(node-RED)の設定画面のホスト名」+「Bluemix(node-RED)の http requestで設定した URL」 を設定する。
Methodの項目に、「Bluemix(node-RED)の http request で設定した メソッド」 を設定する。
Content Type に「text/plain」を設定する。
終了後、「Create Action」ボタンを選択する。

「Finish」ボタンを選択する。

しゃべってみる

Google Homeに、
「OK Google, 電気つけて」 としゃべりかけると、
「電気つけるぜ」 と返答し 電気がつく
これで できあがり!!!

課題

一晩越えると、websocket がタイムアウト後、再接続しないことがあり、
次は タイムアウト しない仕組みを考える。

参考URL