Workout builder

Hi! Would it be possible to add an option for the range of Garmin workouts export based on watts, instead of percentage? for example 80% FTP +/- 10W instead of 80% +/- 2.5%. I’m new to running with power and, using a percentage based range, I sometimes find the range too tight for warm-up and recovery but too wide for higher power levels. Thanks!

1 Like

Does anyone know of a workout creator that will create a ZWO file from a cut and paste of a workout description from the WhatsonZwift group workouts page?

An example is as follows. Intervals won’t interpret it, and ZWOForge works but doesn’t pick up the cadence targets. There is ZwiftConverter on GitHub, but i can’t get it to work due to my lack of expertise.

5min from 40 to 70% FTP
1x 45sec @ 80% FTP,
1min @ 55% FTP
1x 45sec @ 90% FTP,
1min @ 55% FTP
1x 45sec @ 100% FTP,
1min @ 55% FTP
15min @ 85rpm, 60% FTP
1min @ 90rpm, 70% FTP
1min @ 95rpm, 75% FTP
1min @ 100rpm, 77% FTP
1min @ 105rpm, 80% FTP
5min @ 85rpm, 60% FTP
1min @ 90rpm, 70% FTP
1min @ 95rpm, 75% FTP
1min @ 100rpm, 77% FTP
1min @ 105rpm, 80% FTP
5min @ 85rpm, 60% FTP
1min @ 90rpm, 70% FTP
1min @ 95rpm, 75% FTP
1min @ 100rpm, 77% FTP
1min @ 105rpm, 80% FTP
5min @ 85rpm, 60% FTP
1min @ 90rpm, 70% FTP
1min @ 95rpm, 75% FTP
1min @ 100rpm, 77% FTP
1min @ 105rpm, 80% FTP
3min from 65 to 25% FTP

Your in luck…I think this will do what you want

Use this to convert WhatsonZwift structure to intervals.icu workout builder format and then use that in intervals.icu to export a .zwo file

3 Likes

You think correctly - Perfect!

Thanks @Ben for creating this and @Olly_Thomas for the point in the right direction

2 Likes

when i create a workout using Z1 as target ,the workout builder create and display a step from 44 to 55% of my ftp , but on settings my Z1 is from 0 to 55% , shouldn’t they match ?

I chose to make the range for Z1 start at 80% of the upper end instead of zero on the assumption that someone riding in Z1 is likely to be doing at least that.

3 Likes

Hello and happy new year !!!

Yes i agree with you , David
On the opposite side the maximum for the last level (7 in my case) is set as 999%of the ftp , but here we have a bigger discrepancy from reality (ex: 3000W for 300Wftp) and if you make a repetitions workout using zone 7 this will greatly influence the predicted load and you rely on that info for next workout planning , and also your compliance to plan after the completion of the workout.
Does it make sense to set a custom highest ftp%? If you are a sprinter your highest power is definitely different from a climber .
I think that the possibility of setting a highest and lowest % of ftp will help to improve the zones usability of the workouts.

I recall @david saying he planned to do some work on the workout folders. When you get to that, would it be possible to have a secondary sort in the workout folders based on workout duration?

Where you might have multiple variations of the same workout name (i.e Endurance Ride) , it would put them in order and easier to find to apply to plans.

2 Likes

Wow, can’t believe people actually use this :laughing:

But no worries, glad it’s helpful

@david, its just regex replacements so feel free to create a button that can do it here too code is:

Code:
function WrangleZWO(){
	var WOZ_inp = document.getElementById("WOZ_inp");
	var WOZ_out = document.getElementById("WOZ_out");
	var name = WOZ_inp.value;
	//name = name.replace(/\t/g, '')
    name = name.replace(/^\s*\n/gm, "")
	name = name.replace(/min/g, 'm')
	name = name.replace(/sec/g, 's')
	name = name.replace(/from/g, 'ramp')
	name = name.replace(/ to /g, '-')
	name = name.replace(/x /g, 'x\n')
	name = name.replace(/\n/g, '\n- ')
	name = name.replace(/- (?=\d+x)/gm, '')
	name = name.replace(/(FTP)(?!,)/g, '\n')
	name = name.replace(/(W)(?!,)/g, 'W\n')
	name = name.replace(/(FTP)(?=,)/g, '')
	name = name.replace(/@/g, '')
	name = name.replace(/,/g, '')
	name = name.replace(/  /g, ' ')
	name = name.replace(/  /g, ' ')

	WOZ_out.value = "- " + name
}
3 Likes

Hey,

just getting to grips with the workout builder and really liking it so far. Great tool!

I have just built a 3min step test protocol. Idea is to ride 3min steps starting at 80W which each step increasing power target by 20W. Since I want to do that in Zwift which only takes %FTP as target, I calculated the target in % of 500W (obviously I have no 500W FTP but changing the FTP in Zwift to 500 before doing the test is easier that re-creating the workout based on percentage of the then up to date actual FTP value).

My code:

Warmup
- Warmup 10m freeride

Main Set
- Stufentest 3m 16% hidepower
- 3m 20%
- 3m 24%
- 3m 28%
- 3m 32%
- 3m 36%
- 3m 40%
- 3m 44%
- 3m 48%
- 3m 52%
- 3m 56%
- 3m 60%
- 3m 64%
- 3m 68%
- 3m 72%
- 3m 76%
- 3m 80%

