ファームウェア開始¶
プロジェクトのひな型はキャビネットサンプルの章と全く同じです: PlatformIO、lib/内のidryer-core、同じplatformio.ini(環境名をfilterに変えるだけ)。ここでは異なる部分だけを説明します。
この章の完成プロジェクトは、教材リポジトリのexample/10-filterです: platformio.iniと、以降で分割して解説するコード一式はそこから取得します。コアライブラリはidryer-coreです。
ポートへのログ出力: 2つのビルドフラグ
ESP32-C3ではSerialの出力が既定でUART0のピンに出て、ボードのUSBポートには出ません — Serial Monitorは空のままです。ログを見るには、build_flagsに2行必要です:
ESP-IDF自身のメッセージ(mDNSのエラーなど)はこれらがなくてもUSBに出ます。そのため「何かは表示されるのに自分の行だけ出ない」のは、まさにこのフラグが足りない兆候です。
Config: 非標準型デバイス¶
フィルターには、ヒーターもエコシステム辞書のクライメートセンサーもありません。辞書スキルの中でこのデバイスが持つのはファンだけです。src/main.cpp内:
#include <iDryer.h>
static const iDryer::Config CFG = {
.deviceType = iDryer::DeviceType::Unknown, // 非標準デバイス
.unitsCount = 1,
// 周辺機器: エコシステム辞書から「ファン」だけあります。
.hasFan = true,
// 自動公開期間:
.telemetryPeriodMs = 5000,
.statusPeriodMs = 10000,
// ポータル上の識別:
.hardwareVersion = "1.0",
.firmwareVersion = "0.1.0",
.model = "DIY Air Filter",
};
static iDryer::Link s_link(CFG);
void setup() {
Serial.begin(115200);
s_link.begin();
// ポータルで紐付けが解除された:シークレットを消去し、新しいペアリングを待つ
s_link.onCommand("revoke", [](JsonObjectConst) { s_link.handleRevoke(); });
}
void loop() {
s_link.loop();
}
DeviceType::Unknown — これで問題ありません
Unknown型は「ポータルがこのデバイス種別を知らない」という意味です。以前はこれが問題でした: 未知の型にはポータル側にカードがありませんでした。現在はこれが正規の手順です: デバイスのインターフェースはcard manifestが完全に記述し(第6章)、ポータルはそれに基づいてカードを構築します。型(deviceType)が必要なのは、専用カードを持つiDryer純正デバイスだけです。
hasFan = trueフラグを設定するだけで、テレメトリのfanStatusフィールド、カード上の「ファン」セル、マニフェスト内のエンティティがすべて自動的に追加されます — エコシステム辞書の機能です。
VOCセンサーはConfigにない — それで正しい¶
注意してください: Configには「hasVoc」というフラグはありません。has*辞書はエコシステムが知っている周辺機器を記述するものです。独自センサーは辞書経由ではなく、2つの別のメカニズムで追加します: テレメトリに独自フィールドを書き込み、card manifestで宣言する — 次の2章がその内容です。これがこのアプローチの本質です: 新しいデバイスごとに辞書を拡張する必要はありません。
初回起動と登録¶
手順はキャビネットと同じです:
- ボードに書き込み、シリアルモニターを開きます。デバイスにWi-Fiがない間、ログは出ません。
- iDryerアプリで:新しいデバイスを接続 → Wi-Fi**ステップ(ネットワークとパスワード、**デバイスを接続)→ ペアリング**ステップ → **ペアリング。
- **ペアリングが完了しました**の後、デバイスはあなたのアカウントに紐付けられ、ポータルで
Onlineになります。ログにはMQTT: Connected!が表示されます。
詳細、起こりうるエラー、再ペアリングについてはキャビネットの例の章を参照してください。
ポータル上のデバイス: 名前、Idle状態、通信アイコン。グラフは空でメニューも届いていません — デバイスがそれらについて何も宣言していないためです。
ポータルにデバイスが表示されますが、カードはまだほぼ空です — データがないためです。センサーの接続に進みましょう。