Zones from a lab test
Zones could only be derived from a threshold as percentages, so a boundary on a separately measured value — a lab VT1, say — had to be typed into the web UI by hand. icu_update_sport_settings now writes explicit bounds: hr_zones (bpm), power_zones_percent_ftp, max_hr, sweet_spot_min / sweet_spot_max, and names for each zone. Input the API would silently mishandle — bounds out of order, names that don't match the zone count, watts where % of FTP belongs — is rejected with an error that says how to fix it.
Event tags
Tags set in the web UI now reach the model: tags appears on calendar event responses, and icu_create_event, icu_update_event and icu_bulk_create_events accept them. On update the list replaces what's there, so send [] to clear it or leave tags out to keep the current ones.
Notes
icu_apply_sport_settingsno longer tells the model to run it after every FTP or FTHR change. It overwrites zones on every past activity of the sport, so following that advice rewrote whole histories. New thresholds apply from now on without it; for selected activities, the description points to Update zones in the web UI.
Contributed by @russellmays (#136).
Full Changelog: v5.1.0...v5.2.0