寒く(暑く)なったらエアコンの暖房(冷房)を入れるという自動化をしたいと思いました。このためには、HomeKit対応の温度センサーが必要なので、エアコン用自作赤外線リモコンの温度センサを流用することにしました。そこで、Homebridge設定ファイルに6行追記して、MQTTメッセージを取り込むことにしました。このほかにハードウェア・ソフトウェアの追加・変更はありません。
寒くなったらエアコンをOnにする
今は冬なので、エアコンを暖房に使ってます。そこで、「寝ている時に寒くなったらエアコンをOnにする」オートメーションを設定しようとしました。簡単かと思ったら、すぐには作れませんでした。
使用しているエアコンは、こちらで紹介した古いNationalエアコンです。それを、ESP32でDIYした赤外線リモコンデバイスでコントロールしてます。
iPhoneやMacのホーム.appには、以下のようにエアコンのタイルが表示されてます。
ここで19.5度という表示は、現在の室温です。DIYしたエアコンリモコンは、HomeKitのheaterCoolerアクセサリとして実装しています。このアクセサリには、現在温度を取得する温度センサー(DHT20)がついていて、その温度が表示されているわけです。
画面をよく見ると、上方にも「温度センサ」のアイコンがあり、そこにも19.5度と表示されています。これもこのheaterCoolerアクセサリのセンサ値です。
なので、上の赤丸の部分のどちらをクリックしても、同じエアコンの操作パネルが表示されます。
HomeKitでは、温度センサを使って、温度設定に従ったオートメーションを作ることができます。でも、heaterCoolerアクセサリの温度センセは、オートメーションに組み込めないようです。選択肢に現れません。なお、エアコンがOn/Offになったら実行するオートメーションなら組めます。
なので、「部屋が寒くなったらエアコンをOnにする」というオートメーションを設定するためには、この部屋に、温度センサーアクセサリを追加する必要があります。でもESP32の基板には温度センサーが搭載されているので、これを活用したいと考えました。
ESP32基板搭載の温度湿度センサー
以前の記事で紹介したように、この赤外線リモコン基板には、温度湿度センサーDHT20が搭載されています。赤丸の部分の黒い部品です。
ESP32に組み込んだプログラムでは、
- 10秒ごとにDHT20のデータを読み、
- 値が変化していたらMQTTに新しい気温・湿度の値をパブリッシュし、
- また変化がなくても、5分に1回は最新の気温・湿度の値をパブリッシュしています。
なので、たとえばmosquito_subコマンドを使って、該当するトピックスのMQTTメッセージをサブスクライブすると、以下のように、温度と湿度の値がjson形式で得られます。
$ mosquitto_sub -t mqttthing/irNational/get -v
mqttthing/irNational/get {"temperature":19.5,"humidity":50}
mqttthing/irNational/get {"temperature":19.6,"humidity":50}
mqttthing/irNational/get {"temperature":19.5,"humidity":50}
mqttthing/irNational/get {"temperature":19.6,"humidity":50}
mqttthing/irNational/get {"temperature":19.5,"humidity":50}
パブリッシュされた温度センサー値は、Homebridgeが取得して、エアコンタイルの現在温度として表示しています。
これを行うために、HomebridgeのMQTTThingのエアコン設定に、
{
"type": "heaterCooler",
"name": "NationalAC",
"topics": {
"setActive": "mqttthing/irNational/set/Active",
"getActive": "mqttthing/irNational/get/Active",
"setCoolingThresholdTemperature": "mqttthing/irNational/set/CoolingThresholdTemperature",
"getCurrentTemperature": "mqttthing/irNational/get$.temperature",
"setHeatingThresholdTemperature": "mqttthing/irNational/set/HeatingThresholdTemperature",
"setRotationSpeed": "mqttthing/irNational/set/RotationSpeed",
"setTargetHeaterCoolerState": "mqttthing/irNational/set/TargetHeaterCoolerState",
"setSwingMode": "mqttthing/irNational/set/SwingMode"
},
"accessory": "mqttthing"
},
のように書いてます。ハイライトしたgetCurrentTemperatureの行が、現在温度を取得するトピックとjsonの項目の指定です。$.temperatureは、json形式のtemperatureの項目を指定するMQTTThing独特の表記法です。
温度センサを増設
そこで、HomebridgeのMQTTThingの設定に、以下の項目を追加しました。これは、前述のMQTTメッセージで得られる温度情報を使用した、温度センサーアクセサリの定義です。
{
"type": "temperatureSensor",
"name": "NationalTemp",
"topics": {
"getCurrentTemperature": "mqttthing/irNational/get$.temperature"
},
"accessory": "mqttthing",
},
この結果、ホーム.appに、新しい温度センサー、NationalTempが現れました。実態は、その左隣にあるNationalACエアコンの温度センサーと同じものです。
でも新設したアクセサリは、通常の温度センサーなので、温度をトリガーとしたオートメーションの設定が可能です。これで、たとえば室温が19.5度未満になったらエアコンをOnにするオートメーションが作れました。
ハードの追加も、ソフトの書き換えもなく、温度センサーが増やせて、お得な感じです。
湿度センサも追加
DHT20は、温度と同時に湿度も取得してます。ESP32のプログラムでは、これもMQTTメッセージとして流しています。なので、同様に湿度センサも作れます。Homebridgeの設定ファイルに、以下のように追加します。
{
"type": "humiditySensor",
"name": "NationalHumi",
"topics": {
"getCurrentRelativeHumidity": "mqttthing/irNational/get$.humidity"
},
"accessory": "mqttthing",
},
この結果、ホーム.appに、新しい温度センサー、NationalHumiが現れました。これも、オートメーションとして使えます。
まとめ
エアコン用に作った自作赤外リモコンの温度センサを利用して、温度センサーアクセサリの設定を行いました。これで温度をトリガーとしたHomeKitオートメーションが作れました。
heaterCoolerアクセサリの温度センサーが、オートメーションとして使えない仕様は、少し謎です。今回のような「寒く(暑く)なったらエアコンの暖房(冷房)を入れる」自動化は、heaterCoolerアクセサリが快適に動作していたら不要なので、オートメーション対象から外されているのかもしれません。ただ、温度をトリガーとしたオートメーションは、他にも使える可能性があると思いますので、もしかしたら将来のHomeKitでは、オートメーション可能になるかもしれません。
コメント