Releases: Techposts/TankSync
Release list
# TankSync v3.6.3 — the range & reliability overhaul
This one took a full day of live A/B testing on real walls and real floors, and it was worth it. I traced "it worked at long range in June, now it misses for hours" down to three independent bugs — and fixed all three. A link that delivered zero packets through two concrete floors before this release measures ~80% delivery after it, on the same hardware in the same spots.
What was wrong, and what's fixed
1. Network IDs outside the radio's supported range.
Pairing used to assign LoRa network IDs the RYLR998 doesn't actually support (the datasheet allows 3–15 and 18). Out-of-range IDs put the radio into undefined sync behaviour: packets dropped regardless of signal strength, and ACKs vanished one-way. New pairs now draw only valid IDs, and a transmitter stuck on an old out-of-range ID logs a clear error telling you to re-pair.
2. The radio was assumed ready, not verified.
Since v3.3.0 the transmitter power-gates its radio to save battery — but gave it only 50 ms to wake before sending. A module that wasn't ready meant the whole report cycle vanished silently. The transmitter now probes the radio until it actually answers, verifies its configuration by query, and after any failed delivery checks whether the module is even alive — so the logs finally tell you where a loss happened.
3. ACKs that never left the hub.
The hub fired its ACK and never checked whether the radio accepted it. Under channel congestion the module refuses the send (+ERR) — and the transmitter burned its whole retry ladder waiting for an ACK that was never transmitted. The hub now verifies every ACK transmission, retries once, and logs loudly if its downlink is deaf.
Range and delivery improvements
- Maximum forward-error correction (coding rate 4/5 → 4/8) on both ends. My A/B through two concrete floors: 0% → ~75–80% delivery at −76…−94 dBm. Costs a little airtime; irrelevant at a 5-minute reporting cadence.
- Smarter retries, battery-aware. Five fast retries, then one late retry ~50 s later — because a single fade swallows all back-to-back attempts, but rarely survives a minute. The late retry only runs when energy is free (mains, solar charging, or battery ≥ 30%); a low battery banks the energy instead.
- Transmit power can never silently drop. Power values are validated on both ends (a stale byte could previously leave a radio at 0 dBm — hub hears you, you never hear the hub). Hub power overrides now genuinely reach the transmitter too.
- Radio flash wear eliminated. The RYLR998 persists every config write to flash rated 200K cycles — per-wake rewrites were burning ~1,400/day. Config is now verified by query and written only on real change.
- ~0.5 mA transmitter standby. The radio is hard-gated during deep sleep with its own sleep mode; the boot probe absorbs the cold start on every wake.
- Health you can see.
lora_okin the hub API and on the round display, a radio self-heal loop instead of a deaf-until-reboot hub, the firmware version echoed in every boot and every sleep line, and module error codes surfaced in plain text.
Upgrading
- Update both the hub and your transmitters to v3.6.3 (OTA from the hub UI / app as usual). The new radio parameters propagate to the modules automatically.
- Then remove and re-pair each transmitter once. That single re-pair migrates the pair onto a valid network ID — the core range fix. Until you re-pair, things keep working as they did before.
- Fresh/blank boards: use the
-full.binimage for your board at offset0x0; the plain.binis the OTA app image.
Placement tip from this test day: a large metal surface behind the hub (antenna clear of it) acts as a reflector and measurably extends range — my hub lives on an iron gate and that mounting was worth more than any setting.
Downloads (every variant for this firmware version)
Transmitter — ESP32-C3 SuperMini
…-transmitter-lora-esp32c3-<tag>.bin— LoRa SKU (RYLR998 module)…-transmitter-lite-espnow-esp32c3-<tag>.bin— Lite SKU (ESP-NOW, built-in radio, no module)
Receiver / Hub
…-receiver-esp32-<tag>.bin— ESP32 DevKit…-receiver-esp32s3-<tag>.bin— ESP32-S3 SuperMini
Each variant ships two images:
- plain
.bin— OTA app image, flash at0x10000, or use the one-click browser flasher / in-app OTA. …-full.bin— full-flash image for a fresh/blank board, flash at0x0with esptool:esptool.py write_flash 0x0 <file>-full.bin.
TankSync v3.6.2
Receiver (hub) reliability + UX. Transmitter unchanged (version bumped in lockstep).
Fixes
- Data-loss guard (important): the hub could publish an empty tank manifest after a failed storage read (SPIFFS/OOM/corruption at boot), which the cloud honored by deleting all of a user's tanks. The registry now distinguishes "couldn't read" from "genuinely empty" and withholds the manifest when a load fails — so a transient read error can never wipe your tanks. Legitimate empties (first boot, factory reset, removing your last tank) are unaffected.
- OTA ring animation now actually runs. The full-ring update animation was gated on a status flag that was never set, so it had never displayed on any hub. It now shows during updates.
New
- Whole-ring status animations on the LED ring/strip, each a distinct colour: hub update = orange comet, transmitter update = magenta comet, pairing = cyan comet, first-time setup = blue breathing. Normal tank gauges are unchanged.
Also
- Transmitter: sensor +5V power gate is deferred past boot so sensor inrush can no longer brown out the ESP on battery (carried from the prior fix).
Downloads (every variant for this firmware version)
Transmitter — ESP32-C3 SuperMini
…-transmitter-lora-esp32c3-<tag>.bin— LoRa SKU (RYLR998 module)…-transmitter-lite-espnow-esp32c3-<tag>.bin— Lite SKU (ESP-NOW, built-in radio, no module)
Receiver / Hub
…-receiver-esp32-<tag>.bin— ESP32 DevKit…-receiver-esp32s3-<tag>.bin— ESP32-S3 SuperMini
Each variant ships two images:
- plain
.bin— OTA app image, flash at0x10000, or use the one-click browser flasher / in-app OTA. …-full.bin— full-flash image for a fresh/blank board, flash at0x0with esptool:esptool.py write_flash 0x0 <file>-full.bin.
# TankSync v3.6.1 — steadier lights, steadier readings
A hardening release for every hub and sensor I put on the bench this week. No new features — just three classes of "it sometimes misbehaves" hunted down to root cause and fixed for good.
Receiver (hub)
S3 hubs: LED ring/strip moved from RMT to SPI. The ESP32-S3's RMT peripheral has a silicon-level conflict with WiFi softAP cache activity that could crash the hub while it was hosting its setup network — and cause the occasional color glitch during normal use. The WS2812 driver now runs over SPI with DMA on S3 boards: the entire crash class is gone, and dimmed colors no longer shift hue at low brightness. ESP32 DevKit hubs keep their proven RMT path, unchanged.
The setup access point no longer disappears. If your router went down, the hub's fallback setup AP could become invisible or refuse connections — background reconnect attempts were muting the AP's beacons. The hub now probes for your router passively (a scan every 10 minutes) and only leaves setup mode once the router is genuinely back — and it never interrupts you while your phone is connected to the AP.
Round-display hubs: the LED ring now mirrors the screen. The 24-LED ring gauges whichever tank the dial is showing — including through the info screen — instead of splitting into confusing per-tank arcs. The empty portion of the ring stays fully dark. Tank screens rotate every 5 seconds; a tank in alert holds the screen longer.
Transmitter (sensor unit)
JSN-SR04M-2 ultrasonic modules now read reliably. Two real bugs, both found with a live bench rig:
- This sensor variant misses short trigger pulses — measured 17% response at the old 20 µs pulse vs 100% at longer pulses. The trigger is now 200 µs, which every supported sensor variant accepts.
- The trigger line floated during early boot while the sensor was already powered, so electrical noise fired the transducer continuously from the moment of wake (the rapid clicking some of you may have heard). The trigger is now pinned low before the sensor receives power.
Validated the boring way: a 43-burst soak with zero errors, 20 consecutive real deep-sleep wake cycles verified clean at the hub, and physical move-tracking accurate to ±1–2 cm.
Coordinator ("HA stick")
The headless Home Assistant coordinator build now compiles out the LED driver entirely — one less peripheral, zero RMT usage on the stick.
Flashing
- Fresh/blank device: use the
…-full.binfor your board at offset0x0. - Existing devices: update over the air from the hub web UI or the PWA as usual — OTA images are the non-
full.binassets.
Downloads (every variant for this firmware version)
Transmitter — ESP32-C3 SuperMini
…-transmitter-lora-esp32c3-<tag>.bin— LoRa SKU (RYLR998 module)…-transmitter-lite-espnow-esp32c3-<tag>.bin— Lite SKU (ESP-NOW, built-in radio, no module)
Receiver / Hub
…-receiver-esp32-<tag>.bin— ESP32 DevKit…-receiver-esp32s3-<tag>.bin— ESP32-S3 SuperMini
Each variant ships two images:
- plain
.bin— OTA app image, flash at0x10000, or use the one-click browser flasher / in-app OTA. …-full.bin— full-flash image for a fresh/blank board, flash at0x0with esptool:esptool.py write_flash 0x0 <file>-full.bin.
TankSync v3.6.0 — the HA coordinator arrives, plus major hub resilience fixes
New: Home Assistant coordinator firmware ("HA stick")
A new receiver SKU turns the S3 round-display hub board into a headless
Home Assistant coordinator — the Zigbee-stick model for the TankSync sensor
network. Plug it into the Home Assistant machine over its native USB port and
the sensor network appears locally: no WiFi, cloud account, or MQTT broker
required.
- Assets:
tanksync-receiver-esp32s3-cam-ha-v3.6.0.bin(OTA) and
…-full.bin(flash at 0x0). Flashing the-haimage onto an S3 CAM board
makes it a coordinator; flashing the display image makes it a display hub
again — same hardware, two products. - Speaks an open NDJSON serial protocol (see docs/coordinator-serial-protocol.md
in this repo): node discovery, live telemetry, pairing, rename, calibration,
and pump control with hub-side safety automation keeping precedence. - Pairs with SmartGhar Home Assistant integration v0.10.0 ("USB coordinator"
connection type), verified end-to-end on a live install. - Coordinator hubs update on their own OTA lane — a coordinator never pulls
the display image and vice versa. - The display build is unchanged and keeps its fast internal-RAM rendering.
Receiver (all hubs)
Fixed: hub could boot-loop while the home router was down
If the WiFi router went offline, the fallback path (setup access point +
captive portal) overflowed the system event task's stack, panicked, and
rebooted every ~13 seconds until the router returned. The event task stack is
now sized for the whole fallback chain, an mDNS startup failure degrades
gracefully instead of cascading, and the CAM moves mDNS to PSRAM entirely.
Improved: calm, reliable setup mode
Previously a hub that lost its router alternated its display between the
setup QR and "Connecting…" forever, and joining the setup AP could be
interrupted by background reconnect attempts. Fallback is now a steady state:
the setup AP and QR stay up, the hub quietly retries the saved network every
30 seconds, defers retries entirely while someone is connected to the setup
AP, and tears the AP down cleanly the moment the home network returns.
Improved: internal-memory robustness (the OOM class is closed)
The MQTT client's task memory is reserved at boot and handed over at start
(its startup can no longer lose the RAM race); every runtime task creation is
checked — reboot and factory-reset always execute, a failed OTA start reports
"reboot and retry" instead of silently doing nothing; and the hub now logs an
internal-RAM budget line at boot, warns when the pool runs low, and exposes
heap_internal_free / heap_internal_largest in /api/system for remote
diagnosis.
Transmitter
No functional changes since v3.5.3 (version moves in lockstep with the
combined release).
Assets
Per-variant OTA app images (…-v3.6.0.bin) and full-flash images
(…-v3.6.0-full.bin, flash at 0x0). Full-flash erases WiFi/pairing settings —
use the OTA image to update a provisioned device.
Downloads (every variant for this firmware version)
Transmitter — ESP32-C3 SuperMini
…-transmitter-lora-esp32c3-<tag>.bin— LoRa SKU (RYLR998 module)…-transmitter-lite-espnow-esp32c3-<tag>.bin— Lite SKU (ESP-NOW, built-in radio, no module)
Receiver / Hub
…-receiver-esp32-<tag>.bin— ESP32 DevKit…-receiver-esp32s3-<tag>.bin— ESP32-S3 SuperMini
Each variant ships two images:
- plain
.bin— OTA app image, flash at0x10000, or use the one-click browser flasher / in-app OTA. …-full.bin— full-flash image for a fresh/blank board, flash at0x0with esptool:esptool.py write_flash 0x0 <file>-full.bin.
TankSync v3.5.3 — hub self-provisioning reliability (S3 CAM) + TX battery-sense fix
Receiver (hub)
Fixed: round-display (S3 CAM) hubs could never link to the cloud
A fresh CAM hub added from the app would show as linked in the app but never
start publishing — it silently never fetched its cloud credentials. Root cause
was two back-to-back out-of-memory failures in internal RAM during startup,
both invisible in the logs:
- The cloud-credentials poll task failed to start (its 8 KB stack could not be
allocated once WiFi + display were up) and the failure was swallowed, so the
hub never asked the cloud for its broker credentials. The task stack is now
reserved at link time (static), the create result is checked, and the poll is
re-kicked on every WiFi connect and every 5 minutes until linked. - Once credentials did arrive, the MQTT client's own task could fail to start
the same way, leaving the hub stuck on "connecting" forever. A failed start
now tears down cleanly and retries automatically.
The CAM build also frees ~12.8 KB of internal RAM (WiFi static TX buffers
16→8) so both tasks have real headroom. Verified on hardware: three
unlink→reboot→fresh-provision cycles, broker-connected within ~10 seconds of
boot each time, plus automatic recovery without a reboot.
Improved: provisioning is now diagnosable from /api/logs
The credentials poll logs its startup (with internal-heap numbers), every
"not claimed yet" poll, and any failure — a hub that won't link now says why.
Transmitter
Fixed: false battery-critical hibernation on mains/bench units
The battery-present threshold rises from 1000 mV to 2000 mV so noise-level
INA219 readings (~36 mV, or spurious ~1 V) on units running without a battery
no longer trigger battery-critical hibernation. Real LiPo packs (3.0-4.2 V)
are unaffected.
App (PWA 1.19.1, deploys separately)
- The "Open hub & connect" one-tap handoff now accepts the hub's IP address
(shown on the hub's display) — Android phones cannot resolve the
tanksync-xxxx.localfallback address, which made the button appear to do
nothing.
Assets
Per-variant OTA app images (…-v3.5.3.bin) and full-flash images
(…-v3.5.3-full.bin, flash at 0x0). Full-flash erases WiFi/pairing settings —
use the OTA image to update a provisioned device.
Downloads (every variant for this firmware version)
Transmitter — ESP32-C3 SuperMini
…-transmitter-lora-esp32c3-<tag>.bin— LoRa SKU (RYLR998 module)…-transmitter-lite-espnow-esp32c3-<tag>.bin— Lite SKU (ESP-NOW, built-in radio, no module)
Receiver / Hub
…-receiver-esp32-<tag>.bin— ESP32 DevKit…-receiver-esp32s3-<tag>.bin— ESP32-S3 SuperMini
Each variant ships two images:
- plain
.bin— OTA app image, flash at0x10000, or use the one-click browser flasher / in-app OTA. …-full.bin— full-flash image for a fresh/blank board, flash at0x0with esptool:esptool.py write_flash 0x0 <file>-full.bin.
TankSync v3.5.2
Two receiver-side fixes on top of v3.5.1. Transmitter and receiver are versioned
together, so both are rebuilt.
What's fixed
- The hub's web server ran out of URI-handler slots (cap 60, but the full API
surface is 62), so two buzzer endpoints failed to register at boot and buzzer
web config/test didn't work. Raised the cap to 72 — all endpoints register now,
with headroom to spare. - The ESP32-S3 CAM hub now has its own over-the-air update channel. It shares the
esp32s3 chip target with the S3 SuperMini, so it was asking for the SuperMini
image on update — which has the wrong pins, PSRAM mode and partitions for the
CAM. The CAM now pulls its own image (and the SuperMini still pulls its own),
so each board self-updates to the correct firmware.
Assets — two images per board (OTA app + full-flash), same set as v3.5.1:
receiver-esp32 (DevKit), receiver-esp32s3 (SuperMini), receiver-esp32s3-cam
(round-display CAM), transmitter-lora-esp32c3, transmitter-lite-espnow-esp32c3.
Flashing a blank board:
esptool.py --chip <esp32|esp32s3> -p write_flash 0x0 <...-full.bin>
Downloads (every variant for this firmware version)
Transmitter — ESP32-C3 SuperMini
…-transmitter-lora-esp32c3-<tag>.bin— LoRa SKU (RYLR998 module)…-transmitter-lite-espnow-esp32c3-<tag>.bin— Lite SKU (ESP-NOW, built-in radio, no module)
Receiver / Hub
…-receiver-esp32-<tag>.bin— ESP32 DevKit…-receiver-esp32s3-<tag>.bin— ESP32-S3 SuperMini
Each variant ships two images:
- plain
.bin— OTA app image, flash at0x10000, or use the one-click browser flasher / in-app OTA. …-full.bin— full-flash image for a fresh/blank board, flash at0x0with esptool:esptool.py write_flash 0x0 <file>-full.bin.
TankSync v3.5.1
A reliability release on top of v3.5.0 — it fixes cloud OTA on the round-display
S3 CAM hub, makes app-to-hub linking dependable again, and promotes the S3 CAM to
a first-class, CI-built board. Transmitter and receiver are versioned together.
What's fixed
- Cloud OTA over HTTPS now works on the ESP32-S3 CAM hub. The TLS handshake was
running out of internal RAM (framebuffer + Wi-Fi already there); mbedTLS now
allocates from PSRAM, so the update check completes instead of failing to
connect. - App-to-hub linking is dependable again. The app now carries the hub's
provisioning token through every path (QR, setup URL, and on-network
discovery), so a freshly added hub actually receives its cloud credentials
instead of showing "added" while staying unlinked. When a hub can't be linked
automatically, the app now says so honestly and offers a one-tap "Open hub &
connect" handoff that fills the broker settings in for you.
What's new
- The ESP32-S3 CAM (N16R8, 16 MB flash / 8 MB octal PSRAM) round-display hub is
now built and published automatically like every other board, with its own
full-flash and OTA images. It carries 90 days of on-device history (10-minute
resolution) and the full display lifecycle (setup → connecting → connected →
tanks).
Assets — two images per board
- ...--v3.5.1.bin OTA app image (what the app/cloud pushes over-the-air)
- ...--v3.5.1-full.bin full-flash image (esptool @ 0x0, for a blank board)
Boards: receiver-esp32 (DevKit), receiver-esp32s3 (SuperMini),
receiver-esp32s3-cam (round-display CAM), transmitter-lora-esp32c3,
transmitter-lite-espnow-esp32c3. Legacy-named aliases are included so already
deployed units keep updating across the naming change.
Flashing a blank board:
esptool.py --chip <esp32|esp32s3> -p write_flash 0x0 <...-full.bin>
Downloads (every variant for this firmware version)
Transmitter — ESP32-C3 SuperMini
…-transmitter-lora-esp32c3-<tag>.bin— LoRa SKU (RYLR998 module)…-transmitter-lite-espnow-esp32c3-<tag>.bin— Lite SKU (ESP-NOW, built-in radio, no module)
Receiver / Hub
…-receiver-esp32-<tag>.bin— ESP32 DevKit…-receiver-esp32s3-<tag>.bin— ESP32-S3 SuperMini
Each variant ships two images:
- plain
.bin— OTA app image, flash at0x10000, or use the one-click browser flasher / in-app OTA. …-full.bin— full-flash image for a fresh/blank board, flash at0x0with esptool:esptool.py write_flash 0x0 <file>-full.bin.
TankSync v3.5.0 — ESP32-S3 CAM hub, on-device history, full display lifecycle
Receiver (RX)
New — ESP32-S3-WROOM N16R8 CAM hub (TankSync V4-RX)
- New round-display production hub board profile (built with
-DBOARD_S3_CAM=1):
8 MB octal PSRAM, 16 MB flash, UART0 console. DevKit + S3 SuperMini unchanged. - The CAM binary is attached here as
tanksync-receiver-esp32s3-cam-v3.5.0[.|-full.]bin.
New — on-device local history (S3)
- 90-day @ 10-min per-tank time series held in PSRAM, snapshotted hourly to an
~11 MB LittleFS partition; survives reboot; keyed by transmitter MAC.
New — full GC9A01 display lifecycle
- Boot → Wi-Fi setup (real SSID + 192.168.4.1 + a Wi-Fi-join QR) → Connecting →
Connected/IP → No-tanks (with hub IP) → tank dials → device-info, plus pairing
and a per-tank 7-day history sparkline. Previously the round display only ever
showed no-tanks / running.
Fixed
- GC9A01 render task could silently fail to start (RGB "TV static") when internal
RAM fragmented late in boot — its 16 KB stack is now reserved early and the task
is created statically.
Transmitter (TX)
- Version-only bump to keep tx + rx aligned (no functional change).
Assets
Every variant ships an OTA app .bin (flash @ 0x10000) and a -full.bin
(flash @ 0x0). RX: esp32 (DevKit), esp32s3 (SuperMini), esp32s3-cam (V4-RX).
TX: esp32c3 lora + lite (ESP-NOW).
Downloads (every variant for this firmware version)
Transmitter — ESP32-C3 SuperMini
…-transmitter-lora-esp32c3-<tag>.bin— LoRa SKU (RYLR998 module)…-transmitter-lite-espnow-esp32c3-<tag>.bin— Lite SKU (ESP-NOW, built-in radio, no module)
Receiver / Hub
…-receiver-esp32-<tag>.bin— ESP32 DevKit…-receiver-esp32s3-<tag>.bin— ESP32-S3 SuperMini
Each variant ships two images:
- plain
.bin— OTA app image, flash at0x10000, or use the one-click browser flasher / in-app OTA. …-full.bin— full-flash image for a fresh/blank board, flash at0x0with esptool:esptool.py write_flash 0x0 <file>-full.bin.
v3.4.0 — unified release: board-named assets, full-flash images, per-chip OTA
First combined transmitter + receiver release under a single version tag.
Device firmware is functionally identical to 3.3.0 (verified booting on
ESP32 DevKit hardware); this version reworks how releases are built, named,
and delivered.
What's new
- Every binary carries its board in the filename:
tanksync-receiver-esp32-v3.4.0.bin (ESP32 DevKit),
tanksync-receiver-esp32s3-v3.4.0.bin (ESP32-S3 SuperMini),
tanksync-transmitter-lora-esp32c3-v3.4.0.bin (LoRa),
tanksync-transmitter-lite-espnow-esp32c3-v3.4.0.bin (Lite / ESP-NOW). - Each variant ships an OTA app image (.bin) AND a full-flash image
(…-full.bin) for blank boards (esptool write_flash 0x0). - The receiver pulls the OTA image matched to its own chip (DevKit vs S3),
so the two never cross-flash.
Compatibility
- Existing hubs and transmitters keep updating: each fielded variant is also
published under its previous asset name (legacy alias), so devices on older
firmware still find their update. Aliases retire in a later release.
Downloads (every variant for this firmware version)
Transmitter — ESP32-C3 SuperMini
…-transmitter-lora-esp32c3-<tag>.bin— LoRa SKU (RYLR998 module)…-transmitter-lite-espnow-esp32c3-<tag>.bin— Lite SKU (ESP-NOW, built-in radio, no module)
Receiver / Hub
…-receiver-esp32-<tag>.bin— ESP32 DevKit…-receiver-esp32s3-<tag>.bin— ESP32-S3 SuperMini
Each variant ships two images:
- plain
.bin— OTA app image, flash at0x10000, or use the one-click browser flasher / in-app OTA. …-full.bin— full-flash image for a fresh/blank board, flash at0x0with esptool:esptool.py write_flash 0x0 <file>-full.bin.
TankSync Transmitter v3.3.0 — deep-sleep current fix (~15x lower standby)
This release fixes the transmitter's deep-sleep power draw, taking standby from
~3 mA down to the chip's floor and turning a ~1-2 week unaided runtime into
multi-month battery life.
What was wrong
- On the ESP32-C3, gpio_deep_sleep_hold_en() keeps the RTC_PERIPH power domain
powered so it can latch GPIO states through sleep — and that domain draws
~2.4 mA continuously. The TX paid that tax the entire time it slept.
The fix
- Drop the deep-sleep GPIO hold entirely. The gates are driven to their OFF
level before sleep; the board's external gate pull-resistors hold the FETs off
once the pads isolate, so loads stay cut without the costly hold. - The wake-side hold-release is kept, so a unit updating from older
(hold-using) firmware cleanly releases any latched holds on its first wake. - Power down the USB-Serial-JTAG PHY before sleep (small extra saving).
Measured
- Deep sleep: ~2.42 mA with the old hold, ~47 uA without it. Whole transmitter
board ~190 uA (the always-on INA219 fuel-gauge + boost idle set that floor). - Overnight soak: both bench tanks stayed online ~17 h with zero faults and the
battery held flat — confirming the drain in practice, not just on a meter.
Battery life now scales with the reporting interval: roughly 2-2.5 months at the
300 s default on a 2900 mAh cell, ~4-6 months at 600-900 s, and effectively
indefinite with modest solar.
Also in this build
- LD2413 24 GHz radar level-sensor driver now reading on hardware (alternative
to the ultrasonic; select per-TX with SENSOR=ld2413).
Pairs with rx-v3.3.0. Update via the TX's WiFi-AP OTA (hold BOOT to enter update
mode) or re-flash over USB.
Downloads (every variant for this firmware version)
…-transmitter-<tag>.bin— Transmitter, LoRa (RYLR998 module)…-transmitter-lite-<tag>.bin— Transmitter, Lite / ESP-NOW (built-in radio, no module)…-receiver-<tag>.bin— Hub, ESP32 DevKit…-receiver-s3-<tag>.bin— Hub, ESP32-S3 SuperMini
Only the variants for this firmware are present. Flash at 0x10000 with esptool, or use the one-click browser flasher.