Sync Wahoo SYSTM calendar with intervals.icu

Right. I’m trying to match how I name the workouts once done. Any SYSTM workout I do gets the prefix “Wahoo SYSTM:”, or any Xert workout gets “Xert:”, though we’re not worried about Xert in this case. I’ve found that when I don’t match the uploaded activity name to the planned workout name, they don’t match up in intervals, and I’m looking to do a few months’ worth of workouts over on SYSTM to see how I like it.

The numbers for MAP, AC and NM intervals are not correct for me. I have made a fix and created a pull request. I hope you can take a look.

2 Likes

Hi,

I am not really successful at sharing my workout between systm and Intervals. Once I run suffersync in the terminal, I have this message:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.9/bin/suffersync", line 8, in <module>
    sys.exit(main())
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/suffersync.py", line 275, in main
    response = get_intervals_icu_events(START_DATE, END_DATE, INTERVALS_ICU_ID, INTERVALS_ICU_APIKEY)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/suffersync.py", line 171, in get_intervals_icu_events
    response = call_api(url, "GET", headers)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/suffersync.py", line 219, in call_api
    raise(err)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/suffersync.py", line 217, in call_api
    response.raise_for_status()
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/requests/models.py", line 960, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error:  for url: https://intervals.icu/api/v1/athlete/i24083/events?oldest=2022-01-01&newest=2022-12-31

And I got nothing in the Intervals.icu calendar.
Any help?

Seem to be having an issue with @ symbol in password, known issue?

OMG this is really great! :+1: :star_struck:

Gets me closer to ride the original sufferfest workout on the road (If the weather gives me the chance I’ll prefer riding outdoor). In the past I did create my sufferfest workouts for outdoor riding manually in intervalls.icu (which syncs it to my garmin)

Btw there’s a garmin limitation:
Uploading the synced sufferfest workouts to Garmin fails in intervals.icu “Garmin upload failed: Workout exceeds, maximum expected number of 50 steps for a workout” :thinking: :face_vomiting:
Seems that I have to take some steps out of the sufferfest workouts out to sync it to my garmin.

1 Like

Question:

Is there any way for the tool to import these workouts from SYSTM with the “indoor” checkbox ticked?

Question’s Background:

During the holiday/off season I’d taken it easy, like many of us do. At the beginning of the year I got back on it and started back up. I did my testing on Systm, and set my FTP here on intervals accordingly. I hadn’t ridden outside yet, so both the indoor and the outdoor figure were the same.

I’ve done about 6 weeks of workouts since, and just came off a Threshold week. I also started my race season outdoors this weekend (it did not get off to a good start the first day, but that’s another story). I’d expected to see a bump from my early January tests, and I did (in fact, set all sorts of all-time power records from ~6 minutes all the way to 45 minutes).

Since I don’t really feel that I generate quite the same power numbers indoors as I can outdoors, I set my outdoor FTP based on the results and bumped my indoor to a few %% below, at least until I can get a feel for how the workouts go and/or do another round of indoor testing.

And finally gets us to the reason why I ask: When suffersync imports the workout, it uses the outdoor figure by default, I assume because the activity type is “Ride” and the “indoors” box isn’t checked. I guess the other option would be for them to be imported as a Virtual Ride. But you’d know better than I as far as that goes.

Cheers.

1 Like

This is brilliant! Thank you :pray:

1 Like

Hey @Bakermat ! I just installed this (Mac M1 Silicon) and get an error:

ValueError: time data '2022-03-31T08:30:00' does not match format '%Y-%m-%dT00:00:00'

Has the API changed? Here’s the trace…

File "/Users/***/Library/Python/3.8/bin/suffersync", line 8, in <module>
    sys.exit(main())
  File "/Users/***/Library/Python/3.8/lib/python/site-packages/suffersync.py", line 282, in main
    start_date_local = datetime.strptime(start_date_local, "%Y-%m-%dT00:00:00").date()
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/_strptime.py", line 349, in _strptime

Any idea?
Thanks!
elaine

Hi everyone, work’s been hectic so I haven’t had a chance to look at this recently. I’ll have a look over the weekend, thanks for your feedback and comments.

@elaine.montoya: there seems to be a time mismatch, it’s expecting a UTC time string but yours is coming back with an offset of 8:30. Haven’t seen that before, I’ll check.

1 Like

Did you manage to resolve this? A 403 error means authentication failed so invalid username/password. If you were using a special character, would you mind sharing which one?

I just had a look at this. The way an event gets uploaded at the moment to intervals.icu is by uploading the file as ZWO. Unfortunately ZWO files only support a ‘bike’ type and don’t distinguish between virtual or ‘outside’ rides, so there’s no easy or clean way to do this.

Hi,
Now it works. With the change from Wahoo system to Wahoo X, I had to reset my password. With the new one, every thing is fine. I think in my previous password I had a sign that was not supported by your app.
Thanks
r.

1 Like

Unfortunately, I have the same problem.

Traceback (most recent call last):
  File "/bin/suffersync", line 8, in <module>
    sys.exit(main())
  File "/usr/lib/python3.8/site-packages/suffersync.py", line 282, in main
    start_date_local = datetime.strptime(start_date_local, "%Y-%m-%dT00:00:00").date()
  File "/usr/lib/python3.8/_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/usr/lib/python3.8/_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '2022-02-24T19:00:00' does not match format '%Y-%m-%dT00:00:00'

I tried it on two different machines, but the output is the same.
Thanks a lot for your great work! This might be a real game changer :+1:

I just would like to get back to you and let you know that I found my “error/problem”.
In my Intervals calendar I had a planned workout for the given date (24 February) because of that workout, the suffersync stopped.

I removed all planned workout and suffersync works now:


1 Like

anyone have also a message “Failed to upload to Garmin” due to more than 50 steps?
Any way to change this (a part to do it manually)?

The 50steps is a Garmin limitation. You’ll need to change the workouts (manually)

is that your question?

1 Like

Yes, I do it manually. But is there another solutions?

@Bakermat Where did you get the API definitions of Sufferfest/Systm ?

Is there an easy way to delete multiple planned activities (imported by suffersync)? I know intervals.icu has a feature for training plans with “Delete & Others”, but that options doesn’t seem to be an option for imported activities.

1 Like

Awesome script! All activities synced except for biking ones. I think each one errored with the following:

‘charmap’ codec can’t encode characters in position 245-249: character maps to
Something went wrong: 422 Client Error: for url: https://intervals.icu/api/v1/athlete/i47???/events

(I have obfuscated the url)

Is this todo with biking now having indoor and outdoor versions? I have found a folder with all the bike zwo files in but they are all 0byte.

Anything I can do to brink the bike workouts in?

Thanks again