-
Notifications
You must be signed in to change notification settings - Fork 9
Firmware Versions
Release history + notable changes per binary. Per-binary versioning means RX, TX, PWA, and HACS evolve independently — no system-wide "TankSync vX.Y.Z" number.
Tag scheme:
rx-vX.Y.Z→ receiver hub firmware (ESP32 DevKit)tx-vX.Y.Z→ transmitter firmware (ESP32-C3 SuperMini)rxc3-vX.Y.Z→ receiver hub firmware (ESP32-C3 variant)Discipline: Every release event ships BOTH RX and TX paired (even if one binary has no functional change — it gets a patch bump for parity). Annotated tags only, with full Markdown release notes. The version string in the binary (
esp_app_desc.versionat flash offset 0x30) always equals the GitHub Release tag.
| Version | Notable change |
|---|---|
| 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