Garmin Connect Workout and Schedule creator

Last Updated on 22 juni 2023 by Syds

Garmin Connect workout and schedule creator

Onlangs een Garmin Forerunner 955 Solar sporthorloge aangeschaft. Een zogenaamd multisport horloge, bij uitstek geschikt om mij te helpen voorbereiden op een triathlon. Tijdens de corona periode is het sporten er een een beetje bij gebleven, maar het plan is om in july een triathlon (Olympische afstand) te gaan doen.

Voor het trainen voor die triathlon gebruik ik trainingsschema’s van de Nederlandse Triathonbond, te vinden op https://www.triathlonbond.nl/kenniscentrum/trainingsschemas/

Om die trainingsschema’s met behulp van de Garmin Connect app, of via de Garmin Connect website, in te voeren is een behoorlijke klus. Dat moet makkelijker kunnen dacht ik. Op Github vond ik hiervoor diverse medestanders, maar geen van de tools die ik daar vond waren geschikt voor multisport. Wel vond ik hier een voorbeeld van een “turbotaal” voor het definieren van een workout. Het idee werd geboren om zelf een python script te gaan bouwen voor het kunnen intrepreteren van een workout geschreven in turbotaal, op basis van die workout een json file te creeren die voldoet aan de Garmin specs, die json file te importeren in Garmin Connect en ten slotte de workout te agenderen in je Garmin Connect agenda.

Een paar kanttekeningen vooraf:

  • Garmin Connect beschikt over API’s, echter de toegang tot de ontwikkeldocumentatie en de specs van die API’s is voorbehouden aan bedrijven. Bij gebrek aan die documentatie heb ik ervoor gekozen om webscraping technieken te gaan gebruiken voor het uploaden van workouts en schedulen van een workout. Dit is uiteraard kwetsbaar en onderhoudsgevoelig. Ik gebruik zelf de software wekelijks, dus als Garmin wijzigingen doorvoert in het Garmin Connect platform die de werking van de workout and schedule creator raken, dan probeer ik die zo snel mogelijk te fixen. Loop jij tegen een probleem aan, meld dan een issue op de Github pagina.
  • De workout and schedule creator bevat geen syntaxcontrole op de workout beschrijving, je zult dan ook geen foutmeldingen zien als je een typfoutje hebt gemaakt. Ook niet als geprobeerd wordt de workout te importeren in Garmin Connect. Indien een workout niet succesvol ingelezen kan worden, dan stopt het script simpelweg. Corrigeer de typfout, en probeer het opnieuw.
  • Garmin Connect beschikt niet over een importfunctie van workouts, een extension in Chrome genaamd “Share your Garmin Connect workout” maakt dit wel mogelijk. Het is niet nodig om die extension vooraf te installeren. Python library’s Selenium/Helium (Webscraping) starten Chrome is zogenaamde “Testmodus” waardoor eventuele geinstalleerde extensions niet beschikbaar zijn. De workout and schedule creator zorgt er zelf voor dat de extension geactiveerd wordt.

Benodigd and up-and-running

  • Python 3.10.7 of hoger
  • Garmin Connect account
  • Chrome 111.0.5563.147 of hoger
  • Microsoft Excel, versie 2208 of hoger

Github

