ESPHomeで OTA safe mode への強制移行

M5Stack Gray で esp32_ble_tracker で、Bluetooth Low Energy (BLE)のadvertise をscan して得られた アドレスと名前をとりあえず表示する YAML を作成してみたが、esp32_ble_tracker: を含めると Setting WiFi mode failed! となり WiFi が使えなくなる。

その場合でも esp32_ble_tracker 自体は動作しているため、電源ボタンでリセットしても、WiFiで書き込みができる Over-The-Air (OTA) safe mode に移行することはなく、同じことになり、OTAでの書き込みができなくなる。WiFiが使えない状態なので、WiFi経由でOTA safe mode に移行させることもできない。

OTAでのアップデートができないのは不便なので、M5Stack Gray の右ボタン(Button C)を押したら、強制的に OTA safe mode に移行するYAML設定ファイルを作成してみた。プログラムから強制的に OTA safe mode でリブートするための関数を調べるのに手間取ったので、備忘録として残しておく。

YAML設定ファイル

プログラムの動作

BLE scan

正しくWiFiが動作しないので意味がないが、上記の設定ファイルでは、左ボタン(Button A)を押すと esp32_ble_tracker.start_scan によってBLE の scan を開始し、右ボタン (Button B)を押すと esp32_ble_tracker.stop_scan によって scan を停止する。

次のコードで BLEの advertise を受信したら、 ble_data_map に addressとnameを蓄積する。

ble_data_map は std::map<std::string, std::string> 型のグローバル変数である。

ディスプレイへの表示は、display: の lambda で ble_data_map から要素を順に取り出してaddr と name を表示する。

OTA safe mode

先述のように Button C を押すと次のコードで OTA safe mode になるようにreboot する。set_safe_mode_pending(true)で次のブートでsafe mode になるよう設定する。App.safe_reboot()は、safe mode にすべきかのフラグに応じて、safe mode もしくは通常モードでリブートする。

このコードを使う場合には、 ota: で id を定義する必要がある。

上記コードの部分が実行された際に、USB シリアル経由でログをとると、次のように Over-The-Air で待ちに入ることがわかる。