Eve for HomeKitというiPhoneアプリは、Apple純正のホーム.appに相当するアプリで、HomeKitアクセサリを操作します。純正アプリの機能に加えて、温度センサーなどの履歴をグラフ表示する機能があります。グラフ化はEve社製品限定の機能ですが、Mqttthingプラグインを使うと、MQTTデバイスの履歴もグラフ表示できます。
HomeKitには履歴表示機能が無い
Home AssistantにはHistory Graph cardという機能があり、下図の例のように、室温などの履歴をグラフ表示できます。
でもApple HomeKitにはグラフ化機能はありません。Appleが提供するホーム.appには、アクセサリの過去履歴をグラフ表示する機能はもちろん、履歴を数値で閲覧する機能すらありません。アプリだけでなく、プロトコル (HAP: HomeKit Accessory Protocol) にも履歴に関する機能は定義されていません。
ここから先は個人の想像ですが、Appleはあえて履歴機能を除外しているように思います。思うに、家をスマートにする歴史には2つの波があって、1990年代は賢くエネルギー消費するシステムを目指してましたが、ここ10年の波では、ユーザ体験 (UX)の 向上を目指しています。名前も、前世紀はスマートハウスと呼ばれていたものが、現在はスマートホームです。技術的側面が強調された時代から、日常のUXが重視される時代になったのだと思います。それでAppleも「住環境の履歴とか記録とか分析などのしちめんどうくさい事をユーザは望んでいない」と判断して、履歴機能を除外したのでしょう。
このように自分に言い聞かせて、Home Assistantのグラフ機能が羨ましいと思う気持ちを抑えていたのですが・・・
Mqttthingの謎項目
あるときMqttthingの説明に、気になる設定項目を発見しました。
ちなみにMqttthingとはHomeridgeプラグインの一つで、MQTTブローカと通信するApple HomeKitアクセサリを作ります。これを使用すると、例えばESP32で作成したMQTT通信デバイスを、HomeKitアクセサリとして機能させることができます。
このMqttthingの、例えば温度センサーの設定を見ると以下の説明があります。ここにhistoryという項目があります。
{
"accessory": "mqttthing",
"type": "temperatureSensor",
"name": "<センサの名前>",
"topics":
{
"getCurrentTemperature": "<温度センサ値のトピック>"
},
"history": "<Eveアプリの履歴サービスを有効化する場合はtrue>"
}
これによると、historyの値をtrueにすると「Eveアプリの履歴サービス」というものを利用できるようになるらしいです。そこでまずはこのEveアプリを調べました。
Eve for HomeKitアプリを起動
検索したら、Eve for HomeKitという無料のiPhoneアプリが見つかりました。
Eve Systems GmbHという会社(GmbHはドイツで有限会社の意味とのことです)が作っているアプリで、HomeKitアクセサリを操作する機能があるようです。Apple純正のホーム.appに相当するアプリです。EveはHomeKit対応のデバイスを製造販売しているので、そのサポートのためにこのアプリを配布しているようです。
早速iPhoneにダウンロードして使ってみよう・・・と思ったらすでにインストールされていました。大昔に買ったEveの温度・湿度センサを1年くらい前に発掘した時に、このアプリをインストールしてました(ちなみに温度センサは古すぎるのか使えませんでした)。
Eveのグラフ表示はEve専用
Eve for HomeKitを起動して使ってみたところ、普通によくできたスマートホームアプリでした。HomeKitプロトコルをそのまま使っているので、起動しただけで、Appleのホーム.appと同じ家・部屋・デバイスがそのまま表示されます。ホーム.appの代わりにこのまま常用できそうです。ただ、アクセサリの履歴をグラフ表示する機能は見当たりません。
検索してみたところ、こういうことでした。Eve社は、HAPを独自に拡張して、history機能を実現するキャラクタリスティックを追加したそうです。この機能を実装したEva社のアクセサリは、自分の状態の履歴を保持していて、開示リクエストがあるとそれを返送する機能があるそうです。なので、Eve社の温度センサなどのアクセサリを使うと、Eve for HomeKitの画面から履歴のグラフ表示が可能になるとのことでした。手元には、動作するEveアクセサリが1個も無いため、グラフ表示機能が表示されないわけです。
Mqttthingで履歴を有効化する
Eveが独自拡張した履歴機能を実現するのが、Mqttthingのhistoryオプションでした。これをtrueに設定すると、Mqttthingプラグインが独自に履歴を保存して、Eve for HomeKitの要求に従って履歴開示するという流れのようです。Eveが拡張した履歴機能は公開されていないので、多くの人達がハッキングして解明したようです。素晴らしいです。
DHT20湿度計をグラフ化する
ということで、Mqttthingのhistory機能を使って、まずは湿度の変化をグラフ化します。こちらの記事で、ESP32でDIYしたスマートリモコンに、温度・湿度センサDHT20を組み込みました。
ESP32にI2C接続の温度・湿度センサが取り付けてあります。この測定結果が、MQTTメッセージで流されています。
温度センサの値は、Heater Cooler Accessoryに表示されますが、湿度センサの値は表示されませんでした。もったいないので、Mqttthingを使って個別の湿度センサとして表示するよう設定していました。この結果、ホーム.appには以下のように表示されます。
この湿度センサのMqttthing設定に、historyの1行を追加します。topicsの指定の中の$マークの部分は、JSON表記を示してます。後で具体例で説明します。
{
"type": "humiditySensor",
"name": "DHT20_humi",
"topics": {
"getCurrentRelativeHumidity": "mqttthing/irOffice/get$.humidity"
},
"history": "true",
"accessory": "mqttthing"
}
これでEveアプリの湿度センサの項目の右端に、三角マークが表示されるようになります。
これをタップすると、項目の下にグラフが現れます!3日くらい経って、履歴が集積された後のグラフを下に示します。
DHT20温度計をグラフ化する
湿度は変化が少なくて地味でした。なので次は室温データをグラフ化します。Heater coolerアクセサリ(これもMqttthingで作りました)には、室温を表示する機能があり、それを使ったので、Mqttthingで温度計は作りませんでした。Mqttthingのheater coolerアクセサリに室温履歴機能があれば良いのですが、無いようです。それで、heater coolerアクセサリが受け取る室温MQTT情報を傍受して、新たに温度計を作りました。その定義の中で、historyをtrueにしました。
{
"type": "temperatureSensor",
"name": "DHT20_temp",
"topics": {
"getCurrentTemperature": "mqttthing/irOffice/get$.temperature"
},
"history": "true",
"accessory": "mqttthing"
}
これでEveアプリに温度センサが現れ、履歴グラフが表示されました。ちなみに、Airconとあるのがheater coolerアクセサリとして表示している温度です。どちらも同じセンサからの値なので、全く同じ温度を示してます。
Tuya温度計をグラフ化する
こちらで紹介したTuyaのZigbee温度センサもグラフ化します。
こちらは、Zigbee2MQTTを使ってますが、MQTTをmosquitto_subコマンドを使ってモニターすれば、トピックやメッセージの内容がわかります。このTuyaのセンサでは、
zigbee2mqtt/0xa499999999999999
というトピックに、以下のようなメッセージが流れていました。
{"battery":100,"humidity":46.57,"linkquality":120,"temperature":18.67,"voltage":3000}
Mqttthingでは、トピックの指定に、メッセージ中のJSON表記の項目を含めることができます。入れ子になっているJSON表記にも対応可能です。例えば、上記のようなメッセージを出すTuya温度湿度計 + Zigbee2MQTTの構成ならば、以下のようにして、Mqttthingで温度計を実装できます。
{
"type": "temperatureSensor",
"name": "Tuya_temp",
"topics": {
"getCurrentTemperature": "0xa499999999999999$.temperature"
},
"history": "true",
"accessory": "mqttthing"
}
これでZigbee温度センサーがTuya tempという名前でEveアプリに表示されて、履歴グラフも表示されるようになりました。グラフ表示の三角マークの無いBedsideという名前のセンサがZigbee2MQTTが表示しているセンサーです。どちらも同じセンサーなので、温度も同じです。
こちらで解説しましたように、
Zigbee2MQTTとMqttthingはどちらもMQTTメッセージを元にHomeKitアクセサリを表示しています。Zigbee2MQTTでこのセンサを表示しないように設定すれば、温度センサの重複表示は解消されます。
グラフの詳細表示
温度表示の右下の「 i 」のアイコンをクリックすると、グラフを拡大できます。表示期間も変更できます。
週単位、月単位などの指定もできますし、前日と比較をしたり、生の測定値を閲覧したり表計算データに出力することもできます。
スイッチをグラフ化する
湿度・温度以外でも履歴がサポートされています。例えばswitchアクセサリの記述にhistory:trueを追加すると、スイッチのon/offの履歴をグラフで見ることができます。Macをon/offするスイッチをESP32でDIYし、Mqttthingでアクセサリにしているのですが、その履歴をグラフで示した様子です。
まとめ
HomebridgeのMqttthingプラグインには、アクセサリの履歴機能がサポートされています。これをonにしたところ、EvaのHomeKitスマホアプリでグラフ表示が可能になりました。Zigbee2MQTTで使用できるZigbeeデバイスも、Mqttthingで設定すればグラフ化できます。
コメント
初めまして。
いつも参考にさせていただいております。
TuyaのZigbee温度センサをZigbee2MQTTで運用しています。
今回、Mqttthingで温度のグラフ表示をさせようと、
Homebridgeのconfig設定を行ったのですが、0℃表示になってしまい反応しません。
Zigbee2MQTTでは正しく表示されているのですが。。。
原因がわかりますでしょうか。
{
“type”: “temperatureSensor”,
“name”: “abcdefg”,
“topics”: {
“getCurrentTemperature”:
{
“topic”: “zigbee2mqtt/0xa499999999999999”,
“apply”: “return parseFloat(JSON.parse(message).temperature);”
}},
“history”: “true”,
“accessory”: “mqttthing”
}
JSONをparseする指定がうまく働いていないのかもしれないですね。実際のMQTTのトピックとメッセージは、
というような内容でしょうか?だとしたら、
の指定でokだと思います。
多分、昔のMqttthingではJSONクラスを呼び出してJSONのパーズする仕様だったのが、最近のバージョンでは機能拡張されて、topicの指定の中にJSON表記も取り入れられるようになったのだと思います。JSONクラスは使ったことが無いので不具合の見当がつかないですが、上記の表記の方が簡単です(入れ子の表記も簡単)ので試されてはどうでしょうか。
JSONをparseする指定がうまくいっていなかったようで、
教えていただきました内容で設定し直しました。
また、理由は不明ですがセンサー本体をリセットして、
Zigbee2MQTTに接続し直す必要がありました。
温度、湿度をグラフにできると、住環境の向上意欲が湧いてきますね!
ありがとうございました。