withings-sync on debian buster

Since Withings migrates to OAuth 2.0 by 2021-09, I felt it was time to update the flaky sync solution I had running so far.

Now running https://github.com/jaroslawhartman/withings-sync with debian’s virtualenv:

apt install virtualenv python3-virtualenv
virtualenv -p python3 withings-sync
source withings-sync/bin/activate
pip install withings-sync
export WITHINGS_USER=you
withings-sync

(get token, then set up a regular job to sync)

$ cat sync.sh
#!/bin/bash
source withings-sync/bin/activate
export WITHINGS_USER=you
export GARMIN_USERNAME=you-but-on-garmin
export GARMIN_PASSWORD=your-garmin-password
withings-sync
$ chmod 700 sync.sh
crontab -e
12 4 * * * cronic /home/you/sync.sh

Garmin: auto step

Thanks to

I’ve concluded that I need to disable that feature 🙂 My step counts fluctuate so heavily, and the algorithm is so basic, it’s basically impossible to meet step goals consistently. The most trivial optimization of auto step would be to take avg steps-beyond-goal into account when decreasing the goal, but it seems that’s not what it currently does.

garmin tracks heatmap

If you want to create your own heatmap – but lack a webserver – I’ve updated the script shared earlier to allow generating content to run on jsfiddle.

a screenshot of jsfiddle, with a heatmap of your garmin track locations

How to plot a heatmap of your Garmin tracks on Google Maps JS API:

#1 request all your data from Garmin: https://www.garmin.com/en-US/account/datamanagement/

#2 download https://github.com/musings-hub/garmin-fit-to-heatmap-js

#3 run it: python3 fit-to-js-threaded.py ./Garmin/fit/

This will generate a file named “heatmap-datapoints.js“.

#4 open heatmap-datapoints.js and copy the contents into jsfiddle (see screenshot above).

#5 update the javascript to include your own API key for Google Maps API (see https://developers.google.com/maps/documentation/javascript/get-api-key for how to get such a key if you don’t have one already).

#6 click “Run” in jsfiddle.

#7 admire the heatmap of your location based activities 😊

all garmin activities on a map

After further scouring through my data export from Garmin Connect (see https://www.musings.ch/2020/02/22/all-garmin-tracks-on-a-map/), I found ${username}_${index?}_summarizedActivities.json, which contains all activities I ever recorded. 😃

That one contains 468 usable startLongitude/startLatitude elements, which fits nicely into kml as Placemark and renders well on https://www.google.com/mymaps.

The resulting map:

all my Garmin activities anchored in a location, plotted on a map using kml Pacemarks

Which also works well zooming in:

zoomed in view of all my Garmin activities in a specific region

Again, drop me a note if you feel I could help you with any of this.

all garmin tracks on a map

garmin tracks plotted on a map of the world
everywhere in this world I’ve run, biked, hiked, skied, swum

Today I had some fun exporting all my recorded Garmin tracks and plotting them as a heatmap on Google Maps.

After having wanted to create a map like this for ages, I finally found some time to hack together the toolchain needed. If you want to do the same, the easiest way I’ve found was:

#1 Ask Garmin for an export of all your data: https://www.garmin.com/en-US/account/datamanagement/

#2 Use the fabulous https://github.com/polyvertex/fitdecode to extract the lat/longs of your tracks.

#3 Use the Google Maps heatmap API to plot the data: https://developers.google.com/maps/documentation/javascript/reference/visualization

Alternatively, drop me a line, and I’d be happy to help 🙂

You might wonder how to plot all your tracks on a map – which is what I initially started with. However, with 346 recorded activities, using kml to plot them (through various platforms) I found it difficult to navigate the result. – If you’d like to get your fit files converted to kml to play around with them, also drop me a note, I have a converter for that too.

A close up view (without adjusting radius, maxIntensity,.. so not optimal):

Zooming in, this is how the heatmap fits to specific routes beautifully.
close up view of the heatmap of a specific area

Update: I’ve uploaded the script to generate a javascript include on github: https://github.com/musings-hub/garmin-fit-to-heatmap-js 🙂

Update: I’ve updated the script to generate content to run on jsfiddle: https://www.musings.ch/2020/02/26/garmin-tracks-heatmap/