Skip to content

Trifecta bridge — beta 8

Pre-release
Pre-release

Choose a tag to compare

@smellyspice smellyspice released this 30 Aug 14:52
· 12 commits to espnow-ip-bridge since this release

Trifecta repeater firmware (real LoRa + ESP-NOW bridge + IP bridge, all at once) — beta 8.

Built from commit 7ee4ca44 on the espnow-ip-bridge branch. Covers the companion, room server, and repeater roles on Heltec V3, Heltec V4, Xiao S3 WIO, Waveshare ESP32-S3-Zero, and — newly confirmed on real hardware this release — the ESP32-C3 "Super Mini".

Two builds per repeater/room-server board, same code, different tradeoff:

  • _debug filesBRIDGE_DEBUG/MESH_DEBUG/ESPNOW_DEBUG_LOGGING (plus MESH_PACKET_LOGGING/WIFI_DEBUG_LOGGING on the real-LoRa repeaters) all on. Noisier serial output, and debug logging has a real (small) timing/CPU cost, but gives full visibility into bridge/routing decisions. Use this for testing, troubleshooting, or pairing with watch_boards.py below.
  • Plain files (no _debug suffix) — functionally identical, debug logging stripped out. Quieter and slightly leaner/faster. Use this once you're done actively debugging and just want the board running.
    (Companion firmware has no _debug build — its serial line is the binary phone-app protocol, and debug text would collide with it.)

What's new since beta 7

  • New: ESP-NOW time-sync beacon. A dual-bridge repeater (ESP-NOW + IP bridge together, e.g. Heltec V3/V4 with the IP bridge configured) already gets real NTP time. It now broadcasts that time to its ESP-NOW segment every 5 minutes, authenticated purely by the shared bridge.secret (same trust boundary as the rest of the bridge protocol). Any no-LoRa ESP-NOW client (companion, repeater-role, or room server) picks it up and sets its own clock — but only once per 12-hour cooldown, so a steady stream of beacons only actually moves the clock about twice a day. Fixes these boards' clocks drifting to a bogus default with no other time source available. No CLI action needed on either side — it's automatic once the repeater has WiFi/NTP configured.
  • Confirmed working on real hardware: the ESP32-C3 "Super Mini" (companion/repeater/room-server roles), first shipped untested in beta 7. Found and fixed a real bug in the process: the generic esp32-c3-devkitm-1 PlatformIO board definition doesn't enable native USB CDC the way the S3-Zero's board definition does, so the serial CLI was completely silent on a fresh C3 board even though flashing worked fine. Fixed by adding ARDUINO_USB_MODE/ARDUINO_USB_CDC_ON_BOOT explicitly.
  • New: ESP32_C3_SuperMini_room_server_bridge_espnow_debug and ESP32_S3_Zero_room_server_bridge_espnow_debug — the room server role had no debug build until now (needed one to diagnose the two issues above and a wrong-room-password rejection on a test board).
  • Changed: room server's channel-bridge CLI command renamed room.channel <name> <psk>set room.channel <name> <psk>, for consistency with the rest of the CLI's set/get convention (get room.channel unchanged).
  • Fixed: ESPNowBridge's bridge→client retry ceiling raised 3→12, matching the client→bridge direction's existing ceiling (raised in beta 4 for the same reason). Both directions cross the same physical, sometimes-marginal ESP-NOW link — there was no reason retries should help only one direction.

Repeaters (Xiao S3 WIO, Heltec V3, Heltec V4)

Which file to flash:

  • -merged.bin — for a blank/fresh board. Flash at offset 0x0:
    esptool.py --chip esp32s3 write_flash 0x0 <file>-merged.bin
  • plain .bin (no -merged suffix) — app-only, for upgrading a board that's already running MeshCore. Preserves identity, WiFi credentials, and BLE bonds. Flash at offset 0x10000:
    esptool.py --chip esp32s3 write_flash 0x10000 <file>.bin

After flashing, configure over the standard MeshCore serial CLI (set bridge.channel, set bridge.secret, set wifi.ssid, set wifi.pwd, set ip.host, etc.) — no custom tooling needed. A repeater with both bridge.channel/bridge.secret and the IP bridge (wifi.ssid/ip.host or ip.port) configured will automatically start broadcasting time to its ESP-NOW segment once WiFi/NTP land — nothing extra to turn on.

Room server, no LoRa (Waveshare ESP32-S3-Zero, ESP32-C3 Super Mini)

Same flashing pattern as above (-merged.bin at 0x0 for blank, plain .bin at 0x10000 to upgrade; use --chip esp32c3 for the C3 board). If changing an existing board's role (e.g. this same physical board was previously a companion), erase flash fully first — esptool.py erase_flash — before flashing the merged image. A role change doesn't touch the separate SPIFFS partition otherwise, so stale config from the old role can survive and cause boot issues.

Configure the ESP-NOW join the same as a repeater (set bridge.channel/set bridge.secret, matching whatever real repeater it should join), then optionally set room.channel <name> <psk> for the public-channel bridge.

Companion, no LoRa (Waveshare ESP32-S3-Zero, ESP32-C3 Super Mini)

No text CLI (speaks the binary phone-app protocol) — configure the ESP-NOW join with the bundled script instead:

python3 set_bridge_params.py list
python3 set_bridge_params.py <port> set <channel 1-14> <secret>

Monitoring multiple boards at once

python3 watch_boards.py

Auto-detects every connected board, connects to all of them, and streams their debug output live in one terminal. Press n to dump neighbors.all, b to dump bridge status, c to toggle watching companion boards, from every connected board at once. See the script's own --help for details.

Full writeup, use cases, and setup details: https://smellyspice.github.io/MeshCore/


A personal MeshCore fork, unmerged upstream, developer release only — do not run on a mesh you depend on.