ZWO Workout Import / Textevent

Hey @david !

There is an error while importing ZWO Files with multiple Text-Events during a steady state, for example:

	<SteadyState Duration="180" Power="1.1" Cadence="95">
		<textevent timeoffset="10" message="Start 1st Interval"/>
		<textevent timeoffset="90" message="Die Hälfte ist geschafft!"/>
	</SteadyState>
	<SteadyState Duration="180" Power="0.6" Cadence="80">
		<textevent timeoffset="10" message="Erholung"/>
	</SteadyState>
	<SteadyState Duration="180" Power="1.1" Cadence="95">
		<textevent timeoffset="5" message="2nd Interval!"/>
		<textevent timeoffset="90" message="3/4 done ...."/>
	</SteadyState>
	<SteadyState Duration="180" Power="0.6" Cadence="80">
		<textevent timeoffset="5" message="Final Recovery"/>
	</SteadyState>
  1. Only the first textevent is shown after import.
  2. The timeoffset of the post is not recognized.
  3. Intervals is merging the same SteadyState blocks (the textevents are different) into an IntervalsT Container.

Edit: This is the exported ZWO File Content after import of the original ZWO:

    <IntervalsT OnPower="1.1" OffPower="0.6" show_avg="1" Repeat="5" Cadence="95" CadenceResting="80" OffDuration="180" OnDuration="180">
        <textevent message="Start 1st Interval 2x"/>
    </IntervalsT>

By default, currently, only 1 textevent per interval is supported.
That’s the way the current workout builder works.

I’ve turned your post into a feature req

Can you please mail me the original zwo (david@intervals.icu).

I imported your fragment and got this:

- Start 1st Interval 3m 110% 95rpm
- Erholung 3m 60% 80rpm
- 2nd Interval! 3m 110% 95rpm
- Final Recovery 3m 60% 80rpm

Intervals.icu only supports one bit of text per workout step so that is what I would expect.

This converts back to zwo as:

<SteadyState show_avg="1" Power="1.1" Cadence="95" Duration="180">
    <textevent message="Start 1st Interval" duration="10"/>
</SteadyState>
<SteadyState show_avg="1" Power="0.6" Cadence="80" Duration="180">
    <textevent message="Erholung" duration="10"/>
</SteadyState>
<SteadyState show_avg="1" Power="1.1" Cadence="95" Duration="180">
    <textevent message="2nd Interval!" duration="10"/>
</SteadyState>
<SteadyState show_avg="1" Power="0.6" Cadence="80" Duration="180">
    <textevent message="Final Recovery" duration="10"/>
</SteadyState>

Hey @david!

Thanks for your reply!

If i put text events into all intervals, there is no merging of multiple (identical) steady state blocks into the IntervalsT Container. Only the challenge with the different text events by time is still there.

Example upload ZWO:

<workout>
	<Warmup Duration="600" PowerLow="0.4" PowerHigh="0.6" Cadence="80">
		<textevent timeoffset="10" message="Welcome"/>
		<textevent timeoffset="300" message="Are you ready?"/>
		<textevent timeoffset="570" message="First effort is calling! Ramp up your cadence!"/>
	</Warmup>
	<SteadyState Duration="180" Power="1.1" Cadence="95">
		<textevent timeoffset="10" message="Come on! 1st Interval!"/>
		<textevent timeoffset="90" message="Half is done..."/>
	</SteadyState>
	<SteadyState Duration="180" Power="0.6" Cadence="80">
		<textevent timeoffset="5" message="Rest a bit."/>
	</SteadyState>
	<SteadyState Duration="180" Power="1.1" Cadence="95">
		<textevent timeoffset="10" message="Second one!"/>
		<textevent timeoffset="90" message="Half again. Keep pushing!"/>
	</SteadyState>
	<SteadyState Duration="180" Power="0.6" Cadence="80">
		<textevent timeoffset="15" message="Keep calm."/>
	</SteadyState>
	<SteadyState Duration="180" Power="1.1" Cadence="95">
		<textevent timeoffset="5" message="Go Go Go! You are in the 3rd interval."/>
		<textevent timeoffset="90" message="Halfway!"/>
	</SteadyState>
	<SteadyState Duration="180" Power="0.6" Cadence="80">
		<textevent timeoffset="5" message="Breath in ..."/>
		<textevent timeoffset="10" message="... an out."/>
	</SteadyState>
	<SteadyState Duration="180" Power="1.1" Cadence="95">
		<textevent timeoffset="5" message="Hit me baby one more time!"/>
		<textevent timeoffset="90" message="90 seconds to go"/>
	</SteadyState>
	<SteadyState Duration="180" Power="0.6" Cadence="80">
		<textevent timeoffset="5" message="Only one more effort left."/>
	</SteadyState>
	<SteadyState Duration="180" Power="1.1" Cadence="95">
		<textevent timeoffset="5" message="Smash 3 minutes one last time!"/>
		<textevent timeoffset="90" message="Come On! Push!"/>
		<textevent timeoffset="160" message="The last seconds are running!"/>
	</SteadyState>
	<SteadyState Duration="180" Power="0.6" Cadence="80">
		<textevent timeoffset="0" message="Breath again."/>
	</SteadyState>
	<Cooldown Duration="600" PowerLow="0.5" PowerHigh="0.5" Cadence="70">
		<textevent timeoffset="5" message="You did it! Now recovery starts until tomorrow."/>
	</Cooldown>
</workout>

Download version of this ZWO from Intervals.icu:

<workout>
    <Warmup PowerHigh="0.6" PowerLow="0.4" Cadence="80" Duration="600">
        <textevent message="Welcome" duration="10"/>
    </Warmup>
    <SteadyState show_avg="1" Power="1.1" Cadence="95" Duration="180">
        <textevent message="Come on! 1st Interval!" duration="10"/>
    </SteadyState>
    <SteadyState show_avg="1" Power="0.6" Cadence="80" Duration="180">
        <textevent message="Rest a bit." duration="10"/>
    </SteadyState>
    <SteadyState show_avg="1" Power="1.1" Cadence="95" Duration="180">
        <textevent message="Second one!" duration="10"/>
    </SteadyState>
    <SteadyState show_avg="1" Power="0.6" Cadence="80" Duration="180">
        <textevent message="Keep calm." duration="10"/>
    </SteadyState>
    <SteadyState show_avg="1" Power="1.1" Cadence="95" Duration="180">
        <textevent message="Go Go Go! You are in the 3rd interval." duration="10"/>
    </SteadyState>
    <SteadyState show_avg="1" Power="0.6" Cadence="80" Duration="180">
        <textevent message="Breath in ..." duration="10"/>
    </SteadyState>
    <SteadyState show_avg="1" Power="1.1" Cadence="95" Duration="180">
        <textevent message="Hit me baby one more time!" duration="10"/>
    </SteadyState>
    <SteadyState show_avg="1" Power="0.6" Cadence="80" Duration="180">
        <textevent message="Only one more effort left." duration="10"/>
    </SteadyState>
    <SteadyState show_avg="1" Power="1.1" Cadence="95" Duration="180">
        <textevent message="Smash 3 minutes one last time!" duration="10"/>
    </SteadyState>
    <SteadyState show_avg="1" Power="0.6" Cadence="80" Duration="180">
        <textevent message="Breath again." duration="10"/>
    </SteadyState>
    <Cooldown Power="0.5" Cadence="70" Duration="600">
        <textevent message="You did it! Now recovery starts until tomorrow." duration="10"/>
    </Cooldown>
</workout>

Edit: I have only removed the <?xml version="1.0" encoding="UTF-8" standalone="yes"?> and <workout_file> container and complete header.

Yeah it’s only one textevent per step. I can’t think of any easy way to support more than one in the workout builder.

@david maybe an easier way, that it is only done in background. Intervals workout builder “editor” and shown frontend only like it is. But maybe some other handling of the import in background. The original XML/ZWO is stored and while downloading or connecting Zwift, the original XML is used.

Intervals.icu stores workouts internally as the text you see in the editor. Would be hard to reconcile changes in the editor with another stored format.

1 Like