DEV Community

BreakFinderSurf
BreakFinderSurf

Posted on Originally published at breakfinder.surf

Fourteen Days at La Pared, Building Wave Detection in the Water

Originally published on breakfinder.surf.

I'm Philipp, I surf the Baltic out of Flensburg and I'm the dev behind BreakFinder, a surf tracker for smartwatches. I recently spent 14 days at La Pared on the west coast of Fuerteventura. Most mornings I surfed. Most evenings I sat with the data from that session and tried to work out why my own app had counted what it counted.

The short version of this trip has come up in a few places already. This is the long one, session by session, with the bugs in the order they showed up. I'll explain them the way I'd explain them in the car park, without code.

Three watches on me at once

The setup looked a bit silly. A Garmin Instinct 2S on my left wrist, close to the hand. A Galaxy Watch running Wear OS higher up on the forearm. An Amazfit T-Rex Ultra on Zepp OS on my right wrist. Each one ran its own port of the same detection rules.

The idea behind it was simple. If all three follow the same rules and I'm the only one riding, they should agree. Whenever they didn't, at least one of them was wrong, and the other two usually pointed at which one.

There was no Apple Watch on my arm. The Apple Watch version got the same fixes as the others, but I didn't test it in the water at La Pared, so I won't pretend I did.

The first session told three different stories

After the first session with all three watches, they disagreed badly. The Galaxy Watch mostly counted my paddling as waves. The Garmin counted almost nothing but things that weren't waves. The Amazfit counted too few. None of them matched what I had actually ridden.

Going through the tracks that evening, I found three causes. When you paddle, your arm swings, and on the wrist that creates short spikes in speed. To the watch, a spike looked like the start of a ride. Then a clean, even ride sometimes got thrown out for being "too flat", because the rules expected a ride to be bumpier. And a hard paddle into a wave could switch the watch into riding mode and never properly switch it back. The cooldown after that swallowed the real take-off.

The fix became the heart of the new detection. A wave only counts if you actually glide towards the beach for a short stretch. Paddling out to sea doesn't count, and a speed spike on its own isn't enough. I call that part the ride core.

Honestly, that was the biggest lesson of the whole trip. To a watch, paddling looks a lot like surfing. Speed alone can't tell them apart. Direction plus a bit of distance can. I wrote about how wave counts go wrong on watches in general in an older post on why Garmin counts 47 waves, but sitting in the line-up with three of them on me made it a lot more concrete.

When the GPS shows up late

The next session had a different problem. The Galaxy Watch missed most of the rides I could clearly see in the other two tracks. Its GPS points came in bundles and late. By the time the watch knew I was moving fast, the moment to decide was already over. The Garmin had its own trouble that day, it hardly got a GPS fix at all while my arm was under water.

So the watch now looks further back before the start of a wave, and it accepts GPS points that arrive late. On Wear OS I also asked the system for location updates that don't get batched. While I was at it, I loosened the thresholds a little for slower, smaller waves. Those are the waves beginners ride, and the ones I get at home on the Baltic. They were falling through before.

The day of small, mean bugs

The third session was the one where everything weird came out at once.

A paddle attempt that the watch rightly rejected kept it locked for a while afterwards. The real wave came exactly in that window and wasn't counted. Now the lock after a rejected attempt is short.

The Garmin counted one paddle-out twice, because its second "wave" reused the GPS points of the first. Now the watch can't look back past the end of the previous candidate, and paddling back out is recognised more strictly as going the wrong way.

The Galaxy Watch kept losing GPS under water for minutes at a time. Its GPS quality check then blocked rides it should have counted. Now that check only steps in when reception stays bad for a long time, and it lets go faster.

The Amazfit had two of its own. Gaps of several seconds in the GPS broke the check at the start of a ride. And the session got split in two, most likely because the wet screen registered phantom touches. One surf now stays one session, the water lock holds in the sea, and you unlock by tapping a dot, so no buttons are needed.

And the Garmin had been treating old or missing speed values as if they were live. Now only fresh GPS fixes count, and a missing speed value is neutral.

Each of these came out of one session and was fixed before the next one.

A tool for the evenings

That same day I built a small tool that I've kept around since. It takes the tracks from all three watches and works out, by consensus, when the real rides happened. I checked it against the waves I remembered from that session, and every one of them was on its list. It also found rides I hadn't remembered at all.

That changed the evening loop. Before, I was comparing three watches with my memory. After, I compared each watch with the other two plus my memory, which is much harder to fool. I could see which watch had missed a wave and which one had made one up.

Late triggers, jumping GPS and split waves

The fourth session brought a new batch, and by now I knew where to look.

The Galaxy Watch sometimes only noticed a ride well after it had ended, and its look-back was too short to reach the start. The look-back is longer now, on every platform. On the Amazfit, a single GPS jump while paddling out looked like a fast ride. Peak speed now comes from positions over a couple of seconds instead of one reading. The Garmin made false counts on the paddle-out when it had too few GPS points to go on. A ride without enough GPS points no longer counts as a wave. And one wave got cut into two pieces and counted twice. Two pieces right after each other are now merged into one wave.

The two ideas I threw out

Not everything I tried that day stayed in.

The first idea was GPS as an extra trigger. If the motion sensors miss a ride but the GPS clearly shows one, count it anyway. In practice it counted way more waves than I remembered riding. Out.

The second was a rule that a wave only counts if you paddle back out afterwards. It sounded logical to me, because after a ride you go back out. In the data it cost real waves, so it went too.

I'll admit I was pretty sure about both before I tried them. Having the three-watch consensus to check against is what made it easy to let them go.

The last days

In the days after that the changes got smaller. A track from the Amazfit led to a guard against single big GPS jumps. Around the same time the Garmin had trouble sending sessions with a lot of waves to the phone, which is now fixed by uploading them in pieces. The Instinct 2S now asks for just one satellite setting instead of switching around.

One of the three-watch sessions became a test case. Every change I make to the detection from now on gets replayed against it, so I'll notice if I break something I already fixed.

The latest change so far deals with quiet paddling that still looked like a wave. A wave now needs a moment of real movement energy, a push or a burst of acceleration. A very soft wave can fall through because of that. That's a deliberate choice. I'd rather miss that one than count paddling again.

What surfing with three watches taught me

GPS under water is normal. Every time your arm goes under, the fix drops, comes back late or jumps. Any rule that only works with a clean GPS signal will break in the first session, so everything has to survive gaps and jumps.

My memory is a decent reference for the waves I liked and a bad one for the rest. Three watches agreeing with each other filled in the waves I'd forgotten. I wouldn't trust a single watch for that, and I wouldn't trust myself alone either.

None of these bugs would have shown up at a desk. A wet screen that taps itself, or a rejected paddle that blocks the next wave. Every single one needed a real session at a real beach to appear. If you want to know what La Pared itself is like on a given day, the La Pared spot page has the forecast.

And throwing things out is part of the work. The two ideas I dropped felt clever and made the counts worse.

By the end of the 14 days the watches were counting the way the session felt to me. That was the whole point of the trip, and it worked out really well.

The plain disclosure

It's my blog, so this is probably obvious, but I'll say it once: I'm the dev of BreakFinder, and everything above is about my own app. It runs on Garmin, Apple Watch, Wear OS, Amazfit and Huawei watches, with one history across all of them. It's free to download with an optional premium tier. Links are at breakfinder.surf.

If your watch counts your paddling as waves, send me the session. That's exactly the kind of data that made this trip useful.

Top comments (0)