#3【RaspberryPiとGoogle Homeでスマートホーム化】ラズパイとTypetalkの連携

RaspberryPi

ラズパイでスマートホーム化の第3回目です。

第2回目ではIFTTTを用いてGoogle HomeとTypeTalkの連携を行いました。
第2回目をまだ見ていない人は以下のリンクからどうぞ。

第3回目となる今回は、ラズパイとTypeTalkの連携を行い、音声コマンドにより家電を操作できるようにします。

今回の記事はYoutubeにもアップロードしているので、合わせてご覧ください。

#3【RaspberryPiとGoogle Homeでスマートホーム化】ラズパイとTypetalkの連携

フローチャート

前回のおさらいになります。
スマートホーム化するにあたってのフローチャートです。
全体的な流れは以下の画像のようになります。

  1. (人)Google Homeに家電操作の音声指示
  2. (Google Home)エアコン操作のコマンドをTypeTalkに送信
  3. (ラズパイ)TypeTalkの送信された家電操作コマンドを読み取る
  4. (ラズパイ)読み取った家電操作コマンドをもとに赤外線送信
  5. (家電)赤外線を受けて起動

今回の実装部分は3~4(5)の部分になります。音声コマンドをもとに、ラズパイが処理を実行する流れができれば、赤外線を登録するだけになるので、そこまで実装をしましょう。


Hubotのインストール

TypeTalkに家電操作コマンドが投稿されたときに、ラズパイで赤外線モジュールを操作するためには『Hubot』を使用します。

Hubotとは

『Hubot』とはQiitaのはじめてのHubotより引用させていただくと、以下のようなものになります。

Hubotは、文字列のコマンドを受け付け、指定されたコマンドに応じた処理を実行し、結果を表示する機能を提供するプログラムです。

はじめてのHubot – Qiita

Hubotのインストール

Hubotを使用するにはnode.jsが必要になります。
まずはnode.jsをインストールします。以下のコマンドを実行すればインストールができます。

$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash --
$ sudo apt-get update
$ sudo apt-get install -y nodejs

念のためインストールの確認を行っておきましょう。以下のコマンドを実行してバージョンが表示されれば成功です。

$ node -v
$ npm -v

※redisも必要という内容の記事が多くありましたが、私の環境では明示的にインストールしなくても動作しました。もしかしたらすでにインストール済みで見落としていた可能性もあるので、念のためredisもインストールしてください。
以下のコマンドでインストールすことができます。

$ sudo apt-get update
$ sudo apt-get install redis

次にHubot本体のインストールを行います。

$ sudo npm install -g coffee-script
$ sudo npm install -g yo generator-hubot
$ mkdir -p hubot
$ cd hubot
$ yo hubot

yo hubotコマンドを実行するとhubotのひな型作成を行います。セットアップは以下を参考にしてください。
Bot nameには任意の名前を指定してよいのですが、わかりやすいようにtypetalkで作成したbotの名前と同じにしておきましょう。今回はhomebotとして説明を行います。
一番最後のBot adapterの指定でtypetalkを指定することを忘れないようにしてください。

? Owner (User user@example.com) (何も入力せずにEnter)
? Bot name (hubot) (任意で指定。今回はhomebotとしておきます)
? Description (A simple helpful robot for your Company) (何も入力せずにEnter)
? Bot adapter typetalk (typetalkアダプターを指定)

ひな型の作成が終わったらHubotを起動して動作確認しましょう。
ディレクトリはhubotととします。

Hubotの起動
$ ./bin/hubot

Hubotの動作確認
> (Bot nameでつけた名前) ping
例)今回の場合だと"homebot ping"
PONGと帰ってくれば動作確認は完了です

TypeTalkとの連携

TypeTalkとラズパイ(Hubot)を連携するためには、第2回目のGoogleHomeのセットアップのディベロッパー設定で作成したAPIキーを使用します。

作成したアプリケーション
・『Client ID』
・『Client Secret』
ボット
・『メッセージの取得と投稿のURL』のhttps://typetalk.com/api/v1/topics/xxxxxx(ここの数字)

上記のAPIキーを環境変数に登録する必要があります。
exportコマンドで手軽に登録してもよいですが、exportコマンドで設定した環境変数は一時的なもので、再起動すると消えてしまいます。再起動後も環境変数を指定するには設定ファイルを編集して登録する必要があります。
テスト段階はexportコマンドで、動作確認が取れた後に設定ファイルを編集するもよし、いきなり設定ファイルを書き換えるもよしです。2種類のやり方を記載しておきますが、最終的には設定ファイルを編集する必要がある点を念頭に置いておいてください

環境変数の設定ファイルを編集するときはテキストエディタを使用しますが、デフォルトだとvimが入っていなかったので次のコマンドでインストールできます。使い慣れたエディタがあればvimでなくても構いません。

