-
Notifications
You must be signed in to change notification settings - Fork 35
Firmware Versions
Release history + notable changes. As of v3.4.0 (2026-06-27) releases are unified: one v<x.y.z> tag builds and ships every receiver + transmitter variant together. The per-binary rx-v* / tx-v* tables further down cover the historical 2.x → early-3.x line.
Current tag scheme (unified,
v<x.y.z>): one annotated tag per release → CI builds the full matrix (all RX + TX variants) and publishes a single GitHub Release carrying both a full-flash image (…-full.bin, flash at0x0for a blank board) and an OTA app image (….bin, used by the PWA/cloud over-the-air update) for each variant. RX and TX VERSION files bump together — a change to one still cuts a newvX.Y.Zthat rebuilds both. The version string in every binary (esp_app_desc.version, flash offset0x30) always equals the release tag.Historical scheme (≤ ~v3.3.0): separate
rx-vX.Y.Z,tx-vX.Y.Z,rxc3-vX.Y.Ztags, paired per release.
Full per-release detail is in the repo CHANGELOG.md; highlights below.
| Version | Notable change |
|---|---|
| v3.6.2 | LED status-ring animations + empty-manifest data-loss guard. The hub LED ring now animates as a full ring for transient states, each a distinct colour: pairing = cyan comet (was a single blinking pixel), hub update = orange comet, transmitter update = magenta comet, first-time setup / AP = blue breathing. Normal tank gauges unchanged. The firmware-update animation — previously dead code (its status flag was never set) — now runs. Data-safety: a failed registry load (SPIFFS/OOM/corruption at boot) no longer publishes an empty manifest, which the cloud would honour by deleting all your tanks; a failed load is now held as degraded rather than asserted as "no tanks". |
| v3.4.0 – v3.6.1 | See CHANGELOG.md. Milestones in this line: unified v* release pipeline (v3.4.0), S3-CAM hub bring-up + provisioning fixes, S3 LEDs driven over SPI, JSN-SR04M-2 sensor support, and the TX boot-inrush fix. |
| Version | Notable change |
|---|---|
| rx-v3.2.0 / tx-v3.2.0 |
Smart Switch support + MAC-echo anti-spoofing. The hub now pairs and controls a SmartGhar Smart Switch (mains relay + current/temp) over ESP-NOW — a new Switches tab runs pump automation entirely on the hub (level thresholds, source-tank guard, rate-of-rise dry-run, max-runtime, manual-hold) with the switch as a thin executor. MAC-echo: the TX appends its MAC as the 12th TANK field and the hub drops any LoRa packet whose MAC doesn't match the registered one — closing the cross-tenant risk where a neighbour's TX shares your address+NETID. Fully backwards-compatible (old TX/old hub ignore the extra field). Smart Switch firmware lives in its own repo (smartghar-smart-switch, ss-vX.Y.Z). |
| rx-v3.1.0 / tx-v3.1.0 |
Mains/no-battery detection + restart-zeros fix. USB/mains TX sends a bat_pct=-1 sentinel → "Mains powered" instead of a fake 0%/low-battery. Hub no longer publishes zeros for tanks it hasn't heard from since boot (kills false alerts + phantom HA water-consumption per restart). SET_ACK queued-badge fix, 300s default sleep, 9-sample runtime knob, runtime display auto-detect (OLED ↔ GC9A01). |
| rx-v3.0.0 / tx-v3.0.0 | ESP-NOW "Lite" + universal hub + display redesign. ESP-NOW transmitter SKU, one hub binary serving LoRa + ESP-NOW fleets, B2 hub-pull cloud provisioning, reference-grade OLED/LED per-tank layout. |
| rx-v2.8.6 |
Bidirectional sensor sync + on-device diagnostic console. Per-TX sensor selector (Ultrasonic AJ-SR04M / mmWave HLK-LD2413) — change from hub web UI, PWA, or the TX's own AP UI, all three converge via LoRa SET-frame + TX-truth auto-sync. 4 KB log ring buffer exposed at GET /api/logs for laptop-free remote diagnosis. MQTT bridge publishes sensor_kind + active_sensor as retained topics. Backwards-compatible TANK packet — older TXs without the 11th positional field parse fine. |
| rx-v2.8.5 |
Version stamping fixed. Single VERSION file pattern via CMake configure_file(). The displayed version in OLED + web UI + PWA + MQTT now actually matches what was built. (Previously stuck at 2.7.13 since rx-v2.7.13 due to a hardcoded PROJECT_VER string in CMakeLists.txt.) |
| rx-v2.8.4 | Silent-tank false-positive fix + HACS endpoints round-out |
| rx-v2.8.3 | Sensor stuck variance-based detection (≥20 wakes with no level change → warning chip in PWA + HACS binary sensor) |
| rx-v2.8.2 | Buzzer Pattern A on RX local web UI |
| rx-v2.8.1 | Wire missing buzzer events to alert pipeline |
| rx-v2.8.0 | Buzzer feature. Active 3-pin piezo on GPIO 02. Master enable, volume profile (Quiet/Standard/Loud), quiet hours, per-alert toggles. HACS exposes as switch + select + button + binary sensors. |
| rx-v2.7.13 | Pair-mode-NETID rendezvous (TX + RX both temp-set NETID=6 during pair window) |
| rx-v2.7.12 | Reconcile guard fix (legitimate Web-UI delete-all flow no longer breaks the hub↔cloud auto-reconcile) |
| rx-v2.7.11 | Cloud delete propagates to hub via MQTT remove_tx (waits for ack before DB removal) |
| rx-v2.7.10 | Pair identity redesign. No-rotate NETID policy. MAC as identity (instead of random LoRa address). Small int addresses (1, 2, 3…) instead of random. |
| rx-v2.7.9 | Adaptive low-water thresholds + multi-target build (ESP32 DevKit + ESP32-S3 SuperMini from one source tree) |
| rx-v2.7.5 | Six dashboard truthfulness fixes (combined-capacity %, running-low classification, drawn-from source, waiting-state copy, RSSI=0, trend-chip labels). Tank-name limit 15→24 chars. |
| Version | Notable change |
|---|---|
| tx-v2.0.15 |
Sensor abstraction + LD2413 driver + diagnostic mode. New sensor_iface vtable supports Ultrasonic AJ-SR04M and 24 GHz mmWave HLK-LD2413; selected sensor stored in NVS and reported in the TANK packet's 11th field. New diagnostic mode skips deep sleep and exposes the live ESP log at GET /api/logs from the TX AP UI — no serial cable, no rooftop climb. AP SSID now MAC-derived (TankSync-TX-XXXX) so multiple TXs on the same site are distinguishable. TX AP UI restyled to match RX brand. Includes the internal tx-v2.0.14 fixes (brown-out backoff + INA219-gated low-bat TX skip). Note: LD2413 driver code lands but is not bench-verified yet — module ships shortly. |
| tx-v2.0.13 | Version stamping fixed (matches the rx-v2.8.5 single-VERSION pattern). |
| tx-v2.0.12 | Adaptive duty cycle (stranded mode + fill-event + leak detection + LED v2). Explicit sensor_status field ('o'/'e'/'u') in TANK packet. |
| tx-v2.0.11 | Pair identity redesign — MAC included in PAIR_REQ. Enables hub-side tombstone restore on re-pair. |
| tx-v2.0.10 | INA219-only refactor. WS2812 two-beat heartbeat. Sleep-state race fix. |
| tx-v2.0.9 | Various UX bundling (sign-drop, trend, queued chip, mode badge, sleep formatting) |
| tx-v2.0.8 | NETID randomization + RSSI gate + session nonce + boot splash |
The PWA is proprietary (closed source). Versions ship continuously via CI. Visible in Settings → About.
| Version | Notable change |
|---|---|
| 1.14.4 | Per-tank sensor selector (Ultrasonic / mmWave) in tank detail with Active vs Queued indicator. Dashboard tank cards replace the duplicate last-seen pill with a moon-icon + compact sleep cadence (e.g. 5m). Matches rx-v2.8.6 + tx-v2.0.15. |
| 1.14.1 | Sensor-stuck warning chip on dashboard cards |
| 1.14.0 | Buzzer settings UI (matches rx-v2.8.0) |
| 1.10.5 | Multi-hub UX (hub picker, tank-card chip, Settings LoRa readout) |
| 1.10.4 | Hub↔cloud auto-reconcile |
| 1.10.1 | Adaptive threshold UI for low-water alerts |
| 1.9.0 | Six dashboard truthfulness fixes (mirrors rx-v2.7.5) |
| 1.8.4 | Bundled UX fixes (sign-drop, queued chip, mode badge, sleep formatting) |
| Version | Notable change |
|---|---|
| v0.8.0 | Buzzer switch + select + test_buzzer button + sensor-health binary sensors |
| v0.7.3 | Various polish |
| v0.7.x | HA core ≥ 2024.6 compatibility, config-flow improvements |
Minimum versions for features that span components:
| Feature | RX needs | TX needs | PWA needs | HACS needs |
|---|---|---|---|---|
| Basic operation | any | any | any | any |
| MAC-anchored tombstones | rx-v2.7.10 | tx-v2.0.11 | any | — |
| Buzzer | rx-v2.8.0 | — | 1.14.0 | v0.8.0 |
| Sensor-stuck detection | rx-v2.8.3 | — | 1.14.1 | v0.8.0 |
Sensor honesty (sensor_status byte) |
rx-v2.8.0 | tx-v2.0.12 | 1.14.1 | v0.8.0 |
| Bidirectional sensor selector (sr04 / ld2413) | rx-v2.8.6 | tx-v2.0.15 | 1.14.4 | — (data-only; no config entity) |
Diagnostic console (/api/logs) |
rx-v2.8.6 | tx-v2.0.15 | — | — |
| Pump SSR (planned) | rx-v3.0.0 | tx-v2.1.0 | 1.15.0 | v0.9.0 |
If you flash one component without bumping its companion, the older side just ignores the new fields (graceful degradation). No crashes.
Every release in that window was built with PROJECT_VER "2.7.13" hardcoded in CMakeLists.txt:4. The actual feature code was current, but the version string in esp_app_desc.version (flash offset 0x30) — which feeds the OLED, web UI footer, PWA Firmware page, and MQTT — all said "2.7.13".
Fixed in rx-v2.8.5 via the single-VERSION-file pattern. If you flashed any release in that window, the binary on disk reports the wrong version even though it's the right code. Re-flash with rx-v2.8.5 or later.
Pairing a second TX rotated the hub's NETID, silently orphaning the first one — its packets were sent on the old NETID, but the hub only listened on the new one. Fixed in rx-v2.7.10: NETID is generated once on the first-ever pair and stays put.
A defensive guard in the cloud reconcile path refused to accept an empty manifest from the hub, on the grounds that "an empty manifest is suspicious." But the legitimate Web UI "Clear all devices" flow produces exactly that. Fixed in rx-v2.7.13: defense against bad hub state lives in the hub itself ("don't publish if load_json failed"), not in cloud doubt.
| Surface | Where |
|---|---|
| Hub OLED | System screen of the carousel (3rd screen) |
| Hub web UI | Footer of every page |
| PWA | Settings → Firmware → "current: vX.Y.Z" |
| Home Assistant | sensor.<hub>_firmware_version |
| MQTT | Retained <hub>/status topic, firmware_version field |
The .bin file itself |
xxd -s 0x30 -l 32 <file.bin> |
If multiple sources disagree, the .bin's esp_app_desc.version (the xxd command above) is authoritative — it's what's compiled in.
Start here
Build it
Flash it
Use it
Reference