「OK Google、さむい」と言ったら暖房をつける
実現したいこと
今年もあと残りわずか、昼でもとても冷え込む。Google Homeでエアコンの暖房を付けたい!
「OK Google、さむい」
→ 「では、暖房をつけますね」
実現方法
先に概要図を記載すると以下のようになる。
エアコンをつけるため、IRKitを利用
自宅にあるエアコンはスマートエアコンでもなんでもない普通のエアコンなので、普段は赤外線リモコンで操作する。赤外線のインタフェースに対応するため、 IRKit (opens new window) を採用した。 IRKitはHTTPサーバーを内蔵しており、HTTPのPOSTリクエストを受け付けることができる。
IRKitは、WiFi機能の付いたオープンソースな赤外線リモコンデバイス。 家庭のエアコンやテレビ、ライトなど、赤外線で操作できる家電を、 WiFiをとおして、iPhoneやiPad,Androidスマートフォンなどから操作できるようにするものです。
引用: IRKit|opensource infrared remote controller (opens new window)
Google HomeとIRKitを連携させるためIFTTTを利用
Google Homeの音声認識結果を元に、IRKitへHTTPリクエストを投げるため、IFTTTを採用した。Google HomeはIFTTTに対応しており、事前にアプレットを作成しておくことで、音声認識結果からアプレットを実行することができる。
https://ifttt.com/ (opens new window)
設定手順
ここからはIRKitとIFTTTの設定手順。
エアコンをつけるための赤外線信号を確認
IRKitの端末名を確認する。
# IRKitの端末名を確認
$ dns-sd -B _irkit._tcp
# Browsing for _irkit._tcp
# DATE: ---Sun 24 Dec 2017---
# 16:16:48.357 ...STARTING...
# Timestamp A/R Flags if Domain Service Type Instance Name
# 16:16:48.576 Add 2 4 local. _irkit._tcp. iRKit****
出力されたIRKitの結果から、IPアドレスを確認する。
# IRKitのIPアドレスを確認
$ dns-sd -G v4 IRKit****.local
# DATE: ---Sun 24 Dec 2017---
# 16:19:59.060 ...STARTING...
# Timestamp A/R Flags if Hostname Address TTL
# 16:19:59.195 Add 2 4 irkit806d.local. 192.168.***.*** 10
確認したIPアドレスを元に、ClientTokenを確認する。下記のコマンドを実行する度に出力されるClientTokenが変更され、過去に出力したものは無効になるので注意。
# ClientTokenを確認
$ curl "http://192.168.***.***/keys" -d '' -H "X-Requested-With: curl"
# {"clienttoken":"***ClientToken***"}
ClientTokenから、ClientKeyとDeviceIdを確認する。 このClientKeyとDeviceIdはIFTTTのアプレット設定時にも利用するのでコピペ等でメモしておく。
# ClientKeyとDeviceIdを確認
$ curl -d "clienttoken=***ClientToken***" "https://api.getirkit.com/1/keys"
# {"deviceid":"**DeviceId**","clientkey":"**ClientKey**"}
以下コマンドを入力すると、赤外線信号の待機状態になる。
# 赤外線信号を確認
$ curl "https://api.getirkit.com/1/messages?clientkey=**ClientKey**&clear=1"
# {"message":{"format":"raw","freq":38,"data":[6881,3341,968,761,968,2451,968,761,
# 〜中略〜,904]},"hostname":"IRKit***","deviceid":"**DeviceId**"}
IRKitに向けてリモコンを向けて暖房ボタンを押す。 そうすると、上記のようにJSON形式の赤外線信号の情報が取得できるのでこちらもコピペ等でメモしておく。
IFTTTにアプレットを作成
事前にIFTTTでアカウント準備をしておき、以下リンクから、IFTTTでアプレットを作成する。
https://ifttt.com/create/ (opens new window)
トリガーの設定
「this」の部分をクリックして、トリガーを作成する。 Google Homeの音声認識をトリガーにするので、Google Assistantを選択し、「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? | では、暖房をつけますね |
Language | Japanese |
※ここで設定した**「絶対暖房つけるマン」**が後々効果を発揮する
アクションの設定
次に、「that」の部分をクリックしてアクションを設定する。 HTTPでPOSTするアクションを行うのでwebhookを選択し、**「Make a web request」**を選択する。
アクションを設定する画面になるので、各項目を記載する。
設定項目 | 設定内容 |
---|---|
URL | https://api.getirkit.com/1/messages (opens new window) |
Method | POST |
Content Type | application/x-www-form-urlencoded |
Body | ※下記に抜粋 |
以下のように、Bodyの部分には、IRKitのClientKey/DeviceIdと取得した赤外線情報のformat部分をコピペする。
clientkey=**ClientKey**&deviceid=**DeviceId**&message={"format":"raw","freq":38,"data":[6881,3341,968,761,968,2451,968,761,
# 〜中略〜,904]}
テストしてみる
ここで、テストしてみる。
「OK Google、さむい」 「寒い季節は、お風呂がいちばんですね」
...コレジャナイ!
じつはここまでの設定だけでは「OK Google、さむい」と話しかけても、既に予約済みの「さむい」というワードに反応してしまう。 登録済みの予約語を回避するには、Google HomeのiOSアプリで、ショートカットを設定する。
- Google Homeアプリを起動
- 左上のメニューボタンをタップ
- 「その他の設定」をタップ
- 右下の「+」ボタンをタップ
ショートカットを以下のように設定し、「さむい」と話しかけても**「絶対暖房つけるマン」**と認識させるようにする。
完成!
これで、Google Homeが暖房をつけてくれるようになりました。
「OK Google、さむい」
「では、暖房をつけますね」
今回はエアコンの操作をやってみたが、赤外線リモコンに対応した家電であれば操作できるのでこんなこともできそう。
「OK Google、ねます」
「おやすみなさい」(音楽、シーリングライトを消す)
「OK Google、おはよう」
「おはようございます」(シーリングライト点灯、テレビのニュース番組をつける)
「OK Google、掃除して」
「はい、部屋の掃除をします」(ルンバをCLEANモードで起動)
映画「マイノリティ・リポート」ではトム・クルーズ演じる主人公が自宅に帰った際、 「I'm Home.」 の一言だけで部屋の電気がつき、音楽が流れ始める。 そんな未来にすこし近づいたような気がする。
参考記事
- GoogleHome→IFTTT→HomeAssistantで部屋の電気を付けてみる (opens new window)
- IRKitを使ってターミナルで家電を操作する (opens new window)
- Google Homeに話しかけてエアコンを操作してみる (opens new window)
- GoogleHome×IFTTT できることまとめてみた (opens new window)
- Google Home ヘルプ|ショートカット コマンドの作成と管理 (opens new window)
- Google home + IRKit で既存の家電を操作するアプリを作ってみた #dialogflow (opens new window)