$ sudo apt-get install vim
一時的に環境変数を追加する方法
$ export = HUBOT_TYPETALK_CLIENT_ID="XXXXX" (TypetalkのClient ID)
$ export = HUBOT_TYPETALK_CLIENT_SECRET="XXXXX" (TypetalkのClient Secret)
$ export = HUBOT_TYPETALK_ROOMS="XXXXX"※ (https://typetalk.com/topics/XXXXX)
再起動後も環境変数を有効にする方法 
環境変数にPATHを追加
$ sudo vim /etc/profile
追加分(既存の環境変数付近に記載)
HUBOT_TYPETALK_CLIENT_ID="XXXXX" (TypetalkのClient ID)
HUBOT_TYPETALK_CLIENT_SECRET="XXXXX" (TypetalkのClient Secret)
HUBOT_TYPETALK_ROOMS="XXXXX"※ (https://typetalk.com/topics/XXXXX)
export HUBOT_TYPETALK_CLIENT_ID
export HUBOT_TYPETALK_CLIENT_SECRET
export HUBOT_TYPETALK_ROOMS

家電操作スクリプトの編集

TypeTalkから家電操作コマンドを受け取った時に赤外線送信を実行するスクリプトの編集を行います。

スクリプトファイルの編集
$ vim ~/hubot/scripts/example.coffee
スクリプト追加
『module.exports = (robot) ->』の下に追記します。
# TypeTalkにlight offと投稿されたときに次のコマンドを実行するという意味
robot.hear /light off/i,(msg) ->
@exec = require('child_process').exec
# 実行するコマンドを記載
# 赤外線モジュールの操作コマンドと使用する赤外線信号が保存されたファイルを絶対パスで記載
command = "sudo /home/pi/bto_ir_advanced_cmd/bto_advanced_USBIR_cmd -d cat /home/pi/bto_ir_advanced_cmd/light_shell/lightoff.txt"
# 実行するコマンドの表示
msg.send "Command: #{command}"
# コマンド実行結果の表示
@exec command, (error, stdout, stderr) ->
msg.send error if error?
msg.send stdout if stdout?
msg.send stderr if stderr?

複数の家電や家電によって操作を分ける(エアコンの冷房・暖房など)場合は、コピペして黄色くマーカーがひてある場所を書き換える形になります。
正直、イケてないスクリプトなので共通化ができたら追記します。

連携と動作確認

GoogleHomeから音声コマンドを入力して、ラズパイで赤外線送信ができるか動作確認します。

まずはHubotをTypeTalkアダプターを指定して起動します。
コンソールのログの最後に『Typetalk WebSocket connected』と表示されることを確認します。

$ ./bin/hubot -a typetalk
コンソールログに『Typetalk WebSocket connected』と表示されることを確認

Google Homeに音声コマンドを入力します。今回の場合、『OK、Google。電気を消して』と指示します。
Typetalk側に『@homebot light off』と『(エラーがない場合は実行したコマンド)or(コマンド実行時のエラー)』の2種類のメッセージが投稿されれば一連の流れの連携は取れていることになります。

コマンドの実行結果がエラーだった場合は、Hubot側の問題ではなく、赤外線モジュールの設定やディレクトリミス、ファイルの実行権限が足りない等が考えられますが、エラー内容を確認して対応しましょう。

ちなみにYoutube内では『そのようなファイルやディレクトリはありません』と出力されているので、赤外線モジュールの実行ファイルか、赤外線情報のファイルのパスが間違っていることになります(動画内では準備していなかったので当然の結果ですけどね)。

バックグラウンドでの起動

一連の連携動作確認がとれれば、スマートホーム化は完了です。
しかし、このままでは、ログアウトしたり、コンソールを閉じたりするとHubotは停止してGoogleHomeと連携が取れなくなってしまいます。
現実的な運用を想定するなら、最後にバックグラウンドでHubotを起動できるように設定する必要があります。

次のコマンドを実行してforeverパッケージをインストールします。

$ sudo npm install -g forever

次のコマンドでHubotをバックグラウンドで実行出来ようになります。

$ forever start -c coffee node_modules/.bin/hubot -a typetalk

実行後は次のコマンドで、起動してるhubotとログの確認を行います。
ログを確認して『Typetalk WebSocket connected』と表示されていればバックグラウンドでの起動に成功です。

起動しているHubotの確認
$ forever list
logfileという項目があるのでcatコマンドで内容を確認
$ cat [ログファイルのパス]
『Typetalk WebSocket connected』と表示されることを確認

問題点

以上で、必要最小限のスマートホーム化は完了です。
しかし、トークンの有効期限が1時間で切れてしまうという問題があります。
他にも問題はあるのです、とりあえずこれの対応は必須なので次回、調整編で対応します。

他にも、ラズパイ本体を再起動したときに自動でHubotが立ち上がらない点が不便なので、systemdにHubotサービスを登録して自動起動できるようにします。

他にも問題があるのですが、とりあえず対応必須な問題と、対応できる課題の対処をしていきます。

詳しくは次の記事を参照してください。
それではお疲れさまでした。

スポンサーリンク

コメント

タイトルとURLをコピーしました