Skip to content

Introduction of the Calories workout type, various improvements#158

Merged
JaapvanEkris merged 281 commits intomainfrom
0.9.7-(under-construction)
Apr 4, 2026
Merged

Introduction of the Calories workout type, various improvements#158
JaapvanEkris merged 281 commits intomainfrom
0.9.7-(under-construction)

Conversation

@JaapvanEkris
Copy link
Copy Markdown
Owner

@JaapvanEkris JaapvanEkris commented Dec 16, 2025

Version 0.9.7 (April 2026)

Main contributors: Jaap van Ekris, Abasz, DXCanas, NickOldfield, cwklurks and klamp169

New functionality in 0.9.7

  • Addition of the 'Calories' workout type. You can now program Intervals and splits based on calories to be burned
  • GUI Improvements:
    • The GUI now has dark (OLED) mode,
    • The layout is more efficient and it has new tiles for Peak Force and Ratio
    • You can now set single distance/time/calories workouts directly from the GUI by tapping on the relevant tile
  • Fit-file improvements:
    • We added a lot of metrics to the FIT-file, bringing it up to par to the RowingData file, in anticipation of intervals.icu improvements
    • The fit-file now also has splits, which makes the fit-file closer to a native Garmin recording of the same session

Newly supported rowers in 0.9.7

For an overview of all supported machines and their support status, please look at the supported rower list

Bugfixes and robustness improvements in 0.9.7

  • Introduction of the flywheel systematic error filter, this filter can handle systematic errors of magnet positioning on the flywheel. This is more effective at reducing structural measurement noise than the previously used smoothing filter and allows a reduction of the code complexity in Flyhweel.js as all dependent algorithms can use the same datastream. It reduces noise on the reference system from 1.5% (version 0.9.6) to 0.3% (version 0.9.7) (see this explanation)
  • Improvement of the Moving Least Squares regressor:
    • Code refactoring to isolate this function from Flywheel.js, allowing a more thorough testing of this function's behaviour
    • Introduced the 'Local Goodness of Fit' function to improve the robustness against noise. This reduces the effect of outliers on stroke detection, the Force curve, Power curve and Handle speed curve
    • Introduction of a 'Gaussian Weight' filter to reduce the effects of flanks on the regression in a specific datapoint
    • Added documentation about the mathematical foundations of the algorithms used
  • Fix of the Garmin bluetooth issues which affected the 'Cycling Power' and 'Cycling Speed and Cadence' Bluetooth profiles (see issue 125, issue 169 and the known issues in 0.9.6).
  • Brought the Bluetooth FTMS interface further into specification: several bugfixes in the communication to prevent miscommunication between OpenRowingMonitor and the client
  • Fixed issue where Apple HR apps would crash ORM: Fixed an issue where apple HR data would crash OpenRowingMonitor, (see issue 221).
  • Fixed a bug in the initialisation of the Flywheel.js
  • Improved logging in the Strava uploader for better troubleshooting (see issue 145)
  • Fixed a bug where VO2Max calculation missed heartrate data (see this discussion)
  • Improved the memory usage of the webkiosk: We replaced Firefox with a heavily tuned Chrome install, reducing memory usage and surpressed memory warnings regardless (see issue 130)
  • Fixed a bug in the install script:
    • as an adaptation to newer versions of Raspberry OS, we now depend less on the user 'pi' being present (see issue 135 and issue 155)
    • some package now disables Bluetooth by default. Our installation procedure automatically enables it again (see issue 206)
  • Increased the test coverage of key algorithms
  • As usual, all packages are updated to the newest versions

Known issues in 0.9.7

  • ErgData will not work well with our PM5 emulation (see issue 117).

@Abasz
Copy link
Copy Markdown
Collaborator

Abasz commented Mar 27, 2026

@JaapvanEkris can we close the 0.9.7 cycle, especially in terms of the GUI? I have started working on the migration to typescript and vite/vitest (and it is comming together nicely, vite and vitest is extreme fast and has an easy to use API, I am really thinking that we should migrate all uvu tests rather sooner than later) but it is a substantial change affecting all files in the GUI and for the sake of efficiency (to avoid massive merge conflict resolutions) I would like to do this on the finalized version.

