HomeKitアクセサリの履歴をグラフ表示する

HomeKitを使う

Eve for HomeKitというiPhoneアプリは、Apple純正のホーム.appに相当するアプリで、HomeKitアクセサリを操作します。純正アプリの機能に加えて、温度センサーなどの履歴をグラフ表示する機能があります。グラフ化はEve社製品限定の機能ですが、Mqttthingプラグインを使うと、MQTTデバイスの履歴もグラフ表示できます。

HomeKitには履歴表示機能が無い

Home AssistantにはHistory Graph cardという機能があり、下図の例のように、室温などの履歴をグラフ表示できます。

https://www.home-assistant.io/ から引用

でも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 for Matter & HomeKit
‎Eve works with all Matter- and HomeKit-enabled devices. See your home at a glance. Customize your ecosystem down to the...

Eve for HomeKit アプリのアイコン

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を組み込みました。

エアコンリモコンのHomeKitアクセサリをDIYする (後編:温度センサ他)
エアコンリモコンに相当するアクセサリを作る最終回です。今回のターゲットはパナソニックのエアコンですが、他のメーカーでも同様に作れます。下図のように、(右から)HomeKitに接続したHomebridgeサーバから、MQTT経由でコマンドを出...

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が表示しているセンサーです。どちらも同じセンサーなので、温度も同じです。

こちらで解説しましたように、

MqttthingとZigbee2MQTTプラグインを使い分ける
Homebridgeのプラグインは多数用意されていますが、手元の環境で一番活躍しているのは、 Homebridge MQTT-Thing (以下mqttthingプラグイン) と Homebridge Zigbee2MQTT (以下z2mプ...

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で設定すればグラフ化できます。

コメント

  1. とも より:

    初めまして。
    いつも参考にさせていただいております。
    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”
    }

  2. diysmartmatter より:

    JSONをparseする指定がうまく働いていないのかもしれないですね。実際のMQTTのトピックとメッセージは、

    zigbee2mqtt/0xa499999999999999 
    
    {"temperature":23.45,(略)}

    というような内容でしょうか?だとしたら、

    "getCurrentTemperature": "zigbee2mqtt/0xa499999999999999$.temperature"

    の指定でokだと思います。

    多分、昔のMqttthingではJSONクラスを呼び出してJSONのパーズする仕様だったのが、最近のバージョンでは機能拡張されて、topicの指定の中にJSON表記も取り入れられるようになったのだと思います。JSONクラスは使ったことが無いので不具合の見当がつかないですが、上記の表記の方が簡単です(入れ子の表記も簡単)ので試されてはどうでしょうか。

  3. とも より:

    JSONをparseする指定がうまくいっていなかったようで、
    教えていただきました内容で設定し直しました。
    また、理由は不明ですがセンサー本体をリセットして、
    Zigbee2MQTTに接続し直す必要がありました。
    温度、湿度をグラフにできると、住環境の向上意欲が湧いてきますね!
    ありがとうございました。

タイトルとURLをコピーしました