Cooldown
- Cooldown 10m freeride /hidepower

Result when exporting as .zwo:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workout_file>
    <author>Micho</author>
    <name>3min Stufentest</name>
    <sportType>bike</sportType>
    <tags/>
    <workout>
        <FreeRide FlatRoad="1" show_avg="1" Duration="600">
            <textevent message="Warmup" duration="10"/>
        </FreeRide>
        <SteadyState Power="0.161" Duration="180">
            <textevent message="Stufentest" duration="10"/>
        </SteadyState>
        <SteadyState Power="0.2" Duration="180"/>
        <SteadyState Power="0.238" Duration="180"/>
        <SteadyState Power="0.28" Duration="180"/>
        <SteadyState Power="0.319" Duration="180"/>
        <SteadyState Power="0.361" Duration="180"/>
        <SteadyState Power="0.4" Duration="180"/>
        <SteadyState Power="0.438" Duration="180"/>
        <SteadyState Power="0.48" Duration="180"/>
        <SteadyState Power="0.519" Duration="180"/>
        <SteadyState Power="0.561" Duration="180"/>
        <SteadyState Power="0.6" Duration="180"/>
        <SteadyState Power="0.638" Duration="180"/>
        <SteadyState Power="0.68" Duration="180"/>
        <SteadyState Power="0.719" Duration="180"/>
        <SteadyState Power="0.761" Duration="180"/>
        <SteadyState Power="0.8" Duration="180"/>
        <FreeRide FlatRoad="1" show_avg="1" Duration="600">
            <textevent message="Cooldown" duration="10"/>
        </FreeRide>
    </workout>
</workout_file>

As you can see, the export does some weird things when converting % to decimal values. E.g. 24% becomes 0.238 instead of 0.24.

I think these small deviations do not even make a difference when playing the program in Zwift, but I am wondering what is happening here?

Hmm. It’s probably a rounding thing. If your FTP is say 260w then 24% of that is 62.4w. Intervals.icu will use 62w for the workout. When it is converted to ZWO 62w/260w = 0.238. ZWO supports 3 decimals for the % of FTP so that is what gets written to the file.

Ahh I see, yes that works out. Thanks for the explanation - good to understand the background

Hello!

I’m trying to combine HR and Pace, but it seems that I can only create a workout with one parameter.
Am I missing something?

This is how ti shows when I change the first parameter to HR - it deletes the intervals defined with Pace.

You can only use one parameter

1 Like

It depends on the workout and the goal of it. If you need to hit some specific pace on your intervals (I assume there is no altitude changes), your first 10k could be in Z1-Z2 pace, that should match your Z2 HR (please note that Z2 HR in a threshold zone based, is not the famous Z2 you should do your base…). Just need to be a little aware of your watch to not reach your limit HR.

Other way could be to do all the workout based on HR. I’ve found this less affected by the altitude changes and easier to train my super’ and sub’ threshold.

Edit: sorry, didn’t see the 71-78% on your Z2 HR.

1 Like

@David, for the workout builder, is there a way to get specific interval comments to be avaiable? Right now, I think it’s only on an interval Block and in the JSON it’s marked as “text”

eg:
2x

  • 5m 50%
  • 2m 70%

is there a way to do, and have the text also appear?
-5m Go Slow 50%
-2m Go Hard 70%

I’m not sure if I understood your request but Garmin and Golden Cheetah do show the messages from the workout bellow:

  • Warm up 14m Z1 HR
  • Water1 1m Z1 HR

1x

  • 'Z2 13m Z2 HR
  • Stand 1m Z2 HR
  • Water2 1m Z1 HR

3x

  • 'SS 15m 82% HR (140bpm)

  • Water 6m Z1 HR

  • Press lap 1m Z1 HR

5x

  • 'Z5 5m Z5 HR

  • 'Z1 5m Z1 HR

  • Press Lap 1m Z1 HR

  • Cool down 10m Z1 HR

  • Spin 5m Z1 HR

I wish I could also just put text in the middle without duration/target

Regards,

2 Likes

TQ So much…

The correct syntax is

  • Warm up 14m Z1 HR

whereas I as doing this

  • 14m Warm up Z1 HR

Now I see the Per interval Cues

Alternative, Needs some work but may just end up as the same amount of work to add the text w/ some duration/target

Download as MRC/ERG file, and manually edit the Course text.
Time - Text - Duration of text

[COURSE HEADER]
VERSION = 2
UNITS = ENGLISH
DESCRIPTION = Today’s workout will place some focus on hitting those cadence targets.
FILE NAME = Cad_Target.mrc
MINUTES PERCENT
[END COURSE HEADER]
[COURSE DATA]
0.00 50.0
0.83 90.0
0.83 80.0
5.83 80.0
5.83 60.0
7.83 60.0
7.83 80.0
12.83 80.0
12.83 60.0
14.83 60.0
14.83 45.0
19.83 45.0
[END COURSE DATA]
[COURSE TEXT]
0 75-80 rpm 10
50 2x You get to do this 2x … Interval Comment 1/2 60 rpm 10
350 80-90 rpm 10
470 2x You get to do this 2x … Interval Comment 2/2 60 rpm 10
770 80-90 rpm 10
[END COURSE TEXT]

Works for Golden Cheetah but no for Garmin.

Tks

Awesome feature, using it all the time. Any luck implementing nested sets? Would make for much neater description in text