@JaapvanEkris
Copy link
Copy Markdown
Owner Author

@JaapvanEkris can we close the 0.9.7 cycle, especially in terms of the GUI?

I'm waiting for fitfilewriter to release its latest update, and update the fitrecorder to its latest version. This is an anticipation on the move of RowsAndAll.com to migrate to intervals.icu and use fit-files end of the year to communicate (see https://forum.intervals.icu/t/support-for-rowing-data-migrating-from-rowsandall-com/117915 and https://github.com/sanderroosendaal/rowingdata/blob/master/docs/FIT_EXPORT.md). As I want to prevent we need to push this update out when it is the end of the year (putting pressure on 0.9.8 planning).

I anticipate a small change in the workoutsegment to facilitate the development, and a lot of documentation updates and then it is a wrap for me.

I have started working on the migration to typescript and vite/vitest (and it is comming together nicely, vite and vitest is extreme fast and has an easy to use API, I am really thinking that we should migrate all uvu tests rather sooner than later) but it is a substantial change affecting all files in the GUI and for the sake of efficiency (to avoid massive merge conflict resolutions) I would like to do this on the finalized version.

Sounds cool!

@Abasz
Copy link
Copy Markdown
Collaborator

Abasz commented Mar 27, 2026

I'm waiting for fitfilewriter to release its latest update, and update the fitrecorder to its latest version. This is an anticipation on the move of RowsAndAll.com to migrate to intervals.icu and use fit-files end of the year to communicate

What is the functionality that you are expecting from the fitfilewriter that needs addition?

As a side note on the fit file, developer fields in garmin connect only show up if there is a valid connect IQ app ID (https://forums.garmin.com/developer/connect-iq/f/discussion/231088/fitcontributor-data-not-appearing-in-garmin-connect---can-t-figure-out-how-to-debug but implicitly this comes out from the sdk documentation) this is just something to be aware of, may be document at some point.

@JaapvanEkris
Copy link
Copy Markdown
Owner Author

I'm waiting for fitfilewriter to release its latest update, and update the fitrecorder to its latest version. This is an anticipation on the move of RowsAndAll.com to migrate to intervals.icu and use fit-files end of the year to communicate

What is the functionality that you are expecting from the fitfilewriter that needs addition?

Support for undocumented Garmin fields (for lap/split summary) and for developer field arrays (force curves).

As a side note on the fit file, developer fields in garmin connect only show up if there is a valid connect IQ app ID this is just something to be aware of, may be document at some point.

I'm hopefull ErgZone will register it someday, or Garmin will accept it as industry standard. In essence, all rowing data producers jointly agreed this will be the spec moving forward. But intervals.icu will parse the data regardless of status, which is our goal.

@JaapvanEkris
Copy link
Copy Markdown
Owner Author

I'm waiting for fitfilewriter to release its latest update, and update the fitrecorder to its latest version. This is an anticipation on the move of RowsAndAll.com to migrate to intervals.icu and use fit-files end of the year to communicate

What is the functionality that you are expecting from the fitfilewriter that needs addition?

Mark has just released FitFileWriter 0.1.9, which includes all changes we want. I'll release this Sunday evening.

Comment thread app/recorders/fitRecorder.js Outdated
fitWriter.writeMessage(
'developer_data_id',
{
application_id: "42c9182e-23a6-425f-b8fc-316d3d164a6f"
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can see that there is a dev id for the developer fileds: 42c9182e-23a6-425f-b8fc-316d3d164a6f is this a real app or just random UUID to satisfy the standard?

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is random.

Comment thread app/recorders/fitRecorder.js Outdated
@JaapvanEkris
Copy link
Copy Markdown
Owner Author

With the latest PR's merged, I consider 0.9.7 feature complete. I let it cool down for a day or two (last tests), and release it next saturday.

@JaapvanEkris JaapvanEkris merged commit 8cdea5b into main Apr 4, 2026
3 checks passed
@JaapvanEkris JaapvanEkris deleted the 0.9.7-(under-construction) branch April 4, 2026 12:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment