Telemetry
Zone
pydantic-model
¶
Bases: OtfItemBase
A heart rate zone defined by a BPM range.
Show JSON schema:
{
"description": "A heart rate zone defined by a BPM range.",
"properties": {
"startBpm": {
"description": "Lower bound BPM for this zone.",
"title": "Startbpm",
"type": "integer"
},
"endBpm": {
"description": "Upper bound BPM for this zone.",
"title": "Endbpm",
"type": "integer"
}
},
"required": [
"startBpm",
"endBpm"
],
"title": "Zone",
"type": "object"
}
Fields:
Zones
pydantic-model
¶
Bases: OtfItemBase
The five OTF heart rate zones (gray, blue, green, orange, red) with their BPM ranges.
Show JSON schema:
{
"$defs": {
"Zone": {
"description": "A heart rate zone defined by a BPM range.",
"properties": {
"startBpm": {
"description": "Lower bound BPM for this zone.",
"title": "Startbpm",
"type": "integer"
},
"endBpm": {
"description": "Upper bound BPM for this zone.",
"title": "Endbpm",
"type": "integer"
}
},
"required": [
"startBpm",
"endBpm"
],
"title": "Zone",
"type": "object"
}
},
"description": "The five OTF heart rate zones (gray, blue, green, orange, red) with their BPM ranges.",
"properties": {
"gray": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "Rest/very light effort zone."
},
"blue": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "Light effort zone."
},
"green": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "Moderate effort (base pace) zone."
},
"orange": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "High effort (push pace) zone, earns splat points."
},
"red": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "Maximum effort (all-out) zone, earns splat points."
}
},
"required": [
"gray",
"blue",
"green",
"orange",
"red"
],
"title": "Zones",
"type": "object"
}
Fields:
TreadData
pydantic-model
¶
Bases: OtfItemBase
Treadmill telemetry data for a single point in time.
Show JSON schema:
{
"description": "Treadmill telemetry data for a single point in time.",
"properties": {
"treadSpeed": {
"description": "Current treadmill speed.",
"title": "Treadspeed",
"type": "number"
},
"treadIncline": {
"description": "Current treadmill incline.",
"title": "Treadincline",
"type": "number"
},
"aggTreadDistance": {
"description": "Cumulative treadmill distance.",
"title": "Aggtreaddistance",
"type": "integer"
}
},
"required": [
"treadSpeed",
"treadIncline",
"aggTreadDistance"
],
"title": "TreadData",
"type": "object"
}
Fields:
-
tread_speed(float) -
tread_incline(float) -
agg_tread_distance(int)
RowData
pydantic-model
¶
Bases: OtfItemBase
Rower telemetry data for a single point in time.
Show JSON schema:
{
"description": "Rower telemetry data for a single point in time.",
"properties": {
"rowSpeed": {
"description": "Current rowing speed.",
"title": "Rowspeed",
"type": "number"
},
"rowPps": {
"description": "Rowing power per stroke.",
"title": "Rowpps",
"type": "number"
},
"rowSpm": {
"description": "Rowing strokes per minute.",
"title": "Rowspm",
"type": "number"
},
"aggRowDistance": {
"description": "Cumulative rowing distance.",
"title": "Aggrowdistance",
"type": "integer"
},
"rowPace": {
"description": "Current rowing pace.",
"title": "Rowpace",
"type": "integer"
}
},
"required": [
"rowSpeed",
"rowPps",
"rowSpm",
"aggRowDistance",
"rowPace"
],
"title": "RowData",
"type": "object"
}
Fields:
-
row_speed(float) -
row_pps(float) -
row_spm(float) -
agg_row_distance(int) -
row_pace(int)
TelemetryItem
pydantic-model
¶
Bases: OtfItemBase
A single telemetry data point captured during a workout.
Show JSON schema:
{
"$defs": {
"RowData": {
"description": "Rower telemetry data for a single point in time.",
"properties": {
"rowSpeed": {
"description": "Current rowing speed.",
"title": "Rowspeed",
"type": "number"
},
"rowPps": {
"description": "Rowing power per stroke.",
"title": "Rowpps",
"type": "number"
},
"rowSpm": {
"description": "Rowing strokes per minute.",
"title": "Rowspm",
"type": "number"
},
"aggRowDistance": {
"description": "Cumulative rowing distance.",
"title": "Aggrowdistance",
"type": "integer"
},
"rowPace": {
"description": "Current rowing pace.",
"title": "Rowpace",
"type": "integer"
}
},
"required": [
"rowSpeed",
"rowPps",
"rowSpm",
"aggRowDistance",
"rowPace"
],
"title": "RowData",
"type": "object"
},
"TreadData": {
"description": "Treadmill telemetry data for a single point in time.",
"properties": {
"treadSpeed": {
"description": "Current treadmill speed.",
"title": "Treadspeed",
"type": "number"
},
"treadIncline": {
"description": "Current treadmill incline.",
"title": "Treadincline",
"type": "number"
},
"aggTreadDistance": {
"description": "Cumulative treadmill distance.",
"title": "Aggtreaddistance",
"type": "integer"
}
},
"required": [
"treadSpeed",
"treadIncline",
"aggTreadDistance"
],
"title": "TreadData",
"type": "object"
}
},
"description": "A single telemetry data point captured during a workout.",
"properties": {
"relativeTimestamp": {
"description": "Seconds since the start of the class.",
"title": "Relativetimestamp",
"type": "integer"
},
"hr": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Heart rate in BPM at this point in time.",
"title": "Hr"
},
"aggSplats": {
"description": "Cumulative splat points at this time.",
"title": "Aggsplats",
"type": "integer"
},
"aggCalories": {
"description": "Cumulative calories burned at this time.",
"title": "Aggcalories",
"type": "integer"
},
"timestamp": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The timestamp of the telemetry item, calculated from the class start time and relative timestamp.",
"title": "Timestamp"
},
"treadData": {
"anyOf": [
{
"$ref": "#/$defs/TreadData"
},
{
"type": "null"
}
],
"default": null,
"description": "Treadmill data, present when on the treadmill."
},
"rowData": {
"anyOf": [
{
"$ref": "#/$defs/RowData"
},
{
"type": "null"
}
],
"default": null,
"description": "Rower data, present when on the rower."
}
},
"required": [
"relativeTimestamp",
"aggSplats",
"aggCalories"
],
"title": "TelemetryItem",
"type": "object"
}
Fields:
-
relative_timestamp(int) -
hr(int | None) -
agg_splats(int) -
agg_calories(int) -
timestamp(datetime | None) -
tread_data(TreadData | None) -
row_data(RowData | None)
timestamp
pydantic-field
¶
timestamp = None
The timestamp of the telemetry item, calculated from the class start time and relative timestamp.
Telemetry
pydantic-model
¶
Bases: OtfItemBase
Full telemetry data for a workout, including time-series heart rate and equipment data.
Show JSON schema:
{
"$defs": {
"RowData": {
"description": "Rower telemetry data for a single point in time.",
"properties": {
"rowSpeed": {
"description": "Current rowing speed.",
"title": "Rowspeed",
"type": "number"
},
"rowPps": {
"description": "Rowing power per stroke.",
"title": "Rowpps",
"type": "number"
},
"rowSpm": {
"description": "Rowing strokes per minute.",
"title": "Rowspm",
"type": "number"
},
"aggRowDistance": {
"description": "Cumulative rowing distance.",
"title": "Aggrowdistance",
"type": "integer"
},
"rowPace": {
"description": "Current rowing pace.",
"title": "Rowpace",
"type": "integer"
}
},
"required": [
"rowSpeed",
"rowPps",
"rowSpm",
"aggRowDistance",
"rowPace"
],
"title": "RowData",
"type": "object"
},
"TelemetryItem": {
"description": "A single telemetry data point captured during a workout.",
"properties": {
"relativeTimestamp": {
"description": "Seconds since the start of the class.",
"title": "Relativetimestamp",
"type": "integer"
},
"hr": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Heart rate in BPM at this point in time.",
"title": "Hr"
},
"aggSplats": {
"description": "Cumulative splat points at this time.",
"title": "Aggsplats",
"type": "integer"
},
"aggCalories": {
"description": "Cumulative calories burned at this time.",
"title": "Aggcalories",
"type": "integer"
},
"timestamp": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The timestamp of the telemetry item, calculated from the class start time and relative timestamp.",
"title": "Timestamp"
},
"treadData": {
"anyOf": [
{
"$ref": "#/$defs/TreadData"
},
{
"type": "null"
}
],
"default": null,
"description": "Treadmill data, present when on the treadmill."
},
"rowData": {
"anyOf": [
{
"$ref": "#/$defs/RowData"
},
{
"type": "null"
}
],
"default": null,
"description": "Rower data, present when on the rower."
}
},
"required": [
"relativeTimestamp",
"aggSplats",
"aggCalories"
],
"title": "TelemetryItem",
"type": "object"
},
"TreadData": {
"description": "Treadmill telemetry data for a single point in time.",
"properties": {
"treadSpeed": {
"description": "Current treadmill speed.",
"title": "Treadspeed",
"type": "number"
},
"treadIncline": {
"description": "Current treadmill incline.",
"title": "Treadincline",
"type": "number"
},
"aggTreadDistance": {
"description": "Cumulative treadmill distance.",
"title": "Aggtreaddistance",
"type": "integer"
}
},
"required": [
"treadSpeed",
"treadIncline",
"aggTreadDistance"
],
"title": "TreadData",
"type": "object"
},
"Zone": {
"description": "A heart rate zone defined by a BPM range.",
"properties": {
"startBpm": {
"description": "Lower bound BPM for this zone.",
"title": "Startbpm",
"type": "integer"
},
"endBpm": {
"description": "Upper bound BPM for this zone.",
"title": "Endbpm",
"type": "integer"
}
},
"required": [
"startBpm",
"endBpm"
],
"title": "Zone",
"type": "object"
},
"Zones": {
"description": "The five OTF heart rate zones (gray, blue, green, orange, red) with their BPM ranges.",
"properties": {
"gray": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "Rest/very light effort zone."
},
"blue": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "Light effort zone."
},
"green": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "Moderate effort (base pace) zone."
},
"orange": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "High effort (push pace) zone, earns splat points."
},
"red": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "Maximum effort (all-out) zone, earns splat points."
}
},
"required": [
"gray",
"blue",
"green",
"orange",
"red"
],
"title": "Zones",
"type": "object"
}
},
"description": "Full telemetry data for a workout, including time-series heart rate and equipment data.",
"properties": {
"memberUuid": {
"description": "Unique identifier for the member.",
"title": "Memberuuid",
"type": "string"
},
"classHistoryUuid": {
"description": "The same as performance_summary_id.",
"title": "Classhistoryuuid",
"type": "string"
},
"classStartTime": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "When the class started.",
"title": "Classstarttime"
},
"maxHr": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Member's max heart rate.",
"title": "Maxhr"
},
"zones": {
"anyOf": [
{
"$ref": "#/$defs/Zones"
},
{
"type": "null"
}
],
"default": null,
"description": "The zones associated with the telemetry."
},
"windowSize": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Telemetry sampling window size in seconds.",
"title": "Windowsize"
},
"telemetry": {
"description": "Time-series telemetry data points.",
"items": {
"$ref": "#/$defs/TelemetryItem"
},
"title": "Telemetry",
"type": "array"
}
},
"required": [
"memberUuid",
"classHistoryUuid",
"classHistoryUuid"
],
"title": "Telemetry",
"type": "object"
}
Fields:
-
member_uuid(str) -
performance_summary_id(str) -
class_history_uuid(str) -
class_start_time(datetime | None) -
max_hr(int | None) -
zones(Zones | None) -
window_size(int | None) -
telemetry(list[TelemetryItem])
TelemetryHistoryItem
pydantic-model
¶
Bases: OtfItemBase
A historical record of a member's max heart rate zone configuration changes.
Show JSON schema:
{
"$defs": {
"Zone": {
"description": "A heart rate zone defined by a BPM range.",
"properties": {
"startBpm": {
"description": "Lower bound BPM for this zone.",
"title": "Startbpm",
"type": "integer"
},
"endBpm": {
"description": "Upper bound BPM for this zone.",
"title": "Endbpm",
"type": "integer"
}
},
"required": [
"startBpm",
"endBpm"
],
"title": "Zone",
"type": "object"
},
"Zones": {
"description": "The five OTF heart rate zones (gray, blue, green, orange, red) with their BPM ranges.",
"properties": {
"gray": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "Rest/very light effort zone."
},
"blue": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "Light effort zone."
},
"green": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "Moderate effort (base pace) zone."
},
"orange": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "High effort (push pace) zone, earns splat points."
},
"red": {
"allOf": [
{
"$ref": "#/$defs/Zone"
}
],
"description": "Maximum effort (all-out) zone, earns splat points."
}
},
"required": [
"gray",
"blue",
"green",
"orange",
"red"
],
"title": "Zones",
"type": "object"
}
},
"description": "A historical record of a member's max heart rate zone configuration changes.",
"properties": {
"max_hr_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Method used to determine max HR.",
"title": "Max Hr Type"
},
"max_hr_value": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Max heart rate value.",
"title": "Max Hr Value"
},
"zones": {
"anyOf": [
{
"$ref": "#/$defs/Zones"
},
{
"type": "null"
}
],
"default": null,
"description": "Heart rate zone boundaries at this point in time."
},
"changeFromPrevious": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "BPM change from the previous max HR value.",
"title": "Changefromprevious"
},
"changeBucket": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Category of the change (e.g. increase, decrease).",
"title": "Changebucket"
},
"assignedAt": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "When this max HR configuration was assigned.",
"title": "Assignedat"
}
},
"title": "TelemetryHistoryItem",
"type": "object"
}
Fields:
-
max_hr_type(str | None) -
max_hr_value(int | None) -
zones(Zones | None) -
change_from_previous(int | None) -
change_bucket(str | None) -
assigned_at(datetime | None)