De workout and schedule creator is te downloaden vanaf Github (https://github.com/sydspost/Garmin-Connect-Workout-and-Schedule-creator), werkwijze:

git clone https://github.com/sydspost/Garmin-Connect-Workout-and-Schedule-creator.git

Turbo taal

Zoals gezegd heb ik een turbo taal ontwikkeld die je in staat stelt zeer complexe workouts met evt. hartslagzones, hartslag per minuut, te verbranden calorien, cadans aanduidingen en herhalingen te maken. Hieronder de specificatie van die turbotaal:

0-9 defines distance or time, f.e. 100m(eter) or 15:30 minutes
c    indicator hat the numbers before the “c” are calories, f.e. 100c means burn 100 calories with this workoutstep
m    indicator that the numbers before the “m” is a distance, f.e. 100m
r    indicator that the number before the “r” is the number of itterations of a workoutstep, f.e. 10r means 10 push-ups
:    indicator that the 2 numbers before and after the “:” are a time-definition, f.e. 15:30
Z    zone, f.e. Z0 for Zone zero
*    indicator that the number after the “*” indicates the number of iterations of the repeat group
!    indicator that the digits after the “!” indicate the Stroketype or Steptype, f.e. !SS is stroketype “Schoolslag” (dutch for breaststroke)
     or !WUP for steptype ‘Warming up’
@    indicator that the digits after the “@” indicate a Zone, KGR (Weight), RPM or BPM, f.e. 7kgr of 100bpm or 80rpm
&    indicator that the digits after “&” indicate an excercise, f.e. push-up
(    start of a repeat group, f.e. (100m!SS + 00:20!RUST) * 2 (RUST is dutch for Rest)
)    end of a repeat group
+    next workoutstep
#    end of line (optional)

Enkele voorbeelden:

Swimming: 300m!ES@Z1 + (200m!BC@Z1 + 50m!SS + 00:20!RUST)*4 + (25m!BC@Z3)*6 + 250m!SS

staat voor 300 meter vrijeslag in Zone 1 + 4 x (200 meter Borstcrawl in Zone 1 + 50m Schoolslag + een pauze van 20 seconden) + 6 x (25m Borstcrawl in Zone 3) + 250 meter Schoolslag

Running:   15:00!WUP + (05:00@Z2 + 03:00!RUST) * 4 + 10:00@Z1 + (01:00@Z3 + 01:00!RUST) * 3 + 15:00!COOL

staat voor 15 minuten Warmingup + 4 x (5 minuten in Zone 2 + 3 minuten rust) + 10 minuten in Zone 1 + 3 x (1 minuut in Zone 3 + 1 minuut rust) + 15 minuten Cooling down

Cycling:     90:00@Z1@100rpm

staat voor 90 minuten in Zone 1 met een cadans van 100 rpm

Pilates:      10r!WUP&SA + 00:10&3WWCF + 100c!COOL&FP

staat voor 10 herhalingen van oefening Stretch Abs als Warming up + 10 seconden de oefening 3 Way Weighted Calf Raise + 100 calorien verbranden met de oefening Face Pull als Cooldown

Excel sheet

De workouts definieer je in een Excel sheet. Hieronder eerst een beschrijving van de 3 verplichte werkbladen, de werking van de workout and schedule creator is afhankelijk van de werkblad namen, dus verander die niet.

The worksheet “Schedule” contains the following columns:

  • Date: Date for scheduling the workout in your Garmin Connect Calendar
  • Workout: Lookup field for a defined workout in the Workout worksheet
  • Comments: Commenting your Workout, this comment is also visible in your Garmin Connect Workout. Max. 512 characters

The worksheet “Workout” contains the following columns:

  • Name: Name of the workout, max. 80 characters
  • sportType: Type of sport. Important to add also this sportType to the worksheet workoutType (explained hereunder)
  • Description: The workout description based on the workout creator language as explained here above

The worksheet “workoutType” contains the following columns:

  • Name: Short name of the workout type
  • Value: Reference to the Garmin Connect API definitions f.e. swimStrokeType, stepTypeId of sportTypeId. Access to the Garmin API documentation is only granted to professional developers, so getting these values is only possible via reversed engineering. So define a workout with the appropiate sport type, step type and/or swimstroke type. Export this workout to json format and open the downloaded file in a editor/viewer. Determine the appropiate values for sportTypeId, stepTypeId or swimStrokeTypeId or other Id’s and coupled workoutType
  • apiType: definition of the Id type, f.e. sportTypeId or stepTypeId etc.
  • workoutType: definition of the workoutType or excercise, also use reversed engineering to find out the appropiate values
  • category: category of the excercise, also use reversed engineering to find out the appropiate values
  • Description: Free description, is not used by the workout creator

Werkwijze om een nieuwe sport en/of oefening toe te voegen. stel je wil Biljarten als sport toevoegen met daarbij de oefening butage. Voeg hiervoor een rij toe aan het werkblad “workoutType”, vul in kolom “Name” bijv. “Biljart” toe, achterhaal middels reversed engineering zoals hieronder staat beschreven het ID van de sport Biljarten in Garmin Connect, vul die waarde in onder de kolom “Value”. Kies als apiType voor sportTypeId, en onder workoutType de waarde van de sport Biljart zoals je die uit Garmin Connect achterhaald hebt middels reversed engineering. De kolom Category kun je in dit geval leeg laten, en onder Description kun je zelf een omschrijving kwijt. Voeg voor de oefening “butage” wederom een extra rij toe aan het werkblad “workoutType”, vul in kolom “Name” bijv. de waarde “BUT” in als afkorting van “butage”. De kolom Value kun je leeg laten, bij apiType vul je de waarde “excerciseName” in. Achterhaal met behulp van reversed engineering de exacte benaming van de oefening “butage” uit Garmin Connect, en neem die waarde over in de kolom “workoutType”. Indien uit die reversed engeneering blijkt dat die oefening onder een bepaalde categorie valt, neem dan die waarde over onder de kolom “category”. Onder Description kun je bijvoorbeeld de nederlandse benaming van de oefening kwijt. (Het toevoegen van de sport Biljart is puur ter illustratie, je kunt deze sport in ieder geval met mijn Forerunner 955 niet toevoegen in Garmin Connect)

Reversed engineering Garmin Connect

If you want to add a new Sporttype, for example “Yoga”, you can follow the following steps.

  • Create an Yoga workout in Garmin Connect, filled with your favorite trainingtypes as workout steps. Save it.
  • Download the workout to your desktop and open it with notepad
  • Select all text and copy it to your clipboard
  • Open https://jsonlint.com/ and paste the text, click on “Validate JSON”. JSONLint tides and validates the messy JSON code.
  • Search for sportTypeId. In this example the sportTypeId is “7” and the sportTypeKey = “yoga”

Argumenten

De workout en schedule creator kan met de volgende argumenten worden opgestart:

–XLSX_filename Specify input XLSX filename, default is “workoutschedule.xlsx”
–output_dir Specify output dir for JSON workout files, default is current directory
-v, –verbose Show debug information
-u, –username Garmin Connect username
-p, –password Garmin Connect password
-n, –noschedule Don ’t add workouts to calendar
-w, –noworkout Don ’t add workouts to Garmin Connect (implicit –n –noschedule)

Secrets.py

Allereerst, het is niet veilig om gebruikersnaam en password op te slaan in een tekstbestand, maar wel heel gemakkelijk. Dus als er geen andere gebruikers gebruik maken van je laptop of desktop, best een optie en handig. Hiervoor kun je gebruik maken van de file secrets.py:

# Secrets file, containing Garmin Connect username and password

username = “change secrets.py or use -u argument” # change this to your Garmin Connect username

password = “change secrets.py or use -p argument” # change this to your Garmin Connect password

Chrome extension

Zoals in de intro reeds beschreven maakt de workout en schedule creator gebruik van de Chrome extension “Share your Garmin Connect workout” (https://chrome.google.com/webstore/detail/share-your-garmin-connect/kdpolhnlnkengkmfncjdbfdehglepmff). Deze chrome extension wordt aangeroepen middels een zogenaamde .crx file. In deze .crx file zijn het manifest, source code, html en andere bestanden van de extension gezipt. De .crx file die je van mijn Github repository kunt downloaden kan natuurlijk verouderd raken en niet meer werken met je nieuwe Chrome versie. In dat geval kun eenvoudig weg een nieuwe versie van de extension downloaden en in de map plaatsen waar je de workout and schedule creator hebt geinstalleerd. Ga als volgt te werk:

  • Install the Chrome extension “Share your Garmin Connect workout”
  • Follow the steps of method 1 as described on https://techpp.com/2022/08/22/how-to-download-and-save-chrome-extension-as-crx/
  • Copy the .crx file to your workouts map

Bekende tekortkomingen

Multisport workouts, zoals Duathlon’s of Triathlon’s, worden niet ondersteund door Garmin Connect. Workarround is om dit als losse workouts te definieren op dezelfde dag.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *