TTGo T-Display ディスプレーつきESP32開発ボードにESPHomeを導入し,Mi Flora BLEプラントモニタをモニタさせることができた(せっかくのディスプレーが使えないのは残念だが…)。次のステップは,得られたセンサー値をMQTTブローカに投げるようにすること。
道具立て
MQTTブローカ
“MQTTブローカ” はBeebotteの無料プランが,無料で使えるパブクックMQTTブローカとしてよい選択肢というのが骨子だった。しかし今回いざ使い始めてみると,Beebotteの利点と認識していたことがMQTTブローカとして使った際には必ずしも当たらないことがわかった。それでも,無料で使えるパブクックMQTTブローカとしてよい選択肢,という事実は変わらず,予定通り使うことに。
現時点でESPHomeからのSSL/TLSによる接続はESP8266でしかサポートされておらずESP32からは使えない。いずれサポートされるであろう。
BeebotteをMQTTブローカとして使えるようにするための手順は以下。
- アカウント作成。
- IAMトークンを取得。左のサイドバーの “Account Settings” を選び,右のタブペーンで “Access Management” タブを選ぶ(写真)。見ての通り細かくアクセス制御できるが,とりあえず大半のアクセス権を与える設定にする(写真はその変更前の様子)。
Beebotte(本体)は「チャネル」と「リソース」の2階層のみで,MQTTのトピック相当の情報管理をする。MQTTブローカとして使う際には,MQTTの多層のトピックが使える。
Beebotteでアカウントを作成すると,引き続きチャネルの作成を促されるが,MQTTブローカとしてのみ使うのであれば,チャネルもリソースも作成する必要はない。
このIAMトークンがMQTTクライアントのユーザネームとなる。パスワードはなし。ESPHomeがTLSに対応していないので,ブローカとしてはmqtt.beebotte.com,ポートはデフォルトのままの1883。
ESPHomeのMQTTクライアントコンポーネント
ESPHomeの設定ファイルで,MQTTクライアントのコンポーネントを使うようにする。これだけで,デフォルトで各種センサー値がMQTTブローカにpublishされるようになる。デフォルトのトピックのスキームは以下:
デバイス名/
センサ種類/
センサ名/state
Mi Flora一台目(設定でmiflora1
という名前を与えている)の温度計をアクセスするT-Displayにmifloramon
という名前を与えていれば以下:
mifloramon/sensor/miflora1_temperature/state
MQTTクライアント
- Windows: とりあえずはMQTT Explorer | An all-round MQTT client that provides a structured topic overview
- Android: いろいろ選択肢がある
Windows 10上で走らせたMQTT ExplorerからBeebotteのMQTTブローカに流れるメッセージを眺めると以下のような感じ。グラフが表示されるとそれっぽい。
さて,Windows上でMQTTブローカ上の値を見るときは,基本デバッグ目的だからMQTT Explorerで用が足りると思われる。一方Android端末からは,A. 同じくデバッグ目的にメッセージを直接見る, B. 数字をグラフィカルUIなどで直感的に見,場合によってはデバイスを操作するダッシュボード機能を提供する,の双方の役割を担うアプリが別途欲しい。
A. の目的には以下の3アプリを検討した:
- MQTT Snooper ー 唯一トピックのソーティングをサポートしている(図)。トリー表示には対応していない。他のアプリではメッセージは到達した時刻の逆順に表示するだけ。ただし,文字の配置の工夫不足で,老眼で文字を大きくしなくてはならない自分には見づらい。
- MyMQTT ー 実に見やすい(画面例)が,トピックのソーティング・トリー表示に対応していないのが残念。
- MQTT Client ー トピックのソーティング・トリー表示に対応していないし,メッセージ一覧もMyMQTTのそれに比べて単色,同サイズ・同フォントでの表示で特に見やすくない(画面例)。Taskerプラグインでもあるところが最大のウリ。
これらは主にデバッグ用に使うものなので,それはPC上のMQTT Explorerで用が足りて,実際にはあまり使わないのかも知れない。
B. の目的にはいわゆるダッシュボードアプリを使う。そのうちのMQTT Dash (IoT, Smart Home)で表示させたMi Flora3台の測定した土中水分度が右のスクリーンショット。Mi Flora専用のFlower Careアプリでは,3台の情報が別々に表示されるのだが,このダッシュボードでは3台の土中水分度が一覧できるので非常に有用。水やりが必要かすぐ判断できる。
ちなみに,ESP32の設定と実際のMi Floraが合致するかを確認するため,#2だと思っているMi Floraが刺さっている鉢,#1だと思っているMi Floraが刺さっている鉢,#3だと思っているMi Floraが刺さっている鉢,の順に水をやってみときの表示の変化。その順に数値が上がっているところを見ると,どうやら正しく推測できていたようだ。
MQTT Dashはグラフの表示はしてくれないので,IoT MQTT Panelで土中水分と気温の変化を示すグラフを作成してみた(下図)。履歴データを持っているわけではないので,アプリを起動中の間のみグラフがアップデートされて実用性に乏しい。
同様の機能を提供するLinear MQTT Dashboardアプリに関しては「サーバーモード」を指定することで常時バックグラウンド実行させてMQTTブローカにアクセスし続け,データを蓄積させることは可能ではあるが,その分電池消費が激しくなるであろう。そもそも妙にグラフの更新間隔が短くて伸ばしたいところだがそういった変更はできないようであるし,電池消費は抑えたい。
そもそも,現在想定している用途であればリアルタイムに更新される必要は必ずしもない。日常的に必要なのは現在の値のみ。過去を振り返って全体的傾向を分析したいのであれば,値の履歴が記録されていてそれが利用できなければならないし,逆に現在のリアルタイム値が使える必要はない。
履歴の保存はMQTTの守備範囲ではない。必要ならばMQTTの外でそれは実現しなくてはならないので,それに合わせてそういった過去のデータを元にしたグラフ化を考ええた方がよさそうだ。
IoT OnOffも同様なアプリだが今回試さなかった。スクリーンショットを見る限り洗練されている印象を受ける。
ところで,驚いたことにMQTT DashはJavaScriptで表示をさらにカスタマイズできるようだ(右図)。相当内部構造がわかってないとできないんだろうとは思うが…。Linear MQTT Dashboardも,MQTT DashほどではないがJavaScriptによる機能拡張ができそうだ。
Android端末上のダッシュボードについては,いずれはHome Assistantを導入してESPHomeと連携させるつもりをしているので,もしそうであればHome Assistantに接続するコンパニオンアプリを使用するのが結局賢明かも。
上に上げたようなMQTTダッシュボードアプリはMQTTのトピックの意味は全くわかっていない。なので自動でUIは生成できず,全て手動に頼ることになる。しかし,Home AssistantはESPHomeの設定ファイルから自動でデフォルトのUIを生成してくれて,必要なそれに少し手を入れるだけでよい。それがコンパニオンアプリにも自動で反映するようだから,手間はぐっと減るだろう。
ただし,LAN外でもHome Assistantのコンパニオンアプリが使えるためには,インターネットからHome Assistantのインスタンスにアクセスできるようにしなくてはならない。
通知の遅延
Mi HomeアプリではMi Floraのデータは刻々と更新されるが,MQTTブローカ上のデータが更新されるのはもっと間が開いていて,しかもその間隔がまばら。センサーによってはその値が更新されるのに最大数分かかることがある。Mi Floraに限れば一刻を争うデータではないので大した問題ではないが,今後対象領域を広げたときにそれでは問題になることもあるだろう。
しかも,1台のMi Floraで4つのセンサー値が得られる(湿度・気温・日照・養分)のだが,同じMi Floraのそれらの値のMQTTブローカ上での更新は,同じ時間内に同じ回数起こるわけでもない。この辺の理由ははっきりわかってない。Android端末に比べればT-Displayは明らかにBLE電波の掴みは弱いようなので,それが理由の可能性も確かにあるし,ESPHome内のBLE処理も関係している気がする。
さらに,照度の値がMi Home値に示される値とかなり違う。違う単位?他の3つの値は概ね合致している。
「ESP32搭載TTGo T-Displayからセンサー値をMQTTブローカに投げる」への6件のフィードバック