Releases: openhop-dev/openhop_modem
Release list
v1.0.1 - Factory Images, Release Packages, and Radio Reliability Improvements
This release improves radio diagnostics and reliability, corrects board-specific display and bootloader configurations, and expands firmware distribution with complete factory images and per-variant GitHub Release packages.
Highlights
- Updated all 16 firmware variants to
v1.0.1. - Added complete
firmware.factory.binimages for all 13 ESP32-family targets. - Added UF2 firmware files for all three nRF52 targets.
- Added automatic GitHub Release packaging with one ZIP per firmware variant.
- Corrected the Station G2/G3 OLED controller and driver.
- Corrected the XIAO nRF52 Wio SoftDevice and application layout.
- Improved Heltec SX126x current-limit handling and TX-power diagnostics.
- No wire-protocol changes were introduced.
Radio and TX-Power Improvements
The SX126x current limit is now set to 140 mA on:
- Heltec V3
- Heltec V4
- Heltec V4.2
- Heltec V4.3
Additional diagnostic logging now reports:
- Requested TX power
- Applied TX power
- Board power ceiling
setOutputPower()result- SX126x over-current protection values before and after configuration
Received SET_CONFIG commands also log the requested:
- Frequency
- Bandwidth
- Spreading factor
- Coding rate
- TX power
- Sync word
- Preamble length
Station G2/G3 Display Fix
The Station G2/G3 onboard display was incorrectly configured as an SH1107.
This release:
- Corrects the controller to SH1106
- Switches the implementation to
Adafruit_SH1106G - Restores accurate display documentation
XIAO nRF52 Wio Bootloader Compatibility
The XIAO nRF52 Wio firmware now uses the correct S140 7.3.0 bootloader layout.
Changes include:
- SoftDevice updated from S140 6.1.1 to S140 7.3.0
- SoftDevice FWID updated from
0x00B6to0x0123 - Added a dedicated S140 v7 linker script
- Application origin moved to
0x27000 - Maximum application size updated for the new layout
- Regenerated HEX, DFU ZIP, and UF2 artifacts
Important: XIAO nRF52 Wio users must install a compatible Adafruit nRF52 bootloader using S140 7.3.0 before flashing this firmware.
Complete ESP32 Factory Images
Every ESP32-family firmware directory now includes:
firmware.factory.binfirmware.binbootloader.binpartitions.binSHA256SUMS.txtmanifest.jsonwhere supported
Which File Should I Use?
Use firmware.factory.bin at address 0x0 for:
- First-time installation
- Recovery
- Replacing a damaged or incompatible bootloader/partition layout
Use firmware.bin at address 0x10000 for:
- Compatible app-only USB updates
- Web UI OTA updates
curlOTA updates
The factory image contains the bootloader, partition table, OTA initialization data, and application at the correct offsets for each board.
ESP32-P4 targets retain their required layout:
Bootloader: 0x2000
Partition table: 0x8000
OTA initialization: 0xe000
Application: 0x10000
The asset builder now removes stale factory output before incremental builds, preventing an older firmware.factory.bin from being packaged with a newer application.
nRF52 Firmware Formats
All three nRF52 targets now include:
firmware.hexfirmware.zipfor Adafruit serial DFUfirmware.uf2SHA256SUMS.txt
Affected targets:
- Heltec T114
- XIAO nRF52 Wio
- RAK4631 WisMesh Ethernet
Build and Asset Tooling
- Added deterministic per-variant ZIP generation.
- Added validation of tracked firmware checksums before packaging.
- Added release-level checksums for all variant ZIPs.
- Added UF2 generation to the canonical nRF52 asset builder.
- Consolidated the legacy all-environment release script around the canonical asset builder.
- Marked BIN and Intel HEX files as binary in Git.
- Updated installation and flashing documentation.
Updating an Existing ESP32 Device
Download the correct firmware.bin for your board from:
https://github.com/openhop-dev/openhop_modem/tree/main/firmware
You can then install it using the modem Web UI or curl.
Web UI
- Log in to the modem Web UI.
- Open the OTA update section.
- Select the correct
firmware.bin. - Start the update and wait for the modem to reboot.
curl
curl --user <username>:<password> \
-F "firmware=@firmware.bin" \
http://<modem-ip>/updateUse firmware.factory.bin instead when performing a complete USB installation or recovery.
Verification
- All 16 PlatformIO environments built successfully.
- All compiled firmware reports
v1.0.1. - All 16 firmware checksum sets verified.
- All 11 applicable web-flasher manifests verified.
- All 13 ESP32 factory-image layouts verified.
- ESP32-P4 bootloaders confirmed at
0x2000. - All 16 per-variant release ZIPs generated and verified.
- Release-level ZIP checksum manifest verified.
- No wire-protocol changes were introduced.
What's Changed
- test fix for tx power issue by @matthew73210 in #34
- fix: set Heltec V4 SX126x current limit by @yellowcooln in #35
- firmware: update generated firmware assets [skip ci] by @yellowcooln in #36
- fix: update XIAO nRF52 Wio to S140 v7 layout by @yellowcooln in #39
- firmware: update generated firmware assets [skip ci] by @yellowcooln in #40
- Fix Station G2/G3 display by @etienn01 in #42
- feat: add combined factory images and fix Station G2 display by @yellowcooln in #43
- release: publish v1.0.1 firmware packages per variant by @yellowcooln in #44
- firmware: update generated firmware assets [skip ci] by @yellowcooln in #45
New Contributors
Full Changelog: v1.0.0...v1.0.1
v1.0.0 – New Hardware, Automated Firmware, and openHop Rebrand
This is the first major release of openHop Modem, bringing expanded hardware support, automated firmware distribution, improved board-specific features, and the completion of the openHop rebrand.
Building on the v0.8.x modem platform, v1.0.0 doubles the number of supported firmware targets, introduces automated firmware asset generation, expands Ethernet deployments, and adds GPS, battery, RF front-end, and board-specific management features—all while maintaining wire-protocol compatibility with existing Repeater deployments.
Highlights
- Rebranded from pyMC Modem to openHop Modem.
- Expanded support from 8 to 16 firmware targets.
- Added browser-flasher-ready firmware assets and automated firmware publishing.
- Added Ethernet-capable modem targets.
- Added board-specific GPS, battery, RF, and Wi-Fi controls.
- Maintained compatibility with existing v0.8.x serial and TCP modem clients.
New Hardware Support
New supported targets include:
- Heltec WiFi LoRa 32 V4
- Heltec WiFi LoRa 32 V4.2
- Heltec WiFi LoRa 32 V4.3
- Heltec Wireless Tracker V2
- MeshSmith Photon-1W XIAO ESP32-C6
- B&Q Consulting Station G2
- RAK4631 WisMesh Ethernet
- MeshSmith EtherMesh-1W
The project now supports 16 firmware environments spanning ESP32, ESP32-P4, and nRF52 platforms.
Firmware Asset Automation
v1.0 introduces a fully automated firmware publishing pipeline.
New features include:
- Automatic firmware builds from
main - Browser-flasher-ready firmware packages
- ESP32 manifests, bootloaders, partitions, and firmware images
- nRF52 HEX and DFU packages
- SHA256 checksum generation
- Manual and selective firmware builds
- Automatic asset-update pull requests
Ethernet Support
Ethernet deployments have been significantly expanded.
New support includes:
- RAK4631 WisMesh Ethernet (W5100S)
- MeshSmith EtherMesh-1W
- Improved ESP32-P4 Ethernet support
- Updated documentation for wired modem deployments
Board Improvements
Photon-1W
- GPS support
- Battery fuel-gauge telemetry
- Wi-Fi antenna switching
- Persistent GPS enable/disable
- TCP modem diagnostics
- Improved recovery when radio initialization fails
Heltec V4 Family
- Dedicated V4, V4.2, and V4.3 support
- Battery monitoring
- GPS connector support
- RF front-end controls
- External FEM/LNA controls
- AGC reset configuration
- Improved transmit behavior
Additional Boards
- Heltec Wireless Tracker V2 support
- Station G2 support with SH1107 display
- Updated RAK4631 Ethernet implementation
- Improved nRF52 compatibility
- Updated T114 GPS configuration
Web UI Improvements
- Generic Wi-Fi setup reset controls
- Additional board-specific configuration options
- Improved recovery when radio initialization fails
- Continued HTTP Basic Authentication support
- Updated configuration portal experience
Documentation & Branding
- Completed the openHop rebrand throughout the project.
- Updated installation and deployment documentation.
- Added browser flashing guidance.
- Removed legacy modem side-loading instructions.
- Clarified built-in Repeater modem support.
- Updated networking and board documentation.
Fixes
- Improved TCP CRC handling
- Fixed RAK4631 Ethernet configuration
- Fixed Photon radio pin mapping
- Fixed Photon fuel-gauge I²C handling
- Fixed Heltec V4 GPS configuration
- Fixed RSSI sampling
- Fixed firmware asset workflow permissions
- Numerous board-specific compatibility improvements
Upgrade Notes
- Existing v0.8.x Repeater deployments remain compatible.
- The modem wire protocol is unchanged.
- ESP32 boards continue to support Web UI and OTA where available.
- Ethernet-only targets may not provide the Web UI and should be configured as documented.
- Fresh network firmware continues to default to an empty TCP token until configured.
This release establishes openHop Modem as the primary firmware platform for the openHop ecosystem, with significantly broader hardware support, automated firmware delivery, and a stable foundation for future board additions.
Updating Existing Devices
Existing openHop Modem installations can be upgraded using the built-in OTA update mechanism.
Step 1: Download the Firmware
Download the appropriate firmware.bin for your board from:
https://github.com/openhop-dev/openhop_modem/tree/main/firmware
Step 2: Install the Update
You can install the new firmware using either method below.
Option 1: Web UI (Recommended)
- Log in to the modem web interface.
- Navigate to OTA Update.
- Select the downloaded
firmware.bin. - Start the update and wait for the modem to reboot.
Option 2: OTA via curl
Upload the firmware directly to the modem:
curl --user <username>:<password> \
-F "firmware=@firmware.bin" \
http://<modem-ip>/updateReplace:
<username>with your web UI username<password>with your web UI password<modem-ip>with the modem's IP address
The modem will automatically reboot after the update completes.
Note: OTA updates require a board that supports the HTTP/Web UI firmware updater. Boards without the HTTP interface must be updated using their normal flashing method (USB, DFU, etc.).
What's Changed
- ci: add firmware asset builder workflow by @yellowcooln in #6
- ci: open PRs for protected firmware asset updates by @yellowcooln in #8
- Feat: Add Heltec V4 + add Battery support to Firmware by @yellowcooln in #10
- Fix nRF52 board config initializers by @yellowcooln in #11
- ci: tolerate firmware asset PR permission limits by @yellowcooln in #13
- firmware: update generated firmware assets by @yellowcooln in #12
- firmware: add Heltec V4 generated assets by @yellowcooln in #14
- firmware: add Heltec Wireless Tracker V2 support by @matthew73210 in #5
- firmware: update generated firmware assets by @yellowcooln in #15
- firmware: add Station G2 board support by @jonatan-holmgren in #9
- firmware: update generated firmware assets by @yellowcooln in #16
- Add MeshSmith Photon-1W XIAO ESP32-C6 pyMC modem support with battery, Wi-Fi antenna, GPS, and diagnostics by @yellowcooln in #17
- fix: align T114 board config with GPS fields by @yellowcooln in #18
- feat: add generic Wi-Fi setup reset controls by @yellowcooln in #21
- Fix Heltec V4 revision-specific RF and GPS support by @yellowcooln in #23
- Rebrand modem to openHop and update Repeater integration docs by @yellowcooln in #24
- Add support for RAK4631 WisMesh Ethernet Gateway firmware by @Bjorkan in #22
- Add web controls for Heltec V4.3 RF front-end by @yellowcooln in #25
- firmware: update generated firmware assets [skip ci] by @yellowcooln in #26
- Sync Heltec V4.3 LNA branch with upstream and fix transmit bypass by @yellowcooln in #27
- Add EtherMesh-1W modem variant by @yellowcooln in #28
- firmware: update generated firmware assets [skip ci] by @yellowcooln in #29
- firmware: bump base version to v1.0.0 by @yellowcooln in #30
- ci: validate cached PlatformIO executable by @yellowcooln in #31
- firmware: update generated firmware assets [skip ci] by @yellowcooln in #32
New Contributors
- @matthew73210 made their first contribution in #5
- @jonatan-holmgren made their first contribution in #9
- @Bjorkan made their first contribution in #22
Full Changelog: v0.8.0...v1.0.0
v0.8.0 — HTTP management surface + JSON API
What's new in v0.8.0
HTTP management surface + JSON API
PR #1 (yellowcooln) lands a usable web management UI on top of the
existing OTA endpoint, plus a machine-readable JSON API. Wire
protocol unchanged (still v0.7) — drivers and pymc_core/pymc_Repeater
clients work against v0.8 firmware without changes.
- HTTP Basic Auth on every web/API/OTA path. Default
admin/password, changeable from the UI, persisted in NVS underhttp_pass. - Persistent configurable hostname (blank = MAC-derived fallback).
- DHCP / static IP UI with live lease values shown next to the form.
- pyMC token management UI (replaces the older "TCP password" label).
- Reboot button from the UI.
/statspage — uptime, radio config, RX/TX/error counters, RSSI/SNR/noise floor, die temperature, network mode.- JSON API endpoints for headless integration.
See README "Default web UI / OTA / API credentials" for the credential
matrix and how to change them.
New board (8th variant)
Seeed XIAO nRF52840 + Wio-SX1262 carrier (SKU 102010710) — nRF52840
paired with Seeed's Wio-SX1262 Meshtastic carrier.
- USB-CDC transport only (no Wi-Fi/Ethernet/HTTP — same constraints as T114)
- No onboard display
- DIO2-as-RF-switch + external LNA gate on D5 (RXEN)
- TCXO 1.8 V via DIO3, max 22 dBm chip TX (no PA)
- OTA: Adafruit nRF52 DFU (UF2 disk on double-click reset) or in-app
CMD_OTA_*over USB-CDC
fw_suffix: xiao_nrf52_wio (auto-detected by pymc_sector_array's OTA scanner).
Boards (8 binaries below)
| Board | Binary | Notes |
|---|---|---|
| Heltec WiFi LoRa 32 V3 | pymc_usb-v0.8.0-heltec_v3.bin |
ESP32-S3 + SX1262 |
| Ikoka Stick | pymc_usb-v0.8.0-ikoka_stick.bin |
ESP32-S3 + SX1262 |
| Seeed XIAO Wio-SX1262 | pymc_usb-v0.8.0-xiao_wio_sx1262.bin |
ESP32-S3 |
| RAK3112 WisMesh | pymc_usb-v0.8.0-rak3112_wismesh.bin |
ESP32-S3 + BLE + Wi-Fi |
| WaveShare ESP32-P4-Nano | pymc_usb-v0.8.0-esp32_p4_nano.bin |
ESP32-P4 + E22 (SX1262); Ethernet preferred over Wi-Fi |
| Lilygo T3-S3 | pymc_usb-v0.8.0-lilygo_t3s3.bin |
ESP32-S3 + SX1262 + OLED |
| Heltec T114 | pymc_usb-v0.8.0-heltec_t114.hex + -dfu.zip |
nRF52840 + SX1262 + TFT 135×240; no Wi-Fi/TCP |
| Seeed XIAO nRF52840 + Wio-SX1262 (new) | pymc_usb-v0.8.0-xiao_nrf52_wio.hex + -dfu.zip |
nRF52840 + SX1262; no Wi-Fi/TCP, no display |
Flashing
ESP32 boards (USB CDC):
esptool.py --port /dev/ttyACM0 write_flash 0x10000 pymc_usb-v0.8.0-<board>.bin
# or, with PlatformIO source checkout:
cd firmware && pio run -e <env> -t uploadnRF52 boards (T114, XIAO nRF52840 + Wio) — Adafruit bootloader:
double-tap reset to enter DFU, then either drag the .uf2 (if you
build one from the hex) or use adafruit-nrfutil:
adafruit-nrfutil dfu serial -pkg pymc_usb-v0.8.0-<board>-dfu.zip -p /dev/ttyACM0 -b 115200Default credentials (v0.8)
| Surface | User | Default password | Where to change |
|---|---|---|---|
| Web UI / OTA / JSON API | admin |
password |
UI ▸ Admin password (persisted in NVS) |
| pyMC token (TCP transport) | n/a | empty | UI ▸ pyMC token, or CMD_SET_WIFI |
Change both before exposing the modem outside a trusted LAN.
Upgrading from v0.7
- OTA recommended for ESP32 boards: web UI ▸ Update firmware. First
set an admin password — the defaultadmin/passwordwon't gate
anything if left as-is. - No driver changes needed — wire protocol unchanged.
- First-boot HTTP credentials:
admin/password(set
intentionally to be obvious; rotate before exposing to LAN).
v0.7.0 — sector-array integration set
What's new in v0.7.0
Wire-protocol additions (sector-array integration set)
Backwards-compatible — pre-v0.7 hosts work against v0.7 firmware and vice
versa; the new commands are simply skipped if unknown.
CMD_RADIO_STANDBY(0x40) /CMD_RADIO_RESUME(0x42) — host-driven radio gatingCMD_SET_DISPLAY_NAME(0x48) — sector name banner on the T114 TFTCMD_SET_AUTO_CAD(0x4A) — auto-CAD before every TX, persisted in NVS on T114CMD_ENTER_BOOTLOADER(0x74) — drop nRF52 into Adafruit DFU modeCMD_LOG_MSG(0x80) — async log line (modem → host)- In-app OTA over the transport:
CMD_OTA_BEGIN/CHUNK/VERIFY/APPLY/ABORT(0x90 / 0x92 / 0x94 / 0x96 / 0x98) — required path for T114 since it has no Wi-Fi
fw_suffix rename (aligns with pymc_sector_array OTA scanner)
CMD_GET_VERSION / VERSION_RESP now report:
- Heltec T114:
v0.7.0-heltec_t114(renamed fromt114) - ESP32-P4-Nano:
v0.7.0-esp32_p4(renamed fromesp32p4)
This lets pymc_sector_array auto-detect the board from an uploaded .bin
during OTA — previously these two boards fell through the matcher.
Boards (7 binaries below)
| Board | Binary | Notes |
|---|---|---|
| Heltec WiFi LoRa 32 V3 | pymc_usb-v0.7.0-heltec_v3.bin |
ESP32-S3 + SX1262 |
| Ikoka Stick | pymc_usb-v0.7.0-ikoka_stick.bin |
ESP32-S3 + SX1262 |
| Seeed XIAO Wio-SX1262 | pymc_usb-v0.7.0-xiao_wio_sx1262.bin |
ESP32-S3 |
| RAK3112 WisMesh | pymc_usb-v0.7.0-rak3112_wismesh.bin |
ESP32-S3 + BLE + Wi-Fi |
| WaveShare ESP32-P4-Nano | pymc_usb-v0.7.0-esp32_p4_nano.bin |
ESP32-P4 + E22 (SX1262); Ethernet preferred over Wi-Fi |
| Lilygo T3-S3 | pymc_usb-v0.7.0-lilygo_t3s3.bin |
ESP32-S3 + SX1262 + OLED |
| Heltec T114 | pymc_usb-v0.7.0-heltec_t114.hex + -dfu.zip |
nRF52840 + SX1262 + TFT 135×240; no Wi-Fi/TCP — USB-CDC + UART only |
Flashing
ESP32 boards (USB CDC):
esptool.py --port /dev/ttyACM0 write_flash 0x10000 pymc_usb-v0.7.0-<board>.bin
# or, with PlatformIO source checkout:
cd firmware && pio run -e <env> -t uploadHeltec T114 (nRF52840 with Adafruit bootloader): double-tap reset to
enter DFU, then either drag the .uf2 (if you build one from the hex)
or use adafruit-nrfutil:
adafruit-nrfutil dfu serial -pkg pymc_usb-v0.7.0-heltec_t114-dfu.zip -p /dev/ttyACM0 -b 115200Memory footprint
| Board | Flash used | Flash partition | RAM used |
|---|---|---|---|
| heltec_v3 | 1.06 MB | 3.19 MB (33%) | 53 KB |
| ikoka_stick | 1.06 MB | 3.19 MB (33%) | 54 KB |
| xiao_wio_sx1262 | 1.06 MB | 3.19 MB (33%) | 54 KB |
| rak3112_wismesh | 1.07 MB | 3.19 MB (34%) | 53 KB |
| esp32_p4_nano | 1.02 MB | 6.25 MB (16%) | 40 KB |
| lilygo_t3s3 | 1.08 MB | 1.25 MB (86%) | 53 KB |
| heltec_t114 | 147 KB | 796 KB (19%) | 16 KB |
Lilygo T3-S3 is the tightest (86% flash used); consider partition table
adjustments before adding ~150 KB more features on that target.