Skip to content

Firmware Receiver v14

OneSeventyFour edited this page May 15, 2026 · 2 revisions

Receiver firmware v14

Released 2026-05
Status Superseded by v15
Pairs with dongle v8+
Predecessor v13
Notable One-binary-fits-the-fleet — identity moved to NVS.

Downloads

File Purpose Download
os4_receiver_v14.bin App partition. Download
os4_receiver_v14.bootloader.bin Chip bootloader. Download
os4_receiver_v14.partitions.bin Partition table. Download
os4_receiver_v14.boot_app0.bin OTA "next-app" pointer. Download

Release notes

Move NODE_ID + RECEIVER_IDENT out of firmware and into NVS (flash-backed Preferences). One firmware binary now serves the whole fleet; per-unit identity is provisioned over USB serial after the first flash via the host-side devices/utils/flash_receiver.py helper (which sends a SETID <node_id> <ident> line and waits for the chip to reboot).

  • NODE_ID==0 is the unprovisioned sentinel: the receiver does not start the radio, displays a slow magenta breathing pattern on the status LEDs so the operator can see the unit needs commissioning, and only services serial. Once provisioned, ESP.restart() picks up the new identity from NVS like any boot.
  • Serial commands accepted at any time (one per line, 115200 8N1):
    • GETID → prints NODE_ID=<n> IDENT=<s>
    • SETID <n> <ident> → writes NVS, prints OK SETID ... then resets
    • WIPEID → clears NVS identity (back to unprovisioned)
  • NVS namespace is "byh_rx", keys "node_id" (uchar) and "ident" (string, max 15 chars + NUL). The host flash workflow preserves NVS across all flashes: the default partition table puts NVS at 0x9000–0xdfff, in the gap between the partition table and boot_app0, and flash_receiver.py (both default and --full) only writes regions outside that gap. Identity therefore survives every firmware update unless someone explicitly erases the chip (e.g. esptool.py erase_flash).

Upgrade notes

  • Breaking workflow change: pre-v14 firmware baked NODE_ID and IDENT into the binary, so each receiver needed its own per-unit build. v14+ uses a single binary; identity is set via flash_receiver.py --set-id.
  • When upgrading from a pre-v14 binary, the chip's NVS will be empty for the new keys. Run flash_receiver.py <port> --set-id <NODE_ID> <IDENT> once after the first v14 flash. After that all updates preserve identity.

How to flash

Clone this wiki locally