日本でやっと発売されたインテリジェンススピーカであるGoogleHomeを使って部屋の電気を付けたり消したりしてもらいました。スマートホームを実現したいけど、お金はあまりかけたくないので、RaspberryPi(赤外線リモコンであるirMagicianを操作)を利用して実現します。
追記(2017/10/7)
予約語によりうまくいかない場合の対処を追記しました。
#ざっくりした流れ
電気が操作されるまでは流れは以下の通りです。
1.GoogleHomeに「電気を付けて/消して」とお願いする
2.GoogleHomeからIFTTTにアクセスして、あらかじめ用意していたレシピを実行する
3.IFTTTからHomeAssistant(Raspberry Pi)に向けて電気を操作するAPIを実行するようにお願いする
4.HomeAssistantにあらかじめ設定された電気の操作が実行される
#環境
・GoogleHomeスピーカー
・IFTTT
・Raspberry Pi3(HomeAssistantインストール用。赤外線リモコンで電気操作可能にします)
→部屋の電気を操作するために必要です。
#1.Raspberry Piの準備とHomeAssistantの準備
部屋の電気等を操作するためにRaspberry Piを準備します。このRaspberry Piは家の中で電子機器(電気等)を操作できるようにしておきます。
##Raspberry Piと赤外線リモコンの準備
Raspberry(Raspbian)に赤外線リモコンを接続して利用できるようにします。今回利用する赤外線リモコンは、扱いが楽な「irMagician」を利用します。ただし、すでに他の方法でRaspberry Piから家の中の電子機器を操作できるようにしている方は本作業は飛ばしてください。本リモコンの使い方と設定方法は以下のサイトを参考に設定するとわかりやすいと思います。
【irMagician編】Raspberry Piで音声認識システムを使ったホームオートメーション化計画 その2
上記サイトで実施されている通り、pythonを実行するだけで機器を操作できるようになります。
Pythonで実行するコマンドは、後ほどHomeAssistantの設定ファイルで利用します。
##HomeAssistantのインストールと設定
Raspberry PiにHomeAssistantをインストールします。HomeAssistantはオープンソースで開発されているオートメーションプラットフォームです。類似ソフトとしてhomebridgeやOpenHABがあります。現在GitHub的にはHomeAssistantが活発なので、本ソフトウェアを利用します。
参考にさせていただいたサイトは以下の通りです。
https://qiita.com/spicemanjp/items/59032bad6c93c5ac28ab
①インストール
インストールは非常に簡単です。公式サイトにいろいろ記載されていますが、以下のコマンドを実行します。
sudo pip3 install homeassistant
※pip3をインストールしていない方は、以下のサイトでPythonをインストールしてから実行してください
https://home-assistant.io/docs/installation/raspberry-pi/
インストール後、HomeAssistantの実行は以下のコマンドです。
hass
初回実行時は設定ファイル等作られるので時間がかかります。起動後、http://(Raspberry PiのIP):8123にアクセスすると、HomeAssistantの制御ページが表示されればインストール完了です。
②設定
HomeAssistantの設定を実施していきます。設定ファイルは、実行ユーザのディレクトリ下に「.homeassistant」ディレクトリが作成され、その中に「configuration.yaml」ファイルが作成されます。以降、設定は「configuration.yaml」にすべて追記していきます。
「configuration.yaml」に今後利用するAPIの設定並びに操作する機器の設定を記載します。参考ページに倣い、初期設定とデバイス設定に分けて記載します。
###初期設定
初期設定では、APIで利用するためのパスワードを追記します。設定ファイル内のhttp部分にある「api_password」のコメントを外し、「YOURPASS」部分に任意のパスワードを記入します。後ほどIFTTTで利用するときに利用します。
(前略)
http:
# Uncomment this to add a password (recommended!)
api_password: YOURPASS
# Uncomment this if you are using SSL/TLS, running in Docker container, etc.
# base_url: example.duckdns.org:8123
(後略)
###デバイス設定
続いて、設定ファイルに操作するデバイスの設定を記載していきます。スイッチのON,OFFだけの操作なら以下のサイトの設定をそのまま利用できます。
今回は、「switch」を新たに追加し、ONとOFFをPythonのコマンドを実行することで操作できるようにします。
(前略)
switch:
platform: command_line
switches:
light:
command_on: "sudo python /home/pi/irm.py -p -f /home/pi/light_on.json"
command_off: "sudo python /home/pi/irm.py -p -f /home/pi/light_off.json"
(後略)
command_onとcommand_off部分に、Pythonで赤外線リモコンを操作するコマンドを記載します。Python以外で操作している方は、そのコマンドを記載してください。
HomeAssistantから利用するだけなら本設定で完了です。多くの機器を登録する場合はグループ化など実施したほうが見やすくなりますが、ここでは割愛いたします。
設定ファイルの編集が終わったら、HomeAssistantのサービスを再起動し、再度http://(Raspberry PiのIP):8123にアクセスすると、デバイス設定で追加した項目がトップページに表示されるため、操作できることを確認して完了です。
#2.IFTTTの準備
ここまでで、Raspberry PiにインストールしたHomeAssistantから、家電を操作できるようになったと思います。
続いては、GoogleHomeとHomeAssistantを繋ぐためのサービスとしてIFTTTを設定します。
なお、色々調べるとEmulated Hue Bridgeを利用することでIFTTTを利用せずGoogleHomeと連携できる記事がありますが、あくまで「Philips Hueブリッジ」を持っている方のみ実施可能となっております。
※昔は出来たらしいですが、今(2017/10/7現在)は出来なくなってます
##前々準備
さて、IFTTTからHomeAssistantを操作できるように設定するにあたり、以下の条件が必要です。
・HomeAssistantがインストールされたRaspberry Piがインターネットから接続可能なこと
→固定IPおよび、任意のポート(おすすめしないですがデフォルト設定を利用する場合は8123)が開いている必要があります。
外部から接続するための固定IPについては、MyDNS等無料で利用できるDNSサービスを利用することで解決できます。
ポートについては、ご家庭のルータのポートを解放しておく必要があります。デフォルトでは8123ポートを開けることになりますが、ポートマッピング等で任意のポートを解放して利用した方がいいかもしれません。
※外部からRaspberry Piへアクセスできるよう設定することは、セキュリティ上リスクがあります。実施には十分注意し、自己責任でお願いします。本設定で発生した被害について責任を負いかねます。
##IFTTT利用に伴うHomeAssistantの設定
まずは、IFTTTにログインします。アカウントがない方は新規作成を実施します。
以降は以下のページを参考に設定していきます。
ログイン後、Webhooks settingsを開き、APIキーを取得します。(例えばhttps://maker.ifttt.com/use/MYAPIKEYであれば「MYAPIKEY」部分)
取得したAPIキーをHomeAssistantの設定ファイルに記載します。(本設定は今後HomeAssistantからIFTTTを操作する場合に必要のため)
(前略)
ifttt:
key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(後略)
##IFTTTレシピ作成に必要な情報収集
続いて、レシピを作成するにあたり必要な情報を確認します。
IFTTTからHomeAssistantを操作するためには、APIURLを利用して機能を呼び出します。そのために必要な情報を取得していきます。
APIURLについての詳細は以下のサイトをご確認ください。
https://home-assistant.io/developers/rest_api/
本サイトで紹介するAPIURLに関しては上記サイトをコピペしてます。
①操作すべきデバイスのドメイン、サービス名の値を取得する
HomeAssistantでは、登録したデバイスに対して、そのドメインとサービス名が定義されています。APIを利用する場合はその名称を確認する必要があります。確認方法は以下のコマンドを実行します。
curl -X GET -H "x-ha-access: YOURPASS" \ -H "Content-Type: application/json" \ http://(Raspberry PiのIP):8123/api/services
出力結果はドメインとそれに含まれるサービスが記載されています。本記事の設定の場合、
・ドメイン名:switch
・電気を付けるサービス:turn_on
・電気を消すサービス:turn_off
ここで、サービス名は設定ファイルに記載したcommand_on出ではないことに注意してください。実際の値は各自の環境で実行した値を確認してください。
②操作すべきデバイスのentity_idの値を取得する
続いて、APIを利用するために必要なentity_idを取得します。確認方法は以下のコマンドです。
curl -X GET -H "x-ha-access: YOURPASS" \ -H "Content-Type: application/json" \ http://(Raspberry PiのIP):8123/api/states
出力結果は、entity_id、state、last_changed、およびattributesが表示されます。本記事の設定の場合
・entity_id:switch.light
##IFTTTレシピの作成
情報取得が完了したら、IFTTTのレシピを作成していきます。新規レシピの作成ページに移動します。
ページの「this」部分を押して、レシピの作成を行います。
①GoogleHomeからIFTTTを呼び出せるようにする
ここまで一切出てこなかったGoogleHomeが登場です。といっても、スピーカー自体は設定の必要はありません。
先ほど開いたIFTTTのページ上部の検索部分に「Google Assistant」と入力すると、「Google Assistant」が表示されるので、選択します。
続いて、triggerを設定します。今回は、簡単なキーワード「電気つけて」とお願いしたら電気を付けてもらうようにしたいので、「Say a simple phrase」を選択します。
・What do you want to say?(必須)
→本レシピを実行するためのキーワードを記入します。ここでは「電気つけて」を記入します。
・What's another way to say it? (optional)、And another way? (optional)
→ほかの言い回しをする場合に記載します。
・What do you want the Assistant to say in response?
→GoogleHomeスピーカーからの返答を記載します。ここでは「電気をつけました」と入力します
・Language
→Japaneseを選択します。
すべて入力完了したらSAVEして完了です。
②IFTTTからHomeAssistantを呼び出せるようにする
続いて、ページの「that」部分を押して、レシピの作成を行います。IFTTTのページ上部の検索部分に「webhooks」と入力すると、「webhooks」が表示されるので、選択します。triggerは「Make a web request」のみのため、選択します。
ここからの設定は再度以下のサイトを参考に設定していきます。
・URL
URLフィールドには、API URLを記入します。フォーマットは以下の通りです。
「http://(Raspberry Piの外部から接続可能なIPまたはDNS名):ポート/api/services/(domain名)/(service名)?api_password=YOURPASS」
本記事の例では以下の通りとなります。
「http://(Raspberry PiのIP):8123/api/services/switch/turn_on?api_password=YOURPASS」
・Method
POSTを選択します。
・Content Type
application/jsonを選択します。
・Body
Bodyには以下のフォーマットで入力します。
「{"entity_id": "YOURENTITY_ID"}」
本記事では以下の通りとなります。
「{"entity_id": "switch.light"}」
すべて入力したら、「Create action」を選択して、「Finish」で完了です。
追記
予約語によりうまくいかない場合の対処
GoogleHomeにはいくつか予約語があるみたいで、IFTTTに接続せずに予約語の動作が優先される場合があるみたいです。その場合の対処としてGoogleHomeのシュートカットを利用すればうまくいきました。ご参考までに。
①IFTTTの「What do you want to say?(必須)」をでたらめな単語で設定する
通常、ここに設定する言葉は一般的な言葉(いってきます、ただいま、お休み等)にしますが、予約語でうまくいかない場合はでたらめな単語にします。例えば、ただいまと言いたいときに「帰宅しました」等で設定をします。(ふつうはこんな言葉使いしないと思います)
②GoogleHomeアプリ内でショートカットを設定する
IFTTTのでたらめな単語を設定したら、GoogleHomeアプリのショートカットに登録します。スマートフォンにインストールしているGoogleHomeアプリを開き、デバイス→設定→ショートカットを開きます。既存のものを編集もしくは新規作成をし、先ほど作成したIFTTTレシピと紐付けます。
ここでは、「OK Google」と言ったらに「ただいま」、「Googleアシスタントによる操作」に「帰宅しました」を入力します。これにより、ただいまと言ったときに裏で「帰宅しました」が認識され、IFTTTのレシピが実行されます。
追記終わり
#3.GoogleHomeに話しかける
ここまで出来たら、GoogleHomeスピーカーに話しかけてみましょう。「OK,Google、電気つけて」とお願いすると、部屋の電気がつくはずです。
#4.最後に
以上でGoogleHomeから部屋に電気を操作できるようになりました。必要に応じてレシピを増やしてあげれば何でもできるようになります。
ただし、一度外部のサービスを利用するため、部屋の電気がつくまで少し時間差があるのが今後の課題かもしれません。ローカルLANだけで完結できる方法を今後は探して行きたいと思います。