Google Assistantからエアコンを操作できるようにしました。

夏に備えて外からエアコンを操作出来るようにしておきました。家に帰ったら部屋が冷えている(or 暖まっている)なんてことが出来れば最高です。今はコロナであんまり関係ないですが…。はやく収まって欲しいですね。

できること

スマホのGoogleアシスタントアプリやGoogle HomeからエアコンをON/OFF出来るようになりました。電源を入れる際は冷房・暖房の区別がありますが、電源を消す際は区別がありません。

「OK Google, (冷房|暖房)をつけて」 -> 部屋の(冷房|暖房)がつく。
「OK Google, (冷房|暖房|エアコン)を消して」 -> 部屋の(冷房|暖房)が消える。

構成

①赤外線モジュール

エアコンのリモコンの代わりに使います。こちらのUSBで接続できるタイプの製品を使いました。

こちらの製品は赤外線の信号パターンを記録するツールやLinux上で動作するソフトウェアコントローラなどが充実しています。

Raspberry Piからの操作にはこちらのツールを使いました。

赤外線の信号パターンの記録にはこちらのツールを使いました。

②Raspberry Pi

外部からの命令で赤外線モジュールを操作するためのアプリケーションサーバーを動かします。

まず先述のbto_ir_advanced_cmdをインストールしました。

sudo apt-get install libusb-1.0
git clone https://github.com/Drunkar/bto_ir_advanced_cmd.git
cd bto_ir_advanced_cmd
make
sudo make install

次にExpressによるアプリケーションサーバーを構築していきます。nodejsとnpmをインストールしました。

sudo apt-get install nodejs npm

以下リポジトリのようにTypeScriptでプログラミングしました。

signalsディレクトリには送信設定アプリケーションを使って記録したリモコンの信号パターンを置いています。赤外線外部からこのAPIにリクエストする際にはオン・オフのどちらかということと冷房・暖房のどちらかということをパラメータとして乗せます。対応する信号パターンをsignalsディレクトリ以下から探しての赤外線モジュールにbto_ir_advanced_cmdコマンド経由で送信します。

// POST /control
// Content-Type: application/json
{
    "switch": "on", // or "off"
    "mode": "cool" // or "heat"
}

Raspberry Pi起動時にサーバーが自動起動するようにpm2を使いました。

sudo npm install -g pm2
pm2 start my-air-conditioner-control-server/build/index.js
pm2 startup
pm2 save

この時点でローカル上にはアプリケーションサーバーが構築されました。

③Nginx

最終的にGoogle Assistantで制御する以上、ローカルで動いているアプリケーションサーバーを外部から見えるようにする必要があります。

一番お手軽なのはngrokを用いる方法でしょう。ただし有料プランでないと固定のドメインが得られず8時間でセッションが切れてしまいます。

他には外部にサーバーを借りてそこに向けてローカルからSSHトンネルを掘っておくというのもいいでしょう。制御できるグローバルIPを持っていなかったり固定IPにならなかったりする人はこちらの方法が有効だと思います。

私の場合、外部から見えるところにNginxが動いています。構成についてはこちらの記事で触れています。これを入り口に外部からくるリクエストをリバースプロキシでローカルのアプリケーションサーバーに転送するようにしました。気休めですがBasic認証をします。あくまで例としてnginxの設定ファイルを置いておきます。

server {
	listen 443 ssl;
	server_name airconditioner.example.com;

	ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
	ssl_protocols TLSv1.2;

	location / {
		proxy_pass http://192.168.0.123:3000/; # ローカルの転送先
		auth_basic "login"; # Basic認証
		auth_basic_user_file /etc/nginx/.htpasswd;
	}
}

これでローカルで動いているアプリケーションサーバーへはhttps://airconditioner.example.com/で到達できるようになりました。

④IFTTT

Google AssistantからのWebリクエストの作成はIFTTTを使って手を抜きました。

「This」にはGoogle AssistantのSay a simple phraseを、「That」にはWebhooksのMake a web requestを用いました。

冷房をつける/暖房をつける/エアコンを消すの3つについてアプレットを作っていきますが、ここでは例として冷房をつけるアプレットを紹介します。

Say a simple phraseの設定は以下のとおりです。Googleアシスタントアプリに「冷房をつけて」と入力するかGoogle Homeに「OK Google, 冷房をつけて」と話しかけると「冷房をつけます」と反応し、Make a web requestに登録した動作を行います。

Make a web requestの設定は以下のとおりです(実際のものではなく例で置き換えています)。username:passwordはBasic認証のものです。

⑤Google Assistant

特にすることはありません。Google Homeから制御したときの様子はブログのあたまに載せたとおりです。以下のようにGoogleアシスタントアプリからも操作できます。

気になること

赤外線モジュールとRaspberry Pi(とwifiモジュール)がピカピカするから部屋を暗くしたときに結構気になる。