システム構成
自宅にある Nature Remo3 が室温および湿度を測定し、Natureのサーバーにアップロードしています。 また、Nature Remo E liteはWi-SUNの無線通信上でECHONET Liteプロトコルを使って電力事業者が設置しているスマートメーターにBルート経由でアクセスし、瞬時電力消費量と積算電力消費量を取得し、Natureのサーバーにアップロードしています。
Natureのサーバーはサードパーティのデバイスを接続するためのサービスとして、Nature Cloud APIによるアクセスを提供しており、本リポジトリで公開しているファームウェアはこのAPI経由で上記2つのデバイスがアップロードした情報を取得します。 また、取得した情報をもとにM5Paperに搭載されているEInkディスプレイに現在値および最大過去24時間分の変化をグラフ表示します。
ファームウェア構成
M5Paper上のファームウェアは、前述の通り、
- NatureサーバーにNature Cloud API経由でアクセスして情報を取得
- 取得した情報をEInkディスプレイに表示
の2つの処理を行います。
これらの処理は、いくつかのライブラリやフレームワークを用いて実装されています。
Rust
本ファームウェアは一部を除いて主要な処理はRustで記述しています。
ESP-IDF
ESP32の開発元であるEspressifが開発しているESP32向けのソフトウェア開発環境です。ESP32シリーズ向けのファームウェアをC言語およびC++言語にて開発するための各種ライブラリおよびツールチェインを提供します。 また、後述する esp-idf-sys などを組み合わせることにより、Rustによるファームウェア開発も可能です。
esp-idf-sys
主にEspressifにより開発されている、ESP-IDFの機能をRustから使うためのクレート (Rustのライブラリ) です。 ESP-IDFのAPIをRustから呼び出すためのcffiによるバインディングが含まれています。
また、ESP32向けのRust環境は、ESP-IDFと合わせてビルドされることが前提となっており、そのためにESP-IDFのビルドシステムを呼び出して最終的なファームウェアのバイナリを生成する機能も esp-idf-sys
により提供されます。
ESP32 std
Rustのツールチェインはプラットフォーム依存部分をstdクレートとして各種プラットフォーム向けに用意しています。ESP32 stdはESP-IDF環境向けのstdクレートで、ESP32向けのRustツールチェインに含まれています。
esp-idf-svc
esp-idf-sysが提供するESP-IDFのバインディングはESP-IDFのAPIをRustから呼び出せるようにするだけのものなので、Rustから呼び出すのは安全ではありません。 esp-idf-svcはこれらの機能をRustから安全に呼び出せるようにするためのラッパーを提供します。
esp-idf-svcの機能により、ESP32の無線通信機能などをRustから簡単に使えるようになります。
LovyanGFX
高性能な組込み向けの表示デバイスドライバ、および描画機能を提供するライブラリです。M5Paperに搭載されているEInkディスプレイ EPD_ED047TC1 の制御に使います。 C++で実装されており、ESP-IDF上で動作します。
lgfx-rs
LovyanGFXをRustから呼び出すためのバインディングおよびラッパーを提供します。現在のところ本ファームウェアで必要となる程度のLovyanGFXの機能に対するラッパーのみ提供しています。
fuga-remo-api
RustでNature Cloud APIからのレスポンスを処理するためのパーサー。
fuga-json-seq-parser
ESP32のような使用可能なRAMの量に制限のあるデバイス上で、比較的サイズの大きいJSONをパースするためのクレート。fuga-remo-apiの実装につかっています。
ファームウェアの処理
ファームウェアの処理は主に2つのタスクに分かれています。
Nature Cloud API通信処理
Nature Cloud API経由で情報を取得します。 HTTPSにてサーバーに接続し、返ってきたレスポンスを前述の fuga-remo-api を用いて解析し、対象となるセンサー情報や電力消費量の情報を抽出します。
抽出した情報はキュー経由でディスプレイ表示処理に送られます。
Cloud APIの通信処理に関しては、 こちらのブログ記事 にも記載しています。
ディスプレイ表示処理
前述のCloud API通信処理から送られてきた情報をもとに、 lgfx-rsからLovyanGFXのディスプレイ・ドライバを呼び出して、現在の室温・気温・瞬時電力の値および時系列のグラフを描画します。