The Battery Test: Runtime Is a Dial, Not a Number
The range test cleared its bar, which left the other criterion that could quietly kill this whole thing: battery. The pitch I wrote in the PRD was a tracker you don't charge constantly — and a tracker you charge every other day is a tracker that ends up dead in a drawer. So the scorecard set two hard numbers: ≥ 3 days of active beaconing, ≥ 2 weeks in idle/presence mode.
Reading the battery without a meter
I expected to babysit a multimeter for this. I didn't have to. Meshtastic logs Device Metrics on every node — battery %, voltage, channel utilization, air utilization — on an interval, and the app graphs them. So I just left both nodes running and read their own telemetry back. Two runs worth comparing: the range-walk day, where I had everything cranked, and a plain ~24-hour sit afterward.
The collar — the unit that actually has to last
![]()
After 22 hours 56 minutes of uptime the collar read 73% at 3.92 V, having started the day in the high-90s. That's roughly 1% per hour, which projects to 3.5–4 days on a charge — and at the 72-hour mark it still has about a quarter of the battery left. It clears the three-day bar with margin. Channel utilization sat at 7.1% and air at 3.7%, well under the levels where the mesh starts throttling, so it isn't burning the budget fighting for airtime either.
…and then the same collar lasted ten hours
Here's the honest counterweight. On the range walk, with the position interval forced to 60 seconds and the OLED lit the whole time, the same unit went from 97% to 66% in three hours — about 10% an hour, ~10 hours to empty. Same board. Same 3000 mAh cell. Eight times the drain, set entirely by how hard I was working it.
So the battery doesn't have a runtime. It has a runtime per mode:
Why the dial works
The radio sleeps almost all the time. What costs energy is the wake-ups — spinning up the GPS for a fix and keying the LoRa transmitter — plus, on this handheld, an OLED that has no business being on a collar. Average current is the sleep floor plus the area of those spikes. Stretch the interval, kill the screen, duty-cycle the GPS, and the average collapses toward the floor:
That's the whole reason the production collar is headless and will duty-cycle its GPS hard: it lives on the favorable end of that dial by design, not by luck.
A gut-check that the gauge isn't lying
Two independent readings, two voltages: the collar at 73% / 3.92 V, the base at 59% / 3.80 V. Both sit right where a lithium cell's discharge curve says they should — 3.9 V is high-70s, 3.8 V is high-50s. The firmware's percentage and the raw voltage agree, which means I can trust the number on the graph instead of second-guessing it.
The base barely moved
![]()
The base is a different animal — it mostly listens, and receiving is cheap next to transmitting. Its battery line is nearly flat across the day, which is idle-mode territory all on its own. And the base gets to cheat anyway: in real life it's plugged into the wall at home. The collar is the only node with a hard power budget.
What this still doesn't tell me
Two caveats keep me honest. First, these are the handheld Wio units, with screens — the production RAK collar drops the display draw entirely and can sleep the GPS harder, so it should beat everything here. Second, I've shown active clears three days, but I have not yet proven the two-week idle target; the base hints at it, but a hint isn't a measurement.
For that I need the spikes and the sleep floor in real milliamps, not a percentage that ticks once a minute. That's a job for a bench meter — a Nordic Power Profiler Kit II, which sources the board and measures current from nanoamps to amps. With it I can read the deep-sleep floor, integrate the energy in a single GPS-fix-and-transmit spike, and project each mode honestly instead of eyeballing a slope. It's on the way.
The verdict, against the scorecard
| Battery criterion | Target | Result |
|---|---|---|
| Active beaconing → runtime | ≥ 3 days | ~3.5–4 days — pass |
| Idle / presence → runtime | ≥ 2 weeks | Looks low-drain; bench measurement to confirm |
Active passes. Idle is pointing the right way but isn't nailed down. And the real lesson is the one in the title: the lever that makes or breaks runtime isn't a bigger battery — it's firmware, the duty cycle, the dial. Which is good news, because firmware is the cheapest thing on this whole project to change.
Next: the bench numbers, GPS fix quality, and the test I actually care about — putting it on Quark.