BreakAway: Indoor Training - Sync Withings Data to Intervals.Icu

This is now working in the my development version of the app.
I only tested w/ some Dummy Data i manually input to Withings. Not sure how it will fare when there are like months of data.

Initial sync (to Intervals.icu) for months of data may likely fail as I’m uploading the data on a day-by-day basis to intervals.icu. (300 days = 300 API Calls)

Would need some feedback. If there are any Withings Users who can help test, let me know.

app w/ Withings Support is available now. Automatic sync will only work w/ > iOS14. (It’s integrated w/ the refresh button in the intervals.icu week in review page)

Tx

ps: HR is mapped to restingHR in Intervals.Icu wellness fields

2 Likes

Withings User here (Body+ - Scale, BPM Connect - Blood Pressure)

I have daily weight and BPM data from January and not perfectly daily data for the last 3-5 years.

If you want to test stuff, just send me a PM.

2 Likes

I have four years of Withings weight data.
If you would like me to test please free to PM.

1 Like

Thanks @rolandplanitz and @Marvin_Dorfler. You can download and test it out using the BETA app (link updated in first post). Also updated some descriptions and what not on how it works.

2 things to test

  1. daily sync (this will sync data from past 7 days from Today eg: 1/May to 7/May assuming today = 7/May)
  2. Bulk Sync - this will use the “import dates” within the /SETTINGS tab under Withings. I’ve placed the default as 1 month from today as placeholder.

Thankx

Any chance we can customise the fields that are written? I’m using an Oura Ring as well and fields like Resting HR come from there.

Right now there are 5 selectable fields from a whole list that withings supports. (ref. 1st post)

But I cross referenced those fields w/ Intervals.icu and seems like these 5 are all there are that’s equivalent.

If you do not want HR to come from Withings (which from what I read, withings HR isn’t really resting HR), then disable the switch and should be good to go.

Withings has several HR values (from my sleep sensor, from my Blood Pressure device and if one has a more fancy scale or a watch/tracker there would be hr as well)

I’ll have a look at your update and test it when I find a moment :wink:

oh… is it… Would love to see how that is “differentiated” in the API data. I see the API has something called “deviceID” . Would be great if there are samples to work with so that I can see what can be done to select or such.

This feature is now live and available for all in the Apple App Store.
I am now working on the next revision which would also push the data to Garmin Connect.

Some uploaded Dummy data example:



Hello, I am the only one getting error messages when syncing Withins past data? See screen shot. It’s not working for me unfortunately .
I tried several periods shorter and longer ones. I could several years (if possible).
Thank you
Marian

Did you enable MuscleMass field in intervals? This is not a usual field and uploads may fail if this is not enabled within intervals. (There is supposed to be a message showing this, but it’s likely multiple error messages popped up and overlapped each other and only the final one became visible)

I don’t have a Withings and thus, I can only manual update some dummy weights into Withings(but it does not have a field for Muscle Mass)

Please verify if you disable the option for MuscleMass, does the sync succeed?

Hi, thank you for the quick reply.
After your comment I have created a new field “Muscle Mass” in Intervals as you said.
I synchronized again for one year past data but still get the same error message.
I tried both “enabling” and “disabling” “Muscle Mass” in the sync settings of Breakaway App.
Kind regards
Marian



I’m not sure if this makes a difference, but the Muscle Mass I’m using is this “public” version after clicking on the Magnifying Glass “Fields”

Screenshot 2023-12-19 at 5.09.48 PM

Can you go to the SETTINGS tab, way at the bottom… under the Developer Box put in

LOGCLOUD

then try the sync again. After it fails, it should generate a log file that you can access in the HISTORY tab. I think it should be called Debug_logCloud.txt. Please either send it to me or just paste a few lines from it here. It’s a plain text file

Tx

1 Like

I removed my custom field as you described and I enabled the “public version” from David intervals.icu for “muscle mass”.
However syncing still not work. Here the content of the log file:

2023-12-19 10:56:55.9330   DONE loadWithingsPreferences withingsPref(syncWeight: true, syncBodyFat: true, syncDiastolicBP: true, syncSystolicBP: true, lastSyncDate: "19/12/2023", syncToIntervalsIcu: false, syncToStrava: false, syncToGarmin: false, syncHr: true, syncMuscleMass: true, userId: "", refreshToken: "")
2023-12-19 10:56:55.9720   Existing Plist File Exists - Update/Write
2023-12-19 10:56:55.9720   DONE ----- saveUserPreferences ----- DONE
2023-12-19 10:56:55.9730   Existing Plist File Exists - Update/Write
2023-12-19 10:56:55.9740   DONE ----- saveUserPreferences ----- DONE
2023-12-19 10:57:09.9980   DONE loadWithingsPreferences withingsPref(syncWeight: true, syncBodyFat: true, syncDiastolicBP: true, syncSystolicBP: true, lastSyncDate: "19/12/2023", syncToIntervalsIcu: false, syncToStrava: false, syncToGarmin: false, syncHr: true, syncMuscleMass: true, userId: "", refreshToken: "")
2023-12-19 10:57:10.5100 [SUCCESS   ] workoutDelete - removeItem at withingsData.csv
2023-12-19 10:57:10.5170 IntervalsIcu.uploadWellnessCSV - Uploading:/withingsData.csv - SUCCESS
2023-12-19 10:58:49.6690   DONE loadWithingsPreferences withingsPref(syncWeight: true, syncBodyFat: true, syncDiastolicBP: true, syncSystolicBP: true, lastSyncDate: "19/12/2023", syncToIntervalsIcu: false, syncToStrava: false, syncToGarmin: false, syncHr: true, syncMuscleMass: true, userId: "", refreshToken: "")
2023-12-19 10:58:50.2410 IntervalsIcu.uploadWellnessCSV - API Error.. 422 errorMessage: Row 50 2023-05-29: Invalid resting HR
2023-12-19 10:58:50.2780 [SUCCESS   ] workoutDelete - removeItem at withingsData.csv
2023-12-19 10:58:54.7480   Existing Plist File Exists - Update/Write
2023-12-19 10:58:54.7530   DONE ----- saveUserPreferences ----- DONE
2023-12-19 11:01:45.4220   DONE loadWithingsPreferences withingsPref(syncWeight: true, syncBodyFat: true, syncDiastolicBP: true, syncSystolicBP: true, lastSyncDate: "19/12/2023", syncToIntervalsIcu: false, syncToStrava: false, syncToGarmin: false, syncHr: true, syncMuscleMass: true, userId: "", refreshToken: "")
2023-12-19 11:01:45.4830   Existing Plist File Exists - Update/Write
2023-12-19 11:01:45.4840   DONE ----- saveUserPreferences ----- DONE
2023-12-19 11:01:45.4850   Existing Plist File Exists - Update/Write
2023-12-19 11:01:45.4850   DONE ----- saveUserPreferences ----- DONE
2023-12-19 11:01:48.6570   Existing Plist File Exists - Update/Write
2023-12-19 11:01:48.6580   DONE ----- saveUserPreferences ----- DONE
2023-12-19 11:01:49.5760 [SUCCESS   ] workoutDelete - removeItem at withingsPref.plist
2023-12-19 11:02:07.3190   loadWithingsPreferences - No Plist. Use Default:withingsPref(syncWeight: true, syncBodyFat: true, syncDiastolicBP: true, syncSystolicBP: true, lastSyncDate: "19/12/2023", syncToIntervalsIcu: false, syncToStrava: false, syncToGarmin: false, syncHr: true, syncMuscleMass: true, userId: "", refreshToken: "")
2023-12-19 11:02:14.4100   Creating New Plist File
2023-12-19 11:02:14.4120   DONE ----- saveUserPreferences ----- DONE
2023-12-19 11:02:14.4310   DONE loadWithingsPreferences withingsPref(syncWeight: true, syncBodyFat: true, syncDiastolicBP: true, syncSystolicBP: true, lastSyncDate: "19/12/2023", syncToIntervalsIcu: false, syncToStrava: false, syncToGarmin: false, syncHr: true, syncMuscleMass: true, userId: "", refreshToken: "")
2023-12-19 11:02:14.4320   Existing Plist File Exists - Update/Write
2023-12-19 11:02:14.4330   DONE ----- saveUserPreferences ----- DONE
2023-12-19 11:02:34.0870   DONE loadWithingsPreferences withingsPref(syncWeight: true, syncBodyFat: true, syncDiastolicBP: true, syncSystolicBP: true, lastSyncDate: "19/12/2023", syncToIntervalsIcu: false, syncToStrava: false, syncToGarmin: false, syncHr: true, syncMuscleMass: true, userId: "", refreshToken: "")
2023-12-19 11:02:34.7360 IntervalsIcu.uploadWellnessCSV - API Error.. 422 errorMessage: Row 50 2023-05-29: Invalid resting HR
2023-12-19 11:02:34.7630 [SUCCESS   ] workoutDelete - removeItem at withingsData.csv
2023-12-19 11:02:52.6070   DONE loadWithingsPreferences withingsPref(syncWeight: true, syncBodyFat: true, syncDiastolicBP: true, syncSystolicBP: true, lastSyncDate: "19/12/2023", syncToIntervalsIcu: false, syncToStrava: false, syncToGarmin: false, syncHr: true, syncMuscleMass: true, userId: "", refreshToken: "")
2023-12-19 11:02:53.1960 IntervalsIcu.uploadWellnessCSV - API Error.. 422 errorMessage: Row 50 2023-05-29: Invalid resting HR
2023-12-19 11:02:53.2210 [SUCCESS   ] workoutDelete - removeItem at withingsData.csv
2023-12-19 11:02:55.7270   Existing Plist File Exists - Update/Write
2023-12-19 11:02:55.7320   DONE ----- saveUserPreferences ----- DONE

There’s your error…
Check your withings data for that date. Somehow Intervals Doesn’t like the HR for that date.
Also - you’re pulling 1 years’ worth of data. Does it work on smaller batches like 1 month?

does the shorter ones work?

I’ve just made changes that will surface this error message to the user, and if LOGCLOUD is enabled, the app won’t delete the CSV file

Tx

1 Like

Amazing!! It works now! I deleted the “Resting HR” value from 29th of mai 2023. It showed a value of “zero”. I must have been dead on that day :joy:
I synced again for 12 months data and it shows now much more values. Also there was no error message in your app.
I will continue to add older data. I have around 10 years of data (weight and blood pressure) and since march 2023 also a smart watch from Withings (Sleep, Resting HR, etc).
Great team effort and great support! Mary thanks!


Marian

2023-12-19 11:16:21.7080 [SUCCESS   ] workoutDelete - removeItem at withingsData.csv
2023-12-19 11:16:21.7230 IntervalsIcu.uploadWellnessCSV - Uploading:/withingsData.csv - SUCCESS

It worked for 1yr past data sync? Wow… Didn’t know it can do that “much” at one go. I’m not sure what’s the limit.

I didnt’ know that a value of “0” is not acceptable. I will see if I can make it such that the app will filter out these “0” values

Tx for the report and Tx for supporting the app. If not already, do leave a 5 start rating and a review of the App on the Apple App Store. TX!!

The error messge I showed in previous message was just added.

1 Like

I synced back until December 2015 and it worked perfectly. See screenshot.
I created also a new public chart for “blood pressure”. Both WEIGHT and BLOOD PRESSURE charts are build from withings measurements.
Of course I will make 5 star ratting in the App Store.
I was a real pleasure to work with you on the resolution.
Marian

1 Like

Just another small observation: I made a blood measurement today and synchronized it with intervals. The standard date settings in the breakaway app are todays dates “import start” and “end” date. If the date is 19/12/2023 it does not synch. However if the date is 20/12/2023 it will synch. I believe todays date should be “inclusive” bit it is not.

Tx for the observation. Seems like the END Date doesn’t end at 23:59:59

I will take a look at see what I can do… perhaps the simplest is just to +1 day

Edit: Fixed…