iOS 10ではHomebridgeプラグインを作ってもHeaterCoolerサービスをHomeアプリが認識できず操作できなかったのですが、iOS 11にアップデートしたところ認識されるようになっていたので、早速プラグインを書いて見ました。
ちなみにダイキン純正アプリでは室外機のセンサで取得した屋外の気温も表示でき、これが意外と便利なのでこれも表示できるようにしたいと思います。
お約束ですが、メーカーが保証しない方法でエアコンの操作を行うためご利用の際は自己責任でお願いいたします。ここに記載された情報を試してみてエアコンが火を噴いたり白熊しか住めないような部屋になってしまったりしても一切責任は取れません。
プロトコル
我が家ではAN80TRPにBRP072A41を接続して利用しているのですが、これの通信プロトコルは公開されていません。どうせHTTPだろうということで、mitmproxyで覗き見してみます。
mitmproxyを立ち上げてプロキシの設定をし、純正アプリを起動してみます。
はい、バッチリ取れました。
リクエストはすべてGETで行われているようで、レスポンスはキーと値を=で繋いだコンマ区切りです。
パス | 内容 |
---|---|
/common/basic_info | 基本的な情報。IDやパスワードまで返ってくる(!)ので取扱注意。 |
/aircon/get_sensor_info | センサの情報。気温とか湿度とか。 |
/aircon/get_control_info | 設定情報。運転モードとか。 |
/aircon/set_control_info | 設定情報の変更 |
/common/get_datetime | 現在日時。 |
/aircon/get_scdltimer_body?target=c | タイマーの情報?詳しくみてないので分かりません。 |
だいたいこんな感じです。キーは「pow」や「htemp」といったように省略形で表現されています。
とりあえず状態表示はget_sensor_infoとget_control_infoを使えばいけそうです。
それでは実装
値の取得については上記の通りなので、エアコンの状態を変更してはリクエストを投げて値の変化を確認、という地味な作業を繰り返せば簡単に実装できました。
問題はset_control_infoでの状態の変更、電源のオンオフなどですがパラメーターが省略形なのでいまいち分かりません。特にdt1〜7、dh1〜7などは見当すらつかないので何を設定すればいいのか分かりません。
ただ、パラメーターはほぼget_control_infoと同じようなので、取得した値の,を&に置換してpowの値だけ変えてクエリ文字列として投げてみたところバッチリ電源状態が変更できたので、今回はこのまま手抜き実装で行くことにしました。
今回はエアコンなのでHeaterCoolerサービスを実装します。このサービスは以下のCharacteristicを必須としています。
- Active
- CurrentHeaterCoolerState
- TargetHeaterCoolerState
- CurrentTemperature
それから、オプションですが冷暖房の設定温度も取得できた方が便利なので以下も実装しました。
- CoolingThresholdTemperature
- HeatingThresholdTemperature
あとは、湿度も5%刻みで取得できるのでHumiditySensorサービスも追加します。湿度の設定までする場合はHumidifierDehumidifierサービスの方が良さそうですが、なんか色々面倒臭そうなのと設定まではいらねーなと思ったので今回は値の取得のみでいきます。
温度センサー
ところで、冒頭にも書いた通りこのエアコンでは室外機のセンサー温度も取得できます。HeaterCoolerサービスでは1つの温度しか取得できませんが、TemperatureSensorサービスも追加すれば温度表示を増やせます。
…なのですが、アクセサリは1つの部屋に属するため、同じアクセサリとして実装すると、「LDK 27℃。LDK 23℃。」みたいな何を言ってるのか分からない表示になってしまうので、別々のアクセサリとして実装した方が良いです。
というわけで成果物
- 室内機用:https://github.com/haneco/homebridge-daikin-aircon
- 室外機用:https://github.com/haneco/homebridge-daikin-aircon-outdoor
npmモジュールも公開したので、興味のある方はどうぞ。