feat: add SD-backed stats archive and dedicated /stats web console

Этот коммит содержится в:
Jared Dohrman
2026-04-15 17:12:32 +10:00
родитель a1aa318352
Коммит f67aaebe7e
27 изменённых файлов: 3862 добавлений и 588 удалений
+49 -42
Просмотреть файл
@@ -16,6 +16,7 @@ The tables below are built from the repo's PlatformIO board metadata and variant
- `RAM` is the MCU's built-in RAM.
- `PSRAM` is extra memory on some boards. More PSRAM usually means more headroom for UI, MQTT, and future features.
- `GPS` uses `✅` when present and is blank when absent.
- `SD` uses `✅` when the board is currently known to support the SD-backed archive path in EastMesh, `🧪` when the hardware likely supports TF/microSD but the board-specific integration still needs validation, and is blank when there is no current SD/archive support note.
## Start Here
@@ -85,51 +86,57 @@ If you are deciding between otherwise similar boards, these target-level setting
This table includes all repeater MQTT targets currently defined in `variants/eastmesh_mqtt/platformio.ini`.
| Target | MCU | RAM | PSRAM | Flash | LoRa | Display | GPS |
| ------------------------ | ------- | ------ | ----- | ----- | ------ | --------------- | --- |
| Ebyte_EoRa-S3 | ESP32S3 | 512 KB | 2 MB | 4 MB | SX1262 | OLED (SSD1306) | |
| Generic_E22_sx1262 | ESP32 | 520 KB | No | 4 MB | SX1262 | None | |
| Generic_E22_sx1268 | ESP32 | 520 KB | No | 4 MB | SX1268 | None | |
| Heltec_ct62 | ESP32C3 | 400 KB | No | 4 MB | SX1262 | None | |
| Heltec_E213 | ESP32S3 | 512 KB | 8 MB | 16 MB | SX1262 | E-paper (2.13") | |
| Heltec_E290 | ESP32S3 | 512 KB | 8 MB | 16 MB | SX1262 | E-paper (2.9") | |
| Heltec_T190 | ESP32S3 | 512 KB | 8 MB | 16 MB | SX1262 | TFT (ST7789) | |
| heltec_tracker_v2 | ESP32S3 | 512 KB | No | 8 MB | SX1262 | TFT (ST7735) | ✅ |
| Heltec_v2 | ESP32 | 520 KB | No | 8 MB | SX1276 | OLED (SSD1306) | |
| Heltec_v3 | ESP32S3 | 512 KB | No | 8 MB | SX1262 | OLED (SSD1306) | ✅ |
| heltec_v4 | ESP32S3 | 512 KB | 2 MB | 16 MB | SX1262 | OLED (SSD1306) | ✅ |
| heltec_v4_tft | ESP32S3 | 512 KB | 2 MB | 16 MB | SX1262 | TFT (ST7789) | ✅ |
| Heltec_Wireless_Paper | ESP32S3 | 512 KB | No | 8 MB | SX1262 | E-paper (2.13") | |
| Heltec_Wireless_Tracker | ESP32S3 | 512 KB | No | 8 MB | SX1262 | TFT (ST7735) | ✅ |
| Heltec_WSL3 | ESP32S3 | 512 KB | No | 8 MB | SX1262 | None | ✅ |
| LilyGo_T3S3_sx1262 | ESP32S3 | 512 KB | 2 MB | 4 MB | SX1262 | OLED (SSD1306) | |
| LilyGo_T3S3_sx1276 | ESP32S3 | 512 KB | 2 MB | 4 MB | SX1276 | OLED (SSD1306) | |
| LilyGo_TBeam_1W | ESP32S3 | 512 KB | 8 MB | 16 MB | SX1262 | OLED (SH1106) | ✅ |
| LilyGo_TDeck | ESP32S3 | 512 KB | No | 16 MB | SX1262 | TFT (ST7789) | ✅ |
| LilyGo_Tlora_C6 | ESP32C6 | 512 KB | No | 4 MB | SX1262 | None | |
| LilyGo_TLora_V2_1_1_6 | ESP32 | 520 KB | No | 4 MB | SX1276 | OLED (SSD1306) | ✅ |
| M5Stack_Unit_C6L | ESP32C6 | 512 KB | No | 4 MB | SX1262 | None | ✅ |
| Meshadventurer_sx1262 | ESP32 | 520 KB | No | 4 MB | SX1262 | OLED (SSD1306) | ✅ |
| Meshadventurer_sx1268 | ESP32 | 520 KB | No | 4 MB | SX1268 | OLED (SSD1306) | ✅ |
| Meshimi | ESP32C6 | 512 KB | No | 4 MB | SX1262 | None | |
| nibble_screen_connect | ESP32S3 | 512 KB | No | 4 MB | SX1262 | OLED (SSD1306) | |
| RAK_3112 | ESP32S3 | 512 KB | No | 8 MB | SX1262 | None | ✅ |
| Station_G2 | ESP32S3 | 512 KB | 8 MB | 16 MB | SX1262 | OLED (SH1106) | ✅ |
| Station_G2_logging | ESP32S3 | 512 KB | 8 MB | 16 MB | SX1262 | OLED (SH1106) | ✅ |
| T_Beam_S3_Supreme_SX1262 | ESP32S3 | 512 KB | 8 MB | 8 MB | SX1262 | OLED (SH1106) | ✅ |
| Tbeam_SX1262 | ESP32 | 520 KB | No | 4 MB | SX1262 | OLED (SSD1306) | ✅ |
| Tbeam_SX1276 | ESP32 | 520 KB | No | 4 MB | SX1276 | OLED (SSD1306) | ✅ |
| Tenstar_C3_sx1262 | ESP32C3 | 400 KB | No | 4 MB | SX1262 | None | |
| Tenstar_C3_sx1268 | ESP32C3 | 400 KB | No | 4 MB | SX1268 | None | |
| ThinkNode_M2 | ESP32S3 | 512 KB | No | 4 MB | SX1262 | OLED (SH1106) | |
| ThinkNode_M5 | ESP32S3 | 512 KB | No | 4 MB | SX1262 | E-paper (GxEPD) | ✅ |
| WHY2025_badge | ESP32C6 | 512 KB | No | 4 MB | SX1262 | None | |
| Xiao_C3 | ESP32C3 | 400 KB | No | 4 MB | SX1262 | None | ✅ |
| Xiao_C6 | ESP32C6 | 512 KB | No | 4 MB | SX1262 | None | |
| Xiao_S3_WIO | ESP32S3 | 512 KB | No | 8 MB | SX1262 | None | ✅ |
| Target | MCU | RAM | PSRAM | Flash | LoRa | Display | GPS | SD |
| ------------------------ | ------- | ------ | ----- | ----- | ------ | --------------- | --- | -- |
| Ebyte_EoRa-S3 | ESP32S3 | 512 KB | 2 MB | 4 MB | SX1262 | OLED (SSD1306) | | |
| Generic_E22_sx1262 | ESP32 | 520 KB | No | 4 MB | SX1262 | None | | |
| Generic_E22_sx1268 | ESP32 | 520 KB | No | 4 MB | SX1268 | None | | |
| Heltec_ct62 | ESP32C3 | 400 KB | No | 4 MB | SX1262 | None | | |
| Heltec_E213 | ESP32S3 | 512 KB | 8 MB | 16 MB | SX1262 | E-paper (2.13") | | |
| Heltec_E290 | ESP32S3 | 512 KB | 8 MB | 16 MB | SX1262 | E-paper (2.9") | | |
| Heltec_T190 | ESP32S3 | 512 KB | 8 MB | 16 MB | SX1262 | TFT (ST7789) | | |
| heltec_tracker_v2 | ESP32S3 | 512 KB | No | 8 MB | SX1262 | TFT (ST7735) | ✅ | |
| Heltec_v2 | ESP32 | 520 KB | No | 8 MB | SX1276 | OLED (SSD1306) | | |
| Heltec_v3 | ESP32S3 | 512 KB | No | 8 MB | SX1262 | OLED (SSD1306) | ✅ | |
| heltec_v4 | ESP32S3 | 512 KB | 2 MB | 16 MB | SX1262 | OLED (SSD1306) | ✅ | |
| heltec_v4_tft | ESP32S3 | 512 KB | 2 MB | 16 MB | SX1262 | TFT (ST7789) | ✅ | |
| Heltec_Wireless_Paper | ESP32S3 | 512 KB | No | 8 MB | SX1262 | E-paper (2.13") | | |
| Heltec_Wireless_Tracker | ESP32S3 | 512 KB | No | 8 MB | SX1262 | TFT (ST7735) | ✅ | |
| Heltec_WSL3 | ESP32S3 | 512 KB | No | 8 MB | SX1262 | None | ✅ | |
| LilyGo_T3S3_sx1262 | ESP32S3 | 512 KB | 2 MB | 4 MB | SX1262 | OLED (SSD1306) | | 🧪 |
| LilyGo_T3S3_sx1276 | ESP32S3 | 512 KB | 2 MB | 4 MB | SX1276 | OLED (SSD1306) | | 🧪 |
| LilyGo_TBeam_1W | ESP32S3 | 512 KB | 8 MB | 16 MB | SX1262 | OLED (SH1106) | ✅ | ✅ |
| LilyGo_TDeck | ESP32S3 | 512 KB | No | 16 MB | SX1262 | TFT (ST7789) | ✅ | 🧪 |
| LilyGo_Tlora_C6 | ESP32C6 | 512 KB | No | 4 MB | SX1262 | None | | |
| LilyGo_TLora_V2_1_1_6 | ESP32 | 520 KB | No | 4 MB | SX1276 | OLED (SSD1306) | ✅ | |
| M5Stack_Unit_C6L | ESP32C6 | 512 KB | No | 4 MB | SX1262 | None | ✅ | |
| Meshadventurer_sx1262 | ESP32 | 520 KB | No | 4 MB | SX1262 | OLED (SSD1306) | ✅ | |
| Meshadventurer_sx1268 | ESP32 | 520 KB | No | 4 MB | SX1268 | OLED (SSD1306) | ✅ | |
| Meshimi | ESP32C6 | 512 KB | No | 4 MB | SX1262 | None | | |
| nibble_screen_connect | ESP32S3 | 512 KB | No | 4 MB | SX1262 | OLED (SSD1306) | | |
| RAK_3112 | ESP32S3 | 512 KB | No | 8 MB | SX1262 | None | ✅ | |
| Station_G2 | ESP32S3 | 512 KB | 8 MB | 16 MB | SX1262 | OLED (SH1106) | ✅ | |
| Station_G2_logging | ESP32S3 | 512 KB | 8 MB | 16 MB | SX1262 | OLED (SH1106) | ✅ | |
| T_Beam_S3_Supreme_SX1262 | ESP32S3 | 512 KB | 8 MB | 8 MB | SX1262 | OLED (SH1106) | ✅ | ✅ |
| Tbeam_SX1262 | ESP32 | 520 KB | No | 4 MB | SX1262 | OLED (SSD1306) | ✅ | |
| Tbeam_SX1276 | ESP32 | 520 KB | No | 4 MB | SX1276 | OLED (SSD1306) | ✅ | |
| Tenstar_C3_sx1262 | ESP32C3 | 400 KB | No | 4 MB | SX1262 | None | | |
| Tenstar_C3_sx1268 | ESP32C3 | 400 KB | No | 4 MB | SX1268 | None | | |
| ThinkNode_M2 | ESP32S3 | 512 KB | No | 4 MB | SX1262 | OLED (SH1106) | | |
| ThinkNode_M5 | ESP32S3 | 512 KB | No | 4 MB | SX1262 | E-paper (GxEPD) | ✅ | |
| WHY2025_badge | ESP32C6 | 512 KB | No | 4 MB | SX1262 | None | | |
| Xiao_C3 | ESP32C3 | 400 KB | No | 4 MB | SX1262 | None | ✅ | |
| Xiao_C6 | ESP32C6 | 512 KB | No | 4 MB | SX1262 | None | | |
| Xiao_S3_WIO | ESP32S3 | 512 KB | No | 8 MB | SX1262 | None | ✅ | |
Note: all current `repeater_mqtt` boards support the local web panel except `Xiao_C3`, where it is disabled to preserve limited board resources.
SD notes:
- `✅` means the board is currently known to work with the SD-backed archive path in EastMesh.
- `🧪` means the board hardware likely supports TF/microSD, but the EastMesh board-specific integration still needs validation before it should be treated as supported.
- For the current stats archive, a `4 GB` `FAT32` microSD card is more than sufficient. Larger cards are also supported.
## `companion_radio_wifi` Boards With A Display
These are the Wi-Fi companion targets that have a display configured for local status, setup help, or occasional direct interaction.
+6
Просмотреть файл
@@ -62,8 +62,11 @@ Legacy dotted aliases are also accepted:
- `get web`
- `get web.status`: shows whether the local HTTPS panel is available.
- `get web.stats.status`: shows whether the dedicated stats page and history subsystem are enabled, whether recent history is active, whether PSRAM-backed history is available, and whether the SD-backed archive is mounted.
- `set web on|off`
- `set.web on|off`: enables or disables the local HTTPS panel.
- `set web.stats on|off`
- `set.web.stats on|off`: enables or disables the dedicated `/stats` page and historical stats collection.
### Runtime Diagnostics
@@ -87,9 +90,11 @@ That allowlist currently includes:
- `get mqtt.status`
- `get web`
- `get web.status`
- `get web.stats.status`
- `advert`
- `reboot`
- `start ota`
- `set repeat on|off`
- `memory`
- `stats-core`
- `stats-radio`
@@ -117,6 +122,7 @@ That allowlist currently includes:
- `get mqtt.letsmesh-us`
- `set mqtt.letsmesh-us on|off`
- `set web on|off`
- `set web.stats on|off`
- `get name`
- `set name <device-name>`
- `get lat`
+76 -17
Просмотреть файл
@@ -10,12 +10,13 @@ The repeater web panel is a local HTTPS configuration page served directly by th
It gives you:
- a password-gated local admin page
- a password-gated local admin page at `/app`
- a dedicated stats and trends page at `/stats`
- quick `get` commands for common repeater and MQTT checks
- a terminal-style CLI panel for allowlisted commands
- editable repeater settings
- editable MQTT settings
- a stats dashboard with Wi-Fi, core, radio, memory, and packet views
- a historical stats view with trends, neighbours, and recent events
Operational guidance:
@@ -78,18 +79,42 @@ Recommended practice for repeater deployments:
- use it again for occasional checks or troubleshooting
- disable it with `set web off` when finished so MQTT has the most headroom available
## Actions
## Navigation And Actions
The Actions panel gives you the most common operational controls:
The web console now has two main pages:
- `/app`: lighter-weight control and configuration view
- `/stats`: current status, trends, neighbours, and recent events
Both pages share the same top navigation and utility actions.
### `/app`
The `/app` page is the main admin and configuration surface.
It includes:
- navigation to `App` and `Stats`
- `Advert`
- `Start OTA`
- `Reboot`
- `Logout`
- theme toggle
- `Logout`
Use `Start OTA` only when you intend to update firmware.
### `/stats`
The `/stats` page is the home for current status and historical visibility.
It includes:
- navigation to `App` and `Stats`
- `Refresh`
- `Reboot`
- theme toggle
- `Logout`
## Quick "get" Commands
This section runs common read-only commands for:
@@ -148,19 +173,34 @@ Notes:
- you can toggle each MQTT server on or off from this panel
- if all three servers are enabled at once, the panel shows a warning recommending two at most
## Stats
## `/stats` Overview
Press `Get Stats` to load the dashboard.
The stats page is loaded separately from `/app` and is intended to keep the main admin page lighter.
The stats page currently shows:
The `/stats` page currently shows:
- Core
- Radio
- Memory
- Wi-Fi
- Packets
- `Services`: MQTT, web, archive, card, neighbour count, and archive capacity
- `Trends`: battery, heap free, packet activity, and signal
- `Neighbours`: current neighbour table
- `Events`: current boot/session events
The dashboard is designed to work well on phones as well as desktop browsers.
The trend graphs load sequentially rather than as one large payload:
1. summary/status
2. battery
3. memory
4. packet activity
5. signal
This keeps browser-side and device-side memory use lower than the previous in-page stats view.
If `web.stats` is enabled and an SD archive is mounted, trends can restore archived summary points after reboot. Recent live points are still added from in-memory history.
Useful CLI commands:
- `set web.stats on`
- `set web.stats off`
- `get web.stats.status`
## Mobile Use
@@ -169,9 +209,9 @@ The page is responsive and should work cleanly on a phone.
On mobile:
- quick command buttons collapse into a two-column layout
- action buttons stack more cleanly
- top navigation and action groups stay compact and touch-friendly
- input rows stay usable for touch interaction
- stats cards reorganize into single-column sections where needed
- trend cards reorganize into single-column sections where needed
## Common Tasks
@@ -180,7 +220,7 @@ On mobile:
1. Open the panel.
2. Press `wifi.status` in Quick `get` Commands.
3. Press `mqtt.status` in Quick `get` Commands.
4. Press `Get Stats` for the dashboard view.
4. Open `/stats` from the top navigation for the historical stats view.
### Change Device Name
@@ -201,6 +241,14 @@ On mobile:
2. Confirm the action.
3. Continue with your normal OTA workflow.
### Use Historical Stats
1. Enable stats if needed with `set web.stats on`.
2. Open `/stats` from the top navigation.
3. Review `Services` for archive and runtime state.
4. Review `Trends` for recent graph history.
5. Use `Refresh` to reload the stats page.
## Troubleshooting
### The browser warns about the certificate
@@ -241,9 +289,20 @@ The panel intentionally limits what can be run from the browser. Use the serial
Try:
- refreshing the browser tab
- using `Refresh` on `/stats`
- logging out and back in
- checking WiFi stability with `get wifi.status`
### `/stats` is unavailable
Check:
- `get web.status`
- `get web.stats.status`
- whether `set web.stats on` has been applied
If `web.stats` is off, `/stats` will stay disabled and the historical graph requests will not run.
## Related Docs
- [Custom CLI Commands](./custom-cli.md)