diff --git a/README.md b/README.md index 1ef4c32..8d704b5 100644 --- a/README.md +++ b/README.md @@ -1,216 +1,217 @@ -# Garmin - FIT Python SDK - -## FIT SDK Documentation -The FIT SDK documentation is available at [https://developer.garmin.com/fit](https://developer.garmin.com/fit). -## FIT SDK Developer Forum -Share your knowledge, ask questions, and get the latest FIT SDK news in the [FIT SDK Developer Forum](https://forums.garmin.com/developer/). - -## FIT Python SDK Requirements -* [Python](https:##www.python.org/downloads/) Version 3.6 or greater is required to run the FIT Python SDK - -## Install -```sh -pip install garmin-fit-sdk -``` - -## Usage -```py -from garmin_fit_sdk import Decoder, Stream - -stream = Stream.from_file("Activity.fit") -decoder = Decoder(stream) -messages, errors = decoder.read() - -print(errors) -print(messages) -``` - -## Decoder - -### Constructor - -Creating Decoder objects requires an input Stream representing the binary FIT file data to be decoded. See [Creating Streams](#creatingstreams) for more information on constructing Stream objects. - -Once a Decoder object is created it can be used to check that the Stream is a FIT file, that the FIT file is valid, and to read the contents of the FIT file. - -### is_fit Method - -All valid FIT files should include a 12 or 14 byte file header. The 14 byte header is the preferred header size and the most common size used. Bytes 8-11 of the header contain the ASCII values ".FIT". This string can easily be spotted when opening a binary FIT file in a text or hex editor. - -``` - Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F -00000000: 0E 10 43 08 78 06 09 00 2E 46 49 54 96 85 40 00 ..C.x....FIT..@. -00000010: 00 00 00 07 03 04 8C 04 04 86 07 04 86 01 02 84 ................ -00000020: 02 02 84 05 02 84 00 01 00 00 19 28 7E C5 95 B0 ...........(~E.0 -``` - -### check_integrity Method - -The checkIntegrity method performs three checks on a FIT file: - -1. Checks that bytes 8-11 of the header contain the ASCII values ".FIT". -2. Checks that the total file size is equal to Header Size + Data Size + CRC Size. -3. Reads the contents of the file, computes the CRC, and then checks that the computed CRC matches the file CRC. - -A file must pass all three of these tests to be considered a valid FIT file. See the [IsFIT(), CheckIntegrity(), and Read() Methods recipe](/fit/cookbook/isfit-checkintegrity-read/) for use-cases where the checkIntegrity method should be used and cases when it might be better to avoid it. - -#### Read Method -The Read method decodes all messages from the input stream and returns an object containing a list of errors encountered during the decoding and a dictionary of decoded messages grouped by message type. Any exceptions encountered during decoding will be caught by the Read method and added to the list of errors. - -The Read method accepts an optional options object that can be used to customize how field data is represented in the decoded messages. All options are enabled by default. Disabling options may speed up file decoding. Options may also be enabled or disable based on how the decoded data will be used. - -```py -messages, errors = read( - apply_scale_and_offset = True, - convert_datetimes_to_dates = True, - convert_types_to_strings = True, - enable_crc_check = True, - expand_sub_fields = True, - expand_components = True, - merge_heart_rates = True, - mesg_listener = None) -``` -#### mesg_listener -Optional callback function that can be used to inspect or manipulate messages after they are fully decoded and all the options have been applied. The message is mutable and we be returned from the Read method in the messages dictionary. - -Example mesg_listener callback that tracks the field names across all Record messages. - -```py -from garmin_fit_sdk import Decoder, Stream, Profile - -stream = Stream.from_file("Activity.fit") -decoder = Decoder(stream) - -record_fields = set() -def mesg_listener(mesg_num, message): - if mesg_num == Profile['mesg_num']['RECORD']: - for field in message: - record_fields.add(field) - -messages, errors = decoder.read(mesg_listener = mesg_listener) - -if len(errors) > 0: - print(f"Something went wrong decoding the file: {errors}") - return - -print(record_fields) -``` - -#### apply_scale_and_offset: true | false -When true the scale and offset values as defined in the FIT Profile are applied to the raw field values. -```py -{ - 'altitude': 1587 ## with a scale of 5 and offset of 500 applied -} -``` -When false the raw field value is used. -```py -{ - 'altitude': 10435 ## raw value store in file -} -``` -#### enable_crc_check: true | false -When true the CRC of the file is calculated when decoding a FIT file and then validated with the CRC found in the file. Disabling the CRC calculation will improve the performance of the read method. -#### expand_sub_fields: true | false -When true subfields are created for fields as defined in the FIT Profile. -```py -{ - 'event': 'rear_gear_change', - 'data': 16717829, - 'gear_change_data':16717829 ## Sub Field of data when event == 'rear_gear_change' -} -``` -When false subfields are omitted. -```py -{ - 'event': 'rearGearChange', - 'data': 16717829 -} -``` -#### expand_components: true | false -When true field components as defined in the FIT Profile are expanded into new fields. expand_sub_fields must be set to true in order for subfields to be expanded - -```py -{ - 'event': 'rear_gear_change' - 'data': 16717829, - 'gear_change_data':16717829, ## Sub Field of data when event == 'rear_gear_change' - 'front_gear': 2, ## Expanded field of gear_change_data, bits 0-7 - 'front_gear_num': 53, ## Expanded field of gear_change_data, bits 8-15 - 'rear_gear': 11, ## Expanded field of gear_change_data, bits 16-23 - 'rear_gear_num': 1, ## Expanded field of gear_change_data, bits 24-31 -} -``` -When false field components are not expanded. -```py -{ - 'event': 'rear_gear_change', - 'data': 16717829, - 'gear_change_data': 16717829 ### Sub Field of data when event == 'rear_gear_change' -} -``` -#### convert_types_to_strings: true | false -When true field values are converted from raw integer values to the corresponding string values as defined in the FIT Profile. -```py -{ 'type':'activity'} -``` -When false the raw integer value is used. -```py -{ 'type': 4 } -``` -#### convert_datetimes_to_dates: true | false -When true FIT Epoch values are converted to Python datetime objects. -```py -{ 'time_created': {Python datetime object} } -``` -When false the FIT Epoch value is used. -```py -{ 'time_created': 995749880 } -``` -When false the Util.convert_timestamp_to_datetime method may be used to convert FIT Epoch values to Python datetime objects. -#### merge_heart_rates: true | false -When true automatically merge heart rate values from HR messages into the Record messages. This option requires the apply_scale_and_offset and expand_components options to be enabled. This option has no effect on the Record messages when no HR messages are present in the decoded messages. - -## Creating Streams -Stream objects contain the binary FIT data to be decoded. Streams objects can be created from bytearrays, BufferedReaders, and BytesIO objects. Internally the Stream class uses a BufferedReader to manage the byte stream. - -#### From a file -```py -stream = Stream.from_file("activity.fit") -print(f"is_fit: {Decoder.is_fit(stream)}") -``` -#### From a bytearray -```py -fit_byte_array = bytearray([0x0E, 0x10, 0xD9, 0x07, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x91, 0x33, 0x00, 0x00]) -stream = Stream.from_byte_array(fit_byte_array) -print(f"is_fit: {Decoder.is_fit(stream)}") -``` -#### From a BytesIO Object -```py -fit_byte_bytes_io = io.BytesIO(bytearray([0x0E, 0x10, 0xD9, 0x07, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x91, 0x33, 0x00, 0x00])) -stream = Stream.from_byte_io(fit_byte_bytes_io) -print(f"is_fit: {Decoder.is_fit(stream)}") -``` -#### From a buffered_reader -```py -fit_buffered_reader = io.BufferedReader(io.BytesIO(bytearray([0x0E, 0x10, 0xD9, 0x07, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x91, 0x33, 0x00, 0x00]))) -stream = Stream.from_buffered_reader(fit_buffered_reader) -print(f"is_fit: {Decoder.is_fit(stream)}") -``` - -## Util -The Util object contains both constants and methods for working with decoded messages and fields. -### FIT_EPOCH_S Constant -The FIT_EPOCH_S constant represents the number of seconds between the Unix Epoch and the FIT Epoch. -```py -FIT_EPOCH_S = 631065600 -``` -The FIT_EPOCH_S value can be used to convert FIT Epoch values to Python datetime objects. -```py -python_date = datetime.datetime.fromtimestamp(fitDateTime + FIT_EPOCH_S, datetime.UTC) -``` -### convert_timestamp_to_datetime Method -A convenience method for converting FIT Epoch values to Python Datetime objects. -```py -python_date = convert_timestamp_to_datetime(fit_datetime) +# Garmin - FIT Python SDK + +## FIT SDK Documentation +The FIT SDK documentation is available at [https://developer.garmin.com/fit](https://developer.garmin.com/fit). +## FIT SDK Developer Forum +Share your knowledge, ask questions, and get the latest FIT SDK news in the [FIT SDK Developer Forum](https://forums.garmin.com/developer/). + +## FIT Python SDK Requirements +* [Python](https:##www.python.org/downloads/) Version 3.6 or greater is required to run the FIT Python SDK + +## Install +The FIT Python SDK is published to PyPi as [garmin-fit-sdk](https://pypi.org/project/garmin-fit-sdk/) and can be installed using pip. +```sh +pip install garmin-fit-sdk +``` + +## Usage +```py +from garmin_fit_sdk import Decoder, Stream + +stream = Stream.from_file("Activity.fit") +decoder = Decoder(stream) +messages, errors = decoder.read() + +print(errors) +print(messages) +``` + +## Decoder + +### Constructor + +Creating Decoder objects requires an input Stream representing the binary FIT file data to be decoded. See [Creating Streams](#creatingstreams) for more information on constructing Stream objects. + +Once a Decoder object is created it can be used to check that the Stream is a FIT file, that the FIT file is valid, and to read the contents of the FIT file. + +### is_fit Method + +All valid FIT files should include a 12 or 14 byte file header. The 14 byte header is the preferred header size and the most common size used. Bytes 8-11 of the header contain the ASCII values ".FIT". This string can easily be spotted when opening a binary FIT file in a text or hex editor. + +``` + Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F +00000000: 0E 10 43 08 78 06 09 00 2E 46 49 54 96 85 40 00 ..C.x....FIT..@. +00000010: 00 00 00 07 03 04 8C 04 04 86 07 04 86 01 02 84 ................ +00000020: 02 02 84 05 02 84 00 01 00 00 19 28 7E C5 95 B0 ...........(~E.0 +``` + +### check_integrity Method + +The checkIntegrity method performs three checks on a FIT file: + +1. Checks that bytes 8-11 of the header contain the ASCII values ".FIT". +2. Checks that the total file size is equal to Header Size + Data Size + CRC Size. +3. Reads the contents of the file, computes the CRC, and then checks that the computed CRC matches the file CRC. + +A file must pass all three of these tests to be considered a valid FIT file. See the [IsFIT(), CheckIntegrity(), and Read() Methods recipe](/fit/cookbook/isfit-checkintegrity-read/) for use-cases where the checkIntegrity method should be used and cases when it might be better to avoid it. + +#### Read Method +The Read method decodes all messages from the input stream and returns an object containing a list of errors encountered during the decoding and a dictionary of decoded messages grouped by message type. Any exceptions encountered during decoding will be caught by the Read method and added to the list of errors. + +The Read method accepts an optional options object that can be used to customize how field data is represented in the decoded messages. All options are enabled by default. Disabling options may speed up file decoding. Options may also be enabled or disable based on how the decoded data will be used. + +```py +messages, errors = read( + apply_scale_and_offset = True, + convert_datetimes_to_dates = True, + convert_types_to_strings = True, + enable_crc_check = True, + expand_sub_fields = True, + expand_components = True, + merge_heart_rates = True, + mesg_listener = None) +``` +#### mesg_listener +Optional callback function that can be used to inspect or manipulate messages after they are fully decoded and all the options have been applied. The message is mutable and we be returned from the Read method in the messages dictionary. + +Example mesg_listener callback that tracks the field names across all Record messages. + +```py +from garmin_fit_sdk import Decoder, Stream, Profile + +stream = Stream.from_file("Activity.fit") +decoder = Decoder(stream) + +record_fields = set() +def mesg_listener(mesg_num, message): + if mesg_num == Profile['mesg_num']['RECORD']: + for field in message: + record_fields.add(field) + +messages, errors = decoder.read(mesg_listener = mesg_listener) + +if len(errors) > 0: + print(f"Something went wrong decoding the file: {errors}") + return + +print(record_fields) +``` + +#### apply_scale_and_offset: true | false +When true the scale and offset values as defined in the FIT Profile are applied to the raw field values. +```py +{ + 'altitude': 1587 ## with a scale of 5 and offset of 500 applied +} +``` +When false the raw field value is used. +```py +{ + 'altitude': 10435 ## raw value store in file +} +``` +#### enable_crc_check: true | false +When true the CRC of the file is calculated when decoding a FIT file and then validated with the CRC found in the file. Disabling the CRC calculation will improve the performance of the read method. +#### expand_sub_fields: true | false +When true subfields are created for fields as defined in the FIT Profile. +```py +{ + 'event': 'rear_gear_change', + 'data': 16717829, + 'gear_change_data':16717829 ## Sub Field of data when event == 'rear_gear_change' +} +``` +When false subfields are omitted. +```py +{ + 'event': 'rearGearChange', + 'data': 16717829 +} +``` +#### expand_components: true | false +When true field components as defined in the FIT Profile are expanded into new fields. expand_sub_fields must be set to true in order for subfields to be expanded + +```py +{ + 'event': 'rear_gear_change' + 'data': 16717829, + 'gear_change_data':16717829, ## Sub Field of data when event == 'rear_gear_change' + 'front_gear': 2, ## Expanded field of gear_change_data, bits 0-7 + 'front_gear_num': 53, ## Expanded field of gear_change_data, bits 8-15 + 'rear_gear': 11, ## Expanded field of gear_change_data, bits 16-23 + 'rear_gear_num': 1, ## Expanded field of gear_change_data, bits 24-31 +} +``` +When false field components are not expanded. +```py +{ + 'event': 'rear_gear_change', + 'data': 16717829, + 'gear_change_data': 16717829 ### Sub Field of data when event == 'rear_gear_change' +} +``` +#### convert_types_to_strings: true | false +When true field values are converted from raw integer values to the corresponding string values as defined in the FIT Profile. +```py +{ 'type':'activity'} +``` +When false the raw integer value is used. +```py +{ 'type': 4 } +``` +#### convert_datetimes_to_dates: true | false +When true FIT Epoch values are converted to Python datetime objects. +```py +{ 'time_created': {Python datetime object} } +``` +When false the FIT Epoch value is used. +```py +{ 'time_created': 995749880 } +``` +When false the Util.convert_timestamp_to_datetime method may be used to convert FIT Epoch values to Python datetime objects. +#### merge_heart_rates: true | false +When true automatically merge heart rate values from HR messages into the Record messages. This option requires the apply_scale_and_offset and expand_components options to be enabled. This option has no effect on the Record messages when no HR messages are present in the decoded messages. + +## Creating Streams +Stream objects contain the binary FIT data to be decoded. Streams objects can be created from bytearrays, BufferedReaders, and BytesIO objects. Internally the Stream class uses a BufferedReader to manage the byte stream. + +#### From a file +```py +stream = Stream.from_file("activity.fit") +print(f"is_fit: {Decoder.is_fit(stream)}") +``` +#### From a bytearray +```py +fit_byte_array = bytearray([0x0E, 0x10, 0xD9, 0x07, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x91, 0x33, 0x00, 0x00]) +stream = Stream.from_byte_array(fit_byte_array) +print(f"is_fit: {Decoder.is_fit(stream)}") +``` +#### From a BytesIO Object +```py +fit_byte_bytes_io = io.BytesIO(bytearray([0x0E, 0x10, 0xD9, 0x07, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x91, 0x33, 0x00, 0x00])) +stream = Stream.from_byte_io(fit_byte_bytes_io) +print(f"is_fit: {Decoder.is_fit(stream)}") +``` +#### From a buffered_reader +```py +fit_buffered_reader = io.BufferedReader(io.BytesIO(bytearray([0x0E, 0x10, 0xD9, 0x07, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x91, 0x33, 0x00, 0x00]))) +stream = Stream.from_buffered_reader(fit_buffered_reader) +print(f"is_fit: {Decoder.is_fit(stream)}") +``` + +## Util +The Util object contains both constants and methods for working with decoded messages and fields. +### FIT_EPOCH_S Constant +The FIT_EPOCH_S constant represents the number of seconds between the Unix Epoch and the FIT Epoch. +```py +FIT_EPOCH_S = 631065600 +``` +The FIT_EPOCH_S value can be used to convert FIT Epoch values to Python datetime objects. +```py +python_date = datetime.datetime.fromtimestamp(fitDateTime + FIT_EPOCH_S, datetime.UTC) +``` +### convert_timestamp_to_datetime Method +A convenience method for converting FIT Epoch values to Python Datetime objects. +```py +python_date = convert_timestamp_to_datetime(fit_datetime) ``` \ No newline at end of file diff --git a/garmin_fit_sdk/__init__.py b/garmin_fit_sdk/__init__.py index b16b29c..e7d8efe 100644 --- a/garmin_fit_sdk/__init__.py +++ b/garmin_fit_sdk/__init__.py @@ -1,25 +1,25 @@ -# __init__garmin_fit_sdk.py - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### -# ****WARNING**** This file is auto-generated! Do NOT edit this file. -# Profile Version = 21.188.0Release -# Tag = production/release/21.188.0-0-g55050f8 -############################################################################################ - - -from garmin_fit_sdk.accumulator import Accumulator -from garmin_fit_sdk.bitstream import BitStream -from garmin_fit_sdk.crc_calculator import CrcCalculator -from garmin_fit_sdk.decoder import Decoder -from garmin_fit_sdk.fit import BASE_TYPE, BASE_TYPE_DEFINITIONS -from garmin_fit_sdk.hr_mesg_utils import expand_heart_rates -from garmin_fit_sdk.profile import Profile -from garmin_fit_sdk.stream import Stream -from garmin_fit_sdk.util import FIT_EPOCH_S, convert_timestamp_to_datetime - -__version__ = '21.188.0' +# __init__garmin_fit_sdk.py + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### +# ****WARNING**** This file is auto-generated! Do NOT edit this file. +# Profile Version = 21.194.0Release +# Tag = production/release/21.194.0-0-g65135fc +############################################################################################ + + +from garmin_fit_sdk.accumulator import Accumulator +from garmin_fit_sdk.bitstream import BitStream +from garmin_fit_sdk.crc_calculator import CrcCalculator +from garmin_fit_sdk.decoder import Decoder +from garmin_fit_sdk.fit import BASE_TYPE, BASE_TYPE_DEFINITIONS +from garmin_fit_sdk.hr_mesg_utils import expand_heart_rates +from garmin_fit_sdk.profile import Profile +from garmin_fit_sdk.stream import Stream +from garmin_fit_sdk.util import FIT_EPOCH_S, convert_timestamp_to_datetime + +__version__ = '21.194.0' diff --git a/garmin_fit_sdk/accumulator.py b/garmin_fit_sdk/accumulator.py index 8a64be3..d3ba33d 100644 --- a/garmin_fit_sdk/accumulator.py +++ b/garmin_fit_sdk/accumulator.py @@ -1,63 +1,63 @@ -'''accumulator.py: Contains the Accumulator class and sub-component class AccumulatedField''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### -# ****WARNING**** This file is auto-generated! Do NOT edit this file. -# Profile Version = 21.188.0Release -# Tag = production/release/21.188.0-0-g55050f8 -############################################################################################ - - -class AccumulatedField: - '''A class that accumulates a value for a particular field. - Attributes: - _accumulated_value: Resulting accumulated value - _last_value: The previous accumulated value thus far. - ''' - def __init__(self, value = 0): - self._accumulated_value = value - self._last_value = value - - def accumulate(self, value, bits): - ''''Accumulates to the previous value and gives the updated accumulated value.''' - mask = (1 << bits) - 1 - - self._accumulated_value += (value - self._last_value) & mask - self._last_value = value - - return self._accumulated_value - -class Accumulator: - '''A class that represents the accumulated values for particular fields. - Attributes: - _messages: A list of messages with a field or fields to accumulate. - ''' - def __init__(self): - self._messages = {} - - def createAccumulatedField(self, mesg_num, field_num, value): - '''Creates an accumulated field and stores its initial value in the accumulator''' - accumulatedField = AccumulatedField(value) - - if mesg_num not in self._messages: - self._messages[mesg_num] = {} - - self._messages[mesg_num][field_num] = accumulatedField - - return accumulatedField - - def accumulate(self, mesg_num, field_num, value, bits): - '''Accumulates the given field value if present in the accumulator. If it is not, the accumulated field is added to the Accumulator.''' - accumulatedField = None - - if mesg_num in self._messages and field_num in self._messages[mesg_num]: - accumulatedField = self._messages[mesg_num][field_num] - else: - accumulatedField = self.createAccumulatedField(mesg_num, field_num, value) - - return accumulatedField.accumulate(value, bits) - +'''accumulator.py: Contains the Accumulator class and sub-component class AccumulatedField''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### +# ****WARNING**** This file is auto-generated! Do NOT edit this file. +# Profile Version = 21.194.0Release +# Tag = production/release/21.194.0-0-g65135fc +############################################################################################ + + +class AccumulatedField: + '''A class that accumulates a value for a particular field. + Attributes: + _accumulated_value: Resulting accumulated value + _last_value: The previous accumulated value thus far. + ''' + def __init__(self, value = 0): + self._accumulated_value = value + self._last_value = value + + def accumulate(self, value, bits): + ''''Accumulates to the previous value and gives the updated accumulated value.''' + mask = (1 << bits) - 1 + + self._accumulated_value += (value - self._last_value) & mask + self._last_value = value + + return self._accumulated_value + +class Accumulator: + '''A class that represents the accumulated values for particular fields. + Attributes: + _messages: A list of messages with a field or fields to accumulate. + ''' + def __init__(self): + self._messages = {} + + def createAccumulatedField(self, mesg_num, field_num, value): + '''Creates an accumulated field and stores its initial value in the accumulator''' + accumulatedField = AccumulatedField(value) + + if mesg_num not in self._messages: + self._messages[mesg_num] = {} + + self._messages[mesg_num][field_num] = accumulatedField + + return accumulatedField + + def accumulate(self, mesg_num, field_num, value, bits): + '''Accumulates the given field value if present in the accumulator. If it is not, the accumulated field is added to the Accumulator.''' + accumulatedField = None + + if mesg_num in self._messages and field_num in self._messages[mesg_num]: + accumulatedField = self._messages[mesg_num][field_num] + else: + accumulatedField = self.createAccumulatedField(mesg_num, field_num, value) + + return accumulatedField.accumulate(value, bits) + diff --git a/garmin_fit_sdk/bitstream.py b/garmin_fit_sdk/bitstream.py index 381e62c..1b6f8ef 100644 --- a/garmin_fit_sdk/bitstream.py +++ b/garmin_fit_sdk/bitstream.py @@ -1,90 +1,90 @@ -'''bitstream.py: Contains BitStream class which handles reading streams of data bit by bit ''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### -# ****WARNING**** This file is auto-generated! Do NOT edit this file. -# Profile Version = 21.188.0Release -# Tag = production/release/21.188.0-0-g55050f8 -############################################################################################ - - -from . import fit as FIT - - -class BitStream: - ''' - A class that represents a stream of binary data from a chunk of data. - - Attributes: - _array: The stream of data in an array structure. - _current_array_position: Current position in data array. - _bits_per_position: Number of bits per step through the data. - _current_byte: Position of the current byte being read in the data. - _current_bit: Position of the current bit being read in the data. - _bits_available: Remaining number of bits left unread in the data. - ''' - def __init__(self, data, base_type): - self._array = None - self._current_array_position = 0 - self._bits_per_position = 0 - self._current_byte = 0 - self._current_bit = 0 - self._bits_available = 0 - - self._array = data if isinstance(data, list) else [data] - base_type_size = FIT.BASE_TYPE_DEFINITIONS[base_type]['size'] - self._bits_per_position = base_type_size * 8 - self.reset() - - def bits_available(self): - '''Returns the number of bits left in the data.''' - return self._bits_available - - def has_bits_available(self): - '''Returns true if the data has bits available.''' - return self._bits_available > 0 - - def reset(self): - '''Resets the bitstream to the start of the data and resets the bits available.''' - self._current_array_position = 0 - self._bits_available = self._bits_per_position * len(self._array) - self.__next_byte() - - def read_bit(self): - '''Reads the next bit if possible.''' - if self.has_bits_available() is False: - self.__raise_error() - - if self._current_bit >= self._bits_per_position: - self.__next_byte() - - bit = self._current_byte & 0x01 - self._current_byte = (self._current_byte >> 1) - self._current_bit += 1 - self._bits_available -= 1 - - return bit - - def read_bits(self, number_bits_to_read): - '''Reads the specificed number of bits if possible.''' - value = 0 - - for i in range(number_bits_to_read): - value |= self.read_bit() << i - - return value - - def __next_byte(self): - if self._current_array_position >= len(self._array): - self.__raise_error() - - self._current_byte = self._array[self._current_array_position] - self._current_array_position += 1 - self._current_bit = 0 - - def __raise_error(self): - raise IndexError('FIT Runtime Error, no bits available.') +'''bitstream.py: Contains BitStream class which handles reading streams of data bit by bit ''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### +# ****WARNING**** This file is auto-generated! Do NOT edit this file. +# Profile Version = 21.194.0Release +# Tag = production/release/21.194.0-0-g65135fc +############################################################################################ + + +from . import fit as FIT + + +class BitStream: + ''' + A class that represents a stream of binary data from a chunk of data. + + Attributes: + _array: The stream of data in an array structure. + _current_array_position: Current position in data array. + _bits_per_position: Number of bits per step through the data. + _current_byte: Position of the current byte being read in the data. + _current_bit: Position of the current bit being read in the data. + _bits_available: Remaining number of bits left unread in the data. + ''' + def __init__(self, data, base_type): + self._array = None + self._current_array_position = 0 + self._bits_per_position = 0 + self._current_byte = 0 + self._current_bit = 0 + self._bits_available = 0 + + self._array = data if isinstance(data, list) else [data] + base_type_size = FIT.BASE_TYPE_DEFINITIONS[base_type]['size'] + self._bits_per_position = base_type_size * 8 + self.reset() + + def bits_available(self): + '''Returns the number of bits left in the data.''' + return self._bits_available + + def has_bits_available(self): + '''Returns true if the data has bits available.''' + return self._bits_available > 0 + + def reset(self): + '''Resets the bitstream to the start of the data and resets the bits available.''' + self._current_array_position = 0 + self._bits_available = self._bits_per_position * len(self._array) + self.__next_byte() + + def read_bit(self): + '''Reads the next bit if possible.''' + if self.has_bits_available() is False: + self.__raise_error() + + if self._current_bit >= self._bits_per_position: + self.__next_byte() + + bit = self._current_byte & 0x01 + self._current_byte = (self._current_byte >> 1) + self._current_bit += 1 + self._bits_available -= 1 + + return bit + + def read_bits(self, number_bits_to_read): + '''Reads the specificed number of bits if possible.''' + value = 0 + + for i in range(number_bits_to_read): + value |= self.read_bit() << i + + return value + + def __next_byte(self): + if self._current_array_position >= len(self._array): + self.__raise_error() + + self._current_byte = self._array[self._current_array_position] + self._current_array_position += 1 + self._current_bit = 0 + + def __raise_error(self): + raise IndexError('FIT Runtime Error, no bits available.') diff --git a/garmin_fit_sdk/crc_calculator.py b/garmin_fit_sdk/crc_calculator.py index e5fcec0..58245bc 100644 --- a/garmin_fit_sdk/crc_calculator.py +++ b/garmin_fit_sdk/crc_calculator.py @@ -1,57 +1,57 @@ -'''crc_calculator.py: Contains the CRC class which is used for calculating the header and file data CRCs.''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### -# ****WARNING**** This file is auto-generated! Do NOT edit this file. -# Profile Version = 21.188.0Release -# Tag = production/release/21.188.0-0-g55050f8 -############################################################################################ - - -_CRC_TABLE = [ - 0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, - 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400 -] - - -class CrcCalculator: - '''A class for calculating the CRC of a given .fit file header or file contents.''' - - def __init__(self) -> None: - self._crc = 0 - self._bytes_seen = 0 - - def get_crc(self): - '''Returns the calculated CRC value.''' - return self._crc - - def __update_crc(self, value): - # compute checksum of lower four bits of byte - temp = _CRC_TABLE[self._crc & 0xF] - self._crc = (self._crc >> 4) & 0x0FFF - self._crc = self._crc ^ temp ^ _CRC_TABLE[value & 0xF] - - # compute checksum of upper four bits of byte - temp = _CRC_TABLE[self._crc & 0xF] - self._crc = (self._crc >> 4) & 0x0FFF - self._crc = self._crc ^ temp ^ _CRC_TABLE[(value >> 4) & 0xF] - - return self._crc - - def add_bytes(self, buffer, start, end): - '''Adds another chunk of bytes for calculating the CRC.''' - for i in range(start, end): - self._crc = self.__update_crc(buffer[i]) - self._bytes_seen += 1 - - return self._crc - - @staticmethod - def calculate_crc(buffer, start: int, end: int): - '''Calculates the CRC of a given buffer from the given starting index to the ending index.''' - crc_calculator = CrcCalculator() - return crc_calculator.add_bytes(buffer, start, end) +'''crc_calculator.py: Contains the CRC class which is used for calculating the header and file data CRCs.''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### +# ****WARNING**** This file is auto-generated! Do NOT edit this file. +# Profile Version = 21.194.0Release +# Tag = production/release/21.194.0-0-g65135fc +############################################################################################ + + +_CRC_TABLE = [ + 0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, + 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400 +] + + +class CrcCalculator: + '''A class for calculating the CRC of a given .fit file header or file contents.''' + + def __init__(self) -> None: + self._crc = 0 + self._bytes_seen = 0 + + def get_crc(self): + '''Returns the calculated CRC value.''' + return self._crc + + def __update_crc(self, value): + # compute checksum of lower four bits of byte + temp = _CRC_TABLE[self._crc & 0xF] + self._crc = (self._crc >> 4) & 0x0FFF + self._crc = self._crc ^ temp ^ _CRC_TABLE[value & 0xF] + + # compute checksum of upper four bits of byte + temp = _CRC_TABLE[self._crc & 0xF] + self._crc = (self._crc >> 4) & 0x0FFF + self._crc = self._crc ^ temp ^ _CRC_TABLE[(value >> 4) & 0xF] + + return self._crc + + def add_bytes(self, buffer, start, end): + '''Adds another chunk of bytes for calculating the CRC.''' + for i in range(start, end): + self._crc = self.__update_crc(buffer[i]) + self._bytes_seen += 1 + + return self._crc + + @staticmethod + def calculate_crc(buffer, start: int, end: int): + '''Calculates the CRC of a given buffer from the given starting index to the ending index.''' + crc_calculator = CrcCalculator() + return crc_calculator.add_bytes(buffer, start, end) diff --git a/garmin_fit_sdk/decoder.py b/garmin_fit_sdk/decoder.py index b1c7a80..fdf3138 100644 --- a/garmin_fit_sdk/decoder.py +++ b/garmin_fit_sdk/decoder.py @@ -1,769 +1,769 @@ -'''decoder.py: Contains the decoder class which is used to decode fit files.''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### -# ****WARNING**** This file is auto-generated! Do NOT edit this file. -# Profile Version = 21.188.0Release -# Tag = production/release/21.188.0-0-g55050f8 -############################################################################################ - - -import copy - -from . import Accumulator, BitStream, CrcCalculator -from . import fit as FIT -from . import hr_mesg_utils, util -from .profile import Profile -from .stream import Endianness, Stream -from enum import Enum - -_CRCSIZE = 2 -_COMPRESSED_HEADER_MASK = 0x80 -_MESG_DEFINITION_MASK = 0x40 -_MESG_HEADER_MASK = 0x00 -_LOCAL_MESG_NUM_MASK = 0x0F -_DEV_DATA_MASK = 0x20 - -_HEADER_WITH_CRC_SIZE = 14 -_HEADER_WITHOUT_CRC_SIZE = 12 - -DecodeMode = Enum('DecodeMode', ['NORMAL', 'SKIP_HEADER', 'DATA_ONLY']) - -class Decoder: - ''' - A class for decoding a given stream (fit file). Will return the decoded data - from the stream - - Attributes: - _stream: The given stream of data to be decoded. - _local_mesg_defs: The 16 most recent message definitions read. - _messages: The messages decoded by the Decoder. - ''' - - def __init__(self, stream: Stream): - if stream is None: - raise RuntimeError("FIT Runtine Error stream parameter is None.") - - self._stream = stream - self._local_mesg_defs = {} - self._developer_data_defs = {} - self._messages = {} - self._accumulator = Accumulator() - - self._fields_with_subfields = [] - self._fields_to_expand = [] - - self._decode_mode = DecodeMode.NORMAL - - self._mesg_listener = None - self._apply_scale_and_offset = True - self._convert_timestamps_to_datetimes = True - self._convert_types_to_strings = True - self._enable_crc_check = True - self._expand_sub_fields = True - self._expand_components = True - self._merge_heart_rates = True - - - def is_fit(self): - '''Returns whether the file is a valid fit file.''' - try: - file_header_size = self._stream.peek_byte() - if file_header_size != _HEADER_WITH_CRC_SIZE and file_header_size != _HEADER_WITHOUT_CRC_SIZE: - return False - - if self._stream.get_length() < (file_header_size + _CRCSIZE): - return False - - # TODO make sure this works with chained files (add offset) - file_header = self.read_file_header(True) - if file_header.data_type[0].decode() != ".FIT": - return False - - except Exception: - return False - - return True - - def check_integrity(self): - '''Returns whether the integrity of the file is good or not.''' - try: - if self.is_fit() is False: - return False - - file_header = self.read_file_header(True) - - if file_header.header_size + file_header.data_size + _CRCSIZE > self._stream.get_length(): - return False - - if file_header.header_size is _HEADER_WITH_CRC_SIZE and file_header.header_crc != CrcCalculator.calculate_crc(self._stream.slice(0, 12), 0, 12): - return False - - file_crc = CrcCalculator.calculate_crc(self._stream.read_bytes(file_header.file_total_size),0, file_header.file_total_size) - crc_from_file = self._stream.read_byte() + (self._stream.read_byte() << 8) - if crc_from_file != file_crc: - return False - - except Exception: - return False - - return True - - def read(self, apply_scale_and_offset = True, - convert_datetimes_to_dates = True, - convert_types_to_strings = True, - enable_crc_check = True, - expand_sub_fields = True, - expand_components = True, - merge_heart_rates = True, - mesg_listener = None, - decode_mode = DecodeMode.NORMAL): - '''Reads the entire contents of the fit file and returns the decoded messages''' - self._apply_scale_and_offset = apply_scale_and_offset - self._convert_timestamps_to_datetimes = convert_datetimes_to_dates - self._convert_types_to_strings = convert_types_to_strings - self._enable_crc_check = enable_crc_check - self._expand_sub_fields = expand_sub_fields - self._expand_components = expand_components - self._merge_heart_rates = merge_heart_rates - self._mesg_listener = mesg_listener - self._decode_mode = decode_mode - - self._local_mesg_defs = {} - self._developer_data_defs = {} - self._messages = {} - - errors = [] - try: - if self._merge_heart_rates and (not self._apply_scale_and_offset or not self._expand_components): - self.__raise_error("merge_heart_rates requires both apply_scale_and_offset and expand_components to be enabled!") - - while self._stream.position() < self._stream.get_length(): - self.__decode_next_file() - - if self._merge_heart_rates is True and 'hr_mesgs' in self._messages: - hr_mesg_utils.merge_heart_rates(self._messages['hr_mesgs'], self._messages['record_mesgs']) - - except (KeyboardInterrupt, SystemExit): - raise - except Exception as error: - errors.append(error) - - return self._messages, errors - - def __decode_next_file(self): - position = self._stream.position() - - if self._decode_mode == DecodeMode.NORMAL and self.is_fit() is False: - self.__raise_error("The file is not a fit file.") - - crc_calculator = CrcCalculator() if self._enable_crc_check is True else None - self._stream.set_crc_calculator(crc_calculator) - - file_header = self.read_file_header(False, decode_mode=self._decode_mode) - - # Read data definitions and messages - while self._stream.position() < (position + file_header.header_size + file_header.data_size): - self.__decode_next_record() - - - self._stream.set_crc_calculator(None) - crc = self._stream.read_unint_16() - - if crc_calculator is not None: - calculated_crc = crc_calculator.get_crc() - if self._decode_mode == DecodeMode.NORMAL and crc != calculated_crc: - self.__raise_error("CRC Error") - - def __decode_next_record(self): - record_header = self._stream.peek_byte() - - if record_header & _COMPRESSED_HEADER_MASK == _COMPRESSED_HEADER_MASK: - self.__decode_compressed_timestamp_message() - - if record_header & _MESG_DEFINITION_MASK == _MESG_HEADER_MASK: - self.__decode_message() - - if record_header & _MESG_DEFINITION_MASK == _MESG_DEFINITION_MASK: - self.__decode_mesg_def() - - def __decode_mesg_def(self): - record_header = self._stream.read_byte() - - struct_format_string = '' - mesg_def = {} - mesg_def["record_header"] = record_header - mesg_def["local_mesg_num"] = record_header & _LOCAL_MESG_NUM_MASK - mesg_def["reserved"] = self._stream.read_byte() - - mesg_def["architecture"] = self._stream.read_byte() - mesg_def["endianness"] = Endianness.LITTLE if mesg_def["architecture"] == 0 else Endianness.BIG - - struct_format_string += '>' if mesg_def["endianness"] == Endianness.BIG else '<' - mesg_def["struct_format_string"] = struct_format_string - - mesg_def["global_mesg_num"] = self._stream.read_unint_16(mesg_def["endianness"]) - mesg_def["num_fields"] = self._stream.read_byte() - mesg_def["field_definitions"] = [] - mesg_def["developer_field_defs"] = [] - mesg_def["message_size"] = 0 - mesg_def["developer_data_size"] = 0 - - for i in range(mesg_def["num_fields"]): - field_definition = { - "field_id": self._stream.read_byte(), - "size": self._stream.read_byte(), - "base_type": self._stream.read_byte() & FIT.BASE_TYPE_MASK, - } - - if field_definition["base_type"] not in FIT.BASE_TYPE_DEFINITIONS: - self.__raise_error("Invalid field definition base type") - - if field_definition["size"] % FIT.BASE_TYPE_DEFINITIONS[field_definition["base_type"]]["size"] != 0: - field_definition["base_type"] = FIT.BASE_TYPE['UINT8'] - - num_field_elements = int(field_definition["size"] / FIT.BASE_TYPE_DEFINITIONS[field_definition["base_type"]]["size"]) - field_definition["num_field_elements"] = num_field_elements - - struct_format_string += str(num_field_elements) if num_field_elements > 1 else '' - struct_format_string += FIT.BASE_TYPE_DEFINITIONS[field_definition["base_type"]]["type_code"] - - mesg_def["struct_format_string"] = struct_format_string - mesg_def["field_definitions"].append(field_definition) - mesg_def["message_size"] += field_definition["size"] - - if record_header & _DEV_DATA_MASK == _DEV_DATA_MASK: - num_dev_fields = self._stream.read_byte() - - for i in range(num_dev_fields): - developer_field_definition = { - "field_definition_number": self._stream.read_byte(), - "size": self._stream.read_byte(), - "developer_data_index": self._stream.read_byte(), - "endianness": Endianness.LITTLE if mesg_def["architecture"] == 0 else Endianness.BIG - } - - mesg_def["developer_field_defs"].append(developer_field_definition) - mesg_def["developer_data_size"] += developer_field_definition["size"] - - if mesg_def["global_mesg_num"] in Profile['messages']: - message_profile = Profile['messages'][mesg_def["global_mesg_num"]] - else: - message_profile = { - "name": str(mesg_def["global_mesg_num"]), - "messages_key": str(mesg_def["global_mesg_num"]), - "num": mesg_def["global_mesg_num"], - 'fields': {} - } - - #TODO add option for unknown data - - # Add the profile to the local message definition - self._local_mesg_defs[mesg_def["local_mesg_num"]] = {**mesg_def, **message_profile} - - messages_key = message_profile['messages_key'] if 'messages_key' in message_profile else None - if message_profile is not None and messages_key not in self._messages: - self._messages[messages_key] = [] - - def __decode_message(self): - record_header = self._stream.read_byte() - - local_mesg_num = record_header & _LOCAL_MESG_NUM_MASK - if local_mesg_num in self._local_mesg_defs: - mesg_def = self._local_mesg_defs[local_mesg_num] - else: - self.__raise_error("Invalid local message number") - - messages_key = mesg_def['messages_key'] - - # Decode regular message - message = {} - self._fields_to_expand = [] - self._fields_with_subfields = [] - - message = self.__read_message(mesg_def) - - developer_fields = {} - - # Decode developer data if it exists - if len(mesg_def["developer_field_defs"]) > 0: - - for developer_field_def in mesg_def['developer_field_defs']: - field_profile = self.__lookup_developer_data_field(developer_field_def) - if field_profile is None: - # If there is not a field definition, then read past the field data. - self._stream.read_bytes(developer_field_def['size']) - continue - - struct_format_string = self.__build_dev_data_struct_string(developer_field_def, field_profile) - field_value = self.__read_raw_value(developer_field_def['size'], struct_format_string) - - if field_profile['fit_base_type_id'] == FIT.BASE_TYPE['STRING']: - field_value = util._convert_string(field_value) - #NOTE possible point to scrub invalids???? - - if field_value is not None: - developer_fields[field_profile['key']] = field_value - - if mesg_def['global_mesg_num'] == Profile['mesg_num']['DEVELOPER_DATA_ID']: - self.__add_developer_data_id_to_profile(message) - - elif mesg_def['global_mesg_num'] == Profile['mesg_num']['FIELD_DESCRIPTION']: - message['key'] = len(self._messages[messages_key]) - self.__add_field_description_to_profile(message) - - else: - message = self.__apply_profile(mesg_def, message) - - self.__clean_message(message) - - if len(developer_fields) != 0: - message['developer_fields'] = developer_fields - - # Append decoded message - self._messages[messages_key].append(message) - - if self._mesg_listener is not None: - self._mesg_listener(mesg_def['global_mesg_num'], message) - - def __decode_compressed_timestamp_message(self): - self.__raise_error("Compressed timestamp messages are not currently supported") - - def __read_message(self, mesg_def): - message = {} - raw_values = self.__read_raw_values(mesg_def["message_size"], mesg_def["struct_format_string"]) - - index = 0 - for field in mesg_def['field_definitions']: - base_type_definition = FIT.BASE_TYPE_DEFINITIONS[field["base_type"]] - invalid = base_type_definition["invalid"] - num_elements = field["num_field_elements"] - - field_id = field["field_id"] - field_profile = mesg_def['fields'][field_id] if field_id in mesg_def['fields'] else None - field_name = field_profile['name'] if field_id in mesg_def['fields'] else field_id - - if field_profile is not None and 'has_components' in field_profile: - convert_invalids_to_none = not field_profile['has_components'] - else: - convert_invalids_to_none = True - - field_value = None - - # Fields with strings or string arrays - if base_type_definition['type'] == FIT.BASE_TYPE["STRING"]: - field_value = util._convert_string(raw_values[index]) - - # Fields with an array of values - elif num_elements > 1: - field_value = [] - - if(base_type_definition['type'] == FIT.BASE_TYPE["BYTE"]): - raw_array = raw_values[index : index + num_elements] - field_value = raw_array if util._only_invalid_values(raw_array, invalid) is False else None - else: - for i in range(num_elements): - raw_value = raw_values[index + i] if raw_values[index + i] != invalid or not convert_invalids_to_none else None - field_value.append(raw_value) - - if self.__is_array_all_none(field_value) is True: - field_value = None - - # Fields with a single value - else: - if raw_values[index] != invalid or not convert_invalids_to_none: - field_value = raw_values[index] - - if field_value is not None: - message[field_name] = { - 'raw_field_value': field_value, - 'field_definition_number': field_id - } - - if field_profile and len(field_profile['sub_fields']) > 0: - self._fields_with_subfields.append(field_name) - - if field_profile and field_profile['has_components'] is True: - self._fields_to_expand.append(field_name) - - if field_profile and field_profile['is_accumulated'] is True: - self.__set_accumulated_value(mesg_def, message, field_profile, field_value) - - index += num_elements if base_type_definition['type'] != FIT.BASE_TYPE["STRING"] else 1 - - return message - - def __apply_profile(self, mesg_def: dict, raw_message: dict): - message = raw_message - - - self.__expand_sub_fields(mesg_def['global_mesg_num'], message) - - self.__expand_components(mesg_def['global_mesg_num'], message, mesg_def['fields'], mesg_def) - - self.__transform_values(message, mesg_def) - - return message - - def __transform_values(self, message, mesg_def): - for field in message: - if 'is_expanded_field'in message[field] and message[field]['is_expanded_field'] is True: - continue - - field_name = field - field_id = message[field]['field_definition_number'] - field_profile = mesg_def['fields'][field_id] if field_id in mesg_def['fields'] else None - field_type = field_profile['type'] if field_id in mesg_def['fields'] else field_id - - is_sub_field = message[field]['is_sub_field'] if 'is_sub_field' in message[field] else False - if is_sub_field: - field_profile = self.__get_subfield_profile(field_profile, field_name) - field_type = field_profile['type'] if field_id in mesg_def['fields'] else field_id - - field_value = message[field_name]['raw_field_value'] - # Optional data operations - if self._convert_types_to_strings is True: - field_value = self.__convert_type_to_string(field_type, message[field_name]['raw_field_value']) - - if self._apply_scale_and_offset is True and field_type in FIT.NUMERIC_FIELD_TYPES: - field_value = self.__apply_scale_and_offset(field_profile, message[field_name]['raw_field_value']) - - if self._convert_timestamps_to_datetimes is True and field_type == 'date_time': - field_value = util.convert_timestamp_to_datetime(message[field_name]['raw_field_value']) - - message[field_name]['field_value'] = field_value - return - - def __expand_components(self, mesg_num, message, fields, mesg_def): - if self._expand_components is False or len(self._fields_to_expand) == 0: - return - - mesg = {} - - while len(self._fields_to_expand) > 0: - field_name = self._fields_to_expand.pop() - - field_to_expand = message.get(field_name) or mesg.get(field_name) - - raw_field_value = field_to_expand['raw_field_value'] - field_definition_number = field_to_expand['field_definition_number'] - field_profile = mesg_def['fields'].get(field_definition_number) - - if field_profile is None: - continue - - is_sub_field = field_to_expand.get('is_sub_field') or False - if is_sub_field is True: - field_profile = self.__get_subfield_profile(field_profile, field_name) - - base_type = FIT.FIELD_TYPE_TO_BASE_TYPE[field_profile['type']] if field_profile['type'] in FIT.FIELD_TYPE_TO_BASE_TYPE else None - - if field_profile['has_components'] is False or base_type is None: - continue - - if util._only_invalid_values(raw_field_value, FIT.BASE_TYPE_DEFINITIONS[base_type]['invalid']) is True: - continue - - bitstream = BitStream(raw_field_value, base_type) - - for i in range(len(field_profile['components'])): - if bitstream.bits_available() < field_profile['bits'][i]: - break - - target_field = fields[field_profile['components'][i]] - if target_field['name'] not in mesg: - base_type = FIT.FIELD_TYPE_TO_BASE_TYPE[target_field['type']] if target_field['type'] in FIT.FIELD_TYPE_TO_BASE_TYPE else target_field['type'] - invalid_value = FIT.BASE_TYPE_DEFINITIONS[base_type]['invalid'] if base_type in FIT.BASE_TYPE_DEFINITIONS else 0xFF - - mesg[target_field['name']] = { - 'field_value': [], - 'raw_field_value': [], - 'field_definition_number': target_field['num'], - 'is_expanded_field': True, - 'invalid': invalid_value - } - - value = bitstream.read_bits(field_profile['bits'][i]) - - if target_field['is_accumulated'] is True: - value = self._accumulator.accumulate(mesg_num, target_field['num'], value, field_profile['bits'][i]) - - # Undo component scale and offset before applying the destination field's scale and offset - value = (value / field_profile['scale'][i]) - field_profile['offset'][i] - value = int(value) if value.is_integer() else value - raw_value = (value + target_field['offset'][0]) * target_field['scale'][0] - - mesg[target_field['name']]['raw_field_value'].append(int(raw_value)) - - if raw_value == invalid_value: - mesg[target_field['name']]['field_value'].append(None) - else: - if self._convert_types_to_strings is True: - value = self.__convert_type_to_string(target_field['type'], value) - - mesg[target_field['name']]['field_value'].append(value) - - if target_field['has_components'] is True: - self._fields_to_expand.append(target_field['name']) - - if bitstream.has_bits_available() is False: - break - - for field_name in mesg: - mesg[field_name]['raw_field_value'] = util._sanitize_values(mesg[field_name]['raw_field_value']) - mesg[field_name]['field_value'] = util._sanitize_values(mesg[field_name]['field_value']) - message[field_name] = mesg[field_name] - - def __expand_sub_fields(self, global_mesg_num, message): - if self._expand_sub_fields is False or len(self._fields_with_subfields) == 0: - return - - # Save the original fields for iteration before expanding sub fields. - for field in self._fields_with_subfields: - if message[field]['field_definition_number'] in Profile['messages'][global_mesg_num]['fields']: - field_profile = Profile['messages'][global_mesg_num]['fields'][message[field]['field_definition_number']] - else: - continue - - if len(field_profile['sub_fields']) > 0: - self.__expand_sub_field(message, field_profile) - - def __expand_sub_field(self, message, field_profile): - for sub_field in field_profile['sub_fields']: - for map_item in sub_field['map']: - reference_field_profile = message[map_item['name']] if map_item['name'] in message else None - - if reference_field_profile is None: - continue - - if reference_field_profile['raw_field_value'] == map_item['raw_value']: - message[sub_field['name']] = copy.deepcopy(message[field_profile['name']]) - message[sub_field['name']]['is_sub_field'] = True - - if sub_field['has_components'] is True: - self._fields_to_expand.append(sub_field['name']) - - break - - def __get_subfield_profile(self, field_profile, name): - return next(sub_field for sub_field in field_profile['sub_fields'] if sub_field['name'] == name) or {} - - def __set_accumulated_value(self, mesg_def, message, field, raw_field_value): - raw_field_values = raw_field_value if type(raw_field_value) == list else [raw_field_value] - - for value in raw_field_values: - for containing_field in message.values(): - components = mesg_def['fields'].get(field['num'])['components'] - for i, component_field_num in enumerate(components): - target_field = mesg_def['fields'][component_field_num] - - if target_field['num'] == field['num'] and target_field['is_accumulated']: - value = (((value / field['scale'][0]) - field['offset'][0]) + containing_field['offset'][i]) * containing_field['scale'][i] - - self._accumulator.createAccumulatedField(mesg_def['global_mesg_num'], field['num'], int(value)) - - def __convert_type_to_string(self, field_type, raw_field_value): - try: - if field_type in Profile['types']: - types = Profile['types'][field_type] - else: - return raw_field_value - - field_value = raw_field_value - - if isinstance(raw_field_value, list): - for i in range(len(raw_field_value)): - field_value[i] = types[str(raw_field_value[i])] if str(raw_field_value[i]) in types else raw_field_value[i] - return field_value - - return types[str(raw_field_value)] if str(raw_field_value) in types else field_value - except Exception: - return raw_field_value - - def __apply_scale_and_offset(self, field_profile, raw_field_value): - - if self._apply_scale_and_offset is False: - return raw_field_value - - if raw_field_value is None: - return raw_field_value - - if len(field_profile['scale']) > 1: - return raw_field_value - - scale = field_profile['scale'][0] if field_profile['scale'] else 1 - offset = field_profile['offset'][0] if field_profile['offset'] else 0 - - try: - - field_values = raw_field_value - - if isinstance(raw_field_value, list): - for i in range(len(raw_field_value)): - field_value = raw_field_value[i] / scale if (raw_field_value[i] is not None and scale != 1) else raw_field_value[i] - field_values[i] = (field_value - offset) if raw_field_value[i] is not None else None - return field_values - - field_value = raw_field_value / scale if scale != 1 else raw_field_value - return field_value - offset - except Exception: - return raw_field_value - - - def __add_developer_data_id_to_profile(self, message): - if message is None or message['developer_data_index'] is None or message['developer_data_index']['raw_field_value'] == 0xFF: - return - - self._developer_data_defs[message['developer_data_index']['raw_field_value']] = { - 'developer_data_index': message['developer_data_index']['raw_field_value'], - 'developer_id': message['developer_id']['raw_field_value'] if 'developer_id' in message else None, - 'application_id': message['application_id']['raw_field_value'] if 'application_id' in message else None, - 'manufacturer_id': message['manufacturer_id']['raw_field_value'] if 'manufacturer_id' in message else None, - 'application_version': message['application_version']['raw_field_value'] if 'application_version' in message else None, - 'fields': [] - } - - def __add_field_description_to_profile(self, message): - - if message is None or message['developer_data_index'] is None or message['developer_data_index']['raw_field_value'] == 0xFF: - return - - if self._developer_data_defs[message['developer_data_index']['raw_field_value']] is None: - return - - if message["fit_base_type_id"] is not None: - masked_base_type = message["fit_base_type_id"]['raw_field_value'] & FIT.BASE_TYPE_MASK - base_type_code = FIT.BASE_TYPE_DEFINITIONS[masked_base_type]["type_code"] - else: - base_type_code = None - - self._developer_data_defs[message['developer_data_index']['raw_field_value']]['fields'].append({ - 'developer_data_index': message['developer_data_index']['raw_field_value'], - 'field_definition_number': message['field_definition_number']['raw_field_value'], - 'fit_base_type_id': message['fit_base_type_id']['raw_field_value'] & FIT.BASE_TYPE_MASK if 'fit_base_type_id' in message else None, - 'base_type_code': base_type_code, - 'name': message['name']['raw_field_value'] if 'name' in message else None, - 'array': message['array']['raw_field_value'] if 'array' in message else None, - 'components': message['components']['raw_field_value'] if 'components' in message else None, - 'scale': message['scale']['raw_field_value'] if 'scale' in message else None, - 'offset': message['offset']['raw_field_value'] if 'offset' in message else None, - 'units': message['units']['raw_field_value'] if 'units' in message else None, - 'bits': message['bits']['raw_field_value'] if 'bits' in message else None, - 'accumulate': message['accumulate']['raw_field_value'] if 'accumulate' in message else None, - 'ref_field_name': message['ref_field_name']['raw_field_value'] if 'ref_field_name' in message else None, - 'ref_field_value': message['ref_field_value']['raw_field_value'] if 'ref_field_value' in message else None, - 'fit_base_unit_id': message['fit_base_unit_id']['raw_field_value'] if 'fit_base_unit_id' in message else None, - 'native_mesg_num': message['native_mesg_num']['raw_field_value'] if 'native_mesg_num' in message else None, - 'native_field_num': message['native_field_num']['raw_field_value'] if 'native_field_num' in message else None, - 'key': message['key'] - }) - - def __build_dev_data_struct_string(self, developer_field_def: dict, field_profile: dict): - struct_format_string = "<" if developer_field_def['endianness'] == Endianness.LITTLE else ">" - invalid_value = FIT.BASE_TYPE_DEFINITIONS[field_profile['fit_base_type_id']]['invalid'] - base_type_code = field_profile['base_type_code'] - base_type_size = FIT.BASE_TYPE_DEFINITIONS[field_profile['fit_base_type_id']]['size'] - num_elements = int(developer_field_def["size"] / base_type_size) - - field_profile['num_elements'] = num_elements - field_profile['invalid'] = invalid_value - - struct_format_string += str(num_elements) + base_type_code - - return struct_format_string - - def __lookup_developer_data_field(self, developer_field_def): - try: - for field in self._developer_data_defs[developer_field_def['developer_data_index']]['fields']: - if field['field_definition_number'] == developer_field_def['field_definition_number']: - return field - - return None - - except Exception: - return None - - def __clean_message(self, message): - if message is not None: - for field in message: - if isinstance(message[field], dict) and 'raw_field_value' in message[field]: - message[field] = message[field]['field_value'] if 'field_value' in message[field] else message[field]['raw_field_value'] - message[field] = util._sanitize_values(message[field]) - - def __read_raw_values(self, message_size, struct_format_string): - return self._stream.read_and_unpack(message_size, struct_format_string) - - def __read_raw_value(self, message_size, struct_format_string): - field_value = self._stream.read_and_unpack(message_size, struct_format_string) - return field_value if len(field_value) > 1 else field_value[0] - - def __is_array_all_none(self, array): - for i in array: - if i is not None: - return False - return True - - def __raise_error(self, error = ""): - position = self._stream.position() - message = "FIT Runtime Error at byte: " + str(position) + " " + error - raise RuntimeError(message) - - def read_file_header(self, reset, decode_mode = DecodeMode.NORMAL): - '''Reads the file's header and returns its parameters.''' - starting_position = self._stream.position() - - class FileHeader: - '''A class that decodes a FIT file header.''' - def __init__(self, stream, decode_mode): - if decode_mode != DecodeMode.NORMAL: - if decode_mode == DecodeMode.SKIP_HEADER: - stream.seek(_HEADER_WITH_CRC_SIZE) - - header_size = _HEADER_WITH_CRC_SIZE if decode_mode == DecodeMode.SKIP_HEADER else 0 - data_size = stream.get_length() - header_size - _CRCSIZE - - self.header_size = header_size - self.data_size = data_size - - return - - self.header_size = stream.read_byte() - self.protocol_version = stream.read_byte() - self.profile_version = stream.read_unint_16("little") - self.data_size = stream.read_unint_32("little") - self.data_type = stream.read_string(4) - self.header_crc = 0 - self.file_total_size = self.header_size + self.data_size - - if self.header_size == 14: - self.header_crc = stream.read_unint_16("little") - - def get_dict(self): - dict = {} - dict["header_size"] = self.header_size - dict["protocol_version"] = (self.protocol_version >> 4) + ((self.protocol_version & 0x0F) / 10) - dict["profile_version"] = self.profile_version / 1000 if self.profile_version > 2199 else 100 - dict["data_size"] = self.data_size - dict["data_type"] = self.data_type - dict["header_crc"] = self.header_crc - dict["file_total_size"] = self.file_total_size - - return dict - - file_header = FileHeader(self._stream, decode_mode) - - if reset is True: - self._stream.seek(starting_position) - - return file_header - - def get_num_messages(self): - '''Returns the total number of messages successfully decoded from the file(s)''' - num_messages = 0 - for message in self._messages: - num_messages += len(self._messages[message]) - return num_messages +'''decoder.py: Contains the decoder class which is used to decode fit files.''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### +# ****WARNING**** This file is auto-generated! Do NOT edit this file. +# Profile Version = 21.194.0Release +# Tag = production/release/21.194.0-0-g65135fc +############################################################################################ + + +import copy + +from . import Accumulator, BitStream, CrcCalculator +from . import fit as FIT +from . import hr_mesg_utils, util +from .profile import Profile +from .stream import Endianness, Stream +from enum import Enum + +_CRCSIZE = 2 +_COMPRESSED_HEADER_MASK = 0x80 +_MESG_DEFINITION_MASK = 0x40 +_MESG_HEADER_MASK = 0x00 +_LOCAL_MESG_NUM_MASK = 0x0F +_DEV_DATA_MASK = 0x20 + +_HEADER_WITH_CRC_SIZE = 14 +_HEADER_WITHOUT_CRC_SIZE = 12 + +DecodeMode = Enum('DecodeMode', ['NORMAL', 'SKIP_HEADER', 'DATA_ONLY']) + +class Decoder: + ''' + A class for decoding a given stream (fit file). Will return the decoded data + from the stream + + Attributes: + _stream: The given stream of data to be decoded. + _local_mesg_defs: The 16 most recent message definitions read. + _messages: The messages decoded by the Decoder. + ''' + + def __init__(self, stream: Stream): + if stream is None: + raise RuntimeError("FIT Runtine Error stream parameter is None.") + + self._stream = stream + self._local_mesg_defs = {} + self._developer_data_defs = {} + self._messages = {} + self._accumulator = Accumulator() + + self._fields_with_subfields = [] + self._fields_to_expand = [] + + self._decode_mode = DecodeMode.NORMAL + + self._mesg_listener = None + self._apply_scale_and_offset = True + self._convert_timestamps_to_datetimes = True + self._convert_types_to_strings = True + self._enable_crc_check = True + self._expand_sub_fields = True + self._expand_components = True + self._merge_heart_rates = True + + + def is_fit(self): + '''Returns whether the file is a valid fit file.''' + try: + file_header_size = self._stream.peek_byte() + if file_header_size != _HEADER_WITH_CRC_SIZE and file_header_size != _HEADER_WITHOUT_CRC_SIZE: + return False + + if self._stream.get_length() < (file_header_size + _CRCSIZE): + return False + + # TODO make sure this works with chained files (add offset) + file_header = self.read_file_header(True) + if file_header.data_type[0].decode() != ".FIT": + return False + + except Exception: + return False + + return True + + def check_integrity(self): + '''Returns whether the integrity of the file is good or not.''' + try: + if self.is_fit() is False: + return False + + file_header = self.read_file_header(True) + + if file_header.header_size + file_header.data_size + _CRCSIZE > self._stream.get_length(): + return False + + if file_header.header_size is _HEADER_WITH_CRC_SIZE and file_header.header_crc != CrcCalculator.calculate_crc(self._stream.slice(0, 12), 0, 12): + return False + + file_crc = CrcCalculator.calculate_crc(self._stream.read_bytes(file_header.file_total_size),0, file_header.file_total_size) + crc_from_file = self._stream.read_byte() + (self._stream.read_byte() << 8) + if crc_from_file != file_crc: + return False + + except Exception: + return False + + return True + + def read(self, apply_scale_and_offset = True, + convert_datetimes_to_dates = True, + convert_types_to_strings = True, + enable_crc_check = True, + expand_sub_fields = True, + expand_components = True, + merge_heart_rates = True, + mesg_listener = None, + decode_mode = DecodeMode.NORMAL): + '''Reads the entire contents of the fit file and returns the decoded messages''' + self._apply_scale_and_offset = apply_scale_and_offset + self._convert_timestamps_to_datetimes = convert_datetimes_to_dates + self._convert_types_to_strings = convert_types_to_strings + self._enable_crc_check = enable_crc_check + self._expand_sub_fields = expand_sub_fields + self._expand_components = expand_components + self._merge_heart_rates = merge_heart_rates + self._mesg_listener = mesg_listener + self._decode_mode = decode_mode + + self._local_mesg_defs = {} + self._developer_data_defs = {} + self._messages = {} + + errors = [] + try: + if self._merge_heart_rates and (not self._apply_scale_and_offset or not self._expand_components): + self.__raise_error("merge_heart_rates requires both apply_scale_and_offset and expand_components to be enabled!") + + while self._stream.position() < self._stream.get_length(): + self.__decode_next_file() + + if self._merge_heart_rates is True and 'hr_mesgs' in self._messages: + hr_mesg_utils.merge_heart_rates(self._messages['hr_mesgs'], self._messages['record_mesgs']) + + except (KeyboardInterrupt, SystemExit): + raise + except Exception as error: + errors.append(error) + + return self._messages, errors + + def __decode_next_file(self): + position = self._stream.position() + + if self._decode_mode == DecodeMode.NORMAL and self.is_fit() is False: + self.__raise_error("The file is not a fit file.") + + crc_calculator = CrcCalculator() if self._enable_crc_check is True else None + self._stream.set_crc_calculator(crc_calculator) + + file_header = self.read_file_header(False, decode_mode=self._decode_mode) + + # Read data definitions and messages + while self._stream.position() < (position + file_header.header_size + file_header.data_size): + self.__decode_next_record() + + + self._stream.set_crc_calculator(None) + crc = self._stream.read_unint_16() + + if crc_calculator is not None: + calculated_crc = crc_calculator.get_crc() + if self._decode_mode == DecodeMode.NORMAL and crc != calculated_crc: + self.__raise_error("CRC Error") + + def __decode_next_record(self): + record_header = self._stream.peek_byte() + + if record_header & _COMPRESSED_HEADER_MASK == _COMPRESSED_HEADER_MASK: + self.__decode_compressed_timestamp_message() + + if record_header & _MESG_DEFINITION_MASK == _MESG_HEADER_MASK: + self.__decode_message() + + if record_header & _MESG_DEFINITION_MASK == _MESG_DEFINITION_MASK: + self.__decode_mesg_def() + + def __decode_mesg_def(self): + record_header = self._stream.read_byte() + + struct_format_string = '' + mesg_def = {} + mesg_def["record_header"] = record_header + mesg_def["local_mesg_num"] = record_header & _LOCAL_MESG_NUM_MASK + mesg_def["reserved"] = self._stream.read_byte() + + mesg_def["architecture"] = self._stream.read_byte() + mesg_def["endianness"] = Endianness.LITTLE if mesg_def["architecture"] == 0 else Endianness.BIG + + struct_format_string += '>' if mesg_def["endianness"] == Endianness.BIG else '<' + mesg_def["struct_format_string"] = struct_format_string + + mesg_def["global_mesg_num"] = self._stream.read_unint_16(mesg_def["endianness"]) + mesg_def["num_fields"] = self._stream.read_byte() + mesg_def["field_definitions"] = [] + mesg_def["developer_field_defs"] = [] + mesg_def["message_size"] = 0 + mesg_def["developer_data_size"] = 0 + + for i in range(mesg_def["num_fields"]): + field_definition = { + "field_id": self._stream.read_byte(), + "size": self._stream.read_byte(), + "base_type": self._stream.read_byte() & FIT.BASE_TYPE_MASK, + } + + if field_definition["base_type"] not in FIT.BASE_TYPE_DEFINITIONS: + self.__raise_error("Invalid field definition base type") + + if field_definition["size"] % FIT.BASE_TYPE_DEFINITIONS[field_definition["base_type"]]["size"] != 0: + field_definition["base_type"] = FIT.BASE_TYPE['UINT8'] + + num_field_elements = int(field_definition["size"] / FIT.BASE_TYPE_DEFINITIONS[field_definition["base_type"]]["size"]) + field_definition["num_field_elements"] = num_field_elements + + struct_format_string += str(num_field_elements) if num_field_elements > 1 else '' + struct_format_string += FIT.BASE_TYPE_DEFINITIONS[field_definition["base_type"]]["type_code"] + + mesg_def["struct_format_string"] = struct_format_string + mesg_def["field_definitions"].append(field_definition) + mesg_def["message_size"] += field_definition["size"] + + if record_header & _DEV_DATA_MASK == _DEV_DATA_MASK: + num_dev_fields = self._stream.read_byte() + + for i in range(num_dev_fields): + developer_field_definition = { + "field_definition_number": self._stream.read_byte(), + "size": self._stream.read_byte(), + "developer_data_index": self._stream.read_byte(), + "endianness": Endianness.LITTLE if mesg_def["architecture"] == 0 else Endianness.BIG + } + + mesg_def["developer_field_defs"].append(developer_field_definition) + mesg_def["developer_data_size"] += developer_field_definition["size"] + + if mesg_def["global_mesg_num"] in Profile['messages']: + message_profile = Profile['messages'][mesg_def["global_mesg_num"]] + else: + message_profile = { + "name": str(mesg_def["global_mesg_num"]), + "messages_key": str(mesg_def["global_mesg_num"]), + "num": mesg_def["global_mesg_num"], + 'fields': {} + } + + #TODO add option for unknown data + + # Add the profile to the local message definition + self._local_mesg_defs[mesg_def["local_mesg_num"]] = {**mesg_def, **message_profile} + + messages_key = message_profile['messages_key'] if 'messages_key' in message_profile else None + if message_profile is not None and messages_key not in self._messages: + self._messages[messages_key] = [] + + def __decode_message(self): + record_header = self._stream.read_byte() + + local_mesg_num = record_header & _LOCAL_MESG_NUM_MASK + if local_mesg_num in self._local_mesg_defs: + mesg_def = self._local_mesg_defs[local_mesg_num] + else: + self.__raise_error("Invalid local message number") + + messages_key = mesg_def['messages_key'] + + # Decode regular message + message = {} + self._fields_to_expand = [] + self._fields_with_subfields = [] + + message = self.__read_message(mesg_def) + + developer_fields = {} + + # Decode developer data if it exists + if len(mesg_def["developer_field_defs"]) > 0: + + for developer_field_def in mesg_def['developer_field_defs']: + field_profile = self.__lookup_developer_data_field(developer_field_def) + if field_profile is None: + # If there is not a field definition, then read past the field data. + self._stream.read_bytes(developer_field_def['size']) + continue + + struct_format_string = self.__build_dev_data_struct_string(developer_field_def, field_profile) + field_value = self.__read_raw_value(developer_field_def['size'], struct_format_string) + + if field_profile['fit_base_type_id'] == FIT.BASE_TYPE['STRING']: + field_value = util._convert_string(field_value) + #NOTE possible point to scrub invalids???? + + if field_value is not None: + developer_fields[field_profile['key']] = field_value + + if mesg_def['global_mesg_num'] == Profile['mesg_num']['DEVELOPER_DATA_ID']: + self.__add_developer_data_id_to_profile(message) + + elif mesg_def['global_mesg_num'] == Profile['mesg_num']['FIELD_DESCRIPTION']: + message['key'] = len(self._messages[messages_key]) + self.__add_field_description_to_profile(message) + + else: + message = self.__apply_profile(mesg_def, message) + + self.__clean_message(message) + + if len(developer_fields) != 0: + message['developer_fields'] = developer_fields + + # Append decoded message + self._messages[messages_key].append(message) + + if self._mesg_listener is not None: + self._mesg_listener(mesg_def['global_mesg_num'], message) + + def __decode_compressed_timestamp_message(self): + self.__raise_error("Compressed timestamp messages are not currently supported") + + def __read_message(self, mesg_def): + message = {} + raw_values = self.__read_raw_values(mesg_def["message_size"], mesg_def["struct_format_string"]) + + index = 0 + for field in mesg_def['field_definitions']: + base_type_definition = FIT.BASE_TYPE_DEFINITIONS[field["base_type"]] + invalid = base_type_definition["invalid"] + num_elements = field["num_field_elements"] + + field_id = field["field_id"] + field_profile = mesg_def['fields'][field_id] if field_id in mesg_def['fields'] else None + field_name = field_profile['name'] if field_id in mesg_def['fields'] else field_id + + if field_profile is not None and 'has_components' in field_profile: + convert_invalids_to_none = not field_profile['has_components'] + else: + convert_invalids_to_none = True + + field_value = None + + # Fields with strings or string arrays + if base_type_definition['type'] == FIT.BASE_TYPE["STRING"]: + field_value = util._convert_string(raw_values[index]) + + # Fields with an array of values + elif num_elements > 1: + field_value = [] + + if(base_type_definition['type'] == FIT.BASE_TYPE["BYTE"]): + raw_array = raw_values[index : index + num_elements] + field_value = raw_array if util._only_invalid_values(raw_array, invalid) is False else None + else: + for i in range(num_elements): + raw_value = raw_values[index + i] if raw_values[index + i] != invalid or not convert_invalids_to_none else None + field_value.append(raw_value) + + if self.__is_array_all_none(field_value) is True: + field_value = None + + # Fields with a single value + else: + if raw_values[index] != invalid or not convert_invalids_to_none: + field_value = raw_values[index] + + if field_value is not None: + message[field_name] = { + 'raw_field_value': field_value, + 'field_definition_number': field_id + } + + if field_profile and len(field_profile['sub_fields']) > 0: + self._fields_with_subfields.append(field_name) + + if field_profile and field_profile['has_components'] is True: + self._fields_to_expand.append(field_name) + + if field_profile and field_profile['is_accumulated'] is True: + self.__set_accumulated_value(mesg_def, message, field_profile, field_value) + + index += num_elements if base_type_definition['type'] != FIT.BASE_TYPE["STRING"] else 1 + + return message + + def __apply_profile(self, mesg_def: dict, raw_message: dict): + message = raw_message + + + self.__expand_sub_fields(mesg_def['global_mesg_num'], message) + + self.__expand_components(mesg_def['global_mesg_num'], message, mesg_def['fields'], mesg_def) + + self.__transform_values(message, mesg_def) + + return message + + def __transform_values(self, message, mesg_def): + for field in message: + if 'is_expanded_field'in message[field] and message[field]['is_expanded_field'] is True: + continue + + field_name = field + field_id = message[field]['field_definition_number'] + field_profile = mesg_def['fields'][field_id] if field_id in mesg_def['fields'] else None + field_type = field_profile['type'] if field_id in mesg_def['fields'] else field_id + + is_sub_field = message[field]['is_sub_field'] if 'is_sub_field' in message[field] else False + if is_sub_field: + field_profile = self.__get_subfield_profile(field_profile, field_name) + field_type = field_profile['type'] if field_id in mesg_def['fields'] else field_id + + field_value = message[field_name]['raw_field_value'] + # Optional data operations + if self._convert_types_to_strings is True: + field_value = self.__convert_type_to_string(field_type, message[field_name]['raw_field_value']) + + if self._apply_scale_and_offset is True and field_type in FIT.NUMERIC_FIELD_TYPES: + field_value = self.__apply_scale_and_offset(field_profile, message[field_name]['raw_field_value']) + + if self._convert_timestamps_to_datetimes is True and field_type == 'date_time': + field_value = util.convert_timestamp_to_datetime(message[field_name]['raw_field_value']) + + message[field_name]['field_value'] = field_value + return + + def __expand_components(self, mesg_num, message, fields, mesg_def): + if self._expand_components is False or len(self._fields_to_expand) == 0: + return + + mesg = {} + + while len(self._fields_to_expand) > 0: + field_name = self._fields_to_expand.pop() + + field_to_expand = message.get(field_name) or mesg.get(field_name) + + raw_field_value = field_to_expand['raw_field_value'] + field_definition_number = field_to_expand['field_definition_number'] + field_profile = mesg_def['fields'].get(field_definition_number) + + if field_profile is None: + continue + + is_sub_field = field_to_expand.get('is_sub_field') or False + if is_sub_field is True: + field_profile = self.__get_subfield_profile(field_profile, field_name) + + base_type = FIT.FIELD_TYPE_TO_BASE_TYPE[field_profile['type']] if field_profile['type'] in FIT.FIELD_TYPE_TO_BASE_TYPE else None + + if field_profile['has_components'] is False or base_type is None: + continue + + if util._only_invalid_values(raw_field_value, FIT.BASE_TYPE_DEFINITIONS[base_type]['invalid']) is True: + continue + + bitstream = BitStream(raw_field_value, base_type) + + for i in range(len(field_profile['components'])): + if bitstream.bits_available() < field_profile['bits'][i]: + break + + target_field = fields[field_profile['components'][i]] + if target_field['name'] not in mesg: + base_type = FIT.FIELD_TYPE_TO_BASE_TYPE[target_field['type']] if target_field['type'] in FIT.FIELD_TYPE_TO_BASE_TYPE else target_field['type'] + invalid_value = FIT.BASE_TYPE_DEFINITIONS[base_type]['invalid'] if base_type in FIT.BASE_TYPE_DEFINITIONS else 0xFF + + mesg[target_field['name']] = { + 'field_value': [], + 'raw_field_value': [], + 'field_definition_number': target_field['num'], + 'is_expanded_field': True, + 'invalid': invalid_value + } + + value = bitstream.read_bits(field_profile['bits'][i]) + + if target_field['is_accumulated'] is True: + value = self._accumulator.accumulate(mesg_num, target_field['num'], value, field_profile['bits'][i]) + + # Undo component scale and offset before applying the destination field's scale and offset + value = (value / field_profile['scale'][i]) - field_profile['offset'][i] + value = int(value) if value.is_integer() else value + raw_value = (value + target_field['offset'][0]) * target_field['scale'][0] + + mesg[target_field['name']]['raw_field_value'].append(int(raw_value)) + + if raw_value == invalid_value: + mesg[target_field['name']]['field_value'].append(None) + else: + if self._convert_types_to_strings is True: + value = self.__convert_type_to_string(target_field['type'], value) + + mesg[target_field['name']]['field_value'].append(value) + + if target_field['has_components'] is True: + self._fields_to_expand.append(target_field['name']) + + if bitstream.has_bits_available() is False: + break + + for field_name in mesg: + mesg[field_name]['raw_field_value'] = util._sanitize_values(mesg[field_name]['raw_field_value']) + mesg[field_name]['field_value'] = util._sanitize_values(mesg[field_name]['field_value']) + message[field_name] = mesg[field_name] + + def __expand_sub_fields(self, global_mesg_num, message): + if self._expand_sub_fields is False or len(self._fields_with_subfields) == 0: + return + + # Save the original fields for iteration before expanding sub fields. + for field in self._fields_with_subfields: + if message[field]['field_definition_number'] in Profile['messages'][global_mesg_num]['fields']: + field_profile = Profile['messages'][global_mesg_num]['fields'][message[field]['field_definition_number']] + else: + continue + + if len(field_profile['sub_fields']) > 0: + self.__expand_sub_field(message, field_profile) + + def __expand_sub_field(self, message, field_profile): + for sub_field in field_profile['sub_fields']: + for map_item in sub_field['map']: + reference_field_profile = message[map_item['name']] if map_item['name'] in message else None + + if reference_field_profile is None: + continue + + if reference_field_profile['raw_field_value'] == map_item['raw_value']: + message[sub_field['name']] = copy.deepcopy(message[field_profile['name']]) + message[sub_field['name']]['is_sub_field'] = True + + if sub_field['has_components'] is True: + self._fields_to_expand.append(sub_field['name']) + + break + + def __get_subfield_profile(self, field_profile, name): + return next(sub_field for sub_field in field_profile['sub_fields'] if sub_field['name'] == name) or {} + + def __set_accumulated_value(self, mesg_def, message, field, raw_field_value): + raw_field_values = raw_field_value if type(raw_field_value) == list else [raw_field_value] + + for value in raw_field_values: + for containing_field in message.values(): + components = mesg_def['fields'].get(field['num'])['components'] + for i, component_field_num in enumerate(components): + target_field = mesg_def['fields'][component_field_num] + + if target_field['num'] == field['num'] and target_field['is_accumulated']: + value = (((value / field['scale'][0]) - field['offset'][0]) + containing_field['offset'][i]) * containing_field['scale'][i] + + self._accumulator.createAccumulatedField(mesg_def['global_mesg_num'], field['num'], int(value)) + + def __convert_type_to_string(self, field_type, raw_field_value): + try: + if field_type in Profile['types']: + types = Profile['types'][field_type] + else: + return raw_field_value + + field_value = raw_field_value + + if isinstance(raw_field_value, list): + for i in range(len(raw_field_value)): + field_value[i] = types[str(raw_field_value[i])] if str(raw_field_value[i]) in types else raw_field_value[i] + return field_value + + return types[str(raw_field_value)] if str(raw_field_value) in types else field_value + except Exception: + return raw_field_value + + def __apply_scale_and_offset(self, field_profile, raw_field_value): + + if self._apply_scale_and_offset is False: + return raw_field_value + + if raw_field_value is None: + return raw_field_value + + if len(field_profile['scale']) > 1: + return raw_field_value + + scale = field_profile['scale'][0] if field_profile['scale'] else 1 + offset = field_profile['offset'][0] if field_profile['offset'] else 0 + + try: + + field_values = raw_field_value + + if isinstance(raw_field_value, list): + for i in range(len(raw_field_value)): + field_value = raw_field_value[i] / scale if (raw_field_value[i] is not None and scale != 1) else raw_field_value[i] + field_values[i] = (field_value - offset) if raw_field_value[i] is not None else None + return field_values + + field_value = raw_field_value / scale if scale != 1 else raw_field_value + return field_value - offset + except Exception: + return raw_field_value + + + def __add_developer_data_id_to_profile(self, message): + if message is None or message['developer_data_index'] is None or message['developer_data_index']['raw_field_value'] == 0xFF: + return + + self._developer_data_defs[message['developer_data_index']['raw_field_value']] = { + 'developer_data_index': message['developer_data_index']['raw_field_value'], + 'developer_id': message['developer_id']['raw_field_value'] if 'developer_id' in message else None, + 'application_id': message['application_id']['raw_field_value'] if 'application_id' in message else None, + 'manufacturer_id': message['manufacturer_id']['raw_field_value'] if 'manufacturer_id' in message else None, + 'application_version': message['application_version']['raw_field_value'] if 'application_version' in message else None, + 'fields': [] + } + + def __add_field_description_to_profile(self, message): + + if message is None or message['developer_data_index'] is None or message['developer_data_index']['raw_field_value'] == 0xFF: + return + + if self._developer_data_defs[message['developer_data_index']['raw_field_value']] is None: + return + + if message["fit_base_type_id"] is not None: + masked_base_type = message["fit_base_type_id"]['raw_field_value'] & FIT.BASE_TYPE_MASK + base_type_code = FIT.BASE_TYPE_DEFINITIONS[masked_base_type]["type_code"] + else: + base_type_code = None + + self._developer_data_defs[message['developer_data_index']['raw_field_value']]['fields'].append({ + 'developer_data_index': message['developer_data_index']['raw_field_value'], + 'field_definition_number': message['field_definition_number']['raw_field_value'], + 'fit_base_type_id': message['fit_base_type_id']['raw_field_value'] & FIT.BASE_TYPE_MASK if 'fit_base_type_id' in message else None, + 'base_type_code': base_type_code, + 'name': message['name']['raw_field_value'] if 'name' in message else None, + 'array': message['array']['raw_field_value'] if 'array' in message else None, + 'components': message['components']['raw_field_value'] if 'components' in message else None, + 'scale': message['scale']['raw_field_value'] if 'scale' in message else None, + 'offset': message['offset']['raw_field_value'] if 'offset' in message else None, + 'units': message['units']['raw_field_value'] if 'units' in message else None, + 'bits': message['bits']['raw_field_value'] if 'bits' in message else None, + 'accumulate': message['accumulate']['raw_field_value'] if 'accumulate' in message else None, + 'ref_field_name': message['ref_field_name']['raw_field_value'] if 'ref_field_name' in message else None, + 'ref_field_value': message['ref_field_value']['raw_field_value'] if 'ref_field_value' in message else None, + 'fit_base_unit_id': message['fit_base_unit_id']['raw_field_value'] if 'fit_base_unit_id' in message else None, + 'native_mesg_num': message['native_mesg_num']['raw_field_value'] if 'native_mesg_num' in message else None, + 'native_field_num': message['native_field_num']['raw_field_value'] if 'native_field_num' in message else None, + 'key': message['key'] + }) + + def __build_dev_data_struct_string(self, developer_field_def: dict, field_profile: dict): + struct_format_string = "<" if developer_field_def['endianness'] == Endianness.LITTLE else ">" + invalid_value = FIT.BASE_TYPE_DEFINITIONS[field_profile['fit_base_type_id']]['invalid'] + base_type_code = field_profile['base_type_code'] + base_type_size = FIT.BASE_TYPE_DEFINITIONS[field_profile['fit_base_type_id']]['size'] + num_elements = int(developer_field_def["size"] / base_type_size) + + field_profile['num_elements'] = num_elements + field_profile['invalid'] = invalid_value + + struct_format_string += str(num_elements) + base_type_code + + return struct_format_string + + def __lookup_developer_data_field(self, developer_field_def): + try: + for field in self._developer_data_defs[developer_field_def['developer_data_index']]['fields']: + if field['field_definition_number'] == developer_field_def['field_definition_number']: + return field + + return None + + except Exception: + return None + + def __clean_message(self, message): + if message is not None: + for field in message: + if isinstance(message[field], dict) and 'raw_field_value' in message[field]: + message[field] = message[field]['field_value'] if 'field_value' in message[field] else message[field]['raw_field_value'] + message[field] = util._sanitize_values(message[field]) + + def __read_raw_values(self, message_size, struct_format_string): + return self._stream.read_and_unpack(message_size, struct_format_string) + + def __read_raw_value(self, message_size, struct_format_string): + field_value = self._stream.read_and_unpack(message_size, struct_format_string) + return field_value if len(field_value) > 1 else field_value[0] + + def __is_array_all_none(self, array): + for i in array: + if i is not None: + return False + return True + + def __raise_error(self, error = ""): + position = self._stream.position() + message = "FIT Runtime Error at byte: " + str(position) + " " + error + raise RuntimeError(message) + + def read_file_header(self, reset, decode_mode = DecodeMode.NORMAL): + '''Reads the file's header and returns its parameters.''' + starting_position = self._stream.position() + + class FileHeader: + '''A class that decodes a FIT file header.''' + def __init__(self, stream, decode_mode): + if decode_mode != DecodeMode.NORMAL: + if decode_mode == DecodeMode.SKIP_HEADER: + stream.seek(_HEADER_WITH_CRC_SIZE) + + header_size = _HEADER_WITH_CRC_SIZE if decode_mode == DecodeMode.SKIP_HEADER else 0 + data_size = stream.get_length() - header_size - _CRCSIZE + + self.header_size = header_size + self.data_size = data_size + + return + + self.header_size = stream.read_byte() + self.protocol_version = stream.read_byte() + self.profile_version = stream.read_unint_16("little") + self.data_size = stream.read_unint_32("little") + self.data_type = stream.read_string(4) + self.header_crc = 0 + self.file_total_size = self.header_size + self.data_size + + if self.header_size == 14: + self.header_crc = stream.read_unint_16("little") + + def get_dict(self): + dict = {} + dict["header_size"] = self.header_size + dict["protocol_version"] = (self.protocol_version >> 4) + ((self.protocol_version & 0x0F) / 10) + dict["profile_version"] = self.profile_version / 1000 if self.profile_version > 2199 else 100 + dict["data_size"] = self.data_size + dict["data_type"] = self.data_type + dict["header_crc"] = self.header_crc + dict["file_total_size"] = self.file_total_size + + return dict + + file_header = FileHeader(self._stream, decode_mode) + + if reset is True: + self._stream.seek(starting_position) + + return file_header + + def get_num_messages(self): + '''Returns the total number of messages successfully decoded from the file(s)''' + num_messages = 0 + for message in self._messages: + num_messages += len(self._messages[message]) + return num_messages diff --git a/garmin_fit_sdk/fit.py b/garmin_fit_sdk/fit.py index 2d82f82..e538780 100644 --- a/garmin_fit_sdk/fit.py +++ b/garmin_fit_sdk/fit.py @@ -1,92 +1,92 @@ -'''fit.py: Contains base type defintions and conversion functions compliant with the FIT Protocol.''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### -# ****WARNING**** This file is auto-generated! Do NOT edit this file. -# Profile Version = 21.188.0Release -# Tag = production/release/21.188.0-0-g55050f8 -############################################################################################ - - -BASE_TYPE = { - "ENUM": 0x00, - "SINT8": 0x01, - "UINT8": 0x02, - "SINT16": 0x03, - "UINT16": 0x04, - "SINT32": 0x05, - "UINT32": 0x06, - "STRING": 0x07, - "FLOAT32": 0x08, - "FLOAT64": 0x09, - "UINT8Z": 0x0A, - "UINT16Z": 0x0B, - "UINT32Z": 0x0C, - "BYTE": 0x0D, - "SINT64": 0x0E, - "UINT64": 0x0F, - "UINT64Z": 0x10 -} - -FIELD_TYPE_TO_BASE_TYPE = { - "sint8": BASE_TYPE['SINT8'], - "uint8": BASE_TYPE['UINT8'], - "sint16": BASE_TYPE['SINT16'], - "uint16": BASE_TYPE['UINT16'], - "sint32": BASE_TYPE['SINT32'], - "uint32": BASE_TYPE['UINT32'], - "string": BASE_TYPE['STRING'], - "float32": BASE_TYPE['FLOAT32'], - "float64": BASE_TYPE['FLOAT64'], - "uint8z": BASE_TYPE['UINT8Z'], - "uint16z": BASE_TYPE['UINT16Z'], - "uint32z": BASE_TYPE['UINT32Z'], - "byte": BASE_TYPE['BYTE'], - "sint64": BASE_TYPE['SINT64'], - "uint64": BASE_TYPE['UINT64'], - "uint64z": BASE_TYPE['UINT64Z'] -} - -BASE_TYPE_DEFINITIONS = { - 0x00: {'size': 1, 'type': BASE_TYPE["ENUM"], 'signed': False, 'type_code': 'B', 'invalid': 0xFF}, - 0x01: {'size': 1, 'type': BASE_TYPE["SINT8"], 'signed': True, 'type_code': 'b', 'invalid': 0x7F}, - 0x02: {'size': 1, 'type': BASE_TYPE["UINT8"], 'signed': False, 'type_code': 'B', 'invalid': 0xFF}, - 0x03: {'size': 2, 'type': BASE_TYPE["SINT16"], 'signed': True, 'type_code': 'h', 'invalid': 0x7FFF}, - 0x04: {'size': 2, 'type': BASE_TYPE["UINT16"], 'signed': False, 'type_code': 'H', 'invalid': 0xFFFF}, - 0x05: {'size': 4, 'type': BASE_TYPE["SINT32"], 'signed': True, 'type_code': 'i', 'invalid': 0x7FFFFFFF}, - 0x06: {'size': 4, 'type': BASE_TYPE["UINT32"], 'signed': False, 'type_code': 'I', 'invalid': 0xFFFFFFFF}, - 0x07: {'size': 1, 'type': BASE_TYPE["STRING"], 'signed': False, 'type_code': 's', 'invalid': 0x00}, - 0x08: {'size': 4, 'type': BASE_TYPE["FLOAT32"], 'signed': True, 'type_code': 'f', 'invalid': 0xFFFFFFFF}, - 0x09: {'size': 8, 'type': BASE_TYPE["FLOAT64"], 'signed': True, 'type_code': 'd', 'invalid': 0xFFFFFFFFFFFFFFFF}, - 0x0A: {'size': 1, 'type': BASE_TYPE["UINT8Z"], 'signed': False, 'type_code': 'B', 'invalid': 0x00}, - 0x0B: {'size': 2, 'type': BASE_TYPE["UINT16Z"], 'signed': False, 'type_code': 'H', 'invalid': 0x0000}, - 0x0C: {'size': 4, 'type': BASE_TYPE["UINT32Z"], 'signed': False, 'type_code': 'I', 'invalid': 0x00000000}, - 0x0D: {'size': 1, 'type': BASE_TYPE["BYTE"], 'signed': False, 'type_code': 'B', 'invalid': 0xFF}, - 0x0E: {'size': 8, 'type': BASE_TYPE["SINT64"], 'signed': True, 'type_code': 'q', 'invalid': 0x7FFFFFFFFFFFFFFF}, - 0x0F: {'size': 8, 'type': BASE_TYPE["UINT64"], 'signed': False, 'type_code': 'Q', 'invalid': 0xFFFFFFFFFFFFFFFF}, - 0x10: {'size': 8, 'type': BASE_TYPE["UINT64Z"], 'signed': False, 'type_code': 'L', 'invalid': 0x0000000000000000}, -} - -BASE_TYPE_MASK = 0x1F - -NUMERIC_FIELD_TYPES = [ - "sint8", - "uint8", - "sint16", - "uint16", - "sint32", - "uint32", - "float32", - "float64", - "uint8z", - "uint16z", - "uint32z", - "byte", - "sint64", - "uint64", - "uint64z" -] +'''fit.py: Contains base type defintions and conversion functions compliant with the FIT Protocol.''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### +# ****WARNING**** This file is auto-generated! Do NOT edit this file. +# Profile Version = 21.194.0Release +# Tag = production/release/21.194.0-0-g65135fc +############################################################################################ + + +BASE_TYPE = { + "ENUM": 0x00, + "SINT8": 0x01, + "UINT8": 0x02, + "SINT16": 0x03, + "UINT16": 0x04, + "SINT32": 0x05, + "UINT32": 0x06, + "STRING": 0x07, + "FLOAT32": 0x08, + "FLOAT64": 0x09, + "UINT8Z": 0x0A, + "UINT16Z": 0x0B, + "UINT32Z": 0x0C, + "BYTE": 0x0D, + "SINT64": 0x0E, + "UINT64": 0x0F, + "UINT64Z": 0x10 +} + +FIELD_TYPE_TO_BASE_TYPE = { + "sint8": BASE_TYPE['SINT8'], + "uint8": BASE_TYPE['UINT8'], + "sint16": BASE_TYPE['SINT16'], + "uint16": BASE_TYPE['UINT16'], + "sint32": BASE_TYPE['SINT32'], + "uint32": BASE_TYPE['UINT32'], + "string": BASE_TYPE['STRING'], + "float32": BASE_TYPE['FLOAT32'], + "float64": BASE_TYPE['FLOAT64'], + "uint8z": BASE_TYPE['UINT8Z'], + "uint16z": BASE_TYPE['UINT16Z'], + "uint32z": BASE_TYPE['UINT32Z'], + "byte": BASE_TYPE['BYTE'], + "sint64": BASE_TYPE['SINT64'], + "uint64": BASE_TYPE['UINT64'], + "uint64z": BASE_TYPE['UINT64Z'] +} + +BASE_TYPE_DEFINITIONS = { + 0x00: {'size': 1, 'type': BASE_TYPE["ENUM"], 'signed': False, 'type_code': 'B', 'invalid': 0xFF}, + 0x01: {'size': 1, 'type': BASE_TYPE["SINT8"], 'signed': True, 'type_code': 'b', 'invalid': 0x7F}, + 0x02: {'size': 1, 'type': BASE_TYPE["UINT8"], 'signed': False, 'type_code': 'B', 'invalid': 0xFF}, + 0x03: {'size': 2, 'type': BASE_TYPE["SINT16"], 'signed': True, 'type_code': 'h', 'invalid': 0x7FFF}, + 0x04: {'size': 2, 'type': BASE_TYPE["UINT16"], 'signed': False, 'type_code': 'H', 'invalid': 0xFFFF}, + 0x05: {'size': 4, 'type': BASE_TYPE["SINT32"], 'signed': True, 'type_code': 'i', 'invalid': 0x7FFFFFFF}, + 0x06: {'size': 4, 'type': BASE_TYPE["UINT32"], 'signed': False, 'type_code': 'I', 'invalid': 0xFFFFFFFF}, + 0x07: {'size': 1, 'type': BASE_TYPE["STRING"], 'signed': False, 'type_code': 's', 'invalid': 0x00}, + 0x08: {'size': 4, 'type': BASE_TYPE["FLOAT32"], 'signed': True, 'type_code': 'f', 'invalid': 0xFFFFFFFF}, + 0x09: {'size': 8, 'type': BASE_TYPE["FLOAT64"], 'signed': True, 'type_code': 'd', 'invalid': 0xFFFFFFFFFFFFFFFF}, + 0x0A: {'size': 1, 'type': BASE_TYPE["UINT8Z"], 'signed': False, 'type_code': 'B', 'invalid': 0x00}, + 0x0B: {'size': 2, 'type': BASE_TYPE["UINT16Z"], 'signed': False, 'type_code': 'H', 'invalid': 0x0000}, + 0x0C: {'size': 4, 'type': BASE_TYPE["UINT32Z"], 'signed': False, 'type_code': 'I', 'invalid': 0x00000000}, + 0x0D: {'size': 1, 'type': BASE_TYPE["BYTE"], 'signed': False, 'type_code': 'B', 'invalid': 0xFF}, + 0x0E: {'size': 8, 'type': BASE_TYPE["SINT64"], 'signed': True, 'type_code': 'q', 'invalid': 0x7FFFFFFFFFFFFFFF}, + 0x0F: {'size': 8, 'type': BASE_TYPE["UINT64"], 'signed': False, 'type_code': 'Q', 'invalid': 0xFFFFFFFFFFFFFFFF}, + 0x10: {'size': 8, 'type': BASE_TYPE["UINT64Z"], 'signed': False, 'type_code': 'L', 'invalid': 0x0000000000000000}, +} + +BASE_TYPE_MASK = 0x1F + +NUMERIC_FIELD_TYPES = [ + "sint8", + "uint8", + "sint16", + "uint16", + "sint32", + "uint32", + "float32", + "float64", + "uint8z", + "uint16z", + "uint32z", + "byte", + "sint64", + "uint64", + "uint64z" +] diff --git a/garmin_fit_sdk/hr_mesg_utils.py b/garmin_fit_sdk/hr_mesg_utils.py index dc8662d..c48453e 100644 --- a/garmin_fit_sdk/hr_mesg_utils.py +++ b/garmin_fit_sdk/hr_mesg_utils.py @@ -1,152 +1,152 @@ -'''hr_mesg_utils.py: Contains the functions for merging hr_mesgs to record_mesgs''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### -# ****WARNING**** This file is auto-generated! Do NOT edit this file. -# Profile Version = 21.188.0Release -# Tag = production/release/21.188.0-0-g55050f8 -############################################################################################ - - -from datetime import datetime - -from . import util - - -def merge_heart_rates(hr_mesgs, record_mesgs): - '''Takes the list of heart rate messages and merges them into the record messages.''' - if hr_mesgs is None or record_mesgs is None or len(hr_mesgs) == 0 or len(record_mesgs) == 0: - return - - heartrates = expand_heart_rates(hr_mesgs) - - heartrate_index = 0 - record_range_start_time = None - - for i in range(len(record_mesgs)): - message = record_mesgs[i] - - hr_sum = 0 - hr_sum_count = 0 - - record_range_end_time = seconds_since_fit_epoch(message['timestamp']) - - if record_range_start_time is None: - record_range_start_time = record_range_end_time - - if record_range_start_time == record_range_end_time: - record_range_start_time -= 1 - heartrate_index = heartrate_index - 1 if heartrate_index >= 1 else 0 - - finding_in_range_hr_mesgs = True - while(finding_in_range_hr_mesgs and (heartrate_index < len(heartrates))): - heart_rate = heartrates[heartrate_index] - - # Check if the heartrate timestamp is > record start time - # and if the heartrate timestamp is <= to record end time - if heart_rate['timestamp'] > record_range_start_time and heart_rate['timestamp'] <= record_range_end_time: - hr_sum += heart_rate['heart_rate'] - hr_sum_count += 1 - # Check if the heartrate timestamp exceeds the record time - elif heart_rate['timestamp'] > record_range_end_time: - finding_in_range_hr_mesgs = False - - if hr_sum_count > 0: - # Update record's heart rate value - #avg_hr = round(hr_sum / hr_sum_count, 0) - avg_hr = int((hr_sum / hr_sum_count) + .5) - message['heart_rate'] = avg_hr - # Reset HR average accumulators - hr_sum = 0 - hr_sum_count = 0 - record_range_start_time = record_range_end_time - - # Breaks out of finding_in_range_hr_messages while loop without incrementing heartrate_index - break - heartrate_index += 1 - - -def expand_heart_rates(hr_mesgs): - '''Takes the heart rate messages and expands them to 250ms increments.''' - GAP_INCREMENT_MILLISECONDS = 250 - GAP_INCREMENT_SECONDS = GAP_INCREMENT_MILLISECONDS / 1000.0 - GAP_MAX_MILLISECONDS = 5000 - GAP_MAX_STEPS = GAP_MAX_MILLISECONDS / GAP_INCREMENT_MILLISECONDS - - if hr_mesgs is None or len(hr_mesgs) == 0: - return [] - - anchor_event_timestamp = 0.0 - anchor_timestamp = None - - heartrates = [] - - for message in hr_mesgs: - if message is None: - __raise_error("HR message must not be None.") - - event_timestamps = message['event_timestamp'] if isinstance(message['event_timestamp'], list) else [message['event_timestamp']] - filtered_bpm = message['filtered_bpm'] if isinstance(message['filtered_bpm'], list) else [message['filtered_bpm']] - - # Update HR anchor timestamp if present - if 'timestamp' in message and message['timestamp'] is not None: - anchor_timestamp = seconds_since_fit_epoch(message['timestamp']) - - if message['fractional_timestamp'] is not None: - anchor_timestamp += message['fractional_timestamp'] - - if len(event_timestamps) == 1: - anchor_event_timestamp = event_timestamps[0] - else: - __raise_error("Anchor HR message must have at least one event_timestamp") - - if anchor_timestamp is None or anchor_event_timestamp is None: - __raise_error("No anchor timestamp received in an HR message before delta HR messages") - elif len(event_timestamps) != len(filtered_bpm): - __raise_error("HR message with mismatching event timestamp and filtered bpm") - - for i in range(len(event_timestamps)): - event_timestamp = event_timestamps[i] - - if event_timestamp < anchor_event_timestamp: - if anchor_event_timestamp - event_timestamp > (0x400000): - event_timestamp += 0x400000 - else: - __raise_error("Anchor event_timestamp is greater than subsequent event_timestamp. This does not allow for correct delta caluclation.") - - - current_hr = { 'timestamp': anchor_timestamp, 'heart_rate': filtered_bpm[i] } - current_hr['timestamp'] += (event_timestamp - anchor_event_timestamp) - - # Carry the previous HR value forward across the gap to the current - # HR value for up to 5 seconds in 250ms increments - if len(heartrates) > 0: - previous_hr = heartrates[len(heartrates) - 1] - gap_in_milliseconds = abs(current_hr['timestamp'] - previous_hr['timestamp']) * 1000 - step = 1 - - while(gap_in_milliseconds > GAP_INCREMENT_MILLISECONDS and step <= GAP_MAX_STEPS): - gap_hr = { 'timestamp': previous_hr['timestamp'], 'heart_rate': previous_hr['heart_rate'] } - gap_hr['timestamp'] += (GAP_INCREMENT_SECONDS * step) - heartrates.append(gap_hr) - - gap_in_milliseconds -= GAP_INCREMENT_MILLISECONDS - step += 1 - - heartrates.append(current_hr) - return heartrates - -def seconds_since_fit_epoch(timestamp): - '''Gives the time in seconds since the fit epoch.''' - if isinstance(timestamp, datetime): - return (timestamp.timestamp() - util.FIT_EPOCH_S) - - return timestamp - -def __raise_error(error = ""): - message = f"FIT Runtime Error {error}" - raise RuntimeError(message) +'''hr_mesg_utils.py: Contains the functions for merging hr_mesgs to record_mesgs''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### +# ****WARNING**** This file is auto-generated! Do NOT edit this file. +# Profile Version = 21.194.0Release +# Tag = production/release/21.194.0-0-g65135fc +############################################################################################ + + +from datetime import datetime + +from . import util + + +def merge_heart_rates(hr_mesgs, record_mesgs): + '''Takes the list of heart rate messages and merges them into the record messages.''' + if hr_mesgs is None or record_mesgs is None or len(hr_mesgs) == 0 or len(record_mesgs) == 0: + return + + heartrates = expand_heart_rates(hr_mesgs) + + heartrate_index = 0 + record_range_start_time = None + + for i in range(len(record_mesgs)): + message = record_mesgs[i] + + hr_sum = 0 + hr_sum_count = 0 + + record_range_end_time = seconds_since_fit_epoch(message['timestamp']) + + if record_range_start_time is None: + record_range_start_time = record_range_end_time + + if record_range_start_time == record_range_end_time: + record_range_start_time -= 1 + heartrate_index = heartrate_index - 1 if heartrate_index >= 1 else 0 + + finding_in_range_hr_mesgs = True + while(finding_in_range_hr_mesgs and (heartrate_index < len(heartrates))): + heart_rate = heartrates[heartrate_index] + + # Check if the heartrate timestamp is > record start time + # and if the heartrate timestamp is <= to record end time + if heart_rate['timestamp'] > record_range_start_time and heart_rate['timestamp'] <= record_range_end_time: + hr_sum += heart_rate['heart_rate'] + hr_sum_count += 1 + # Check if the heartrate timestamp exceeds the record time + elif heart_rate['timestamp'] > record_range_end_time: + finding_in_range_hr_mesgs = False + + if hr_sum_count > 0: + # Update record's heart rate value + #avg_hr = round(hr_sum / hr_sum_count, 0) + avg_hr = int((hr_sum / hr_sum_count) + .5) + message['heart_rate'] = avg_hr + # Reset HR average accumulators + hr_sum = 0 + hr_sum_count = 0 + record_range_start_time = record_range_end_time + + # Breaks out of finding_in_range_hr_messages while loop without incrementing heartrate_index + break + heartrate_index += 1 + + +def expand_heart_rates(hr_mesgs): + '''Takes the heart rate messages and expands them to 250ms increments.''' + GAP_INCREMENT_MILLISECONDS = 250 + GAP_INCREMENT_SECONDS = GAP_INCREMENT_MILLISECONDS / 1000.0 + GAP_MAX_MILLISECONDS = 5000 + GAP_MAX_STEPS = GAP_MAX_MILLISECONDS / GAP_INCREMENT_MILLISECONDS + + if hr_mesgs is None or len(hr_mesgs) == 0: + return [] + + anchor_event_timestamp = 0.0 + anchor_timestamp = None + + heartrates = [] + + for message in hr_mesgs: + if message is None: + __raise_error("HR message must not be None.") + + event_timestamps = message['event_timestamp'] if isinstance(message['event_timestamp'], list) else [message['event_timestamp']] + filtered_bpm = message['filtered_bpm'] if isinstance(message['filtered_bpm'], list) else [message['filtered_bpm']] + + # Update HR anchor timestamp if present + if 'timestamp' in message and message['timestamp'] is not None: + anchor_timestamp = seconds_since_fit_epoch(message['timestamp']) + + if message['fractional_timestamp'] is not None: + anchor_timestamp += message['fractional_timestamp'] + + if len(event_timestamps) == 1: + anchor_event_timestamp = event_timestamps[0] + else: + __raise_error("Anchor HR message must have at least one event_timestamp") + + if anchor_timestamp is None or anchor_event_timestamp is None: + __raise_error("No anchor timestamp received in an HR message before delta HR messages") + elif len(event_timestamps) != len(filtered_bpm): + __raise_error("HR message with mismatching event timestamp and filtered bpm") + + for i in range(len(event_timestamps)): + event_timestamp = event_timestamps[i] + + if event_timestamp < anchor_event_timestamp: + if anchor_event_timestamp - event_timestamp > (0x400000): + event_timestamp += 0x400000 + else: + __raise_error("Anchor event_timestamp is greater than subsequent event_timestamp. This does not allow for correct delta caluclation.") + + + current_hr = { 'timestamp': anchor_timestamp, 'heart_rate': filtered_bpm[i] } + current_hr['timestamp'] += (event_timestamp - anchor_event_timestamp) + + # Carry the previous HR value forward across the gap to the current + # HR value for up to 5 seconds in 250ms increments + if len(heartrates) > 0: + previous_hr = heartrates[len(heartrates) - 1] + gap_in_milliseconds = abs(current_hr['timestamp'] - previous_hr['timestamp']) * 1000 + step = 1 + + while(gap_in_milliseconds > GAP_INCREMENT_MILLISECONDS and step <= GAP_MAX_STEPS): + gap_hr = { 'timestamp': previous_hr['timestamp'], 'heart_rate': previous_hr['heart_rate'] } + gap_hr['timestamp'] += (GAP_INCREMENT_SECONDS * step) + heartrates.append(gap_hr) + + gap_in_milliseconds -= GAP_INCREMENT_MILLISECONDS + step += 1 + + heartrates.append(current_hr) + return heartrates + +def seconds_since_fit_epoch(timestamp): + '''Gives the time in seconds since the fit epoch.''' + if isinstance(timestamp, datetime): + return (timestamp.timestamp() - util.FIT_EPOCH_S) + + return timestamp + +def __raise_error(error = ""): + message = f"FIT Runtime Error {error}" + raise RuntimeError(message) diff --git a/garmin_fit_sdk/profile.py b/garmin_fit_sdk/profile.py index 2582364..276b155 100644 --- a/garmin_fit_sdk/profile.py +++ b/garmin_fit_sdk/profile.py @@ -1,26624 +1,26643 @@ -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### -# ****WARNING**** This file is auto-generated! Do NOT edit this file. -# Profile Version = 21.188.0Release -# Tag = production/release/21.188.0-0-g55050f8 -############################################################################################ - - -Profile = { - 'version': { - 'major': 21, - 'minor': 188, - 'patch': 0, - 'type': "Release" - }, - 'common_fields': { - 'part_index': 250, - 'timestamp': 253, - 'message_index': 254 - }, - 'messages': { - 0: { - 'num': "0", # Must be first message in file. - 'name': "file_id", - 'messages_key': "file_id_mesgs", - 'fields': { - 0: { - 'num': 0, - 'name': "type", - 'type': "file", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "manufacturer", - 'type': "manufacturer", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "product", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "favero_product", - 'type': "favero_product", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "manufacturer", 'raw_value': 263, 'value_name': "favero_electronics" }, - ], - }, - { - 'name': "garmin_product", - 'type': "garmin_product", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "manufacturer", 'raw_value': 1, 'value_name': "garmin" }, - { 'num': 1, 'name': "manufacturer", 'raw_value': 15, 'value_name': "dynastream" }, - { 'num': 1, 'name': "manufacturer", 'raw_value': 13, 'value_name': "dynastream_oem" }, - { 'num': 1, 'name': "manufacturer", 'raw_value': 89, 'value_name': "tacx" }, - ], - }, - ] - }, - 3: { - 'num': 3, - 'name': "serial_number", - 'type': "uint32z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Only set for files that are can be created/erased. - 'name': "time_created", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # Only set for files that are not created/erased. - 'name': "number", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # Optional free form string to indicate the devices name or model - 'name': "product_name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 49: { - 'num': "49", - 'name': "file_creator", - 'messages_key': "file_creator_mesgs", - 'fields': { - 0: { - 'num': 0, - 'name': "software_version", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "hardware_version", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 162: { - 'num': "162", - 'name': "timestamp_correlation", - 'messages_key': "timestamp_correlation_mesgs", - 'fields': { - 253: { - 'num': 253, # Whole second part of UTC timestamp at the time the system timestamp was recorded. - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Fractional part of the UTC timestamp at the time the system timestamp was recorded. - 'name': "fractional_timestamp", - 'type': "uint16", - 'array': "false", - 'scale': [32768], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Whole second part of the system timestamp - 'name': "system_timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Fractional part of the system timestamp - 'name': "fractional_system_timestamp", - 'type': "uint16", - 'array': "false", - 'scale': [32768], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # timestamp epoch expressed in local time used to convert timestamps to local time - 'name': "local_timestamp", - 'type': "local_date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Millisecond part of the UTC timestamp at the time the system timestamp was recorded. - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # Millisecond part of the system timestamp - 'name': "system_timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 35: { - 'num': "35", - 'name': "software", - 'messages_key': "software_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "version", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "part_number", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 106: { - 'num': "106", - 'name': "slave_device", - 'messages_key': "slave_device_mesgs", - 'fields': { - 0: { - 'num': 0, - 'name': "manufacturer", - 'type': "manufacturer", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "product", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "favero_product", - 'type': "favero_product", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "manufacturer", 'raw_value': 263, 'value_name': "favero_electronics" }, - ], - }, - { - 'name': "garmin_product", - 'type': "garmin_product", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "manufacturer", 'raw_value': 1, 'value_name': "garmin" }, - { 'num': 0, 'name': "manufacturer", 'raw_value': 15, 'value_name': "dynastream" }, - { 'num': 0, 'name': "manufacturer", 'raw_value': 13, 'value_name': "dynastream_oem" }, - { 'num': 0, 'name': "manufacturer", 'raw_value': 89, 'value_name': "tacx" }, - ], - }, - ] - }, - }, -}, - 1: { - 'num': "1", - 'name': "capabilities", - 'messages_key': "capabilities_mesgs", - 'fields': { - 0: { - 'num': 0, # Use language_bits_x types where x is index of array. - 'name': "languages", - 'type': "uint8z", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Use sport_bits_x types where x is index of array. - 'name': "sports", - 'type': "sport_bits_0", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 21: { - 'num': 21, - 'name': "workouts_supported", - 'type': "workout_capabilities", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 23: { - 'num': 23, - 'name': "connectivity_supported", - 'type': "connectivity_capabilities", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 37: { - 'num': "37", - 'name': "file_capabilities", - 'messages_key': "file_capabilities_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "type", - 'type': "file", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "flags", - 'type': "file_flags", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "directory", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "max_count", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "max_size", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bytes", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 38: { - 'num': "38", - 'name': "mesg_capabilities", - 'messages_key': "mesg_capabilities_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "file", - 'type': "file", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "mesg_num", - 'type': "mesg_num", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "count_type", - 'type': "mesg_count", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "count", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "num_per_file", - 'type': "uint16", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 2, 'name': "count_type", 'raw_value': 0, 'value_name': "num_per_file" }, - ], - }, - { - 'name': "max_per_file", - 'type': "uint16", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 2, 'name': "count_type", 'raw_value': 1, 'value_name': "max_per_file" }, - ], - }, - { - 'name': "max_per_file_type", - 'type': "uint16", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 2, 'name': "count_type", 'raw_value': 2, 'value_name': "max_per_file_type" }, - ], - }, - ] - }, - }, -}, - 39: { - 'num': "39", - 'name': "field_capabilities", - 'messages_key': "field_capabilities_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "file", - 'type': "file", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "mesg_num", - 'type': "mesg_num", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "field_num", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "count", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 2: { - 'num': "2", - 'name': "device_settings", - 'messages_key': "device_settings_mesgs", - 'fields': { - 0: { - 'num': 0, # Index into time zone arrays. - 'name': "active_time_zone", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Offset from system time. Required to convert timestamp from system time to UTC. - 'name': "utc_offset", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Offset from system time. - 'name': "time_offset", - 'type': "uint32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Display mode for the time - 'name': "time_mode", - 'type': "time_mode", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # timezone offset in 1/4 hour increments - 'name': "time_zone_offset", - 'type': "sint8", - 'array': "true", - 'scale': [4], - 'offset': [0], - 'units': "hr", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, # Mode for backlight - 'name': "backlight_mode", - 'type': "backlight_mode", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 36: { - 'num': 36, # Enabled state of the activity tracker functionality - 'name': "activity_tracker_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 39: { - 'num': 39, # UTC timestamp used to set the devices clock and date - 'name': "clock_time", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 40: { - 'num': 40, # Bitfield to configure enabled screens for each supported loop - 'name': "pages_enabled", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 46: { - 'num': 46, # Enabled state of the move alert - 'name': "move_alert_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 47: { - 'num': 47, # Display mode for the date - 'name': "date_mode", - 'type': "date_mode", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 55: { - 'num': 55, - 'name': "display_orientation", - 'type': "display_orientation", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 56: { - 'num': 56, - 'name': "mounting_side", - 'type': "side", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 57: { - 'num': 57, # Bitfield to indicate one page as default for each supported loop - 'name': "default_page", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 58: { - 'num': 58, # Minimum steps before an autosync can occur - 'name': "autosync_min_steps", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "steps", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 59: { - 'num': 59, # Minimum minutes before an autosync can occur - 'name': "autosync_min_time", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "minutes", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 80: { - 'num': 80, # Enable auto-detect setting for the lactate threshold feature. - 'name': "lactate_threshold_autodetect_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 86: { - 'num': 86, # Automatically upload using BLE - 'name': "ble_auto_upload_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 89: { - 'num': 89, # Helps to conserve battery by changing modes - 'name': "auto_sync_frequency", - 'type': "auto_sync_frequency", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 90: { - 'num': 90, # Allows setting specific activities auto-activity detect enabled/disabled settings - 'name': "auto_activity_detect", - 'type': "auto_activity_detect", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 94: { - 'num': 94, # Number of screens configured to display - 'name': "number_of_screens", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 95: { - 'num': 95, # Smart Notification display orientation - 'name': "smart_notification_display_orientation", - 'type': "display_orientation", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 134: { - 'num': 134, - 'name': "tap_interface", - 'type': "switch", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 174: { - 'num': 174, # Used to hold the tap threshold setting - 'name': "tap_sensitivity", - 'type': "tap_sensitivity", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 3: { - 'num': "3", - 'name': "user_profile", - 'messages_key': "user_profile_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Used for Morning Report greeting - 'name': "friendly_name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "gender", - 'type': "gender", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "age", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "years", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "height", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "weight", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "kg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "language", - 'type': "language", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "elev_setting", - 'type': "display_measure", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "weight_setting", - 'type': "display_measure", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "resting_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "default_max_running_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "default_max_biking_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "default_max_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, - 'name': "hr_setting", - 'type': "display_heart", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "speed_setting", - 'type': "display_measure", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, - 'name': "dist_setting", - 'type': "display_measure", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 16: { - 'num': 16, - 'name': "power_setting", - 'type': "display_power", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 17: { - 'num': 17, - 'name': "activity_class", - 'type': "activity_class", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 18: { - 'num': 18, - 'name': "position_setting", - 'type': "display_position", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 21: { - 'num': 21, - 'name': "temperature_setting", - 'type': "display_measure", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 22: { - 'num': 22, - 'name': "local_id", - 'type': "user_local_id", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 23: { - 'num': 23, - 'name': "global_id", - 'type': "byte", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 28: { - 'num': 28, # Typical wake time - 'name': "wake_time", - 'type': "localtime_into_day", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 29: { - 'num': 29, # Typical bed time - 'name': "sleep_time", - 'type': "localtime_into_day", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 30: { - 'num': 30, - 'name': "height_setting", - 'type': "display_measure", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 31: { - 'num': 31, # User defined running step length set to 0 for auto length - 'name': "user_running_step_length", - 'type': "uint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 32: { - 'num': 32, # User defined walking step length set to 0 for auto length - 'name': "user_walking_step_length", - 'type': "uint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 47: { - 'num': 47, - 'name': "depth_setting", - 'type': "display_measure", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 49: { - 'num': 49, - 'name': "dive_count", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 4: { - 'num': "4", - 'name': "hrm_profile", - 'messages_key': "hrm_profile_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "hrm_ant_id", - 'type': "uint16z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "log_hrv", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "hrm_ant_id_trans_type", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 5: { - 'num': "5", - 'name': "sdm_profile", - 'messages_key': "sdm_profile_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "sdm_ant_id", - 'type': "uint16z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "sdm_cal_factor", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "odometer", - 'type': "uint32", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Use footpod for speed source instead of GPS - 'name': "speed_source", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "sdm_ant_id_trans_type", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Rollover counter that can be used to extend the odometer - 'name': "odometer_rollover", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 6: { - 'num': "6", - 'name': "bike_profile", - 'messages_key': "bike_profile_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "sport", - 'type': "sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "sub_sport", - 'type': "sub_sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "odometer", - 'type': "uint32", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "bike_spd_ant_id", - 'type': "uint16z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "bike_cad_ant_id", - 'type': "uint16z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "bike_spdcad_ant_id", - 'type': "uint16z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "bike_power_ant_id", - 'type': "uint16z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "custom_wheelsize", - 'type': "uint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "auto_wheelsize", - 'type': "uint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "bike_weight", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "kg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "power_cal_factor", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, - 'name': "auto_wheel_cal", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "auto_power_zero", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, - 'name': "id", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 15: { - 'num': 15, - 'name': "spd_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 16: { - 'num': 16, - 'name': "cad_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 17: { - 'num': 17, - 'name': "spdcad_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 18: { - 'num': 18, - 'name': "power_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 19: { - 'num': 19, - 'name': "crank_length", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [-110], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 20: { - 'num': 20, - 'name': "enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 21: { - 'num': 21, - 'name': "bike_spd_ant_id_trans_type", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 22: { - 'num': 22, - 'name': "bike_cad_ant_id_trans_type", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 23: { - 'num': 23, - 'name': "bike_spdcad_ant_id_trans_type", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 24: { - 'num': 24, - 'name': "bike_power_ant_id_trans_type", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 37: { - 'num': 37, # Rollover counter that can be used to extend the odometer - 'name': "odometer_rollover", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 38: { - 'num': 38, # Number of front gears - 'name': "front_gear_num", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 39: { - 'num': 39, # Number of teeth on each gear 0 is innermost - 'name': "front_gear", - 'type': "uint8z", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 40: { - 'num': 40, # Number of rear gears - 'name': "rear_gear_num", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 41: { - 'num': 41, # Number of teeth on each gear 0 is innermost - 'name': "rear_gear", - 'type': "uint8z", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 44: { - 'num': 44, - 'name': "shimano_di2_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 127: { - 'num': "127", - 'name': "connectivity", - 'messages_key': "connectivity_mesgs", - 'fields': { - 0: { - 'num': 0, # Use Bluetooth for connectivity features - 'name': "bluetooth_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Use Bluetooth Low Energy for connectivity features - 'name': "bluetooth_le_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Use ANT for connectivity features - 'name': "ant_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "live_tracking_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "weather_conditions_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "weather_alerts_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "auto_activity_upload_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "course_download_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "workout_download_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "gps_ephemeris_download_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "incident_detection_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, - 'name': "grouptrack_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 159: { - 'num': "159", - 'name': "watchface_settings", - 'messages_key': "watchface_settings_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "mode", - 'type': "watchface_mode", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "layout", - 'type': "byte", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "digital_layout", - 'type': "digital_watchface_layout", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "mode", 'raw_value': 0, 'value_name': "digital" }, - ], - }, - { - 'name': "analog_layout", - 'type': "analog_watchface_layout", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "mode", 'raw_value': 1, 'value_name': "analog" }, - ], - }, - ] - }, - }, -}, - 188: { - 'num': "188", - 'name': "ohr_settings", - 'messages_key': "ohr_settings_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "enabled", - 'type': "switch", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 216: { - 'num': "216", - 'name': "time_in_zone", - 'messages_key': "time_in_zone_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "reference_mesg", - 'type': "mesg_num", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "reference_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "time_in_hr_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "time_in_speed_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "time_in_cadence_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "time_in_power_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "hr_zone_high_boundary", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "speed_zone_high_boundary", - 'type': "uint16", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "cadence_zone_high_bondary", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "power_zone_high_boundary", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "hr_calc_type", - 'type': "hr_zone_calc", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "max_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, - 'name': "resting_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "threshold_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, - 'name': "pwr_calc_type", - 'type': "pwr_zone_calc", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 15: { - 'num': 15, - 'name': "functional_threshold_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 7: { - 'num': "7", - 'name': "zones_target", - 'messages_key': "zones_target_mesgs", - 'fields': { - 1: { - 'num': 1, - 'name': "max_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "threshold_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "functional_threshold_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "hr_calc_type", - 'type': "hr_zone_calc", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "pwr_calc_type", - 'type': "pwr_zone_calc", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 12: { - 'num': "12", - 'name': "sport", - 'messages_key': "sport_mesgs", - 'fields': { - 0: { - 'num': 0, - 'name': "sport", - 'type': "sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "sub_sport", - 'type': "sub_sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 8: { - 'num': "8", - 'name': "hr_zone", - 'messages_key': "hr_zone_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "high_bpm", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 53: { - 'num': "53", - 'name': "speed_zone", - 'messages_key': "speed_zone_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "high_value", - 'type': "uint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 131: { - 'num': "131", - 'name': "cadence_zone", - 'messages_key': "cadence_zone_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "high_value", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 9: { - 'num': "9", - 'name': "power_zone", - 'messages_key': "power_zone_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "high_value", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 10: { - 'num': "10", - 'name': "met_zone", - 'messages_key': "met_zone_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "high_bpm", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "calories", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "kcal / min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "fat_calories", - 'type': "uint8", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "kcal / min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 13: { - 'num': "13", - 'name': "training_settings", - 'messages_key': "training_settings_mesgs", - 'fields': { - 31: { - 'num': 31, - 'name': "target_distance", - 'type': "uint32", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 32: { - 'num': 32, - 'name': "target_speed", - 'type': "uint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 33: { - 'num': 33, - 'name': "target_time", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 153: { - 'num': 153, # A more precise target speed field - 'name': "precise_target_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 258: { - 'num': "258", - 'name': "dive_settings", - 'messages_key': "dive_settings_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "model", - 'type': "tissue_model_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "gf_low", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "gf_high", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "water_type", - 'type': "water_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # Fresh water is usually 1000; salt water is usually 1025 - 'name': "water_density", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kg/m^3", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Typically 1.40 - 'name': "po2_warn", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Typically 1.60 - 'name': "po2_critical", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "po2_deco", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "safety_stop_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "bottom_depth", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "bottom_time", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, - 'name': "apnea_countdown_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "apnea_countdown_time", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, - 'name': "backlight_mode", - 'type': "dive_backlight_mode", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 15: { - 'num': 15, - 'name': "backlight_brightness", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 16: { - 'num': 16, - 'name': "backlight_timeout", - 'type': "backlight_timeout", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 17: { - 'num': 17, # Time between surfacing and ending the activity - 'name': "repeat_dive_interval", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 18: { - 'num': 18, # Time at safety stop (if enabled) - 'name': "safety_stop_time", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 19: { - 'num': 19, - 'name': "heart_rate_source_type", - 'type': "source_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 20: { - 'num': 20, - 'name': "heart_rate_source", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "heart_rate_antplus_device_type", - 'type': "antplus_device_type", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "heart_rate_source_type", 'raw_value': 1, 'value_name': "antplus" }, - ], - }, - { - 'name': "heart_rate_local_device_type", - 'type': "local_device_type", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "heart_rate_source_type", 'raw_value': 5, 'value_name': "local" }, - ], - }, - ] - }, - 21: { - 'num': 21, # Index of travel dive_gas message - 'name': "travel_gas", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 22: { - 'num': 22, # If low PO2 should be switched to automatically - 'name': "ccr_low_setpoint_switch_mode", - 'type': "ccr_setpoint_switch_mode", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 23: { - 'num': 23, # Target PO2 when using low setpoint - 'name': "ccr_low_setpoint", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 24: { - 'num': 24, # Depth to switch to low setpoint in automatic mode - 'name': "ccr_low_setpoint_depth", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 25: { - 'num': 25, # If high PO2 should be switched to automatically - 'name': "ccr_high_setpoint_switch_mode", - 'type': "ccr_setpoint_switch_mode", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 26: { - 'num': 26, # Target PO2 when using high setpoint - 'name': "ccr_high_setpoint", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 27: { - 'num': 27, # Depth to switch to high setpoint in automatic mode - 'name': "ccr_high_setpoint_depth", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 29: { - 'num': 29, # Type of gas consumption rate to display. Some values are only valid if tank volume is known. - 'name': "gas_consumption_display", - 'type': "gas_consumption_rate_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 30: { - 'num': 30, # Indicates whether the up key is enabled during dives - 'name': "up_key_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 35: { - 'num': 35, # Sounds and vibration enabled or disabled in-dive - 'name': "dive_sounds", - 'type': "tone", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 36: { - 'num': 36, # Usually 1.0/1.5/2.0 representing 3/4.5/6m or 10/15/20ft - 'name': "last_stop_multiple", - 'type': "uint8", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 37: { - 'num': 37, # Indicates which guidelines to use for no-fly surface interval. - 'name': "no_fly_time_mode", - 'type': "no_fly_time_mode", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 262: { - 'num': "262", - 'name': "dive_alarm", - 'messages_key': "dive_alarm_mesgs", - 'fields': { - 254: { - 'num': 254, # Index of the alarm - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Depth setting (m) for depth type alarms - 'name': "depth", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Time setting (s) for time type alarms - 'name': "time", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Enablement flag - 'name': "enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Alarm type setting - 'name': "alarm_type", - 'type': "dive_alarm_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Tone and Vibe setting for the alarm - 'name': "sound", - 'type': "tone", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # Dive types the alarm will trigger on - 'name': "dive_types", - 'type': "sub_sport", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Alarm ID - 'name': "id", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Show a visible pop-up for this alarm - 'name': "popup_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # Trigger the alarm on descent - 'name': "trigger_on_descent", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, # Trigger the alarm on ascent - 'name': "trigger_on_ascent", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, # Repeat alarm each time threshold is crossed? - 'name': "repeating", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, # Ascent/descent rate (mps) setting for speed type alarms - 'name': "speed", - 'type': "sint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "mps", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 393: { - 'num': "393", - 'name': "dive_apnea_alarm", - 'messages_key': "dive_apnea_alarm_mesgs", - 'fields': { - 254: { - 'num': 254, # Index of the alarm - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Depth setting (m) for depth type alarms - 'name': "depth", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Time setting (s) for time type alarms - 'name': "time", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Enablement flag - 'name': "enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Alarm type setting - 'name': "alarm_type", - 'type': "dive_alarm_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Tone and Vibe setting for the alarm. - 'name': "sound", - 'type': "tone", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # Dive types the alarm will trigger on - 'name': "dive_types", - 'type': "sub_sport", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Alarm ID - 'name': "id", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Show a visible pop-up for this alarm - 'name': "popup_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # Trigger the alarm on descent - 'name': "trigger_on_descent", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, # Trigger the alarm on ascent - 'name': "trigger_on_ascent", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, # Repeat alarm each time threshold is crossed? - 'name': "repeating", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, # Ascent/descent rate (mps) setting for speed type alarms - 'name': "speed", - 'type': "sint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "mps", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 259: { - 'num': "259", - 'name': "dive_gas", - 'messages_key': "dive_gas_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "helium_content", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "oxygen_content", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "status", - 'type': "dive_gas_status", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "mode", - 'type': "dive_gas_mode", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 15: { - 'num': "15", - 'name': "goal", - 'messages_key': "goal_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "sport", - 'type': "sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "sub_sport", - 'type': "sub_sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "start_date", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "end_date", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "type", - 'type': "goal", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "value", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "repeat", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "target_value", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "recurrence", - 'type': "goal_recurrence", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "recurrence_value", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "source", - 'type': "goal_source", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 34: { - 'num': "34", - 'name': "activity", - 'messages_key': "activity_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Exclude pauses - 'name': "total_timer_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "num_sessions", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "type", - 'type': "activity", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "event", - 'type': "event", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "event_type", - 'type': "event_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # timestamp epoch expressed in local time, used to convert activity timestamps to local time - 'name': "local_timestamp", - 'type': "local_date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "event_group", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 18: { - 'num': "18", - 'name': "session", - 'messages_key': "session_mesgs", - 'fields': { - 254: { - 'num': 254, # Selected bit is set for the current session. - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # session - 'name': "event", - 'type': "event", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # stop - 'name': "event_type", - 'type': "event_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "start_time", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "start_position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "start_position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "sport", - 'type': "sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "sub_sport", - 'type': "sub_sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Time (includes pauses) - 'name': "total_elapsed_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # Timer Time (excludes pauses) - 'name': "total_timer_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "total_distance", - 'type': "uint32", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "total_cycles", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "cycles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "total_strides", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["strides"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 5, 'name': "sport", 'raw_value': 1, 'value_name': "running" }, - { 'num': 5, 'name': "sport", 'raw_value': 11, 'value_name': "walking" }, - ], - }, - { - 'name': "total_strokes", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["strokes"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 5, 'name': "sport", 'raw_value': 2, 'value_name': "cycling" }, - { 'num': 5, 'name': "sport", 'raw_value': 5, 'value_name': "swimming" }, - { 'num': 5, 'name': "sport", 'raw_value': 15, 'value_name': "rowing" }, - { 'num': 5, 'name': "sport", 'raw_value': 37, 'value_name': "stand_up_paddleboarding" }, - ], - }, - ] - }, - 11: { - 'num': 11, - 'name': "total_calories", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "total_fat_calories", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, # total_distance / total_timer_time - 'name': "avg_speed", - 'type': "uint16", - 'array': "false", - 'scale': [1000, ], - 'offset': [0, ], - 'units': ["m/s", ], - 'bits': [16,], - 'components': [124, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 15: { - 'num': 15, - 'name': "max_speed", - 'type': "uint16", - 'array': "false", - 'scale': [1000, ], - 'offset': [0, ], - 'units': ["m/s", ], - 'bits': [16,], - 'components': [125, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 16: { - 'num': 16, # average heart rate (excludes pause time) - 'name': "avg_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 17: { - 'num': 17, - 'name': "max_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 18: { - 'num': 18, # total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time - 'name': "avg_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "avg_running_cadence", - 'type': "uint8", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["strides/min"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 5, 'name': "sport", 'raw_value': 1, 'value_name': "running" }, - ], - }, - ] - }, - 19: { - 'num': 19, - 'name': "max_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "max_running_cadence", - 'type': "uint8", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["strides/min"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 5, 'name': "sport", 'raw_value': 1, 'value_name': "running" }, - ], - }, - ] - }, - 20: { - 'num': 20, # total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time - 'name': "avg_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 21: { - 'num': 21, - 'name': "max_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 22: { - 'num': 22, - 'name': "total_ascent", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 23: { - 'num': 23, - 'name': "total_descent", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 24: { - 'num': 24, - 'name': "total_training_effect", - 'type': "uint8", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 25: { - 'num': 25, - 'name': "first_lap_index", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 26: { - 'num': 26, - 'name': "num_laps", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 27: { - 'num': 27, - 'name': "event_group", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 28: { - 'num': 28, - 'name': "trigger", - 'type': "session_trigger", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 29: { - 'num': 29, # North east corner latitude - 'name': "nec_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 30: { - 'num': 30, # North east corner longitude - 'name': "nec_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 31: { - 'num': 31, # South west corner latitude - 'name': "swc_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 32: { - 'num': 32, # South west corner longitude - 'name': "swc_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 33: { - 'num': 33, # # of lengths of swim pool - 'name': "num_lengths", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "lengths", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 34: { - 'num': 34, - 'name': "normalized_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 35: { - 'num': 35, - 'name': "training_stress_score", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "tss", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 36: { - 'num': 36, - 'name': "intensity_factor", - 'type': "uint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "if", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 37: { - 'num': 37, - 'name': "left_right_balance", - 'type': "left_right_balance_100", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 38: { - 'num': 38, - 'name': "end_position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 39: { - 'num': 39, - 'name': "end_position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 41: { - 'num': 41, - 'name': "avg_stroke_count", - 'type': "uint32", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "strokes/lap", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 42: { - 'num': 42, - 'name': "avg_stroke_distance", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 43: { - 'num': 43, - 'name': "swim_stroke", - 'type': "swim_stroke", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "swim_stroke", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 44: { - 'num': 44, - 'name': "pool_length", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 45: { - 'num': 45, - 'name': "threshold_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 46: { - 'num': 46, - 'name': "pool_length_unit", - 'type': "display_measure", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 47: { - 'num': 47, # # of active lengths of swim pool - 'name': "num_active_lengths", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "lengths", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 48: { - 'num': 48, - 'name': "total_work", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "J", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 49: { - 'num': 49, - 'name': "avg_altitude", - 'type': "uint16", - 'array': "false", - 'scale': [5, ], - 'offset': [500, ], - 'units': ["m", ], - 'bits': [16,], - 'components': [126, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 50: { - 'num': 50, - 'name': "max_altitude", - 'type': "uint16", - 'array': "false", - 'scale': [5, ], - 'offset': [500, ], - 'units': ["m", ], - 'bits': [16,], - 'components': [128, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 51: { - 'num': 51, - 'name': "gps_accuracy", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 52: { - 'num': 52, - 'name': "avg_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 53: { - 'num': 53, - 'name': "avg_pos_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 54: { - 'num': 54, - 'name': "avg_neg_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 55: { - 'num': 55, - 'name': "max_pos_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 56: { - 'num': 56, - 'name': "max_neg_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 57: { - 'num': 57, - 'name': "avg_temperature", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 58: { - 'num': 58, - 'name': "max_temperature", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 59: { - 'num': 59, - 'name': "total_moving_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 60: { - 'num': 60, - 'name': "avg_pos_vertical_speed", - 'type': "sint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 61: { - 'num': 61, - 'name': "avg_neg_vertical_speed", - 'type': "sint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 62: { - 'num': 62, - 'name': "max_pos_vertical_speed", - 'type': "sint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 63: { - 'num': 63, - 'name': "max_neg_vertical_speed", - 'type': "sint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 64: { - 'num': 64, - 'name': "min_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 65: { - 'num': 65, - 'name': "time_in_hr_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 66: { - 'num': 66, - 'name': "time_in_speed_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 67: { - 'num': 67, - 'name': "time_in_cadence_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 68: { - 'num': 68, - 'name': "time_in_power_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 69: { - 'num': 69, - 'name': "avg_lap_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 70: { - 'num': 70, - 'name': "best_lap_index", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 71: { - 'num': 71, - 'name': "min_altitude", - 'type': "uint16", - 'array': "false", - 'scale': [5, ], - 'offset': [500, ], - 'units': ["m", ], - 'bits': [16,], - 'components': [127, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 82: { - 'num': 82, - 'name': "player_score", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 83: { - 'num': 83, - 'name': "opponent_score", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 84: { - 'num': 84, - 'name': "opponent_name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 85: { - 'num': 85, # stroke_type enum used as the index - 'name': "stroke_count", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 86: { - 'num': 86, # zone number used as the index - 'name': "zone_count", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 87: { - 'num': 87, - 'name': "max_ball_speed", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 88: { - 'num': 88, - 'name': "avg_ball_speed", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 89: { - 'num': 89, - 'name': "avg_vertical_oscillation", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 90: { - 'num': 90, - 'name': "avg_stance_time_percent", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 91: { - 'num': 91, - 'name': "avg_stance_time", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 92: { - 'num': 92, # fractional part of the avg_cadence - 'name': "avg_fractional_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 93: { - 'num': 93, # fractional part of the max_cadence - 'name': "max_fractional_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 94: { - 'num': 94, # fractional part of the total_cycles - 'name': "total_fractional_cycles", - 'type': "uint8", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "cycles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 95: { - 'num': 95, # Avg saturated and unsaturated hemoglobin - 'name': "avg_total_hemoglobin_conc", - 'type': "uint16", - 'array': "true", - 'scale': [100], - 'offset': [0], - 'units': "g/dL", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 96: { - 'num': 96, # Min saturated and unsaturated hemoglobin - 'name': "min_total_hemoglobin_conc", - 'type': "uint16", - 'array': "true", - 'scale': [100], - 'offset': [0], - 'units': "g/dL", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 97: { - 'num': 97, # Max saturated and unsaturated hemoglobin - 'name': "max_total_hemoglobin_conc", - 'type': "uint16", - 'array': "true", - 'scale': [100], - 'offset': [0], - 'units': "g/dL", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 98: { - 'num': 98, # Avg percentage of hemoglobin saturated with oxygen - 'name': "avg_saturated_hemoglobin_percent", - 'type': "uint16", - 'array': "true", - 'scale': [10], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 99: { - 'num': 99, # Min percentage of hemoglobin saturated with oxygen - 'name': "min_saturated_hemoglobin_percent", - 'type': "uint16", - 'array': "true", - 'scale': [10], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 100: { - 'num': 100, # Max percentage of hemoglobin saturated with oxygen - 'name': "max_saturated_hemoglobin_percent", - 'type': "uint16", - 'array': "true", - 'scale': [10], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 101: { - 'num': 101, - 'name': "avg_left_torque_effectiveness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 102: { - 'num': 102, - 'name': "avg_right_torque_effectiveness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 103: { - 'num': 103, - 'name': "avg_left_pedal_smoothness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 104: { - 'num': 104, - 'name': "avg_right_pedal_smoothness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 105: { - 'num': 105, - 'name': "avg_combined_pedal_smoothness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 110: { - 'num': 110, # Sport name from associated sport mesg - 'name': "sport_profile_name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 111: { - 'num': 111, - 'name': "sport_index", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 112: { - 'num': 112, # Total time spend in the standing position - 'name': "time_standing", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 113: { - 'num': 113, # Number of transitions to the standing state - 'name': "stand_count", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 114: { - 'num': 114, # Average platform center offset Left - 'name': "avg_left_pco", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 115: { - 'num': 115, # Average platform center offset Right - 'name': "avg_right_pco", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 116: { - 'num': 116, # Average left power phase angles. Indexes defined by power_phase_type. - 'name': "avg_left_power_phase", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 117: { - 'num': 117, # Average left power phase peak angles. Data value indexes defined by power_phase_type. - 'name': "avg_left_power_phase_peak", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 118: { - 'num': 118, # Average right power phase angles. Data value indexes defined by power_phase_type. - 'name': "avg_right_power_phase", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 119: { - 'num': 119, # Average right power phase peak angles data value indexes defined by power_phase_type. - 'name': "avg_right_power_phase_peak", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 120: { - 'num': 120, # Average power by position. Data value indexes defined by rider_position_type. - 'name': "avg_power_position", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 121: { - 'num': 121, # Maximum power by position. Data value indexes defined by rider_position_type. - 'name': "max_power_position", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 122: { - 'num': 122, # Average cadence by position. Data value indexes defined by rider_position_type. - 'name': "avg_cadence_position", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 123: { - 'num': 123, # Maximum cadence by position. Data value indexes defined by rider_position_type. - 'name': "max_cadence_position", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 124: { - 'num': 124, # total_distance / total_timer_time - 'name': "enhanced_avg_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 125: { - 'num': 125, - 'name': "enhanced_max_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 126: { - 'num': 126, - 'name': "enhanced_avg_altitude", - 'type': "uint32", - 'array': "false", - 'scale': [5], - 'offset': [500], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 127: { - 'num': 127, - 'name': "enhanced_min_altitude", - 'type': "uint32", - 'array': "false", - 'scale': [5], - 'offset': [500], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 128: { - 'num': 128, - 'name': "enhanced_max_altitude", - 'type': "uint32", - 'array': "false", - 'scale': [5], - 'offset': [500], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 129: { - 'num': 129, # lev average motor power during session - 'name': "avg_lev_motor_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 130: { - 'num': 130, # lev maximum motor power during session - 'name': "max_lev_motor_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 131: { - 'num': 131, # lev battery consumption during session - 'name': "lev_battery_consumption", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 132: { - 'num': 132, - 'name': "avg_vertical_ratio", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 133: { - 'num': 133, - 'name': "avg_stance_time_balance", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 134: { - 'num': 134, - 'name': "avg_step_length", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 137: { - 'num': 137, - 'name': "total_anaerobic_training_effect", - 'type': "uint8", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 139: { - 'num': 139, - 'name': "avg_vam", - 'type': "uint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 140: { - 'num': 140, # 0 if above water - 'name': "avg_depth", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 141: { - 'num': 141, # 0 if above water - 'name': "max_depth", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 142: { - 'num': 142, # Time since end of last dive - 'name': "surface_interval", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 143: { - 'num': 143, - 'name': "start_cns", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 144: { - 'num': 144, - 'name': "end_cns", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 145: { - 'num': 145, - 'name': "start_n2", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 146: { - 'num': 146, - 'name': "end_n2", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 147: { - 'num': 147, - 'name': "avg_respiration_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1, ], - 'offset': [0, ], - 'units': ["", ], - 'bits': [8,], - 'components': [169, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 148: { - 'num': 148, - 'name': "max_respiration_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1, ], - 'offset': [0, ], - 'units': ["", ], - 'bits': [8,], - 'components': [170, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 149: { - 'num': 149, - 'name': "min_respiration_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1, ], - 'offset': [0, ], - 'units': ["", ], - 'bits': [8,], - 'components': [180, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 150: { - 'num': 150, - 'name': "min_temperature", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 155: { - 'num': 155, - 'name': "o2_toxicity", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "OTUs", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 156: { - 'num': 156, - 'name': "dive_number", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 168: { - 'num': 168, - 'name': "training_load_peak", - 'type': "sint32", - 'array': "false", - 'scale': [65536], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 169: { - 'num': 169, - 'name': "enhanced_avg_respiration_rate", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "Breaths/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 170: { - 'num': 170, - 'name': "enhanced_max_respiration_rate", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "Breaths/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 180: { - 'num': 180, - 'name': "enhanced_min_respiration_rate", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 181: { - 'num': 181, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. - 'name': "total_grit", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kGrit", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 182: { - 'num': 182, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. - 'name': "total_flow", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "Flow", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 183: { - 'num': 183, - 'name': "jump_count", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 186: { - 'num': 186, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. - 'name': "avg_grit", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kGrit", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 187: { - 'num': 187, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. - 'name': "avg_flow", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "Flow", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 192: { - 'num': 192, # A 0-100 scale representing how a user felt while performing a workout. Low values are considered feeling bad, while high values are good. - 'name': "workout_feel", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 193: { - 'num': 193, # Common Borg CR10 / 0-10 RPE scale, multiplied 10x.. Aggregate score for all workouts in a single session. - 'name': "workout_rpe", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 194: { - 'num': 194, # Average SPO2 for the monitoring session - 'name': "avg_spo2", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 195: { - 'num': 195, # Average stress for the monitoring session - 'name': "avg_stress", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 197: { - 'num': 197, # Standard deviation of R-R interval (SDRR) - Heart rate variability measure most useful for wellness users. - 'name': "sdrr_hrv", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mS", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 198: { - 'num': 198, # Root mean square successive difference (RMSSD) - Heart rate variability measure most useful for athletes - 'name': "rmssd_hrv", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mS", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 199: { - 'num': 199, # fractional part of total_ascent - 'name': "total_fractional_ascent", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 200: { - 'num': 200, # fractional part of total_descent - 'name': "total_fractional_descent", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 208: { - 'num': 208, - 'name': "avg_core_temperature", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 209: { - 'num': 209, - 'name': "min_core_temperature", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 210: { - 'num': 210, - 'name': "max_core_temperature", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 19: { - 'num': "19", - 'name': "lap", - 'messages_key': "lap_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "event", - 'type': "event", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "event_type", - 'type': "event_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "start_time", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "start_position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "start_position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "end_position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "end_position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Time (includes pauses) - 'name': "total_elapsed_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # Timer Time (excludes pauses) - 'name': "total_timer_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "total_distance", - 'type': "uint32", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "total_cycles", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "cycles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "total_strides", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["strides"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 25, 'name': "sport", 'raw_value': 1, 'value_name': "running" }, - { 'num': 25, 'name': "sport", 'raw_value': 11, 'value_name': "walking" }, - ], - }, - { - 'name': "total_strokes", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["strokes"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 25, 'name': "sport", 'raw_value': 2, 'value_name': "cycling" }, - { 'num': 25, 'name': "sport", 'raw_value': 5, 'value_name': "swimming" }, - { 'num': 25, 'name': "sport", 'raw_value': 15, 'value_name': "rowing" }, - { 'num': 25, 'name': "sport", 'raw_value': 37, 'value_name': "stand_up_paddleboarding" }, - ], - }, - ] - }, - 11: { - 'num': 11, - 'name': "total_calories", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, # If New Leaf - 'name': "total_fat_calories", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "avg_speed", - 'type': "uint16", - 'array': "false", - 'scale': [1000, ], - 'offset': [0, ], - 'units': ["m/s", ], - 'bits': [16,], - 'components': [110, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 14: { - 'num': 14, - 'name': "max_speed", - 'type': "uint16", - 'array': "false", - 'scale': [1000, ], - 'offset': [0, ], - 'units': ["m/s", ], - 'bits': [16,], - 'components': [111, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 15: { - 'num': 15, - 'name': "avg_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 16: { - 'num': 16, - 'name': "max_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 17: { - 'num': 17, # total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time - 'name': "avg_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "avg_running_cadence", - 'type': "uint8", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["strides/min"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 25, 'name': "sport", 'raw_value': 1, 'value_name': "running" }, - ], - }, - ] - }, - 18: { - 'num': 18, - 'name': "max_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "max_running_cadence", - 'type': "uint8", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["strides/min"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 25, 'name': "sport", 'raw_value': 1, 'value_name': "running" }, - ], - }, - ] - }, - 19: { - 'num': 19, # total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time - 'name': "avg_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 20: { - 'num': 20, - 'name': "max_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 21: { - 'num': 21, - 'name': "total_ascent", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 22: { - 'num': 22, - 'name': "total_descent", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 23: { - 'num': 23, - 'name': "intensity", - 'type': "intensity", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 24: { - 'num': 24, - 'name': "lap_trigger", - 'type': "lap_trigger", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 25: { - 'num': 25, - 'name': "sport", - 'type': "sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 26: { - 'num': 26, - 'name': "event_group", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 32: { - 'num': 32, # # of lengths of swim pool - 'name': "num_lengths", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "lengths", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 33: { - 'num': 33, - 'name': "normalized_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 34: { - 'num': 34, - 'name': "left_right_balance", - 'type': "left_right_balance_100", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 35: { - 'num': 35, - 'name': "first_length_index", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 37: { - 'num': 37, - 'name': "avg_stroke_distance", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 38: { - 'num': 38, - 'name': "swim_stroke", - 'type': "swim_stroke", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 39: { - 'num': 39, - 'name': "sub_sport", - 'type': "sub_sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 40: { - 'num': 40, # # of active lengths of swim pool - 'name': "num_active_lengths", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "lengths", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 41: { - 'num': 41, - 'name': "total_work", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "J", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 42: { - 'num': 42, - 'name': "avg_altitude", - 'type': "uint16", - 'array': "false", - 'scale': [5, ], - 'offset': [500, ], - 'units': ["m", ], - 'bits': [16,], - 'components': [112, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 43: { - 'num': 43, - 'name': "max_altitude", - 'type': "uint16", - 'array': "false", - 'scale': [5, ], - 'offset': [500, ], - 'units': ["m", ], - 'bits': [16,], - 'components': [114, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 44: { - 'num': 44, - 'name': "gps_accuracy", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 45: { - 'num': 45, - 'name': "avg_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 46: { - 'num': 46, - 'name': "avg_pos_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 47: { - 'num': 47, - 'name': "avg_neg_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 48: { - 'num': 48, - 'name': "max_pos_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 49: { - 'num': 49, - 'name': "max_neg_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 50: { - 'num': 50, - 'name': "avg_temperature", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 51: { - 'num': 51, - 'name': "max_temperature", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 52: { - 'num': 52, - 'name': "total_moving_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 53: { - 'num': 53, - 'name': "avg_pos_vertical_speed", - 'type': "sint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 54: { - 'num': 54, - 'name': "avg_neg_vertical_speed", - 'type': "sint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 55: { - 'num': 55, - 'name': "max_pos_vertical_speed", - 'type': "sint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 56: { - 'num': 56, - 'name': "max_neg_vertical_speed", - 'type': "sint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 57: { - 'num': 57, - 'name': "time_in_hr_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 58: { - 'num': 58, - 'name': "time_in_speed_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 59: { - 'num': 59, - 'name': "time_in_cadence_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 60: { - 'num': 60, - 'name': "time_in_power_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 61: { - 'num': 61, - 'name': "repetition_num", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 62: { - 'num': 62, - 'name': "min_altitude", - 'type': "uint16", - 'array': "false", - 'scale': [5, ], - 'offset': [500, ], - 'units': ["m", ], - 'bits': [16,], - 'components': [113, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 63: { - 'num': 63, - 'name': "min_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 71: { - 'num': 71, - 'name': "wkt_step_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 74: { - 'num': 74, - 'name': "opponent_score", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 75: { - 'num': 75, # stroke_type enum used as the index - 'name': "stroke_count", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 76: { - 'num': 76, # zone number used as the index - 'name': "zone_count", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 77: { - 'num': 77, - 'name': "avg_vertical_oscillation", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 78: { - 'num': 78, - 'name': "avg_stance_time_percent", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 79: { - 'num': 79, - 'name': "avg_stance_time", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 80: { - 'num': 80, # fractional part of the avg_cadence - 'name': "avg_fractional_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 81: { - 'num': 81, # fractional part of the max_cadence - 'name': "max_fractional_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 82: { - 'num': 82, # fractional part of the total_cycles - 'name': "total_fractional_cycles", - 'type': "uint8", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "cycles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 83: { - 'num': 83, - 'name': "player_score", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 84: { - 'num': 84, # Avg saturated and unsaturated hemoglobin - 'name': "avg_total_hemoglobin_conc", - 'type': "uint16", - 'array': "true", - 'scale': [100], - 'offset': [0], - 'units': "g/dL", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 85: { - 'num': 85, # Min saturated and unsaturated hemoglobin - 'name': "min_total_hemoglobin_conc", - 'type': "uint16", - 'array': "true", - 'scale': [100], - 'offset': [0], - 'units': "g/dL", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 86: { - 'num': 86, # Max saturated and unsaturated hemoglobin - 'name': "max_total_hemoglobin_conc", - 'type': "uint16", - 'array': "true", - 'scale': [100], - 'offset': [0], - 'units': "g/dL", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 87: { - 'num': 87, # Avg percentage of hemoglobin saturated with oxygen - 'name': "avg_saturated_hemoglobin_percent", - 'type': "uint16", - 'array': "true", - 'scale': [10], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 88: { - 'num': 88, # Min percentage of hemoglobin saturated with oxygen - 'name': "min_saturated_hemoglobin_percent", - 'type': "uint16", - 'array': "true", - 'scale': [10], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 89: { - 'num': 89, # Max percentage of hemoglobin saturated with oxygen - 'name': "max_saturated_hemoglobin_percent", - 'type': "uint16", - 'array': "true", - 'scale': [10], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 91: { - 'num': 91, - 'name': "avg_left_torque_effectiveness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 92: { - 'num': 92, - 'name': "avg_right_torque_effectiveness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 93: { - 'num': 93, - 'name': "avg_left_pedal_smoothness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 94: { - 'num': 94, - 'name': "avg_right_pedal_smoothness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 95: { - 'num': 95, - 'name': "avg_combined_pedal_smoothness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 98: { - 'num': 98, # Total time spent in the standing position - 'name': "time_standing", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 99: { - 'num': 99, # Number of transitions to the standing state - 'name': "stand_count", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 100: { - 'num': 100, # Average left platform center offset - 'name': "avg_left_pco", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 101: { - 'num': 101, # Average right platform center offset - 'name': "avg_right_pco", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 102: { - 'num': 102, # Average left power phase angles. Data value indexes defined by power_phase_type. - 'name': "avg_left_power_phase", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 103: { - 'num': 103, # Average left power phase peak angles. Data value indexes defined by power_phase_type. - 'name': "avg_left_power_phase_peak", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 104: { - 'num': 104, # Average right power phase angles. Data value indexes defined by power_phase_type. - 'name': "avg_right_power_phase", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 105: { - 'num': 105, # Average right power phase peak angles. Data value indexes defined by power_phase_type. - 'name': "avg_right_power_phase_peak", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 106: { - 'num': 106, # Average power by position. Data value indexes defined by rider_position_type. - 'name': "avg_power_position", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 107: { - 'num': 107, # Maximum power by position. Data value indexes defined by rider_position_type. - 'name': "max_power_position", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 108: { - 'num': 108, # Average cadence by position. Data value indexes defined by rider_position_type. - 'name': "avg_cadence_position", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 109: { - 'num': 109, # Maximum cadence by position. Data value indexes defined by rider_position_type. - 'name': "max_cadence_position", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 110: { - 'num': 110, - 'name': "enhanced_avg_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 111: { - 'num': 111, - 'name': "enhanced_max_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 112: { - 'num': 112, - 'name': "enhanced_avg_altitude", - 'type': "uint32", - 'array': "false", - 'scale': [5], - 'offset': [500], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 113: { - 'num': 113, - 'name': "enhanced_min_altitude", - 'type': "uint32", - 'array': "false", - 'scale': [5], - 'offset': [500], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 114: { - 'num': 114, - 'name': "enhanced_max_altitude", - 'type': "uint32", - 'array': "false", - 'scale': [5], - 'offset': [500], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 115: { - 'num': 115, # lev average motor power during lap - 'name': "avg_lev_motor_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 116: { - 'num': 116, # lev maximum motor power during lap - 'name': "max_lev_motor_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 117: { - 'num': 117, # lev battery consumption during lap - 'name': "lev_battery_consumption", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 118: { - 'num': 118, - 'name': "avg_vertical_ratio", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 119: { - 'num': 119, - 'name': "avg_stance_time_balance", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 120: { - 'num': 120, - 'name': "avg_step_length", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 121: { - 'num': 121, - 'name': "avg_vam", - 'type': "uint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 122: { - 'num': 122, # 0 if above water - 'name': "avg_depth", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 123: { - 'num': 123, # 0 if above water - 'name': "max_depth", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 124: { - 'num': 124, - 'name': "min_temperature", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 136: { - 'num': 136, - 'name': "enhanced_avg_respiration_rate", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "Breaths/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 137: { - 'num': 137, - 'name': "enhanced_max_respiration_rate", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "Breaths/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 147: { - 'num': 147, - 'name': "avg_respiration_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1, ], - 'offset': [0, ], - 'units': ["", ], - 'bits': [8,], - 'components': [136, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 148: { - 'num': 148, - 'name': "max_respiration_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1, ], - 'offset': [0, ], - 'units': ["", ], - 'bits': [8,], - 'components': [137, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 149: { - 'num': 149, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. - 'name': "total_grit", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kGrit", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 150: { - 'num': 150, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. - 'name': "total_flow", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "Flow", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 151: { - 'num': 151, - 'name': "jump_count", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 153: { - 'num': 153, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. - 'name': "avg_grit", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kGrit", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 154: { - 'num': 154, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. - 'name': "avg_flow", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "Flow", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 156: { - 'num': 156, # fractional part of total_ascent - 'name': "total_fractional_ascent", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 157: { - 'num': 157, # fractional part of total_descent - 'name': "total_fractional_descent", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 158: { - 'num': 158, - 'name': "avg_core_temperature", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 159: { - 'num': 159, - 'name': "min_core_temperature", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 160: { - 'num': 160, - 'name': "max_core_temperature", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 101: { - 'num': "101", - 'name': "length", - 'messages_key': "length_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "event", - 'type': "event", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "event_type", - 'type': "event_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "start_time", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "total_elapsed_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "total_timer_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "total_strokes", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "strokes", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "avg_speed", - 'type': "uint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "swim_stroke", - 'type': "swim_stroke", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "swim_stroke", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "avg_swimming_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "strokes/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "event_group", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "total_calories", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, - 'name': "length_type", - 'type': "length_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 18: { - 'num': 18, - 'name': "player_score", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 19: { - 'num': 19, - 'name': "opponent_score", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 20: { - 'num': 20, # stroke_type enum used as the index - 'name': "stroke_count", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 21: { - 'num': 21, # zone number used as the index - 'name': "zone_count", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 22: { - 'num': 22, - 'name': "enhanced_avg_respiration_rate", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "Breaths/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 23: { - 'num': 23, - 'name': "enhanced_max_respiration_rate", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "Breaths/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 24: { - 'num': 24, - 'name': "avg_respiration_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1, ], - 'offset': [0, ], - 'units': ["", ], - 'bits': [8,], - 'components': [22, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 25: { - 'num': 25, - 'name': "max_respiration_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1, ], - 'offset': [0, ], - 'units': ["", ], - 'bits': [8,], - 'components': [23, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - }, -}, - 20: { - 'num': "20", - 'name': "record", - 'messages_key': "record_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "altitude", - 'type': "uint16", - 'array': "false", - 'scale': [5, ], - 'offset': [500, ], - 'units': ["m", ], - 'bits': [16,], - 'components': [78, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "cadence", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "distance", - 'type': "uint32", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': True, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "speed", - 'type': "uint16", - 'array': "false", - 'scale': [1000, ], - 'offset': [0, ], - 'units': ["m/s", ], - 'bits': [16,], - 'components': [73, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "compressed_speed_distance", - 'type': "byte", - 'array': "true", - 'scale': [100, 16, ], - 'offset': [0, 0, ], - 'units': ["m/s", "m", ], - 'bits': [12,12,], - 'components': [6, 5, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, # Relative. 0 is none 254 is Max. - 'name': "resistance", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "time_from_course", - 'type': "sint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, - 'name': "cycle_length", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "temperature", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 17: { - 'num': 17, # Speed at 1s intervals. Timestamp field indicates time of last array element. - 'name': "speed_1s", - 'type': "uint8", - 'array': "true", - 'scale': [16], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 18: { - 'num': 18, - 'name': "cycles", - 'type': "uint8", - 'array': "false", - 'scale': [1, ], - 'offset': [0, ], - 'units': ["cycles", ], - 'bits': [8,], - 'components': [19, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 19: { - 'num': 19, - 'name': "total_cycles", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "cycles", - 'bits': [], - 'components': [], - 'is_accumulated': True, - 'has_components': False, - 'sub_fields': [] - }, - 28: { - 'num': 28, - 'name': "compressed_accumulated_power", - 'type': "uint16", - 'array': "false", - 'scale': [1, ], - 'offset': [0, ], - 'units': ["watts", ], - 'bits': [16,], - 'components': [29, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 29: { - 'num': 29, - 'name': "accumulated_power", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': True, - 'has_components': False, - 'sub_fields': [] - }, - 30: { - 'num': 30, - 'name': "left_right_balance", - 'type': "left_right_balance", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 31: { - 'num': 31, - 'name': "gps_accuracy", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 32: { - 'num': 32, - 'name': "vertical_speed", - 'type': "sint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 33: { - 'num': 33, - 'name': "calories", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 39: { - 'num': 39, - 'name': "vertical_oscillation", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 40: { - 'num': 40, - 'name': "stance_time_percent", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 41: { - 'num': 41, - 'name': "stance_time", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 42: { - 'num': 42, - 'name': "activity_type", - 'type': "activity_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 43: { - 'num': 43, - 'name': "left_torque_effectiveness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 44: { - 'num': 44, - 'name': "right_torque_effectiveness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 45: { - 'num': 45, - 'name': "left_pedal_smoothness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 46: { - 'num': 46, - 'name': "right_pedal_smoothness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 47: { - 'num': 47, - 'name': "combined_pedal_smoothness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 48: { - 'num': 48, - 'name': "time128", - 'type': "uint8", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 49: { - 'num': 49, - 'name': "stroke_type", - 'type': "stroke_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 50: { - 'num': 50, - 'name': "zone", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 51: { - 'num': 51, - 'name': "ball_speed", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 52: { - 'num': 52, # Log cadence and fractional cadence for backwards compatability - 'name': "cadence256", - 'type': "uint16", - 'array': "false", - 'scale': [256], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 53: { - 'num': 53, - 'name': "fractional_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 54: { - 'num': 54, # Total saturated and unsaturated hemoglobin - 'name': "total_hemoglobin_conc", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "g/dL", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 55: { - 'num': 55, # Min saturated and unsaturated hemoglobin - 'name': "total_hemoglobin_conc_min", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "g/dL", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 56: { - 'num': 56, # Max saturated and unsaturated hemoglobin - 'name': "total_hemoglobin_conc_max", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "g/dL", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 57: { - 'num': 57, # Percentage of hemoglobin saturated with oxygen - 'name': "saturated_hemoglobin_percent", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 58: { - 'num': 58, # Min percentage of hemoglobin saturated with oxygen - 'name': "saturated_hemoglobin_percent_min", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 59: { - 'num': 59, # Max percentage of hemoglobin saturated with oxygen - 'name': "saturated_hemoglobin_percent_max", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 62: { - 'num': 62, - 'name': "device_index", - 'type': "device_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 67: { - 'num': 67, # Left platform center offset - 'name': "left_pco", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 68: { - 'num': 68, # Right platform center offset - 'name': "right_pco", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 69: { - 'num': 69, # Left power phase angles. Data value indexes defined by power_phase_type. - 'name': "left_power_phase", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 70: { - 'num': 70, # Left power phase peak angles. Data value indexes defined by power_phase_type. - 'name': "left_power_phase_peak", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 71: { - 'num': 71, # Right power phase angles. Data value indexes defined by power_phase_type. - 'name': "right_power_phase", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 72: { - 'num': 72, # Right power phase peak angles. Data value indexes defined by power_phase_type. - 'name': "right_power_phase_peak", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 73: { - 'num': 73, - 'name': "enhanced_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 78: { - 'num': 78, - 'name': "enhanced_altitude", - 'type': "uint32", - 'array': "false", - 'scale': [5], - 'offset': [500], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 81: { - 'num': 81, # lev battery state of charge - 'name': "battery_soc", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 82: { - 'num': 82, # lev motor power - 'name': "motor_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 83: { - 'num': 83, - 'name': "vertical_ratio", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 84: { - 'num': 84, - 'name': "stance_time_balance", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 85: { - 'num': 85, - 'name': "step_length", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 87: { - 'num': 87, # Supports larger cycle sizes needed for paddlesports. Max cycle size: 655.35 - 'name': "cycle_length16", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 91: { - 'num': 91, # Includes atmospheric pressure - 'name': "absolute_pressure", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "Pa", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 92: { - 'num': 92, # 0 if above water - 'name': "depth", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 93: { - 'num': 93, # 0 if above water - 'name': "next_stop_depth", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 94: { - 'num': 94, - 'name': "next_stop_time", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 95: { - 'num': 95, - 'name': "time_to_surface", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 96: { - 'num': 96, - 'name': "ndl_time", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 97: { - 'num': 97, - 'name': "cns_load", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 98: { - 'num': 98, - 'name': "n2_load", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 99: { - 'num': 99, - 'name': "respiration_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1, ], - 'offset': [0, ], - 'units': ["s", ], - 'bits': [8,], - 'components': [108, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 108: { - 'num': 108, - 'name': "enhanced_respiration_rate", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "Breaths/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 114: { - 'num': 114, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. - 'name': "grit", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 115: { - 'num': 115, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. - 'name': "flow", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 116: { - 'num': 116, # Current Stress value - 'name': "current_stress", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 117: { - 'num': 117, - 'name': "ebike_travel_range", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "km", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 118: { - 'num': 118, - 'name': "ebike_battery_level", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 119: { - 'num': 119, - 'name': "ebike_assist_mode", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "depends on sensor", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 120: { - 'num': 120, - 'name': "ebike_assist_level_percent", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 123: { - 'num': 123, - 'name': "air_time_remaining", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 124: { - 'num': 124, # Pressure-based surface air consumption - 'name': "pressure_sac", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "bar/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 125: { - 'num': 125, # Volumetric surface air consumption - 'name': "volume_sac", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "L/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 126: { - 'num': 126, # Respiratory minute volume - 'name': "rmv", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "L/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 127: { - 'num': 127, - 'name': "ascent_rate", - 'type': "sint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 129: { - 'num': 129, # Current partial pressure of oxygen - 'name': "po2", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 139: { - 'num': 139, - 'name': "core_temperature", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 21: { - 'num': "21", - 'name': "event", - 'messages_key': "event_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "event", - 'type': "event", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "event_type", - 'type': "event_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "data16", - 'type': "uint16", - 'array': "false", - 'scale': [1, ], - 'offset': [0, ], - 'units': ["", ], - 'bits': [16,], - 'components': [3, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "data", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "timer_trigger", - 'type': "timer_trigger", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 0, 'value_name': "timer" }, - ], - }, - { - 'name': "course_point_index", - 'type': "message_index", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 10, 'value_name': "course_point" }, - ], - }, - { - 'name': "battery_level", - 'type': "uint16", - 'array': "", - 'scale': [1000], - 'offset': [0], - 'units': ["V"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 11, 'value_name': "battery" }, - ], - }, - { - 'name': "virtual_partner_speed", - 'type': "uint16", - 'array': "", - 'scale': [1000], - 'offset': [0], - 'units': ["m/s"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 12, 'value_name': "virtual_partner_pace" }, - ], - }, - { - 'name': "hr_high_alert", - 'type': "uint8", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["bpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 13, 'value_name': "hr_high_alert" }, - ], - }, - { - 'name': "hr_low_alert", - 'type': "uint8", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["bpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 14, 'value_name': "hr_low_alert" }, - ], - }, - { - 'name': "speed_high_alert", - 'type': "uint32", - 'array': "", - 'scale': [1000], - 'offset': [0], - 'units': ["m/s"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 15, 'value_name': "speed_high_alert" }, - ], - }, - { - 'name': "speed_low_alert", - 'type': "uint32", - 'array': "", - 'scale': [1000], - 'offset': [0], - 'units': ["m/s"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 16, 'value_name': "speed_low_alert" }, - ], - }, - { - 'name': "cad_high_alert", - 'type': "uint16", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["rpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 17, 'value_name': "cad_high_alert" }, - ], - }, - { - 'name': "cad_low_alert", - 'type': "uint16", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["rpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 18, 'value_name': "cad_low_alert" }, - ], - }, - { - 'name': "power_high_alert", - 'type': "uint16", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["watts"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 19, 'value_name': "power_high_alert" }, - ], - }, - { - 'name': "power_low_alert", - 'type': "uint16", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["watts"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 20, 'value_name': "power_low_alert" }, - ], - }, - { - 'name': "time_duration_alert", - 'type': "uint32", - 'array': "", - 'scale': [1000], - 'offset': [0], - 'units': ["s"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 23, 'value_name': "time_duration_alert" }, - ], - }, - { - 'name': "distance_duration_alert", - 'type': "uint32", - 'array': "", - 'scale': [100], - 'offset': [0], - 'units': ["m"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 24, 'value_name': "distance_duration_alert" }, - ], - }, - { - 'name': "calorie_duration_alert", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["calories"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 25, 'value_name': "calorie_duration_alert" }, - ], - }, - { - 'name': "fitness_equipment_state", - 'type': "fitness_equipment_state", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 27, 'value_name': "fitness_equipment" }, - ], - }, - { - 'name': "sport_point", - 'type': "uint32", - 'array': "", - 'scale': [1, 1, ], - 'offset': [0, 0, ], - 'units': ["", "", ], - 'bits': [16,16,], - 'components': [7, 8, ], - 'has_components': True, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 33, 'value_name': "sport_point" }, - ], - }, - { - 'name': "gear_change_data", - 'type': "uint32", - 'array': "", - 'scale': [1, 1, 1, 1, ], - 'offset': [0, 0, 0, 0, ], - 'units': ["", "", "", "", ], - 'bits': [8,8,8,8,], - 'components': [11, 12, 9, 10, ], - 'has_components': True, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 42, 'value_name': "front_gear_change" }, - { 'num': 0, 'name': "event", 'raw_value': 43, 'value_name': "rear_gear_change" }, - ], - }, - { - 'name': "rider_position", # Indicates the rider position value. - 'type': "rider_position_type", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 44, 'value_name': "rider_position_change" }, - ], - }, - { - 'name': "comm_timeout", - 'type': "comm_timeout_type", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 47, 'value_name': "comm_timeout" }, - ], - }, - { - 'name': "dive_alert", - 'type': "dive_alert", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 56, 'value_name': "dive_alert" }, - ], - }, - { - 'name': "auto_activity_detect_duration", - 'type': "uint16", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["min"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 54, 'value_name': "auto_activity_detect" }, - ], - }, - { - 'name': "radar_threat_alert", # The first byte is the radar_threat_level_max, the second byte is the radar_threat_count, third bytes is the average approach speed, and the 4th byte is the max approach speed - 'type': "uint32", - 'array': "", - 'scale': [1, 1, 10, 10, ], - 'offset': [0, 0, 0, 0, ], - 'units': ["", "", "", "", ], - 'bits': [8,8,8,8,], - 'components': [21, 22, 23, 24, ], - 'has_components': True, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 75, 'value_name': "radar_threat_alert" }, - ], - }, - ] - }, - 4: { - 'num': 4, - 'name': "event_group", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Do not populate directly. Autogenerated by decoder for sport_point subfield components - 'name': "score", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # Do not populate directly. Autogenerated by decoder for sport_point subfield components - 'name': "opponent_score", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Front gear number. 1 is innermost. - 'name': "front_gear_num", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Number of front teeth. - 'name': "front_gear", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Rear gear number. 1 is innermost. - 'name': "rear_gear_num", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Number of rear teeth. - 'name': "rear_gear", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "device_index", - 'type': "device_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, # Activity Type associated with an auto_activity_detect event - 'name': "activity_type", - 'type': "activity_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 15: { - 'num': 15, # Timestamp of when the event started - 'name': "start_timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "auto_activity_detect_start_timestamp", # Auto Activity Detect Start Timestamp. - 'type': "date_time", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["s"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "event", 'raw_value': 54, 'value_name': "auto_activity_detect" }, - ], - }, - ] - }, - 21: { - 'num': 21, # Do not populate directly. Autogenerated by decoder for threat_alert subfield components. - 'name': "radar_threat_level_max", - 'type': "radar_threat_level_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 22: { - 'num': 22, # Do not populate directly. Autogenerated by decoder for threat_alert subfield components. - 'name': "radar_threat_count", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 23: { - 'num': 23, # Do not populate directly. Autogenerated by decoder for radar_threat_alert subfield components - 'name': "radar_threat_avg_approach_speed", - 'type': "uint8", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 24: { - 'num': 24, # Do not populate directly. Autogenerated by decoder for radar_threat_alert subfield components - 'name': "radar_threat_max_approach_speed", - 'type': "uint8", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 23: { - 'num': "23", - 'name': "device_info", - 'messages_key': "device_info_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "device_index", - 'type': "device_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "device_type", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "ble_device_type", - 'type': "ble_device_type", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 25, 'name': "source_type", 'raw_value': 3, 'value_name': "bluetooth_low_energy" }, - ], - }, - { - 'name': "antplus_device_type", - 'type': "antplus_device_type", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 25, 'name': "source_type", 'raw_value': 1, 'value_name': "antplus" }, - ], - }, - { - 'name': "ant_device_type", - 'type': "uint8", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 25, 'name': "source_type", 'raw_value': 0, 'value_name': "ant" }, - ], - }, - { - 'name': "local_device_type", - 'type': "local_device_type", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 25, 'name': "source_type", 'raw_value': 5, 'value_name': "local" }, - ], - }, - ] - }, - 2: { - 'num': 2, - 'name': "manufacturer", - 'type': "manufacturer", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "serial_number", - 'type': "uint32z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "product", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "favero_product", - 'type': "favero_product", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 2, 'name': "manufacturer", 'raw_value': 263, 'value_name': "favero_electronics" }, - ], - }, - { - 'name': "garmin_product", - 'type': "garmin_product", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 2, 'name': "manufacturer", 'raw_value': 1, 'value_name': "garmin" }, - { 'num': 2, 'name': "manufacturer", 'raw_value': 15, 'value_name': "dynastream" }, - { 'num': 2, 'name': "manufacturer", 'raw_value': 13, 'value_name': "dynastream_oem" }, - { 'num': 2, 'name': "manufacturer", 'raw_value': 89, 'value_name': "tacx" }, - ], - }, - ] - }, - 5: { - 'num': 5, - 'name': "software_version", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "hardware_version", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Reset by new battery or charge. - 'name': "cum_operating_time", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "battery_voltage", - 'type': "uint16", - 'array': "false", - 'scale': [256], - 'offset': [0], - 'units': "V", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "battery_status", - 'type': "battery_status", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 18: { - 'num': 18, # Indicates the location of the sensor - 'name': "sensor_position", - 'type': "body_location", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 19: { - 'num': 19, # Used to describe the sensor or location - 'name': "descriptor", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 20: { - 'num': 20, - 'name': "ant_transmission_type", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 21: { - 'num': 21, - 'name': "ant_device_number", - 'type': "uint16z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 22: { - 'num': 22, - 'name': "ant_network", - 'type': "ant_network", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 25: { - 'num': 25, - 'name': "source_type", - 'type': "source_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 27: { - 'num': 27, # Optional free form string to indicate the devices name or model - 'name': "product_name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 32: { - 'num': 32, - 'name': "battery_level", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 375: { - 'num': "375", - 'name': "device_aux_battery_info", - 'messages_key': "device_aux_battery_info_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "device_index", - 'type': "device_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "battery_voltage", - 'type': "uint16", - 'array': "false", - 'scale': [256], - 'offset': [0], - 'units': "V", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "battery_status", - 'type': "battery_status", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "battery_identifier", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 72: { - 'num': "72", # Corresponds to file_id of workout or course. - 'name': "training_file", - 'messages_key': "training_file_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "type", - 'type': "file", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "manufacturer", - 'type': "manufacturer", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "product", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "favero_product", - 'type': "favero_product", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "manufacturer", 'raw_value': 263, 'value_name': "favero_electronics" }, - ], - }, - { - 'name': "garmin_product", - 'type': "garmin_product", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "manufacturer", 'raw_value': 1, 'value_name': "garmin" }, - { 'num': 1, 'name': "manufacturer", 'raw_value': 15, 'value_name': "dynastream" }, - { 'num': 1, 'name': "manufacturer", 'raw_value': 13, 'value_name': "dynastream_oem" }, - { 'num': 1, 'name': "manufacturer", 'raw_value': 89, 'value_name': "tacx" }, - ], - }, - ] - }, - 3: { - 'num': 3, - 'name': "serial_number", - 'type': "uint32z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "time_created", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 128: { - 'num': "128", - 'name': "weather_conditions", - 'messages_key': "weather_conditions_mesgs", - 'fields': { - 253: { - 'num': 253, # time of update for current conditions, else forecast time - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Current or forecast - 'name': "weather_report", - 'type': "weather_report", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "temperature", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Corresponds to GSC Response weatherIcon field - 'name': "condition", - 'type': "weather_status", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "wind_direction", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "wind_speed", - 'type': "uint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # range 0-100 - 'name': "precipitation_probability", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Heat Index if GCS heatIdx above or equal to 90F or wind chill if GCS windChill below or equal to 32F - 'name': "temperature_feels_like", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "relative_humidity", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # string corresponding to GCS response location string - 'name': "location", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "observed_at_time", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "observed_location_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "observed_location_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, - 'name': "day_of_week", - 'type': "day_of_week", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "high_temperature", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, - 'name': "low_temperature", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 129: { - 'num': "129", - 'name': "weather_alert", - 'messages_key': "weather_alert_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Unique identifier from GCS report ID string, length is 12 - 'name': "report_id", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Time alert was issued - 'name': "issue_time", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Time alert expires - 'name': "expire_time", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Warning, Watch, Advisory, Statement - 'name': "severity", - 'type': "weather_severity", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Tornado, Severe Thunderstorm, etc. - 'name': "type", - 'type': "weather_severe_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 160: { - 'num': "160", - 'name': "gps_metadata", - 'messages_key': "gps_metadata_mesgs", - 'fields': { - 253: { - 'num': 253, # Whole second part of the timestamp. - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Millisecond part of the timestamp. - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "enhanced_altitude", - 'type': "uint32", - 'array': "false", - 'scale': [5], - 'offset': [500], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "enhanced_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "heading", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Used to correlate UTC to system time if the timestamp of the message is in system time. This UTC time is derived from the GPS data. - 'name': "utc_timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # velocity[0] is lon velocity. Velocity[1] is lat velocity. Velocity[2] is altitude velocity. - 'name': "velocity", - 'type': "sint16", - 'array': "true", - 'scale': [100], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 161: { - 'num': "161", - 'name': "camera_event", - 'messages_key': "camera_event_mesgs", - 'fields': { - 253: { - 'num': 253, # Whole second part of the timestamp. - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Millisecond part of the timestamp. - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "camera_event_type", - 'type': "camera_event_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "camera_file_uuid", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "camera_orientation", - 'type': "camera_orientation_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 164: { - 'num': "164", - 'name': "gyroscope_data", - 'messages_key': "gyroscope_data_mesgs", - 'fields': { - 253: { - 'num': 253, # Whole second part of the timestamp - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Millisecond part of the timestamp. - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Each time in the array describes the time at which the gyro sample with the corrosponding index was taken. Limited to 30 samples in each message. The samples may span across seconds. Array size must match the number of samples in gyro_x and gyro_y and gyro_z - 'name': "sample_time_offset", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. - 'name': "gyro_x", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. - 'name': "gyro_y", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. - 'name': "gyro_z", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # Calibrated gyro reading - 'name': "calibrated_gyro_x", - 'type': "float32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "deg/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Calibrated gyro reading - 'name': "calibrated_gyro_y", - 'type': "float32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "deg/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Calibrated gyro reading - 'name': "calibrated_gyro_z", - 'type': "float32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "deg/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 165: { - 'num': "165", - 'name': "accelerometer_data", - 'messages_key': "accelerometer_data_mesgs", - 'fields': { - 253: { - 'num': 253, # Whole second part of the timestamp - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Millisecond part of the timestamp. - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Each time in the array describes the time at which the accelerometer sample with the corrosponding index was taken. Limited to 30 samples in each message. The samples may span across seconds. Array size must match the number of samples in accel_x and accel_y and accel_z - 'name': "sample_time_offset", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. - 'name': "accel_x", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. - 'name': "accel_y", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. - 'name': "accel_z", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # Calibrated accel reading - 'name': "calibrated_accel_x", - 'type': "float32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "g", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Calibrated accel reading - 'name': "calibrated_accel_y", - 'type': "float32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "g", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Calibrated accel reading - 'name': "calibrated_accel_z", - 'type': "float32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "g", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # Calibrated accel reading - 'name': "compressed_calibrated_accel_x", - 'type': "sint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "mG", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, # Calibrated accel reading - 'name': "compressed_calibrated_accel_y", - 'type': "sint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "mG", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, # Calibrated accel reading - 'name': "compressed_calibrated_accel_z", - 'type': "sint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "mG", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 208: { - 'num': "208", - 'name': "magnetometer_data", - 'messages_key': "magnetometer_data_mesgs", - 'fields': { - 253: { - 'num': 253, # Whole second part of the timestamp - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Millisecond part of the timestamp. - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Each time in the array describes the time at which the compass sample with the corrosponding index was taken. Limited to 30 samples in each message. The samples may span across seconds. Array size must match the number of samples in cmps_x and cmps_y and cmps_z - 'name': "sample_time_offset", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. - 'name': "mag_x", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. - 'name': "mag_y", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. - 'name': "mag_z", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # Calibrated Magnetometer reading - 'name': "calibrated_mag_x", - 'type': "float32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "G", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Calibrated Magnetometer reading - 'name': "calibrated_mag_y", - 'type': "float32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "G", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Calibrated Magnetometer reading - 'name': "calibrated_mag_z", - 'type': "float32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "G", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 209: { - 'num': "209", - 'name': "barometer_data", - 'messages_key': "barometer_data_mesgs", - 'fields': { - 253: { - 'num': 253, # Whole second part of the timestamp - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Millisecond part of the timestamp. - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Each time in the array describes the time at which the barometer sample with the corrosponding index was taken. The samples may span across seconds. Array size must match the number of samples in baro_cal - 'name': "sample_time_offset", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # These are the raw ADC reading. The samples may span across seconds. A conversion will need to be done on this data once read. - 'name': "baro_pres", - 'type': "uint32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "Pa", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 167: { - 'num': "167", - 'name': "three_d_sensor_calibration", - 'messages_key': "three_d_sensor_calibration_mesgs", - 'fields': { - 253: { - 'num': 253, # Whole second part of the timestamp - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Indicates which sensor the calibration is for - 'name': "sensor_type", - 'type': "sensor_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Calibration factor used to convert from raw ADC value to degrees, g, etc. - 'name': "calibration_factor", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "accel_cal_factor", # Accelerometer calibration factor - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["g"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "sensor_type", 'raw_value': 0, 'value_name': "accelerometer" }, - ], - }, - { - 'name': "gyro_cal_factor", # Gyro calibration factor - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["deg/s"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "sensor_type", 'raw_value': 1, 'value_name': "gyroscope" }, - ], - }, - ] - }, - 2: { - 'num': 2, # Calibration factor divisor - 'name': "calibration_divisor", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Level shift value used to shift the ADC value back into range - 'name': "level_shift", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Internal calibration factors, one for each: xy, yx, zx - 'name': "offset_cal", - 'type': "sint32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # 3 x 3 rotation matrix (row major) - 'name': "orientation_matrix", - 'type': "sint32", - 'array': "true", - 'scale': [65535], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 210: { - 'num': "210", - 'name': "one_d_sensor_calibration", - 'messages_key': "one_d_sensor_calibration_mesgs", - 'fields': { - 253: { - 'num': 253, # Whole second part of the timestamp - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Indicates which sensor the calibration is for - 'name': "sensor_type", - 'type': "sensor_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Calibration factor used to convert from raw ADC value to degrees, g, etc. - 'name': "calibration_factor", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "baro_cal_factor", # Barometer calibration factor - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["Pa"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "sensor_type", 'raw_value': 3, 'value_name': "barometer" }, - ], - }, - ] - }, - 2: { - 'num': 2, # Calibration factor divisor - 'name': "calibration_divisor", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "counts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Level shift value used to shift the ADC value back into range - 'name': "level_shift", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Internal Calibration factor - 'name': "offset_cal", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 169: { - 'num': "169", - 'name': "video_frame", - 'messages_key': "video_frame_mesgs", - 'fields': { - 253: { - 'num': 253, # Whole second part of the timestamp - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Millisecond part of the timestamp. - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Number of the frame that the timestamp and timestamp_ms correlate to - 'name': "frame_number", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 174: { - 'num': "174", - 'name': "obdii_data", - 'messages_key': "obdii_data_mesgs", - 'fields': { - 253: { - 'num': 253, # Timestamp message was output - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Fractional part of timestamp, added to timestamp - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Offset of PID reading [i] from start_timestamp+start_timestamp_ms. Readings may span accross seconds. - 'name': "time_offset", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Parameter ID - 'name': "pid", - 'type': "byte", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Raw parameter data - 'name': "raw_data", - 'type': "byte", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Optional, data size of PID[i]. If not specified refer to SAE J1979. - 'name': "pid_data_size", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # System time associated with sample expressed in ms, can be used instead of time_offset. There will be a system_time value for each raw_data element. For multibyte pids the system_time is repeated. - 'name': "system_time", - 'type': "uint32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Timestamp of first sample recorded in the message. Used with time_offset to generate time of each sample - 'name': "start_timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Fractional part of start_timestamp - 'name': "start_timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 177: { - 'num': "177", - 'name': "nmea_sentence", - 'messages_key': "nmea_sentence_mesgs", - 'fields': { - 253: { - 'num': 253, # Timestamp message was output - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Fractional part of timestamp, added to timestamp - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # NMEA sentence - 'name': "sentence", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 178: { - 'num': "178", - 'name': "aviation_attitude", - 'messages_key': "aviation_attitude_mesgs", - 'fields': { - 253: { - 'num': 253, # Timestamp message was output - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Fractional part of timestamp, added to timestamp - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # System time associated with sample expressed in ms. - 'name': "system_time", - 'type': "uint32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Range -PI/2 to +PI/2 - 'name': "pitch", - 'type': "sint16", - 'array': "true", - 'scale': [10430.38], - 'offset': [0], - 'units': "radians", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Range -PI to +PI - 'name': "roll", - 'type': "sint16", - 'array': "true", - 'scale': [10430.38], - 'offset': [0], - 'units': "radians", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Range -78.4 to +78.4 (-8 Gs to 8 Gs) - 'name': "accel_lateral", - 'type': "sint16", - 'array': "true", - 'scale': [100], - 'offset': [0], - 'units': "m/s^2", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # Range -78.4 to +78.4 (-8 Gs to 8 Gs) - 'name': "accel_normal", - 'type': "sint16", - 'array': "true", - 'scale': [100], - 'offset': [0], - 'units': "m/s^2", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Range -8.727 to +8.727 (-500 degs/sec to +500 degs/sec) - 'name': "turn_rate", - 'type': "sint16", - 'array': "true", - 'scale': [1024], - 'offset': [0], - 'units': "radians/second", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "stage", - 'type': "attitude_stage", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # The percent complete of the current attitude stage. Set to 0 for attitude stages 0, 1 and 2 and to 100 for attitude stage 3 by AHRS modules that do not support it. Range - 100 - 'name': "attitude_stage_complete", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, # Track Angle/Heading Range 0 - 2pi - 'name': "track", - 'type': "uint16", - 'array': "true", - 'scale': [10430.38], - 'offset': [0], - 'units': "radians", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "validity", - 'type': "attitude_validity", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 184: { - 'num': "184", - 'name': "video", - 'messages_key': "video_mesgs", - 'fields': { - 0: { - 'num': 0, - 'name': "url", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "hosting_provider", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Playback time of video - 'name': "duration", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 185: { - 'num': "185", - 'name': "video_title", - 'messages_key': "video_title_mesgs", - 'fields': { - 254: { - 'num': 254, # Long titles will be split into multiple parts - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Total number of title parts - 'name': "message_count", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "text", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 186: { - 'num': "186", - 'name': "video_description", - 'messages_key': "video_description_mesgs", - 'fields': { - 254: { - 'num': 254, # Long descriptions will be split into multiple parts - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Total number of description parts - 'name': "message_count", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "text", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 187: { - 'num': "187", - 'name': "video_clip", - 'messages_key': "video_clip_mesgs", - 'fields': { - 0: { - 'num': 0, - 'name': "clip_number", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "start_timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "start_timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "end_timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "end_timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Start of clip in video time - 'name': "clip_start", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # End of clip in video time - 'name': "clip_end", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 225: { - 'num': "225", - 'name': "set", - 'messages_key': "set_mesgs", - 'fields': { - 254: { - 'num': 254, # Timestamp of the set - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "duration", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # # of repitions of the movement - 'name': "repetitions", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Amount of weight applied for the set - 'name': "weight", - 'type': "uint16", - 'array': "false", - 'scale': [16], - 'offset': [0], - 'units': "kg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "set_type", - 'type': "set_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Start time of the set - 'name': "start_time", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "category", - 'type': "exercise_category", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # Based on the associated category, see [category]_exercise_names - 'name': "category_subtype", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "weight_display_unit", - 'type': "fit_base_unit", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "wkt_step_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 285: { - 'num': "285", - 'name': "jump", - 'messages_key': "jump_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "distance", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "height", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "rotations", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "hang_time", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # A score for a jump calculated based on hang time, rotations, and distance. - 'name': "score", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "speed", - 'type': "uint16", - 'array': "false", - 'scale': [1000, ], - 'offset': [0, ], - 'units': ["m/s", ], - 'bits': [16,], - 'components': [8, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "enhanced_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 312: { - 'num': "312", - 'name': "split", - 'messages_key': "split_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "split_type", - 'type': "split_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "total_elapsed_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "total_timer_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "total_distance", - 'type': "uint32", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "avg_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "start_time", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "total_ascent", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, - 'name': "total_descent", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 21: { - 'num': 21, - 'name': "start_position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 22: { - 'num': 22, - 'name': "start_position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 23: { - 'num': 23, - 'name': "end_position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 24: { - 'num': 24, - 'name': "end_position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 25: { - 'num': 25, - 'name': "max_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 26: { - 'num': 26, - 'name': "avg_vert_speed", - 'type': "sint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 27: { - 'num': 27, - 'name': "end_time", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 28: { - 'num': 28, - 'name': "total_calories", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 74: { - 'num': 74, - 'name': "start_elevation", - 'type': "uint32", - 'array': "false", - 'scale': [5], - 'offset': [500], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 110: { - 'num': 110, - 'name': "total_moving_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 313: { - 'num': "313", - 'name': "split_summary", - 'messages_key': "split_summary_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "split_type", - 'type': "split_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "num_splits", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "total_timer_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "total_distance", - 'type': "uint32", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "avg_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "max_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "total_ascent", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "total_descent", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "avg_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "max_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, - 'name': "avg_vert_speed", - 'type': "sint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "total_calories", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 77: { - 'num': 77, - 'name': "total_moving_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 317: { - 'num': "317", - 'name': "climb_pro", - 'messages_key': "climb_pro_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "climb_pro_event", - 'type': "climb_pro_event", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "climb_number", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "climb_category", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "current_dist", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 206: { - 'num': "206", # Must be logged before developer field is used - 'name': "field_description", - 'messages_key': "field_description_mesgs", - 'fields': { - 0: { - 'num': 0, - 'name': "developer_data_index", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "field_definition_number", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "fit_base_type_id", - 'type': "fit_base_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "field_name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "array", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "components", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "scale", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "offset", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "units", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "bits", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "accumulate", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "fit_base_unit_id", - 'type': "fit_base_unit", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, - 'name': "native_mesg_num", - 'type': "mesg_num", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 15: { - 'num': 15, - 'name': "native_field_num", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 207: { - 'num': "207", # Must be logged before field description - 'name': "developer_data_id", - 'messages_key': "developer_data_id_mesgs", - 'fields': { - 0: { - 'num': 0, - 'name': "developer_id", - 'type': "byte", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "application_id", - 'type': "byte", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "manufacturer_id", - 'type': "manufacturer", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "developer_data_index", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "application_version", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 31: { - 'num': "31", - 'name': "course", - 'messages_key': "course_mesgs", - 'fields': { - 4: { - 'num': 4, - 'name': "sport", - 'type': "sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "capabilities", - 'type': "course_capabilities", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "sub_sport", - 'type': "sub_sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 32: { - 'num': "32", - 'name': "course_point", - 'messages_key': "course_point_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "distance", - 'type': "uint32", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "type", - 'type': "course_point", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "favorite", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 148: { - 'num': "148", # Unique Identification data for a segment file - 'name': "segment_id", - 'messages_key': "segment_id_mesgs", - 'fields': { - 0: { - 'num': 0, # Friendly name assigned to segment - 'name': "name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # UUID of the segment - 'name': "uuid", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Sport associated with the segment - 'name': "sport", - 'type': "sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Segment enabled for evaluation - 'name': "enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Primary key of the user that created the segment - 'name': "user_profile_primary_key", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # ID of the device that created the segment - 'name': "device_id", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Index for the Leader Board entry selected as the default race participant - 'name': "default_race_leader", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Indicates if any segments should be deleted - 'name': "delete_status", - 'type': "segment_delete_status", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # Indicates how the segment was selected to be sent to the device - 'name': "selection_type", - 'type': "segment_selection_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 149: { - 'num': "149", # Unique Identification data for an individual segment leader within a segment file - 'name': "segment_leaderboard_entry", - 'messages_key': "segment_leaderboard_entry_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Friendly name assigned to leader - 'name': "name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Leader classification - 'name': "type", - 'type': "segment_leaderboard_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Primary user ID of this leader - 'name': "group_primary_key", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # ID of the activity associated with this leader time - 'name': "activity_id", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Segment Time (includes pauses) - 'name': "segment_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # String version of the activity_id. 21 characters long, express in decimal - 'name': "activity_id_string", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 150: { - 'num': "150", # Navigation and race evaluation point for a segment decribing a point along the segment path and time it took each segment leader to reach that point - 'name': "segment_point", - 'messages_key': "segment_point_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Accumulated distance along the segment at the described point - 'name': "distance", - 'type': "uint32", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Accumulated altitude along the segment at the described point - 'name': "altitude", - 'type': "uint16", - 'array': "false", - 'scale': [5, ], - 'offset': [500, ], - 'units': ["m", ], - 'bits': [16,], - 'components': [6, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 5: { - 'num': 5, # Accumualted time each leader board member required to reach the described point. This value is zero for all leader board members at the starting point of the segment. - 'name': "leader_time", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Accumulated altitude along the segment at the described point - 'name': "enhanced_altitude", - 'type': "uint32", - 'array': "false", - 'scale': [5], - 'offset': [500], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 142: { - 'num': "142", - 'name': "segment_lap", - 'messages_key': "segment_lap_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "event", - 'type': "event", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "event_type", - 'type': "event_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "start_time", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "start_position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "start_position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "end_position_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "end_position_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Time (includes pauses) - 'name': "total_elapsed_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # Timer Time (excludes pauses) - 'name': "total_timer_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "total_distance", - 'type': "uint32", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "total_cycles", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "cycles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "total_strokes", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["strokes"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 23, 'name': "sport", 'raw_value': 2, 'value_name': "cycling" }, - ], - }, - ] - }, - 11: { - 'num': 11, - 'name': "total_calories", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, # If New Leaf - 'name': "total_fat_calories", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "avg_speed", - 'type': "uint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, - 'name': "max_speed", - 'type': "uint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 15: { - 'num': 15, - 'name': "avg_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 16: { - 'num': 16, - 'name': "max_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 17: { - 'num': 17, # total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time - 'name': "avg_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 18: { - 'num': 18, - 'name': "max_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 19: { - 'num': 19, # total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time - 'name': "avg_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 20: { - 'num': 20, - 'name': "max_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 21: { - 'num': 21, - 'name': "total_ascent", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 22: { - 'num': 22, - 'name': "total_descent", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 23: { - 'num': 23, - 'name': "sport", - 'type': "sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 24: { - 'num': 24, - 'name': "event_group", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 25: { - 'num': 25, # North east corner latitude. - 'name': "nec_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 26: { - 'num': 26, # North east corner longitude. - 'name': "nec_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 27: { - 'num': 27, # South west corner latitude. - 'name': "swc_lat", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 28: { - 'num': 28, # South west corner latitude. - 'name': "swc_long", - 'type': "sint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "semicircles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 29: { - 'num': 29, - 'name': "name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 30: { - 'num': 30, - 'name': "normalized_power", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 31: { - 'num': 31, - 'name': "left_right_balance", - 'type': "left_right_balance_100", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 32: { - 'num': 32, - 'name': "sub_sport", - 'type': "sub_sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 33: { - 'num': 33, - 'name': "total_work", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "J", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 34: { - 'num': 34, - 'name': "avg_altitude", - 'type': "uint16", - 'array': "false", - 'scale': [5, ], - 'offset': [500, ], - 'units': ["m", ], - 'bits': [16,], - 'components': [91, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 35: { - 'num': 35, - 'name': "max_altitude", - 'type': "uint16", - 'array': "false", - 'scale': [5, ], - 'offset': [500, ], - 'units': ["m", ], - 'bits': [16,], - 'components': [92, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 36: { - 'num': 36, - 'name': "gps_accuracy", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 37: { - 'num': 37, - 'name': "avg_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 38: { - 'num': 38, - 'name': "avg_pos_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 39: { - 'num': 39, - 'name': "avg_neg_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 40: { - 'num': 40, - 'name': "max_pos_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 41: { - 'num': 41, - 'name': "max_neg_grade", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 42: { - 'num': 42, - 'name': "avg_temperature", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 43: { - 'num': 43, - 'name': "max_temperature", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 44: { - 'num': 44, - 'name': "total_moving_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 45: { - 'num': 45, - 'name': "avg_pos_vertical_speed", - 'type': "sint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 46: { - 'num': 46, - 'name': "avg_neg_vertical_speed", - 'type': "sint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 47: { - 'num': 47, - 'name': "max_pos_vertical_speed", - 'type': "sint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 48: { - 'num': 48, - 'name': "max_neg_vertical_speed", - 'type': "sint16", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 49: { - 'num': 49, - 'name': "time_in_hr_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 50: { - 'num': 50, - 'name': "time_in_speed_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 51: { - 'num': 51, - 'name': "time_in_cadence_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 52: { - 'num': 52, - 'name': "time_in_power_zone", - 'type': "uint32", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 53: { - 'num': 53, - 'name': "repetition_num", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 54: { - 'num': 54, - 'name': "min_altitude", - 'type': "uint16", - 'array': "false", - 'scale': [5, ], - 'offset': [500, ], - 'units': ["m", ], - 'bits': [16,], - 'components': [93, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 55: { - 'num': 55, - 'name': "min_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 56: { - 'num': 56, - 'name': "active_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 57: { - 'num': 57, - 'name': "wkt_step_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 58: { - 'num': 58, - 'name': "sport_event", - 'type': "sport_event", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 59: { - 'num': 59, - 'name': "avg_left_torque_effectiveness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 60: { - 'num': 60, - 'name': "avg_right_torque_effectiveness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 61: { - 'num': 61, - 'name': "avg_left_pedal_smoothness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 62: { - 'num': 62, - 'name': "avg_right_pedal_smoothness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 63: { - 'num': 63, - 'name': "avg_combined_pedal_smoothness", - 'type': "uint8", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 64: { - 'num': 64, - 'name': "status", - 'type': "segment_lap_status", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 65: { - 'num': 65, - 'name': "uuid", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 66: { - 'num': 66, # fractional part of the avg_cadence - 'name': "avg_fractional_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 67: { - 'num': 67, # fractional part of the max_cadence - 'name': "max_fractional_cadence", - 'type': "uint8", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 68: { - 'num': 68, # fractional part of the total_cycles - 'name': "total_fractional_cycles", - 'type': "uint8", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "cycles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 69: { - 'num': 69, - 'name': "front_gear_shift_count", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 70: { - 'num': 70, - 'name': "rear_gear_shift_count", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 71: { - 'num': 71, # Total time spent in the standing position - 'name': "time_standing", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 72: { - 'num': 72, # Number of transitions to the standing state - 'name': "stand_count", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 73: { - 'num': 73, # Average left platform center offset - 'name': "avg_left_pco", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 74: { - 'num': 74, # Average right platform center offset - 'name': "avg_right_pco", - 'type': "sint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 75: { - 'num': 75, # Average left power phase angles. Data value indexes defined by power_phase_type. - 'name': "avg_left_power_phase", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 76: { - 'num': 76, # Average left power phase peak angles. Data value indexes defined by power_phase_type. - 'name': "avg_left_power_phase_peak", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 77: { - 'num': 77, # Average right power phase angles. Data value indexes defined by power_phase_type. - 'name': "avg_right_power_phase", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 78: { - 'num': 78, # Average right power phase peak angles. Data value indexes defined by power_phase_type. - 'name': "avg_right_power_phase_peak", - 'type': "uint8", - 'array': "true", - 'scale': [0.7111111], - 'offset': [0], - 'units': "degrees", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 79: { - 'num': 79, # Average power by position. Data value indexes defined by rider_position_type. - 'name': "avg_power_position", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 80: { - 'num': 80, # Maximum power by position. Data value indexes defined by rider_position_type. - 'name': "max_power_position", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "watts", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 81: { - 'num': 81, # Average cadence by position. Data value indexes defined by rider_position_type. - 'name': "avg_cadence_position", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 82: { - 'num': 82, # Maximum cadence by position. Data value indexes defined by rider_position_type. - 'name': "max_cadence_position", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "rpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 83: { - 'num': 83, # Manufacturer that produced the segment - 'name': "manufacturer", - 'type': "manufacturer", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 84: { - 'num': 84, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. - 'name': "total_grit", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kGrit", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 85: { - 'num': 85, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. - 'name': "total_flow", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "Flow", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 86: { - 'num': 86, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. - 'name': "avg_grit", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kGrit", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 87: { - 'num': 87, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. - 'name': "avg_flow", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "Flow", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 89: { - 'num': 89, # fractional part of total_ascent - 'name': "total_fractional_ascent", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 90: { - 'num': 90, # fractional part of total_descent - 'name': "total_fractional_descent", - 'type': "uint8", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 91: { - 'num': 91, - 'name': "enhanced_avg_altitude", - 'type': "uint32", - 'array': "false", - 'scale': [5], - 'offset': [500], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 92: { - 'num': 92, - 'name': "enhanced_max_altitude", - 'type': "uint32", - 'array': "false", - 'scale': [5], - 'offset': [500], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 93: { - 'num': 93, - 'name': "enhanced_min_altitude", - 'type': "uint32", - 'array': "false", - 'scale': [5], - 'offset': [500], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 151: { - 'num': "151", # Summary of the unique segment and leaderboard information associated with a segment file. This message is used to compile a segment list file describing all segment files on a device. The segment list file is used when refreshing the contents of a segment file with the latest available leaderboard information. - 'name': "segment_file", - 'messages_key': "segment_file_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # UUID of the segment file - 'name': "file_uuid", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Enabled state of the segment file - 'name': "enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Primary key of the user that created the segment file - 'name': "user_profile_primary_key", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Leader type of each leader in the segment file - 'name': "leader_type", - 'type': "segment_leaderboard_type", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # Group primary key of each leader in the segment file - 'name': "leader_group_primary_key", - 'type': "uint32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, # Activity ID of each leader in the segment file - 'name': "leader_activity_id", - 'type': "uint32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, # String version of the activity ID of each leader in the segment file. 21 characters long for each ID, express in decimal - 'name': "leader_activity_id_string", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, # Index for the Leader Board entry selected as the default race participant - 'name': "default_race_leader", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 26: { - 'num': "26", - 'name': "workout", - 'messages_key': "workout_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "sport", - 'type': "sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "capabilities", - 'type': "workout_capabilities", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # number of valid steps - 'name': "num_valid_steps", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "wkt_name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "sub_sport", - 'type': "sub_sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, - 'name': "pool_length", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 15: { - 'num': 15, - 'name': "pool_length_unit", - 'type': "display_measure", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 17: { - 'num': 17, # Description of the workout - 'name': "wkt_description", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 158: { - 'num': "158", - 'name': "workout_session", - 'messages_key': "workout_session_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "sport", - 'type': "sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "sub_sport", - 'type': "sub_sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "num_valid_steps", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "first_step_index", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "pool_length", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "pool_length_unit", - 'type': "display_measure", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 27: { - 'num': "27", - 'name': "workout_step", - 'messages_key': "workout_step_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "wkt_step_name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "duration_type", - 'type': "wkt_step_duration", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "duration_value", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "duration_time", - 'type': "uint32", - 'array': "", - 'scale': [1000], - 'offset': [0], - 'units': ["s"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "duration_type", 'raw_value': 0, 'value_name': "time" }, - { 'num': 1, 'name': "duration_type", 'raw_value': 28, 'value_name': "repetition_time" }, - ], - }, - { - 'name': "duration_distance", - 'type': "uint32", - 'array': "", - 'scale': [100], - 'offset': [0], - 'units': ["m"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "duration_type", 'raw_value': 1, 'value_name': "distance" }, - ], - }, - { - 'name': "duration_hr", - 'type': "workout_hr", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["% or bpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "duration_type", 'raw_value': 2, 'value_name': "hr_less_than" }, - { 'num': 1, 'name': "duration_type", 'raw_value': 3, 'value_name': "hr_greater_than" }, - ], - }, - { - 'name': "duration_calories", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["calories"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "duration_type", 'raw_value': 4, 'value_name': "calories" }, - ], - }, - { - 'name': "duration_step", # message_index of step to loop back to. Steps are assumed to be in the order by message_index. custom_name and intensity members are undefined for this duration type. - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "duration_type", 'raw_value': 6, 'value_name': "repeat_until_steps_cmplt" }, - { 'num': 1, 'name': "duration_type", 'raw_value': 7, 'value_name': "repeat_until_time" }, - { 'num': 1, 'name': "duration_type", 'raw_value': 8, 'value_name': "repeat_until_distance" }, - { 'num': 1, 'name': "duration_type", 'raw_value': 9, 'value_name': "repeat_until_calories" }, - { 'num': 1, 'name': "duration_type", 'raw_value': 10, 'value_name': "repeat_until_hr_less_than" }, - { 'num': 1, 'name': "duration_type", 'raw_value': 11, 'value_name': "repeat_until_hr_greater_than" }, - { 'num': 1, 'name': "duration_type", 'raw_value': 12, 'value_name': "repeat_until_power_less_than" }, - { 'num': 1, 'name': "duration_type", 'raw_value': 13, 'value_name': "repeat_until_power_greater_than" }, - ], - }, - { - 'name': "duration_power", - 'type': "workout_power", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["% or watts"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "duration_type", 'raw_value': 14, 'value_name': "power_less_than" }, - { 'num': 1, 'name': "duration_type", 'raw_value': 15, 'value_name': "power_greater_than" }, - ], - }, - { - 'name': "duration_reps", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "duration_type", 'raw_value': 29, 'value_name': "reps" }, - ], - }, - ] - }, - 3: { - 'num': 3, - 'name': "target_type", - 'type': "wkt_step_target", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "target_value", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "target_speed_zone", # speed zone (1-10);Custom =0; - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 3, 'name': "target_type", 'raw_value': 0, 'value_name': "speed" }, - ], - }, - { - 'name': "target_hr_zone", # hr zone (1-5);Custom =0; - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 3, 'name': "target_type", 'raw_value': 1, 'value_name': "heart_rate" }, - ], - }, - { - 'name': "target_cadence_zone", # Zone (1-?); Custom = 0; - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 3, 'name': "target_type", 'raw_value': 3, 'value_name': "cadence" }, - ], - }, - { - 'name': "target_power_zone", # Power Zone ( 1-7); Custom = 0; - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 3, 'name': "target_type", 'raw_value': 4, 'value_name': "power" }, - ], - }, - { - 'name': "repeat_steps", # # of repetitions - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "duration_type", 'raw_value': 6, 'value_name': "repeat_until_steps_cmplt" }, - ], - }, - { - 'name': "repeat_time", - 'type': "uint32", - 'array': "", - 'scale': [1000], - 'offset': [0], - 'units': ["s"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "duration_type", 'raw_value': 7, 'value_name': "repeat_until_time" }, - ], - }, - { - 'name': "repeat_distance", - 'type': "uint32", - 'array': "", - 'scale': [100], - 'offset': [0], - 'units': ["m"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "duration_type", 'raw_value': 8, 'value_name': "repeat_until_distance" }, - ], - }, - { - 'name': "repeat_calories", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["calories"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "duration_type", 'raw_value': 9, 'value_name': "repeat_until_calories" }, - ], - }, - { - 'name': "repeat_hr", - 'type': "workout_hr", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["% or bpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "duration_type", 'raw_value': 10, 'value_name': "repeat_until_hr_less_than" }, - { 'num': 1, 'name': "duration_type", 'raw_value': 11, 'value_name': "repeat_until_hr_greater_than" }, - ], - }, - { - 'name': "repeat_power", - 'type': "workout_power", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["% or watts"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 1, 'name': "duration_type", 'raw_value': 12, 'value_name': "repeat_until_power_less_than" }, - { 'num': 1, 'name': "duration_type", 'raw_value': 13, 'value_name': "repeat_until_power_greater_than" }, - ], - }, - { - 'name': "target_stroke_type", - 'type': "swim_stroke", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 3, 'name': "target_type", 'raw_value': 11, 'value_name': "swim_stroke" }, - ], - }, - ] - }, - 5: { - 'num': 5, - 'name': "custom_target_value_low", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "custom_target_speed_low", - 'type': "uint32", - 'array': "", - 'scale': [1000], - 'offset': [0], - 'units': ["m/s"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 3, 'name': "target_type", 'raw_value': 0, 'value_name': "speed" }, - ], - }, - { - 'name': "custom_target_heart_rate_low", - 'type': "workout_hr", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["% or bpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 3, 'name': "target_type", 'raw_value': 1, 'value_name': "heart_rate" }, - ], - }, - { - 'name': "custom_target_cadence_low", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["rpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 3, 'name': "target_type", 'raw_value': 3, 'value_name': "cadence" }, - ], - }, - { - 'name': "custom_target_power_low", - 'type': "workout_power", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["% or watts"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 3, 'name': "target_type", 'raw_value': 4, 'value_name': "power" }, - ], - }, - ] - }, - 6: { - 'num': 6, - 'name': "custom_target_value_high", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "custom_target_speed_high", - 'type': "uint32", - 'array': "", - 'scale': [1000], - 'offset': [0], - 'units': ["m/s"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 3, 'name': "target_type", 'raw_value': 0, 'value_name': "speed" }, - ], - }, - { - 'name': "custom_target_heart_rate_high", - 'type': "workout_hr", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["% or bpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 3, 'name': "target_type", 'raw_value': 1, 'value_name': "heart_rate" }, - ], - }, - { - 'name': "custom_target_cadence_high", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["rpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 3, 'name': "target_type", 'raw_value': 3, 'value_name': "cadence" }, - ], - }, - { - 'name': "custom_target_power_high", - 'type': "workout_power", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["% or watts"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 3, 'name': "target_type", 'raw_value': 4, 'value_name': "power" }, - ], - }, - ] - }, - 7: { - 'num': 7, - 'name': "intensity", - 'type': "intensity", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "notes", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "equipment", - 'type': "workout_equipment", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "exercise_category", - 'type': "exercise_category", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "exercise_name", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, - 'name': "exercise_weight", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "kg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "weight_display_unit", - 'type': "fit_base_unit", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 19: { - 'num': 19, - 'name': "secondary_target_type", - 'type': "wkt_step_target", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 20: { - 'num': 20, - 'name': "secondary_target_value", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "secondary_target_speed_zone", # speed zone (1-10);Custom =0; - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "secondary_target_type", 'raw_value': 0, 'value_name': "speed" }, - ], - }, - { - 'name': "secondary_target_hr_zone", # hr zone (1-5);Custom =0; - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "secondary_target_type", 'raw_value': 1, 'value_name': "heart_rate" }, - ], - }, - { - 'name': "secondary_target_cadence_zone", # Zone (1-?); Custom = 0; - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "secondary_target_type", 'raw_value': 3, 'value_name': "cadence" }, - ], - }, - { - 'name': "secondary_target_power_zone", # Power Zone ( 1-7); Custom = 0; - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "secondary_target_type", 'raw_value': 4, 'value_name': "power" }, - ], - }, - { - 'name': "secondary_target_stroke_type", - 'type': "swim_stroke", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "secondary_target_type", 'raw_value': 11, 'value_name': "swim_stroke" }, - ], - }, - ] - }, - 21: { - 'num': 21, - 'name': "secondary_custom_target_value_low", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "secondary_custom_target_speed_low", - 'type': "uint32", - 'array': "", - 'scale': [1000], - 'offset': [0], - 'units': ["m/s"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "secondary_target_type", 'raw_value': 0, 'value_name': "speed" }, - ], - }, - { - 'name': "secondary_custom_target_heart_rate_low", - 'type': "workout_hr", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["% or bpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "secondary_target_type", 'raw_value': 1, 'value_name': "heart_rate" }, - ], - }, - { - 'name': "secondary_custom_target_cadence_low", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["rpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "secondary_target_type", 'raw_value': 3, 'value_name': "cadence" }, - ], - }, - { - 'name': "secondary_custom_target_power_low", - 'type': "workout_power", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["% or watts"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "secondary_target_type", 'raw_value': 4, 'value_name': "power" }, - ], - }, - ] - }, - 22: { - 'num': 22, - 'name': "secondary_custom_target_value_high", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "secondary_custom_target_speed_high", - 'type': "uint32", - 'array': "", - 'scale': [1000], - 'offset': [0], - 'units': ["m/s"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "secondary_target_type", 'raw_value': 0, 'value_name': "speed" }, - ], - }, - { - 'name': "secondary_custom_target_heart_rate_high", - 'type': "workout_hr", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["% or bpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "secondary_target_type", 'raw_value': 1, 'value_name': "heart_rate" }, - ], - }, - { - 'name': "secondary_custom_target_cadence_high", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["rpm"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "secondary_target_type", 'raw_value': 3, 'value_name': "cadence" }, - ], - }, - { - 'name': "secondary_custom_target_power_high", - 'type': "workout_power", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["% or watts"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 19, 'name': "secondary_target_type", 'raw_value': 4, 'value_name': "power" }, - ], - }, - ] - }, - }, -}, - 264: { - 'num': "264", - 'name': "exercise_title", - 'messages_key': "exercise_title_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "exercise_category", - 'type': "exercise_category", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "exercise_name", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "wkt_step_name", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 28: { - 'num': "28", - 'name': "schedule", - 'messages_key': "schedule_mesgs", - 'fields': { - 0: { - 'num': 0, # Corresponds to file_id of scheduled workout / course. - 'name': "manufacturer", - 'type': "manufacturer", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Corresponds to file_id of scheduled workout / course. - 'name': "product", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "favero_product", - 'type': "favero_product", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "manufacturer", 'raw_value': 263, 'value_name': "favero_electronics" }, - ], - }, - { - 'name': "garmin_product", - 'type': "garmin_product", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': [""], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 0, 'name': "manufacturer", 'raw_value': 1, 'value_name': "garmin" }, - { 'num': 0, 'name': "manufacturer", 'raw_value': 15, 'value_name': "dynastream" }, - { 'num': 0, 'name': "manufacturer", 'raw_value': 13, 'value_name': "dynastream_oem" }, - { 'num': 0, 'name': "manufacturer", 'raw_value': 89, 'value_name': "tacx" }, - ], - }, - ] - }, - 2: { - 'num': 2, # Corresponds to file_id of scheduled workout / course. - 'name': "serial_number", - 'type': "uint32z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Corresponds to file_id of scheduled workout / course. - 'name': "time_created", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # TRUE if this activity has been started - 'name': "completed", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "type", - 'type': "schedule", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "scheduled_time", - 'type': "local_date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 33: { - 'num': "33", - 'name': "totals", - 'messages_key': "totals_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Excludes pauses - 'name': "timer_time", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "distance", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "calories", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "sport", - 'type': "sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Includes pauses - 'name': "elapsed_time", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "sessions", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "active_time", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "sport_index", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 30: { - 'num': "30", - 'name': "weight_scale", - 'messages_key': "weight_scale_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "weight", - 'type': "weight", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "kg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "percent_fat", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "percent_hydration", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "%", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "visceral_fat_mass", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "kg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "bone_mass", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "kg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "muscle_mass", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "kg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "basal_met", - 'type': "uint16", - 'array': "false", - 'scale': [4], - 'offset': [0], - 'units': "kcal/day", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "physique_rating", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, # ~4kJ per kcal, 0.25 allows max 16384 kcal - 'name': "active_met", - 'type': "uint16", - 'array': "false", - 'scale': [4], - 'offset': [0], - 'units': "kcal/day", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "metabolic_age", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "years", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "visceral_fat_rating", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, # Associates this weight scale message to a user. This corresponds to the index of the user profile message in the weight scale file. - 'name': "user_profile_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, - 'name': "bmi", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "kg/m^2", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 51: { - 'num': "51", - 'name': "blood_pressure", - 'messages_key': "blood_pressure_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "systolic_pressure", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mmHg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "diastolic_pressure", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mmHg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "mean_arterial_pressure", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mmHg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "map_3_sample_mean", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mmHg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "map_morning_values", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mmHg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "map_evening_values", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "mmHg", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "heart_rate_type", - 'type': "hr_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "status", - 'type': "bp_status", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, # Associates this blood pressure message to a user. This corresponds to the index of the user profile message in the blood pressure file. - 'name': "user_profile_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 103: { - 'num': "103", - 'name': "monitoring_info", - 'messages_key': "monitoring_info_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Use to convert activity timestamps to local time if device does not support time zone and daylight savings time correction. - 'name': "local_timestamp", - 'type': "local_date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "activity_type", - 'type': "activity_type", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Indexed by activity_type - 'name': "cycles_to_distance", - 'type': "uint16", - 'array': "true", - 'scale': [5000], - 'offset': [0], - 'units': "m/cycle", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Indexed by activity_type - 'name': "cycles_to_calories", - 'type': "uint16", - 'array': "true", - 'scale': [5000], - 'offset': [0], - 'units': "kcal/cycle", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "resting_metabolic_rate", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal / day", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 55: { - 'num': "55", - 'name': "monitoring", - 'messages_key': "monitoring_mesgs", - 'fields': { - 253: { - 'num': 253, # Must align to logging interval, for example, time must be 00:00:00 for daily log. - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Associates this data to device_info message. Not required for file with single device (sensor). - 'name': "device_index", - 'type': "device_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Accumulated total calories. Maintained by MonitoringReader for each activity_type. See SDK documentation - 'name': "calories", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Accumulated distance. Maintained by MonitoringReader for each activity_type. See SDK documentation. - 'name': "distance", - 'type': "uint32", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Accumulated cycles. Maintained by MonitoringReader for each activity_type. See SDK documentation. - 'name': "cycles", - 'type': "uint32", - 'array': "false", - 'scale': [2], - 'offset': [0], - 'units': "cycles", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [{ - 'name': "steps", - 'type': "uint32", - 'array': "", - 'scale': [1], - 'offset': [0], - 'units': ["steps"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 5, 'name': "activity_type", 'raw_value': 6, 'value_name': "walking" }, - { 'num': 5, 'name': "activity_type", 'raw_value': 1, 'value_name': "running" }, - ], - }, - { - 'name': "strokes", - 'type': "uint32", - 'array': "", - 'scale': [2], - 'offset': [0], - 'units': ["strokes"], - 'bits': [], - 'components': [], - 'has_components': False, - 'map':[ - { 'num': 5, 'name': "activity_type", 'raw_value': 2, 'value_name': "cycling" }, - { 'num': 5, 'name': "activity_type", 'raw_value': 5, 'value_name': "swimming" }, - ], - }, - ] - }, - 4: { - 'num': 4, - 'name': "active_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "activity_type", - 'type': "activity_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "activity_subtype", - 'type': "activity_subtype", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "activity_level", - 'type': "activity_level", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "distance_16", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "100 * m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "cycles_16", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "2 * cycles (steps)", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "active_time_16", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, # Must align to logging interval, for example, time must be 00:00:00 for daily log. - 'name': "local_timestamp", - 'type': "local_date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, # Avg temperature during the logging interval ended at timestamp - 'name': "temperature", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, # Min temperature during the logging interval ended at timestamp - 'name': "temperature_min", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 15: { - 'num': 15, # Max temperature during the logging interval ended at timestamp - 'name': "temperature_max", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "C", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 16: { - 'num': 16, # Indexed using minute_activity_level enum - 'name': "activity_time", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "minutes", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 19: { - 'num': 19, - 'name': "active_calories", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "kcal", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 24: { - 'num': 24, # Indicates single type / intensity for duration since last monitoring message. - 'name': "current_activity_type_intensity", - 'type': "byte", - 'array': "false", - 'scale': [1, 1, ], - 'offset': [0, 0, ], - 'units': ["", "", ], - 'bits': [5,3,], - 'components': [5, 28, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 25: { - 'num': 25, - 'name': "timestamp_min_8", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 26: { - 'num': 26, - 'name': "timestamp_16", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 27: { - 'num': 27, - 'name': "heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 28: { - 'num': 28, - 'name': "intensity", - 'type': "uint8", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 29: { - 'num': 29, - 'name': "duration_min", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 30: { - 'num': 30, - 'name': "duration", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 31: { - 'num': 31, - 'name': "ascent", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 32: { - 'num': 32, - 'name': "descent", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 33: { - 'num': 33, - 'name': "moderate_activity_minutes", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "minutes", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 34: { - 'num': 34, - 'name': "vigorous_activity_minutes", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "minutes", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 211: { - 'num': "211", - 'name': "monitoring_hr_data", - 'messages_key': "monitoring_hr_data_mesgs", - 'fields': { - 253: { - 'num': 253, # Must align to logging interval, for example, time must be 00:00:00 for daily log. - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # 7-day rolling average - 'name': "resting_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # RHR for today only. (Feeds into 7-day average) - 'name': "current_day_resting_heart_rate", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 269: { - 'num': "269", - 'name': "spo2_data", - 'messages_key': "spo2_data_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "reading_spo2", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "reading_confidence", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Mode when data was captured - 'name': "mode", - 'type': "spo2_measurement_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 132: { - 'num': "132", - 'name': "hr", - 'messages_key': "hr_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "fractional_timestamp", - 'type': "uint16", - 'array': "false", - 'scale': [32768], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "time256", - 'type': "uint8", - 'array': "false", - 'scale': [256, ], - 'offset': [0, ], - 'units': ["s", ], - 'bits': [8,], - 'components': [0, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "filtered_bpm", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "event_timestamp", - 'type': "uint32", - 'array': "true", - 'scale': [1024], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': True, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "event_timestamp_12", - 'type': "byte", - 'array': "true", - 'scale': [1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, ], - 'offset': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - 'units': ["s", "", "", "", "", "", "", "", "", "", ], - 'bits': [12,12,12,12,12,12,12,12,12,12,], - 'components': [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - }, -}, - 227: { - 'num': "227", # Value from 1 to 100 calculated by FirstBeat - 'name': "stress_level", - 'messages_key': "stress_level_mesgs", - 'fields': { - 0: { - 'num': 0, - 'name': "stress_level_value", - 'type': "sint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Time stress score was calculated - 'name': "stress_level_time", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 229: { - 'num': "229", - 'name': "max_met_data", - 'messages_key': "max_met_data_mesgs", - 'fields': { - 0: { - 'num': 0, # Time maxMET and vo2 were calculated - 'name': "update_time", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "vo2_max", - 'type': "uint16", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "mL/kg/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "sport", - 'type': "sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "sub_sport", - 'type': "sub_sport", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "max_met_category", - 'type': "max_met_category", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, # Indicates if calibrated data was used in the calculation - 'name': "calibrated_data", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, # Indicates if the estimate was obtained using a chest strap or wrist heart rate - 'name': "hr_source", - 'type': "max_met_heart_rate_source", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, # Indidcates if the estimate was obtained using onboard GPS or connected GPS - 'name': "speed_source", - 'type': "max_met_speed_source", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 314: { - 'num': "314", # Body battery data used for HSA custom data logging - 'name': "hsa_body_battery_data", - 'messages_key': "hsa_body_battery_data_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Processing interval length in seconds - 'name': "processing_interval", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Body battery level: [0,100] Blank: -16 - 'name': "level", - 'type': "sint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Body battery charged value - 'name': "charged", - 'type': "sint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Body battery uncharged value - 'name': "uncharged", - 'type': "sint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 315: { - 'num': "315", # HSA events - 'name': "hsa_event", - 'messages_key': "hsa_event_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Event ID. Health SDK use only - 'name': "event_id", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 302: { - 'num': "302", # Raw accelerometer data used for HSA custom data logging - 'name': "hsa_accelerometer_data", - 'messages_key': "hsa_accelerometer_data_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Millisecond resolution of the timestamp - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Sampling Interval in Milliseconds - 'name': "sampling_interval", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # X-Axis Measurement - 'name': "accel_x", - 'type': "sint16", - 'array': "true", - 'scale': [1.024], - 'offset': [0], - 'units': "mG", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Y-Axis Measurement - 'name': "accel_y", - 'type': "sint16", - 'array': "true", - 'scale': [1.024], - 'offset': [0], - 'units': "mG", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Z-Axis Measurement - 'name': "accel_z", - 'type': "sint16", - 'array': "true", - 'scale': [1.024], - 'offset': [0], - 'units': "mG", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # 32 kHz timestamp - 'name': "timestamp_32k", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 376: { - 'num': "376", - 'name': "hsa_gyroscope_data", - 'messages_key': "hsa_gyroscope_data_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Millisecond resolution of the timestamp - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Sampling Interval in 32 kHz timescale - 'name': "sampling_interval", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "1/32768 s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # X-Axis Measurement - 'name': "gyro_x", - 'type': "sint16", - 'array': "true", - 'scale': [28.57143], - 'offset': [0], - 'units': "deg/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Y-Axis Measurement - 'name': "gyro_y", - 'type': "sint16", - 'array': "true", - 'scale': [28.57143], - 'offset': [0], - 'units': "deg/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Z-Axis Measurement - 'name': "gyro_z", - 'type': "sint16", - 'array': "true", - 'scale': [28.57143], - 'offset': [0], - 'units': "deg/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # 32 kHz timestamp - 'name': "timestamp_32k", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "1/32768 s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 304: { - 'num': "304", # User's current daily step data used for HSA custom data logging - 'name': "hsa_step_data", - 'messages_key': "hsa_step_data_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Processing interval length in seconds. File start: 0xFFFFFFEF File stop: 0xFFFFFFEE - 'name': "processing_interval", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Total step sum - 'name': "steps", - 'type': "uint32", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "steps", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 305: { - 'num': "305", # User's current SpO2 data used for HSA custom data logging - 'name': "hsa_spo2_data", - 'messages_key': "hsa_spo2_data_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Processing interval length in seconds - 'name': "processing_interval", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # SpO2 Reading: [70,100] Blank: 240 - 'name': "reading_spo2", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # SpO2 Confidence: [0,254] - 'name': "confidence", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 306: { - 'num': "306", # User's current stress data used for HSA custom data logging - 'name': "hsa_stress_data", - 'messages_key': "hsa_stress_data_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Processing interval length in seconds - 'name': "processing_interval", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Stress Level: [0,100] Off wrist: -1 Excess motion: -2 Not enough data: -3 Recovering from exercise: -4 Unidentified: -5 Blank: -16 - 'name': "stress_level", - 'type': "sint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 307: { - 'num': "307", # User's current respiration data used for HSA custom data logging - 'name': "hsa_respiration_data", - 'messages_key': "hsa_respiration_data_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Processing interval length in seconds - 'name': "processing_interval", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Breaths / min: [1,100] Invalid: 255 Excess motion: 254 Off wrist: 253 Not available: 252 Blank: 2.4 - 'name': "respiration_rate", - 'type': "sint16", - 'array': "true", - 'scale': [100], - 'offset': [0], - 'units': "breaths/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 308: { - 'num': "308", # User's current heart rate data used for HSA custom data logging - 'name': "hsa_heart_rate_data", - 'messages_key': "hsa_heart_rate_data_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Processing interval length in seconds - 'name': "processing_interval", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Status of measurements in buffer - 0 indicates SEARCHING 1 indicates LOCKED - 'name': "status", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Beats / min. Blank: 0 - 'name': "heart_rate", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "bpm", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 389: { - 'num': "389", # Configuration data for HSA custom data logging - 'name': "hsa_configuration_data", - 'messages_key': "hsa_configuration_data_mesgs", - 'fields': { - 253: { - 'num': 253, # Encoded configuration data - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Encoded configuration data. Health SDK use only - 'name': "data", - 'type': "byte", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Size in bytes of data field - 'name': "data_size", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 409: { - 'num': "409", # Wrist temperature data used for HSA custom data logging - 'name': "hsa_wrist_temperature_data", - 'messages_key': "hsa_wrist_temperature_data_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Processing interval length in seconds - 'name': "processing_interval", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Wrist temperature reading - 'name': "value", - 'type': "uint16", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "degC", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 145: { - 'num': "145", - 'name': "memo_glob", - 'messages_key': "memo_glob_mesgs", - 'fields': { - 250: { - 'num': 250, # Sequence number of memo blocks - 'name': "part_index", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Deprecated. Use data field. - 'name': "memo", - 'type': "byte", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Message Number of the parent message - 'name': "mesg_num", - 'type': "mesg_num", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Index of mesg that this glob is associated with. - 'name': "parent_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Field within the parent that this glob is associated with - 'name': "field_num", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Block of utf8 bytes. Note, mutltibyte characters may be split across adjoining memo_glob messages. - 'name': "data", - 'type': "uint8z", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 275: { - 'num': "275", - 'name': "sleep_level", - 'messages_key': "sleep_level_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "sleep_level", - 'type': "sleep_level", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 82: { - 'num': "82", - 'name': "ant_channel_id", - 'messages_key': "ant_channel_id_mesgs", - 'fields': { - 0: { - 'num': 0, - 'name': "channel_number", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "device_type", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "device_number", - 'type': "uint16z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "transmission_type", - 'type': "uint8z", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "device_index", - 'type': "device_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 80: { - 'num': "80", - 'name': "ant_rx", - 'messages_key': "ant_rx_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "fractional_timestamp", - 'type': "uint16", - 'array': "false", - 'scale': [32768], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "mesg_id", - 'type': "byte", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "mesg_data", - 'type': "byte", - 'array': "true", - 'scale': [1, 1, 1, 1, 1, 1, 1, 1, 1, ], - 'offset': [0, 0, 0, 0, 0, 0, 0, 0, 0, ], - 'units': ["", "", "", "", "", "", "", "", "", ], - 'bits': [8,8,8,8,8,8,8,8,8,], - 'components': [3, 4, 4, 4, 4, 4, 4, 4, 4, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "channel_number", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "data", - 'type': "byte", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 81: { - 'num': "81", - 'name': "ant_tx", - 'messages_key': "ant_tx_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "fractional_timestamp", - 'type': "uint16", - 'array': "false", - 'scale': [32768], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "mesg_id", - 'type': "byte", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "mesg_data", - 'type': "byte", - 'array': "true", - 'scale': [1, 1, 1, 1, 1, 1, 1, 1, 1, ], - 'offset': [0, 0, 0, 0, 0, 0, 0, 0, 0, ], - 'units': ["", "", "", "", "", "", "", "", "", ], - 'bits': [8,8,8,8,8,8,8,8,8,], - 'components': [3, 4, 4, 4, 4, 4, 4, 4, 4, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "channel_number", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "data", - 'type': "byte", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 200: { - 'num': "200", - 'name': "exd_screen_configuration", - 'messages_key': "exd_screen_configuration_mesgs", - 'fields': { - 0: { - 'num': 0, - 'name': "screen_index", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # number of fields in screen - 'name': "field_count", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "layout", - 'type': "exd_layout", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "screen_enabled", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 201: { - 'num': "201", - 'name': "exd_data_field_configuration", - 'messages_key': "exd_data_field_configuration_mesgs", - 'fields': { - 0: { - 'num': 0, - 'name': "screen_index", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "concept_field", - 'type': "byte", - 'array': "false", - 'scale': [1, 1, ], - 'offset': [0, 0, ], - 'units': ["", "", ], - 'bits': [4,4,], - 'components': [2, 3, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "field_id", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "concept_count", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "display_type", - 'type': "exd_display_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "title", - 'type': "string", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 202: { - 'num': "202", - 'name': "exd_data_concept_configuration", - 'messages_key': "exd_data_concept_configuration_mesgs", - 'fields': { - 0: { - 'num': 0, - 'name': "screen_index", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "concept_field", - 'type': "byte", - 'array': "false", - 'scale': [1, 1, ], - 'offset': [0, 0, ], - 'units': ["", "", ], - 'bits': [4,4,], - 'components': [2, 3, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "field_id", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "concept_index", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "data_page", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "concept_key", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "scaling", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "data_units", - 'type': "exd_data_units", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "qualifier", - 'type': "exd_qualifiers", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "descriptor", - 'type': "exd_descriptors", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "is_signed", - 'type': "bool", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 268: { - 'num': "268", - 'name': "dive_summary", - 'messages_key': "dive_summary_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "reference_mesg", - 'type': "mesg_num", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "reference_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # 0 if above water - 'name': "avg_depth", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # 0 if above water - 'name': "max_depth", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Time since end of last dive - 'name': "surface_interval", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "start_cns", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "end_cns", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, - 'name': "start_n2", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, - 'name': "end_n2", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "percent", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, - 'name': "o2_toxicity", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "OTUs", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, - 'name': "dive_number", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, - 'name': "bottom_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 12: { - 'num': 12, # Average pressure-based surface air consumption - 'name': "avg_pressure_sac", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "bar/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 13: { - 'num': 13, # Average volumetric surface air consumption - 'name': "avg_volume_sac", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "L/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, # Average respiratory minute volume - 'name': "avg_rmv", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "L/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 15: { - 'num': 15, # Time to reach deepest level stop - 'name': "descent_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 16: { - 'num': 16, # Time after leaving bottom until reaching surface - 'name': "ascent_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 17: { - 'num': 17, # Average ascent rate, not including descents or stops - 'name': "avg_ascent_rate", - 'type': "sint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 22: { - 'num': 22, # Average descent rate, not including ascents or stops - 'name': "avg_descent_rate", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 23: { - 'num': 23, # Maximum ascent rate - 'name': "max_ascent_rate", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 24: { - 'num': 24, # Maximum descent rate - 'name': "max_descent_rate", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 25: { - 'num': 25, # Time spent neither ascending nor descending - 'name': "hang_time", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 289: { - 'num': "289", # Number of acclerometer zero crossings summed over the specified time interval - 'name': "aad_accel_features", - 'messages_key': "aad_accel_features_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Time interval length in seconds - 'name': "time", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Total accelerometer energy in the interval - 'name': "energy_total", - 'type': "uint32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Count of zero crossings - 'name': "zero_cross_cnt", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Instance ID of zero crossing algorithm - 'name': "instance", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Total accelerometer time above threshold in the interval - 'name': "time_above_threshold", - 'type': "uint16", - 'array': "false", - 'scale': [25], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 78: { - 'num': "78", # Heart rate variability - 'name': "hrv", - 'messages_key': "hrv_mesgs", - 'fields': { - 0: { - 'num': 0, # Time between beats - 'name': "time", - 'type': "uint16", - 'array': "true", - 'scale': [1000], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 290: { - 'num': "290", # Array of heart beat intervals - 'name': "beat_intervals", - 'messages_key': "beat_intervals_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Milliseconds past date_time - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Array of millisecond times between beats - 'name': "time", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 370: { - 'num': "370", - 'name': "hrv_status_summary", - 'messages_key': "hrv_status_summary_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # 7 day RMSSD average over sleep - 'name': "weekly_average", - 'type': "uint16", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Last night RMSSD average over sleep - 'name': "last_night_average", - 'type': "uint16", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # 5 minute high RMSSD value over sleep - 'name': "last_night_5_min_high", - 'type': "uint16", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # 3 week baseline, upper boundary of low HRV status - 'name': "baseline_low_upper", - 'type': "uint16", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # 3 week baseline, lower boundary of balanced HRV status - 'name': "baseline_balanced_lower", - 'type': "uint16", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # 3 week baseline, upper boundary of balanced HRV status - 'name': "baseline_balanced_upper", - 'type': "uint16", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "status", - 'type': "hrv_status", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 371: { - 'num': "371", - 'name': "hrv_value", - 'messages_key': "hrv_value_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # 5 minute RMSSD - 'name': "value", - 'type': "uint16", - 'array': "false", - 'scale': [128], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 372: { - 'num': "372", # Raw Beat-to-Beat Interval values - 'name': "raw_bbi", - 'messages_key': "raw_bbi_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Millisecond resolution of the timestamp - 'name': "timestamp_ms", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # 1 bit for gap indicator, 1 bit for quality indicator, and 14 bits for Beat-to-Beat interval values in whole-integer millisecond resolution - 'name': "data", - 'type': "uint16", - 'array': "true", - 'scale': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], - 'offset': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], - 'units': ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ], - 'bits': [14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,], - 'components': [2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, ], - 'is_accumulated': False, - 'has_components': True, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Array of millisecond times between beats - 'name': "time", - 'type': "uint16", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "ms", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # 1 = high confidence. 0 = low confidence. N/A when gap = 1 - 'name': "quality", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # 1 = gap (time represents ms gap length). 0 = BBI data - 'name': "gap", - 'type': "uint8", - 'array': "true", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 297: { - 'num': "297", - 'name': "respiration_rate", - 'messages_key': "respiration_rate_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, # Breaths * 100 /min, -300 indicates invalid, -200 indicates large motion, -100 indicates off wrist - 'name': "respiration_rate", - 'type': "sint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "breaths/min", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 387: { - 'num': "387", # Specifically used for XERO products. - 'name': "chrono_shot_session", - 'messages_key': "chrono_shot_session_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "min_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "max_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "avg_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "shot_count", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, - 'name': "projectile_type", - 'type': "projectile_type", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, - 'name': "grain_weight", - 'type': "uint32", - 'array': "false", - 'scale': [10], - 'offset': [0], - 'units': "gr", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, - 'name': "standard_deviation", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 388: { - 'num': "388", # Specifically used for XERO products. - 'name': "chrono_shot_data", - 'messages_key': "chrono_shot_data_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "shot_speed", - 'type': "uint32", - 'array': "false", - 'scale': [1000], - 'offset': [0], - 'units': "m/s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "shot_num", - 'type': "uint16", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 319: { - 'num': "319", - 'name': "tank_update", - 'messages_key': "tank_update_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "sensor", - 'type': "ant_channel_id", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "pressure", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "bar", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 323: { - 'num': "323", - 'name': "tank_summary", - 'messages_key': "tank_summary_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "s", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "sensor", - 'type': "ant_channel_id", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, - 'name': "start_pressure", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "bar", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, - 'name': "end_pressure", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "bar", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, - 'name': "volume_used", - 'type': "uint32", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "L", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 346: { - 'num': "346", - 'name': "sleep_assessment", - 'messages_key': "sleep_assessment_mesgs", - 'fields': { - 0: { - 'num': 0, # Average of awake_time_score and awakenings_count_score. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. - 'name': "combined_awake_score", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # Score that evaluates the total time spent awake between sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. - 'name': "awake_time_score", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # Score that evaluates the number of awakenings that interrupt sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. - 'name': "awakenings_count_score", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 3: { - 'num': 3, # Score that evaluates the amount of deep sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. - 'name': "deep_sleep_score", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Score that evaluates the quality of sleep based on sleep stages, heart-rate variability and possible awakenings during the night. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. - 'name': "sleep_duration_score", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 5: { - 'num': 5, # Score that evaluates the amount of light sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. - 'name': "light_sleep_score", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 6: { - 'num': 6, # Total score that summarizes the overall quality of sleep, combining sleep duration and quality. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. - 'name': "overall_sleep_score", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 7: { - 'num': 7, # Score that evaluates the quality of sleep based on sleep stages, heart-rate variability and possible awakenings during the night. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. - 'name': "sleep_quality_score", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 8: { - 'num': 8, # Score that evaluates stress and recovery during sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. - 'name': "sleep_recovery_score", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 9: { - 'num': 9, # Score that evaluates the amount of REM sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. - 'name': "rem_sleep_score", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 10: { - 'num': 10, # Score that evaluates the amount of restlessness during sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. - 'name': "sleep_restlessness_score", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 11: { - 'num': 11, # The number of awakenings during sleep. - 'name': "awakenings_count", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 14: { - 'num': 14, # Score that evaluates the sleep interruptions. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. - 'name': "interruptions_score", - 'type': "uint8", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 15: { - 'num': 15, # Excludes stress during awake periods in the sleep window - 'name': "average_stress_during_sleep", - 'type': "uint16", - 'array': "false", - 'scale': [100], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 470: { - 'num': "470", - 'name': "sleep_disruption_severity_period", - 'messages_key': "sleep_disruption_severity_period_mesgs", - 'fields': { - 254: { - 'num': 254, - 'name': "message_index", - 'type': "message_index", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "severity", - 'type': "sleep_disruption_severity", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 471: { - 'num': "471", - 'name': "sleep_disruption_overnight_severity", - 'messages_key': "sleep_disruption_overnight_severity_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "severity", - 'type': "sleep_disruption_severity", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 398: { - 'num': "398", - 'name': "skin_temp_overnight", - 'messages_key': "skin_temp_overnight_mesgs", - 'fields': { - 253: { - 'num': 253, - 'name': "timestamp", - 'type': "date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 0: { - 'num': 0, - 'name': "local_timestamp", - 'type': "local_date_time", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 1: { - 'num': 1, # The average overnight deviation from baseline temperature in degrees C - 'name': "average_deviation", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 2: { - 'num': 2, # The average 7 day overnight deviation from baseline temperature in degrees C - 'name': "average_7_day_deviation", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - 4: { - 'num': 4, # Final overnight temperature value - 'name': "nightly_value", - 'type': "float32", - 'array': "false", - 'scale': [1], - 'offset': [0], - 'units': "", - 'bits': [], - 'components': [], - 'is_accumulated': False, - 'has_components': False, - 'sub_fields': [] - }, - }, -}, - 105: { - 'num': "105", - 'name': "pad", - 'messages_key': "pad_mesgs", - 'fields': { - }, -}, -}, -'types': { - 'file': { - '1': 'device', # Read only, single file. Must be in root directory. - '2': 'settings', # Read/write, single file. Directory=Settings - '3': 'sport', # Read/write, multiple files, file number = sport type. Directory=Sports - '4': 'activity', # Read/erase, multiple files. Directory=Activities - '5': 'workout', # Read/write/erase, multiple files. Directory=Workouts - '6': 'course', # Read/write/erase, multiple files. Directory=Courses - '7': 'schedules', # Read/write, single file. Directory=Schedules - '9': 'weight', # Read only, single file. Circular buffer. All message definitions at start of file. Directory=Weight - '10': 'totals', # Read only, single file. Directory=Totals - '11': 'goals', # Read/write, single file. Directory=Goals - '14': 'blood_pressure', # Read only. Directory=Blood Pressure - '15': 'monitoring_a', # Read only. Directory=Monitoring. File number=sub type. - '20': 'activity_summary', # Read/erase, multiple files. Directory=Activities - '28': 'monitoring_daily', - '32': 'monitoring_b', # Read only. Directory=Monitoring. File number=identifier - '34': 'segment', # Read/write/erase. Multiple Files. Directory=Segments - '35': 'segment_list', # Read/write/erase. Single File. Directory=Segments - '40': 'exd_configuration', # Read/write/erase. Single File. Directory=Settings - '0xF7': 'mfg_range_min', # 0xF7 - 0xFE reserved for manufacturer specific file types - '0xFE': 'mfg_range_max', # 0xF7 - 0xFE reserved for manufacturer specific file types - }, - 'mesg_num': { - '0': 'file_id', - '1': 'capabilities', - '2': 'device_settings', - '3': 'user_profile', - '4': 'hrm_profile', - '5': 'sdm_profile', - '6': 'bike_profile', - '7': 'zones_target', - '8': 'hr_zone', - '9': 'power_zone', - '10': 'met_zone', - '12': 'sport', - '13': 'training_settings', - '15': 'goal', - '18': 'session', - '19': 'lap', - '20': 'record', - '21': 'event', - '23': 'device_info', - '26': 'workout', - '27': 'workout_step', - '28': 'schedule', - '30': 'weight_scale', - '31': 'course', - '32': 'course_point', - '33': 'totals', - '34': 'activity', - '35': 'software', - '37': 'file_capabilities', - '38': 'mesg_capabilities', - '39': 'field_capabilities', - '49': 'file_creator', - '51': 'blood_pressure', - '53': 'speed_zone', - '55': 'monitoring', - '72': 'training_file', - '78': 'hrv', - '80': 'ant_rx', - '81': 'ant_tx', - '82': 'ant_channel_id', - '101': 'length', - '103': 'monitoring_info', - '105': 'pad', - '106': 'slave_device', - '127': 'connectivity', - '128': 'weather_conditions', - '129': 'weather_alert', - '131': 'cadence_zone', - '132': 'hr', - '142': 'segment_lap', - '145': 'memo_glob', - '148': 'segment_id', - '149': 'segment_leaderboard_entry', - '150': 'segment_point', - '151': 'segment_file', - '158': 'workout_session', - '159': 'watchface_settings', - '160': 'gps_metadata', - '161': 'camera_event', - '162': 'timestamp_correlation', - '164': 'gyroscope_data', - '165': 'accelerometer_data', - '167': 'three_d_sensor_calibration', - '169': 'video_frame', - '174': 'obdii_data', - '177': 'nmea_sentence', - '178': 'aviation_attitude', - '184': 'video', - '185': 'video_title', - '186': 'video_description', - '187': 'video_clip', - '188': 'ohr_settings', - '200': 'exd_screen_configuration', - '201': 'exd_data_field_configuration', - '202': 'exd_data_concept_configuration', - '206': 'field_description', - '207': 'developer_data_id', - '208': 'magnetometer_data', - '209': 'barometer_data', - '210': 'one_d_sensor_calibration', - '211': 'monitoring_hr_data', - '216': 'time_in_zone', - '225': 'set', - '227': 'stress_level', - '229': 'max_met_data', - '258': 'dive_settings', - '259': 'dive_gas', - '262': 'dive_alarm', - '264': 'exercise_title', - '268': 'dive_summary', - '269': 'spo2_data', - '275': 'sleep_level', - '285': 'jump', - '289': 'aad_accel_features', - '290': 'beat_intervals', - '297': 'respiration_rate', - '302': 'hsa_accelerometer_data', - '304': 'hsa_step_data', - '305': 'hsa_spo2_data', - '306': 'hsa_stress_data', - '307': 'hsa_respiration_data', - '308': 'hsa_heart_rate_data', - '312': 'split', - '313': 'split_summary', - '314': 'hsa_body_battery_data', - '315': 'hsa_event', - '317': 'climb_pro', - '319': 'tank_update', - '323': 'tank_summary', - '346': 'sleep_assessment', - '370': 'hrv_status_summary', - '371': 'hrv_value', - '372': 'raw_bbi', - '375': 'device_aux_battery_info', - '376': 'hsa_gyroscope_data', - '387': 'chrono_shot_session', - '388': 'chrono_shot_data', - '389': 'hsa_configuration_data', - '393': 'dive_apnea_alarm', - '398': 'skin_temp_overnight', - '409': 'hsa_wrist_temperature_data', # Message number for the HSA wrist temperature data message - '470': 'sleep_disruption_severity_period', - '471': 'sleep_disruption_overnight_severity', - '0xFF00': 'mfg_range_min', # 0xFF00 - 0xFFFE reserved for manufacturer specific messages - '0xFFFE': 'mfg_range_max', # 0xFF00 - 0xFFFE reserved for manufacturer specific messages - }, - 'checksum': { - '0': 'clear', # Allows clear of checksum for flash memory where can only write 1 to 0 without erasing sector. - '1': 'ok', # Set to mark checksum as valid if computes to invalid values 0 or 0xFF. Checksum can also be set to ok to save encoding computation time. - }, - 'file_flags': { - '0x02': 'read', - '0x04': 'write', - '0x08': 'erase', - }, - 'mesg_count': { - '0': 'num_per_file', - '1': 'max_per_file', - '2': 'max_per_file_type', - }, - 'date_time': { - '0x10000000': 'min', # if date_time is < 0x10000000 then it is system time (seconds from device power on) - }, - 'local_date_time': { - '0x10000000': 'min', # if date_time is < 0x10000000 then it is system time (seconds from device power on) - }, - 'message_index': { - '0x8000': 'selected', # message is selected if set - '0x7000': 'reserved', # reserved (default 0) - '0x0FFF': 'mask', # index - }, - 'device_index': { - '0': 'creator', # Creator of the file is always device index 0. - }, - 'gender': { - '0': 'female', - '1': 'male', - }, - 'language': { - '0': 'english', - '1': 'french', - '2': 'italian', - '3': 'german', - '4': 'spanish', - '5': 'croatian', - '6': 'czech', - '7': 'danish', - '8': 'dutch', - '9': 'finnish', - '10': 'greek', - '11': 'hungarian', - '12': 'norwegian', - '13': 'polish', - '14': 'portuguese', - '15': 'slovakian', - '16': 'slovenian', - '17': 'swedish', - '18': 'russian', - '19': 'turkish', - '20': 'latvian', - '21': 'ukrainian', - '22': 'arabic', - '23': 'farsi', - '24': 'bulgarian', - '25': 'romanian', - '26': 'chinese', - '27': 'japanese', - '28': 'korean', - '29': 'taiwanese', - '30': 'thai', - '31': 'hebrew', - '32': 'brazilian_portuguese', - '33': 'indonesian', - '34': 'malaysian', - '35': 'vietnamese', - '36': 'burmese', - '37': 'mongolian', - '254': 'custom', - }, - 'language_bits_0': { - '0x01': 'english', - '0x02': 'french', - '0x04': 'italian', - '0x08': 'german', - '0x10': 'spanish', - '0x20': 'croatian', - '0x40': 'czech', - '0x80': 'danish', - }, - 'language_bits_1': { - '0x01': 'dutch', - '0x02': 'finnish', - '0x04': 'greek', - '0x08': 'hungarian', - '0x10': 'norwegian', - '0x20': 'polish', - '0x40': 'portuguese', - '0x80': 'slovakian', - }, - 'language_bits_2': { - '0x01': 'slovenian', - '0x02': 'swedish', - '0x04': 'russian', - '0x08': 'turkish', - '0x10': 'latvian', - '0x20': 'ukrainian', - '0x40': 'arabic', - '0x80': 'farsi', - }, - 'language_bits_3': { - '0x01': 'bulgarian', - '0x02': 'romanian', - '0x04': 'chinese', - '0x08': 'japanese', - '0x10': 'korean', - '0x20': 'taiwanese', - '0x40': 'thai', - '0x80': 'hebrew', - }, - 'language_bits_4': { - '0x01': 'brazilian_portuguese', - '0x02': 'indonesian', - '0x04': 'malaysian', - '0x08': 'vietnamese', - '0x10': 'burmese', - '0x20': 'mongolian', - }, - 'time_zone': { - '0': 'almaty', - '1': 'bangkok', - '2': 'bombay', - '3': 'brasilia', - '4': 'cairo', - '5': 'cape_verde_is', - '6': 'darwin', - '7': 'eniwetok', - '8': 'fiji', - '9': 'hong_kong', - '10': 'islamabad', - '11': 'kabul', - '12': 'magadan', - '13': 'mid_atlantic', - '14': 'moscow', - '15': 'muscat', - '16': 'newfoundland', - '17': 'samoa', - '18': 'sydney', - '19': 'tehran', - '20': 'tokyo', - '21': 'us_alaska', - '22': 'us_atlantic', - '23': 'us_central', - '24': 'us_eastern', - '25': 'us_hawaii', - '26': 'us_mountain', - '27': 'us_pacific', - '28': 'other', - '29': 'auckland', - '30': 'kathmandu', - '31': 'europe_western_wet', - '32': 'europe_central_cet', - '33': 'europe_eastern_eet', - '34': 'jakarta', - '35': 'perth', - '36': 'adelaide', - '37': 'brisbane', - '38': 'tasmania', - '39': 'iceland', - '40': 'amsterdam', - '41': 'athens', - '42': 'barcelona', - '43': 'berlin', - '44': 'brussels', - '45': 'budapest', - '46': 'copenhagen', - '47': 'dublin', - '48': 'helsinki', - '49': 'lisbon', - '50': 'london', - '51': 'madrid', - '52': 'munich', - '53': 'oslo', - '54': 'paris', - '55': 'prague', - '56': 'reykjavik', - '57': 'rome', - '58': 'stockholm', - '59': 'vienna', - '60': 'warsaw', - '61': 'zurich', - '62': 'quebec', - '63': 'ontario', - '64': 'manitoba', - '65': 'saskatchewan', - '66': 'alberta', - '67': 'british_columbia', - '68': 'boise', - '69': 'boston', - '70': 'chicago', - '71': 'dallas', - '72': 'denver', - '73': 'kansas_city', - '74': 'las_vegas', - '75': 'los_angeles', - '76': 'miami', - '77': 'minneapolis', - '78': 'new_york', - '79': 'new_orleans', - '80': 'phoenix', - '81': 'santa_fe', - '82': 'seattle', - '83': 'washington_dc', - '84': 'us_arizona', - '85': 'chita', - '86': 'ekaterinburg', - '87': 'irkutsk', - '88': 'kaliningrad', - '89': 'krasnoyarsk', - '90': 'novosibirsk', - '91': 'petropavlovsk_kamchatskiy', - '92': 'samara', - '93': 'vladivostok', - '94': 'mexico_central', - '95': 'mexico_mountain', - '96': 'mexico_pacific', - '97': 'cape_town', - '98': 'winkhoek', - '99': 'lagos', - '100': 'riyahd', - '101': 'venezuela', - '102': 'australia_lh', - '103': 'santiago', - '253': 'manual', - '254': 'automatic', - }, - 'display_measure': { - '0': 'metric', - '1': 'statute', - '2': 'nautical', - }, - 'display_heart': { - '0': 'bpm', - '1': 'max', - '2': 'reserve', - }, - 'display_power': { - '0': 'watts', - '1': 'percent_ftp', - }, - 'display_position': { - '0': 'degree', # dd.dddddd - '1': 'degree_minute', # dddmm.mmm - '2': 'degree_minute_second', # dddmmss - '3': 'austrian_grid', # Austrian Grid (BMN) - '4': 'british_grid', # British National Grid - '5': 'dutch_grid', # Dutch grid system - '6': 'hungarian_grid', # Hungarian grid system - '7': 'finnish_grid', # Finnish grid system Zone3 KKJ27 - '8': 'german_grid', # Gausss Krueger (German) - '9': 'icelandic_grid', # Icelandic Grid - '10': 'indonesian_equatorial', # Indonesian Equatorial LCO - '11': 'indonesian_irian', # Indonesian Irian LCO - '12': 'indonesian_southern', # Indonesian Southern LCO - '13': 'india_zone_0', # India zone 0 - '14': 'india_zone_IA', # India zone IA - '15': 'india_zone_IB', # India zone IB - '16': 'india_zone_IIA', # India zone IIA - '17': 'india_zone_IIB', # India zone IIB - '18': 'india_zone_IIIA', # India zone IIIA - '19': 'india_zone_IIIB', # India zone IIIB - '20': 'india_zone_IVA', # India zone IVA - '21': 'india_zone_IVB', # India zone IVB - '22': 'irish_transverse', # Irish Transverse Mercator - '23': 'irish_grid', # Irish Grid - '24': 'loran', # Loran TD - '25': 'maidenhead_grid', # Maidenhead grid system - '26': 'mgrs_grid', # MGRS grid system - '27': 'new_zealand_grid', # New Zealand grid system - '28': 'new_zealand_transverse', # New Zealand Transverse Mercator - '29': 'qatar_grid', # Qatar National Grid - '30': 'modified_swedish_grid', # Modified RT-90 (Sweden) - '31': 'swedish_grid', # RT-90 (Sweden) - '32': 'south_african_grid', # South African Grid - '33': 'swiss_grid', # Swiss CH-1903 grid - '34': 'taiwan_grid', # Taiwan Grid - '35': 'united_states_grid', # United States National Grid - '36': 'utm_ups_grid', # UTM/UPS grid system - '37': 'west_malayan', # West Malayan RSO - '38': 'borneo_rso', # Borneo RSO - '39': 'estonian_grid', # Estonian grid system - '40': 'latvian_grid', # Latvian Transverse Mercator - '41': 'swedish_ref_99_grid', # Reference Grid 99 TM (Swedish) - }, - 'switch': { - '0': 'off', - '1': 'on', - '2': 'auto', - }, - 'sport': { - '0': 'generic', - '1': 'running', - '2': 'cycling', - '3': 'transition', # Mulitsport transition - '4': 'fitness_equipment', - '5': 'swimming', - '6': 'basketball', - '7': 'soccer', - '8': 'tennis', - '9': 'american_football', - '10': 'training', - '11': 'walking', - '12': 'cross_country_skiing', - '13': 'alpine_skiing', - '14': 'snowboarding', - '15': 'rowing', - '16': 'mountaineering', - '17': 'hiking', - '18': 'multisport', - '19': 'paddling', - '20': 'flying', - '21': 'e_biking', - '22': 'motorcycling', - '23': 'boating', - '24': 'driving', - '25': 'golf', - '26': 'hang_gliding', - '27': 'horseback_riding', - '28': 'hunting', - '29': 'fishing', - '30': 'inline_skating', - '31': 'rock_climbing', - '32': 'sailing', - '33': 'ice_skating', - '34': 'sky_diving', - '35': 'snowshoeing', - '36': 'snowmobiling', - '37': 'stand_up_paddleboarding', - '38': 'surfing', - '39': 'wakeboarding', - '40': 'water_skiing', - '41': 'kayaking', - '42': 'rafting', - '43': 'windsurfing', - '44': 'kitesurfing', - '45': 'tactical', - '46': 'jumpmaster', - '47': 'boxing', - '48': 'floor_climbing', - '49': 'baseball', - '53': 'diving', - '62': 'hiit', - '64': 'racket', - '65': 'wheelchair_push_walk', - '66': 'wheelchair_push_run', - '67': 'meditation', - '69': 'disc_golf', - '71': 'cricket', - '72': 'rugby', - '73': 'hockey', - '74': 'lacrosse', - '75': 'volleyball', - '76': 'water_tubing', - '77': 'wakesurfing', - '80': 'mixed_martial_arts', - '82': 'snorkeling', - '83': 'dance', - '84': 'jump_rope', - '254': 'all', # All is for goals only to include all sports. - }, - 'sport_bits_0': { - '0x01': 'generic', - '0x02': 'running', - '0x04': 'cycling', - '0x08': 'transition', # Mulitsport transition - '0x10': 'fitness_equipment', - '0x20': 'swimming', - '0x40': 'basketball', - '0x80': 'soccer', - }, - 'sport_bits_1': { - '0x01': 'tennis', - '0x02': 'american_football', - '0x04': 'training', - '0x08': 'walking', - '0x10': 'cross_country_skiing', - '0x20': 'alpine_skiing', - '0x40': 'snowboarding', - '0x80': 'rowing', - }, - 'sport_bits_2': { - '0x01': 'mountaineering', - '0x02': 'hiking', - '0x04': 'multisport', - '0x08': 'paddling', - '0x10': 'flying', - '0x20': 'e_biking', - '0x40': 'motorcycling', - '0x80': 'boating', - }, - 'sport_bits_3': { - '0x01': 'driving', - '0x02': 'golf', - '0x04': 'hang_gliding', - '0x08': 'horseback_riding', - '0x10': 'hunting', - '0x20': 'fishing', - '0x40': 'inline_skating', - '0x80': 'rock_climbing', - }, - 'sport_bits_4': { - '0x01': 'sailing', - '0x02': 'ice_skating', - '0x04': 'sky_diving', - '0x08': 'snowshoeing', - '0x10': 'snowmobiling', - '0x20': 'stand_up_paddleboarding', - '0x40': 'surfing', - '0x80': 'wakeboarding', - }, - 'sport_bits_5': { - '0x01': 'water_skiing', - '0x02': 'kayaking', - '0x04': 'rafting', - '0x08': 'windsurfing', - '0x10': 'kitesurfing', - '0x20': 'tactical', - '0x40': 'jumpmaster', - '0x80': 'boxing', - }, - 'sport_bits_6': { - '0x01': 'floor_climbing', - }, - 'sub_sport': { - '0': 'generic', - '1': 'treadmill', # Run/Fitness Equipment - '2': 'street', # Run - '3': 'trail', # Run - '4': 'track', # Run - '5': 'spin', # Cycling - '6': 'indoor_cycling', # Cycling/Fitness Equipment - '7': 'road', # Cycling - '8': 'mountain', # Cycling - '9': 'downhill', # Cycling - '10': 'recumbent', # Cycling - '11': 'cyclocross', # Cycling - '12': 'hand_cycling', # Cycling - '13': 'track_cycling', # Cycling - '14': 'indoor_rowing', # Fitness Equipment - '15': 'elliptical', # Fitness Equipment - '16': 'stair_climbing', # Fitness Equipment - '17': 'lap_swimming', # Swimming - '18': 'open_water', # Swimming - '19': 'flexibility_training', # Training - '20': 'strength_training', # Training - '21': 'warm_up', # Tennis - '22': 'match', # Tennis - '23': 'exercise', # Tennis - '24': 'challenge', - '25': 'indoor_skiing', # Fitness Equipment - '26': 'cardio_training', # Training - '27': 'indoor_walking', # Walking/Fitness Equipment - '28': 'e_bike_fitness', # E-Biking - '29': 'bmx', # Cycling - '30': 'casual_walking', # Walking - '31': 'speed_walking', # Walking - '32': 'bike_to_run_transition', # Transition - '33': 'run_to_bike_transition', # Transition - '34': 'swim_to_bike_transition', # Transition - '35': 'atv', # Motorcycling - '36': 'motocross', # Motorcycling - '37': 'backcountry', # Alpine Skiing/Snowboarding - '38': 'resort', # Alpine Skiing/Snowboarding - '39': 'rc_drone', # Flying - '40': 'wingsuit', # Flying - '41': 'whitewater', # Kayaking/Rafting - '42': 'skate_skiing', # Cross Country Skiing - '43': 'yoga', # Training - '44': 'pilates', # Fitness Equipment - '45': 'indoor_running', # Run - '46': 'gravel_cycling', # Cycling - '47': 'e_bike_mountain', # Cycling - '48': 'commuting', # Cycling - '49': 'mixed_surface', # Cycling - '50': 'navigate', - '51': 'track_me', - '52': 'map', - '53': 'single_gas_diving', # Diving - '54': 'multi_gas_diving', # Diving - '55': 'gauge_diving', # Diving - '56': 'apnea_diving', # Diving - '57': 'apnea_hunting', # Diving - '58': 'virtual_activity', - '59': 'obstacle', # Used for events where participants run, crawl through mud, climb over walls, etc. - '62': 'breathing', - '65': 'sail_race', # Sailing - '67': 'ultra', # Ultramarathon - '68': 'indoor_climbing', # Climbing - '69': 'bouldering', # Climbing - '70': 'hiit', # High Intensity Interval Training - '73': 'amrap', # HIIT - '74': 'emom', # HIIT - '75': 'tabata', # HIIT - '84': 'pickleball', # Racket - '85': 'padel', # Racket - '86': 'indoor_wheelchair_walk', - '87': 'indoor_wheelchair_run', - '88': 'indoor_hand_cycling', - '94': 'squash', - '95': 'badminton', - '96': 'racquetball', - '97': 'table_tennis', - '110': 'fly_canopy', # Flying - '111': 'fly_paraglide', # Flying - '112': 'fly_paramotor', # Flying - '113': 'fly_pressurized', # Flying - '114': 'fly_navigate', # Flying - '115': 'fly_timer', # Flying - '116': 'fly_altimeter', # Flying - '117': 'fly_wx', # Flying - '118': 'fly_vfr', # Flying - '119': 'fly_ifr', # Flying - '254': 'all', - }, - 'sport_event': { - '0': 'uncategorized', - '1': 'geocaching', - '2': 'fitness', - '3': 'recreation', - '4': 'race', - '5': 'special_event', - '6': 'training', - '7': 'transportation', - '8': 'touring', - }, - 'activity': { - '0': 'manual', - '1': 'auto_multi_sport', - }, - 'intensity': { - '0': 'active', - '1': 'rest', - '2': 'warmup', - '3': 'cooldown', - '4': 'recovery', - '5': 'interval', - '6': 'other', - }, - 'session_trigger': { - '0': 'activity_end', - '1': 'manual', # User changed sport. - '2': 'auto_multi_sport', # Auto multi-sport feature is enabled and user pressed lap button to advance session. - '3': 'fitness_equipment', # Auto sport change caused by user linking to fitness equipment. - }, - 'autolap_trigger': { - '0': 'time', - '1': 'distance', - '2': 'position_start', - '3': 'position_lap', - '4': 'position_waypoint', - '5': 'position_marked', - '6': 'off', - '13': 'auto_select', - }, - 'lap_trigger': { - '0': 'manual', - '1': 'time', - '2': 'distance', - '3': 'position_start', - '4': 'position_lap', - '5': 'position_waypoint', - '6': 'position_marked', - '7': 'session_end', - '8': 'fitness_equipment', - }, - 'time_mode': { - '0': 'hour12', - '1': 'hour24', # Does not use a leading zero and has a colon - '2': 'military', # Uses a leading zero and does not have a colon - '3': 'hour_12_with_seconds', - '4': 'hour_24_with_seconds', - '5': 'utc', - }, - 'backlight_mode': { - '0': 'off', - '1': 'manual', - '2': 'key_and_messages', - '3': 'auto_brightness', - '4': 'smart_notifications', - '5': 'key_and_messages_night', - '6': 'key_and_messages_and_smart_notifications', - }, - 'date_mode': { - '0': 'day_month', - '1': 'month_day', - }, - 'backlight_timeout': { - '0': 'infinite', # Backlight stays on forever. - }, - 'event': { - '0': 'timer', # Group 0. Start / stop_all - '3': 'workout', # start / stop - '4': 'workout_step', # Start at beginning of workout. Stop at end of each step. - '5': 'power_down', # stop_all group 0 - '6': 'power_up', # stop_all group 0 - '7': 'off_course', # start / stop group 0 - '8': 'session', # Stop at end of each session. - '9': 'lap', # Stop at end of each lap. - '10': 'course_point', # marker - '11': 'battery', # marker - '12': 'virtual_partner_pace', # Group 1. Start at beginning of activity if VP enabled, when VP pace is changed during activity or VP enabled mid activity. stop_disable when VP disabled. - '13': 'hr_high_alert', # Group 0. Start / stop when in alert condition. - '14': 'hr_low_alert', # Group 0. Start / stop when in alert condition. - '15': 'speed_high_alert', # Group 0. Start / stop when in alert condition. - '16': 'speed_low_alert', # Group 0. Start / stop when in alert condition. - '17': 'cad_high_alert', # Group 0. Start / stop when in alert condition. - '18': 'cad_low_alert', # Group 0. Start / stop when in alert condition. - '19': 'power_high_alert', # Group 0. Start / stop when in alert condition. - '20': 'power_low_alert', # Group 0. Start / stop when in alert condition. - '21': 'recovery_hr', # marker - '22': 'battery_low', # marker - '23': 'time_duration_alert', # Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled. - '24': 'distance_duration_alert', # Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled. - '25': 'calorie_duration_alert', # Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled. - '26': 'activity', # Group 1.. Stop at end of activity. - '27': 'fitness_equipment', # marker - '28': 'length', # Stop at end of each length. - '32': 'user_marker', # marker - '33': 'sport_point', # marker - '36': 'calibration', # start/stop/marker - '42': 'front_gear_change', # marker - '43': 'rear_gear_change', # marker - '44': 'rider_position_change', # marker - '45': 'elev_high_alert', # Group 0. Start / stop when in alert condition. - '46': 'elev_low_alert', # Group 0. Start / stop when in alert condition. - '47': 'comm_timeout', # marker - '54': 'auto_activity_detect', # marker - '56': 'dive_alert', # marker - '57': 'dive_gas_switched', # marker - '71': 'tank_pressure_reserve', # marker - '72': 'tank_pressure_critical', # marker - '73': 'tank_lost', # marker - '75': 'radar_threat_alert', # start/stop/marker - '76': 'tank_battery_low', # marker - '81': 'tank_pod_connected', # marker - tank pod has connected - '82': 'tank_pod_disconnected', # marker - tank pod has lost connection - }, - 'event_type': { - '0': 'start', - '1': 'stop', - '2': 'consecutive_depreciated', - '3': 'marker', - '4': 'stop_all', - '5': 'begin_depreciated', - '6': 'end_depreciated', - '7': 'end_all_depreciated', - '8': 'stop_disable', - '9': 'stop_disable_all', - }, - 'timer_trigger': { - '0': 'manual', - '1': 'auto', - '2': 'fitness_equipment', - }, - 'fitness_equipment_state': { - '0': 'ready', - '1': 'in_use', - '2': 'paused', - '3': 'unknown', # lost connection to fitness equipment - }, - 'tone': { - '0': 'off', - '1': 'tone', - '2': 'vibrate', - '3': 'tone_and_vibrate', - }, - 'autoscroll': { - '0': 'none', - '1': 'slow', - '2': 'medium', - '3': 'fast', - }, - 'activity_class': { - '0x7F': 'level', # 0 to 100 - '100': 'level_max', - '0x80': 'athlete', - }, - 'hr_zone_calc': { - '0': 'custom', - '1': 'percent_max_hr', - '2': 'percent_hrr', - '3': 'percent_lthr', - }, - 'pwr_zone_calc': { - '0': 'custom', - '1': 'percent_ftp', - }, - 'wkt_step_duration': { - '0': 'time', - '1': 'distance', - '2': 'hr_less_than', - '3': 'hr_greater_than', - '4': 'calories', - '5': 'open', - '6': 'repeat_until_steps_cmplt', - '7': 'repeat_until_time', - '8': 'repeat_until_distance', - '9': 'repeat_until_calories', - '10': 'repeat_until_hr_less_than', - '11': 'repeat_until_hr_greater_than', - '12': 'repeat_until_power_less_than', - '13': 'repeat_until_power_greater_than', - '14': 'power_less_than', - '15': 'power_greater_than', - '16': 'training_peaks_tss', - '17': 'repeat_until_power_last_lap_less_than', - '18': 'repeat_until_max_power_last_lap_less_than', - '19': 'power_3s_less_than', - '20': 'power_10s_less_than', - '21': 'power_30s_less_than', - '22': 'power_3s_greater_than', - '23': 'power_10s_greater_than', - '24': 'power_30s_greater_than', - '25': 'power_lap_less_than', - '26': 'power_lap_greater_than', - '27': 'repeat_until_training_peaks_tss', - '28': 'repetition_time', - '29': 'reps', - '31': 'time_only', - }, - 'wkt_step_target': { - '0': 'speed', - '1': 'heart_rate', - '2': 'open', - '3': 'cadence', - '4': 'power', - '5': 'grade', - '6': 'resistance', - '7': 'power_3s', - '8': 'power_10s', - '9': 'power_30s', - '10': 'power_lap', - '11': 'swim_stroke', - '12': 'speed_lap', - '13': 'heart_rate_lap', - }, - 'goal': { - '0': 'time', - '1': 'distance', - '2': 'calories', - '3': 'frequency', - '4': 'steps', - '5': 'ascent', - '6': 'active_minutes', - }, - 'goal_recurrence': { - '0': 'off', - '1': 'daily', - '2': 'weekly', - '3': 'monthly', - '4': 'yearly', - '5': 'custom', - }, - 'goal_source': { - '0': 'auto', # Device generated - '1': 'community', # Social network sourced goal - '2': 'user', # Manually generated - }, - 'schedule': { - '0': 'workout', - '1': 'course', - }, - 'course_point': { - '0': 'generic', - '1': 'summit', - '2': 'valley', - '3': 'water', - '4': 'food', - '5': 'danger', - '6': 'left', - '7': 'right', - '8': 'straight', - '9': 'first_aid', - '10': 'fourth_category', - '11': 'third_category', - '12': 'second_category', - '13': 'first_category', - '14': 'hors_category', - '15': 'sprint', - '16': 'left_fork', - '17': 'right_fork', - '18': 'middle_fork', - '19': 'slight_left', - '20': 'sharp_left', - '21': 'slight_right', - '22': 'sharp_right', - '23': 'u_turn', - '24': 'segment_start', - '25': 'segment_end', - '27': 'campsite', - '28': 'aid_station', - '29': 'rest_area', - '30': 'general_distance', # Used with UpAhead - '31': 'service', - '32': 'energy_gel', - '33': 'sports_drink', - '34': 'mile_marker', - '35': 'checkpoint', - '36': 'shelter', - '37': 'meeting_spot', - '38': 'overlook', - '39': 'toilet', - '40': 'shower', - '41': 'gear', - '42': 'sharp_curve', - '43': 'steep_incline', - '44': 'tunnel', - '45': 'bridge', - '46': 'obstacle', - '47': 'crossing', - '48': 'store', - '49': 'transition', - '50': 'navaid', - '51': 'transport', - '52': 'alert', - '53': 'info', - }, - 'manufacturer': { - '1': 'garmin', - '2': 'garmin_fr405_antfs', # Do not use. Used by FR405 for ANTFS man id. - '3': 'zephyr', - '4': 'dayton', - '5': 'idt', - '6': 'srm', - '7': 'quarq', - '8': 'ibike', - '9': 'saris', - '10': 'spark_hk', - '11': 'tanita', - '12': 'echowell', - '13': 'dynastream_oem', - '14': 'nautilus', - '15': 'dynastream', - '16': 'timex', - '17': 'metrigear', - '18': 'xelic', - '19': 'beurer', - '20': 'cardiosport', - '21': 'a_and_d', - '22': 'hmm', - '23': 'suunto', - '24': 'thita_elektronik', - '25': 'gpulse', - '26': 'clean_mobile', - '27': 'pedal_brain', - '28': 'peaksware', - '29': 'saxonar', - '30': 'lemond_fitness', - '31': 'dexcom', - '32': 'wahoo_fitness', - '33': 'octane_fitness', - '34': 'archinoetics', - '35': 'the_hurt_box', - '36': 'citizen_systems', - '37': 'magellan', - '38': 'osynce', - '39': 'holux', - '40': 'concept2', - '41': 'shimano', - '42': 'one_giant_leap', - '43': 'ace_sensor', - '44': 'brim_brothers', - '45': 'xplova', - '46': 'perception_digital', - '47': 'bf1systems', - '48': 'pioneer', - '49': 'spantec', - '50': 'metalogics', - '51': '4iiiis', - '52': 'seiko_epson', - '53': 'seiko_epson_oem', - '54': 'ifor_powell', - '55': 'maxwell_guider', - '56': 'star_trac', - '57': 'breakaway', - '58': 'alatech_technology_ltd', - '59': 'mio_technology_europe', - '60': 'rotor', - '61': 'geonaute', - '62': 'id_bike', - '63': 'specialized', - '64': 'wtek', - '65': 'physical_enterprises', - '66': 'north_pole_engineering', - '67': 'bkool', - '68': 'cateye', - '69': 'stages_cycling', - '70': 'sigmasport', - '71': 'tomtom', - '72': 'peripedal', - '73': 'wattbike', - '76': 'moxy', - '77': 'ciclosport', - '78': 'powerbahn', - '79': 'acorn_projects_aps', - '80': 'lifebeam', - '81': 'bontrager', - '82': 'wellgo', - '83': 'scosche', - '84': 'magura', - '85': 'woodway', - '86': 'elite', - '87': 'nielsen_kellerman', - '88': 'dk_city', - '89': 'tacx', - '90': 'direction_technology', - '91': 'magtonic', - '92': '1partcarbon', - '93': 'inside_ride_technologies', - '94': 'sound_of_motion', - '95': 'stryd', - '96': 'icg', # Indoorcycling Group - '97': 'MiPulse', - '98': 'bsx_athletics', - '99': 'look', - '100': 'campagnolo_srl', - '101': 'body_bike_smart', - '102': 'praxisworks', - '103': 'limits_technology', # Limits Technology Ltd. - '104': 'topaction_technology', # TopAction Technology Inc. - '105': 'cosinuss', - '106': 'fitcare', - '107': 'magene', - '108': 'giant_manufacturing_co', - '109': 'tigrasport', # Tigrasport - '110': 'salutron', - '111': 'technogym', - '112': 'bryton_sensors', - '113': 'latitude_limited', - '114': 'soaring_technology', - '115': 'igpsport', - '116': 'thinkrider', - '117': 'gopher_sport', - '118': 'waterrower', - '119': 'orangetheory', - '120': 'inpeak', - '121': 'kinetic', - '122': 'johnson_health_tech', - '123': 'polar_electro', - '124': 'seesense', - '125': 'nci_technology', - '126': 'iqsquare', - '127': 'leomo', - '128': 'ifit_com', - '129': 'coros_byte', - '130': 'versa_design', - '131': 'chileaf', - '132': 'cycplus', - '133': 'gravaa_byte', - '134': 'sigeyi', - '135': 'coospo', - '136': 'geoid', - '137': 'bosch', - '138': 'kyto', - '139': 'kinetic_sports', - '140': 'decathlon_byte', - '141': 'tq_systems', - '142': 'tag_heuer', - '143': 'keiser_fitness', - '144': 'zwift_byte', - '145': 'porsche_ep', - '146': 'blackbird', - '147': 'meilan_byte', - '148': 'ezon', - '149': 'laisi', - '150': 'myzone', - '151': 'abawo', - '152': 'bafang', - '153': 'luhong_technology', - '255': 'development', - '257': 'healthandlife', - '258': 'lezyne', - '259': 'scribe_labs', - '260': 'zwift', - '261': 'watteam', - '262': 'recon', - '263': 'favero_electronics', - '264': 'dynovelo', - '265': 'strava', - '266': 'precor', # Amer Sports - '267': 'bryton', - '268': 'sram', - '269': 'navman', # MiTAC Global Corporation (Mio Technology) - '270': 'cobi', # COBI GmbH - '271': 'spivi', - '272': 'mio_magellan', - '273': 'evesports', - '274': 'sensitivus_gauge', - '275': 'podoon', - '276': 'life_time_fitness', - '277': 'falco_e_motors', # Falco eMotors Inc. - '278': 'minoura', - '279': 'cycliq', - '280': 'luxottica', - '281': 'trainer_road', - '282': 'the_sufferfest', - '283': 'fullspeedahead', - '284': 'virtualtraining', - '285': 'feedbacksports', - '286': 'omata', - '287': 'vdo', - '288': 'magneticdays', - '289': 'hammerhead', - '290': 'kinetic_by_kurt', - '291': 'shapelog', - '292': 'dabuziduo', - '293': 'jetblack', - '294': 'coros', - '295': 'virtugo', - '296': 'velosense', - '297': 'cycligentinc', - '298': 'trailforks', - '299': 'mahle_ebikemotion', - '300': 'nurvv', - '301': 'microprogram', - '302': 'zone5cloud', - '303': 'greenteg', - '304': 'yamaha_motors', - '305': 'whoop', - '306': 'gravaa', - '307': 'onelap', - '308': 'monark_exercise', - '309': 'form', - '310': 'decathlon', - '311': 'syncros', - '312': 'heatup', - '313': 'cannondale', - '314': 'true_fitness', - '315': 'RGT_cycling', - '316': 'vasa', - '317': 'race_republic', - '318': 'fazua', - '319': 'oreka_training', - '320': 'lsec', # Lishun Electric & Communication - '321': 'lululemon_studio', - '322': 'shanyue', - '323': 'spinning_mda', - '324': 'hilldating', - '325': 'aero_sensor', - '326': 'nike', - '327': 'magicshine', - '328': 'ictrainer', - '329': 'absolute_cycling', - '330': 'eo_swimbetter', - '331': 'mywhoosh', - '332': 'ravemen', - '333': 'tektro_racing_products', - '334': 'darad_innovation_corporation', - '335': 'cycloptim', - '337': 'runna', - '5759': 'actigraphcorp', - }, - 'garmin_product': { - '1': 'hrm1', - '2': 'axh01', # AXH01 HRM chipset - '3': 'axb01', - '4': 'axb02', - '5': 'hrm2ss', - '6': 'dsi_alf02', - '7': 'hrm3ss', - '8': 'hrm_run_single_byte_product_id', # hrm_run model for HRM ANT+ messaging - '9': 'bsm', # BSM model for ANT+ messaging - '10': 'bcm', # BCM model for ANT+ messaging - '11': 'axs01', # AXS01 HRM Bike Chipset model for ANT+ messaging - '12': 'hrm_tri_single_byte_product_id', # hrm_tri model for HRM ANT+ messaging - '13': 'hrm4_run_single_byte_product_id', # hrm4 run model for HRM ANT+ messaging - '14': 'fr225_single_byte_product_id', # fr225 model for HRM ANT+ messaging - '15': 'gen3_bsm_single_byte_product_id', # gen3_bsm model for Bike Speed ANT+ messaging - '16': 'gen3_bcm_single_byte_product_id', # gen3_bcm model for Bike Cadence ANT+ messaging - '22': 'hrm_fit_single_byte_product_id', - '255': 'OHR', # Garmin Wearable Optical Heart Rate Sensor for ANT+ HR Profile Broadcasting - '473': 'fr301_china', - '474': 'fr301_japan', - '475': 'fr301_korea', - '494': 'fr301_taiwan', - '717': 'fr405', # Forerunner 405 - '782': 'fr50', # Forerunner 50 - '987': 'fr405_japan', - '988': 'fr60', # Forerunner 60 - '1011': 'dsi_alf01', - '1018': 'fr310xt', # Forerunner 310 - '1036': 'edge500', - '1124': 'fr110', # Forerunner 110 - '1169': 'edge800', - '1199': 'edge500_taiwan', - '1213': 'edge500_japan', - '1253': 'chirp', - '1274': 'fr110_japan', - '1325': 'edge200', - '1328': 'fr910xt', - '1333': 'edge800_taiwan', - '1334': 'edge800_japan', - '1341': 'alf04', - '1345': 'fr610', - '1360': 'fr210_japan', - '1380': 'vector_ss', - '1381': 'vector_cp', - '1386': 'edge800_china', - '1387': 'edge500_china', - '1405': 'approach_g10', - '1410': 'fr610_japan', - '1422': 'edge500_korea', - '1436': 'fr70', - '1446': 'fr310xt_4t', - '1461': 'amx', - '1482': 'fr10', - '1497': 'edge800_korea', - '1499': 'swim', - '1537': 'fr910xt_china', - '1551': 'fenix', - '1555': 'edge200_taiwan', - '1561': 'edge510', - '1567': 'edge810', - '1570': 'tempe', - '1600': 'fr910xt_japan', - '1623': 'fr620', - '1632': 'fr220', - '1664': 'fr910xt_korea', - '1688': 'fr10_japan', - '1721': 'edge810_japan', - '1735': 'virb_elite', - '1736': 'edge_touring', # Also Edge Touring Plus - '1742': 'edge510_japan', - '1743': 'hrm_tri', # Also HRM-Swim - '1752': 'hrm_run', - '1765': 'fr920xt', - '1821': 'edge510_asia', - '1822': 'edge810_china', - '1823': 'edge810_taiwan', - '1836': 'edge1000', - '1837': 'vivo_fit', - '1853': 'virb_remote', - '1885': 'vivo_ki', - '1903': 'fr15', - '1907': 'vivo_active', - '1918': 'edge510_korea', - '1928': 'fr620_japan', - '1929': 'fr620_china', - '1930': 'fr220_japan', - '1931': 'fr220_china', - '1936': 'approach_s6', - '1956': 'vivo_smart', - '1967': 'fenix2', - '1988': 'epix', - '2050': 'fenix3', - '2052': 'edge1000_taiwan', - '2053': 'edge1000_japan', - '2061': 'fr15_japan', - '2067': 'edge520', - '2070': 'edge1000_china', - '2072': 'fr620_russia', - '2073': 'fr220_russia', - '2079': 'vector_s', - '2100': 'edge1000_korea', - '2130': 'fr920xt_taiwan', - '2131': 'fr920xt_china', - '2132': 'fr920xt_japan', - '2134': 'virbx', - '2135': 'vivo_smart_apac', - '2140': 'etrex_touch', - '2147': 'edge25', - '2148': 'fr25', - '2150': 'vivo_fit2', - '2153': 'fr225', - '2156': 'fr630', - '2157': 'fr230', - '2158': 'fr735xt', - '2160': 'vivo_active_apac', - '2161': 'vector_2', - '2162': 'vector_2s', - '2172': 'virbxe', - '2173': 'fr620_taiwan', - '2174': 'fr220_taiwan', - '2175': 'truswing', - '2187': 'd2airvenu', - '2188': 'fenix3_china', - '2189': 'fenix3_twn', - '2192': 'varia_headlight', - '2193': 'varia_taillight_old', - '2204': 'edge_explore_1000', - '2219': 'fr225_asia', - '2225': 'varia_radar_taillight', - '2226': 'varia_radar_display', - '2238': 'edge20', - '2260': 'edge520_asia', - '2261': 'edge520_japan', - '2262': 'd2_bravo', - '2266': 'approach_s20', - '2271': 'vivo_smart2', - '2274': 'edge1000_thai', - '2276': 'varia_remote', - '2288': 'edge25_asia', - '2289': 'edge25_jpn', - '2290': 'edge20_asia', - '2292': 'approach_x40', - '2293': 'fenix3_japan', - '2294': 'vivo_smart_emea', - '2310': 'fr630_asia', - '2311': 'fr630_jpn', - '2313': 'fr230_jpn', - '2327': 'hrm4_run', - '2332': 'epix_japan', - '2337': 'vivo_active_hr', - '2347': 'vivo_smart_gps_hr', - '2348': 'vivo_smart_hr', - '2361': 'vivo_smart_hr_asia', - '2362': 'vivo_smart_gps_hr_asia', - '2368': 'vivo_move', - '2379': 'varia_taillight', - '2396': 'fr235_asia', - '2397': 'fr235_japan', - '2398': 'varia_vision', - '2406': 'vivo_fit3', - '2407': 'fenix3_korea', - '2408': 'fenix3_sea', - '2413': 'fenix3_hr', - '2417': 'virb_ultra_30', - '2429': 'index_smart_scale', - '2431': 'fr235', - '2432': 'fenix3_chronos', - '2441': 'oregon7xx', - '2444': 'rino7xx', - '2457': 'epix_korea', - '2473': 'fenix3_hr_chn', - '2474': 'fenix3_hr_twn', - '2475': 'fenix3_hr_jpn', - '2476': 'fenix3_hr_sea', - '2477': 'fenix3_hr_kor', - '2496': 'nautix', - '2497': 'vivo_active_hr_apac', - '2503': 'fr35', - '2512': 'oregon7xx_ww', - '2530': 'edge_820', - '2531': 'edge_explore_820', - '2533': 'fr735xt_apac', - '2534': 'fr735xt_japan', - '2544': 'fenix5s', - '2547': 'd2_bravo_titanium', - '2567': 'varia_ut800', # Varia UT 800 SW - '2593': 'running_dynamics_pod', - '2599': 'edge_820_china', - '2600': 'edge_820_japan', - '2604': 'fenix5x', - '2606': 'vivo_fit_jr', - '2622': 'vivo_smart3', - '2623': 'vivo_sport', - '2628': 'edge_820_taiwan', - '2629': 'edge_820_korea', - '2630': 'edge_820_sea', - '2650': 'fr35_hebrew', - '2656': 'approach_s60', - '2667': 'fr35_apac', - '2668': 'fr35_japan', - '2675': 'fenix3_chronos_asia', - '2687': 'virb_360', - '2691': 'fr935', - '2697': 'fenix5', - '2700': 'vivoactive3', - '2733': 'fr235_china_nfc', - '2769': 'foretrex_601_701', - '2772': 'vivo_move_hr', - '2713': 'edge_1030', - '2727': 'fr35_sea', - '2787': 'vector_3', - '2796': 'fenix5_asia', - '2797': 'fenix5s_asia', - '2798': 'fenix5x_asia', - '2806': 'approach_z80', - '2814': 'fr35_korea', - '2819': 'd2charlie', - '2831': 'vivo_smart3_apac', - '2832': 'vivo_sport_apac', - '2833': 'fr935_asia', - '2859': 'descent', - '2878': 'vivo_fit4', - '2886': 'fr645', - '2888': 'fr645m', - '2891': 'fr30', - '2900': 'fenix5s_plus', - '2909': 'Edge_130', - '2924': 'edge_1030_asia', - '2927': 'vivosmart_4', - '2945': 'vivo_move_hr_asia', - '2962': 'approach_x10', - '2977': 'fr30_asia', - '2988': 'vivoactive3m_w', - '3003': 'fr645_asia', - '3004': 'fr645m_asia', - '3011': 'edge_explore', - '3028': 'gpsmap66', - '3049': 'approach_s10', - '3066': 'vivoactive3m_l', - '3076': 'fr245', - '3077': 'fr245_music', - '3085': 'approach_g80', - '3092': 'edge_130_asia', - '3095': 'edge_1030_bontrager', - '3110': 'fenix5_plus', - '3111': 'fenix5x_plus', - '3112': 'edge_520_plus', - '3113': 'fr945', - '3121': 'edge_530', - '3122': 'edge_830', - '3126': 'instinct_esports', - '3134': 'fenix5s_plus_apac', - '3135': 'fenix5x_plus_apac', - '3142': 'edge_520_plus_apac', - '3143': 'descent_t1', - '3144': 'fr235l_asia', - '3145': 'fr245_asia', - '3163': 'vivo_active3m_apac', - '3192': 'gen3_bsm', # gen3 bike speed sensor - '3193': 'gen3_bcm', # gen3 bike cadence sensor - '3218': 'vivo_smart4_asia', - '3224': 'vivoactive4_small', - '3225': 'vivoactive4_large', - '3226': 'venu', - '3246': 'marq_driver', - '3247': 'marq_aviator', - '3248': 'marq_captain', - '3249': 'marq_commander', - '3250': 'marq_expedition', - '3251': 'marq_athlete', - '3258': 'descent_mk2', - '3282': 'fr45', - '3284': 'gpsmap66i', - '3287': 'fenix6S_sport', - '3288': 'fenix6S', - '3289': 'fenix6_sport', - '3290': 'fenix6', - '3291': 'fenix6x', - '3299': 'hrm_dual', # HRM-Dual - '3300': 'hrm_pro', # HRM-Pro - '3308': 'vivo_move3_premium', - '3314': 'approach_s40', - '3321': 'fr245m_asia', - '3349': 'edge_530_apac', - '3350': 'edge_830_apac', - '3378': 'vivo_move3', - '3387': 'vivo_active4_small_asia', - '3388': 'vivo_active4_large_asia', - '3389': 'vivo_active4_oled_asia', - '3405': 'swim2', - '3420': 'marq_driver_asia', - '3421': 'marq_aviator_asia', - '3422': 'vivo_move3_asia', - '3441': 'fr945_asia', - '3446': 'vivo_active3t_chn', - '3448': 'marq_captain_asia', - '3449': 'marq_commander_asia', - '3450': 'marq_expedition_asia', - '3451': 'marq_athlete_asia', - '3461': 'index_smart_scale_2', - '3466': 'instinct_solar', - '3469': 'fr45_asia', - '3473': 'vivoactive3_daimler', - '3498': 'legacy_rey', - '3499': 'legacy_darth_vader', - '3500': 'legacy_captain_marvel', - '3501': 'legacy_first_avenger', - '3512': 'fenix6s_sport_asia', - '3513': 'fenix6s_asia', - '3514': 'fenix6_sport_asia', - '3515': 'fenix6_asia', - '3516': 'fenix6x_asia', - '3535': 'legacy_captain_marvel_asia', - '3536': 'legacy_first_avenger_asia', - '3537': 'legacy_rey_asia', - '3538': 'legacy_darth_vader_asia', - '3542': 'descent_mk2s', - '3558': 'edge_130_plus', - '3570': 'edge_1030_plus', - '3578': 'rally_200', # Rally 100/200 Power Meter Series - '3589': 'fr745', - '3596': 'venusq_music', - '3599': 'venusq_music_v2', - '3600': 'venusq', - '3615': 'lily', - '3624': 'marq_adventurer', - '3638': 'enduro', - '3639': 'swim2_apac', - '3648': 'marq_adventurer_asia', - '3652': 'fr945_lte', - '3702': 'descent_mk2_asia', # Mk2 and Mk2i - '3703': 'venu2', - '3704': 'venu2s', - '3737': 'venu_daimler_asia', - '3739': 'marq_golfer', - '3740': 'venu_daimler', - '3794': 'fr745_asia', - '3808': 'varia_rct715', - '3809': 'lily_asia', - '3812': 'edge_1030_plus_asia', - '3813': 'edge_130_plus_asia', - '3823': 'approach_s12', - '3872': 'enduro_asia', - '3837': 'venusq_asia', - '3843': 'edge_1040', - '3850': 'marq_golfer_asia', - '3851': 'venu2_plus', - '3865': 'gnss', # Airoha AG3335M Family - '3869': 'fr55', - '3888': 'instinct_2', - '3889': 'instinct_2s', - '3905': 'fenix7s', - '3906': 'fenix7', - '3907': 'fenix7x', - '3908': 'fenix7s_apac', - '3909': 'fenix7_apac', - '3910': 'fenix7x_apac', - ' 3927': 'approach_g12', - '3930': 'descent_mk2s_asia', - '3934': 'approach_s42', - '3943': 'epix_gen2', - '3944': 'epix_gen2_apac', - '3949': 'venu2s_asia', - '3950': 'venu2_asia', - '3978': 'fr945_lte_asia', - '3982': 'vivo_move_sport', - '3983': 'vivomove_trend', - '3986': 'approach_S12_asia', - '3990': 'fr255_music', - '3991': 'fr255_small_music', - '3992': 'fr255', - '3993': 'fr255_small', - ' 4001': 'approach_g12_asia', - '4002': 'approach_s42_asia', - '4005': 'descent_g1', - '4017': 'venu2_plus_asia', - '4024': 'fr955', - '4033': 'fr55_asia', - '4061': 'edge_540', - '4062': 'edge_840', - '4063': 'vivosmart_5', - '4071': 'instinct_2_asia', - '4105': 'marq_gen2', # Adventurer, Athlete, Captain, Golfer - '4115': 'venusq2', - '4116': 'venusq2music', - '4124': 'marq_gen2_aviator', - '4125': 'd2_air_x10', - '4130': 'hrm_pro_plus', - '4132': 'descent_g1_asia', - '4135': 'tactix7', - '4155': 'instinct_crossover', - '4169': 'edge_explore2', - '4222': 'descent_mk3', - '4223': 'descent_mk3i', - '4233': 'approach_s70', - '4257': 'fr265_large', - '4258': 'fr265_small', - '4260': 'venu3', - '4261': 'venu3s', - '4265': 'tacx_neo_smart', # Neo Smart, Tacx - '4266': 'tacx_neo2_smart', # Neo 2 Smart, Tacx - '4267': 'tacx_neo2_t_smart', # Neo 2T Smart, Tacx - '4268': 'tacx_neo_smart_bike', # Neo Smart Bike, Tacx - '4269': 'tacx_satori_smart', # Satori Smart, Tacx - '4270': 'tacx_flow_smart', # Flow Smart, Tacx - '4271': 'tacx_vortex_smart', # Vortex Smart, Tacx - '4272': 'tacx_bushido_smart', # Bushido Smart, Tacx - '4273': 'tacx_genius_smart', # Genius Smart, Tacx - '4274': 'tacx_flux_flux_s_smart', # Flux/Flux S Smart, Tacx - '4275': 'tacx_flux2_smart', # Flux 2 Smart, Tacx - '4276': 'tacx_magnum', # Magnum, Tacx - '4305': 'edge_1040_asia', - '4312': 'epix_gen2_pro_42', - '4313': 'epix_gen2_pro_47', - '4314': 'epix_gen2_pro_51', - '4315': 'fr965', - '4341': 'enduro2', - '4374': 'fenix7s_pro_solar', - '4375': 'fenix7_pro_solar', - '4376': 'fenix7x_pro_solar', - '4380': 'lily2', - '4394': 'instinct_2x', - '4426': 'vivoactive5', - '4432': 'fr165', - '4433': 'fr165_music', - '4440': 'edge_1050', - '4442': 'descent_t2', - '4446': 'hrm_fit', - '4472': 'marq_gen2_commander', - '4477': 'lily_athlete', # aka the Lily 2 Active - '4525': 'rally_x10', # Rally 110/210 - '4532': 'fenix8_solar', - '4533': 'fenix8_solar_large', - '4534': 'fenix8_small', - '4536': 'fenix8', - '4556': 'd2_mach1_pro', - '4575': 'enduro3', - '4583': 'instinctE_40mm', - '4584': 'instinctE_45mm', - '4585': 'instinct3_solar_45mm', - '4586': 'instinct3_amoled_45mm', - '4587': 'instinct3_amoled_50mm', - '4588': 'descent_g2', - '4603': 'venu_x1', - '4606': 'hrm_200', - '4625': 'vivoactive6', - '4631': 'fenix8_pro', - '4633': 'edge_550', - '4634': 'edge_850', - '4643': 'venu4', - '4644': 'venu4s', - '4647': 'approachS44', - '4655': 'edge_mtb', - '4656': 'approachS50', - '4666': 'fenix_e', - '4745': 'bounce2', - '4759': 'instinct3_solar_50mm', - '4775': 'tactix8_amoled', - '4776': 'tactix8_solar', - '4879': 'd2_mach2', - '4678': 'instinct_crossover_amoled', - '4944': 'd2_air_x15', - '10007': 'sdm4', # SDM4 footpod - '10014': 'edge_remote', - '20533': 'tacx_training_app_win', - '20534': 'tacx_training_app_mac', - '20565': 'tacx_training_app_mac_catalyst', - '20119': 'training_center', - '30045': 'tacx_training_app_android', - '30046': 'tacx_training_app_ios', - '30047': 'tacx_training_app_legacy', - '65531': 'connectiq_simulator', - '65532': 'android_antplus_plugin', - '65534': 'connect', # Garmin Connect website - }, - 'antplus_device_type': { - '1': 'antfs', - '11': 'bike_power', - '12': 'environment_sensor_legacy', - '15': 'multi_sport_speed_distance', - '16': 'control', - '17': 'fitness_equipment', - '18': 'blood_pressure', - '19': 'geocache_node', - '20': 'light_electric_vehicle', - '25': 'env_sensor', - '26': 'racquet', - '27': 'control_hub', - '31': 'muscle_oxygen', - '34': 'shifting', - '35': 'bike_light_main', - '36': 'bike_light_shared', - '38': 'exd', - '40': 'bike_radar', - '46': 'bike_aero', - '119': 'weight_scale', - '120': 'heart_rate', - '121': 'bike_speed_cadence', - '122': 'bike_cadence', - '123': 'bike_speed', - '124': 'stride_speed_distance', - }, - 'ant_network': { - '0': 'public', - '1': 'antplus', - '2': 'antfs', - '3': 'private', - }, - 'workout_capabilities': { - '0x00000001': 'interval', - '0x00000002': 'custom', - '0x00000004': 'fitness_equipment', - '0x00000008': 'firstbeat', - '0x00000010': 'new_leaf', - '0x00000020': 'tcx', # For backwards compatibility. Watch should add missing id fields then clear flag. - '0x00000080': 'speed', # Speed source required for workout step. - '0x00000100': 'heart_rate', # Heart rate source required for workout step. - '0x00000200': 'distance', # Distance source required for workout step. - '0x00000400': 'cadence', # Cadence source required for workout step. - '0x00000800': 'power', # Power source required for workout step. - '0x00001000': 'grade', # Grade source required for workout step. - '0x00002000': 'resistance', # Resistance source required for workout step. - '0x00004000': 'protected', - }, - 'battery_status': { - '1': 'new', - '2': 'good', - '3': 'ok', - '4': 'low', - '5': 'critical', - '6': 'charging', - '7': 'unknown', - }, - 'hr_type': { - '0': 'normal', - '1': 'irregular', - }, - 'course_capabilities': { - '0x00000001': 'processed', - '0x00000002': 'valid', - '0x00000004': 'time', - '0x00000008': 'distance', - '0x00000010': 'position', - '0x00000020': 'heart_rate', - '0x00000040': 'power', - '0x00000080': 'cadence', - '0x00000100': 'training', - '0x00000200': 'navigation', - '0x00000400': 'bikeway', - '0x00001000': 'aviation', # Denote course files to be used as flight plans - }, - 'weight': { - '0xFFFE': 'calculating', - }, - 'workout_hr': { - '100': 'bpm_offset', - }, - 'workout_power': { - '1000': 'watts_offset', - }, - 'bp_status': { - '0': 'no_error', - '1': 'error_incomplete_data', - '2': 'error_no_measurement', - '3': 'error_data_out_of_range', - '4': 'error_irregular_heart_rate', - }, - 'user_local_id': { - '0x0000': 'local_min', - '0x000F': 'local_max', - '0x0010': 'stationary_min', - '0x00FF': 'stationary_max', - '0x0100': 'portable_min', - '0xFFFE': 'portable_max', - }, - 'swim_stroke': { - '0': 'freestyle', - '1': 'backstroke', - '2': 'breaststroke', - '3': 'butterfly', - '4': 'drill', - '5': 'mixed', - '6': 'im', # IM is a mixed interval containing the same number of lengths for each of: Butterfly, Backstroke, Breaststroke, Freestyle, swam in that order. - '7': 'im_by_round', # For repeated workout steps, a new individual medly stroke is used for each round. - '8': 'rimo', # Reverse IM Order - }, - 'activity_type': { - '0': 'generic', - '1': 'running', - '2': 'cycling', - '3': 'transition', # Mulitsport transition - '4': 'fitness_equipment', - '5': 'swimming', - '6': 'walking', - '8': 'sedentary', - '254': 'all', # All is for goals only to include all sports. - }, - 'activity_subtype': { - '0': 'generic', - '1': 'treadmill', # Run - '2': 'street', # Run - '3': 'trail', # Run - '4': 'track', # Run - '5': 'spin', # Cycling - '6': 'indoor_cycling', # Cycling - '7': 'road', # Cycling - '8': 'mountain', # Cycling - '9': 'downhill', # Cycling - '10': 'recumbent', # Cycling - '11': 'cyclocross', # Cycling - '12': 'hand_cycling', # Cycling - '13': 'track_cycling', # Cycling - '14': 'indoor_rowing', # Fitness Equipment - '15': 'elliptical', # Fitness Equipment - '16': 'stair_climbing', # Fitness Equipment - '17': 'lap_swimming', # Swimming - '18': 'open_water', # Swimming - '254': 'all', - }, - 'activity_level': { - '0': 'low', - '1': 'medium', - '2': 'high', - }, - 'side': { - '0': 'right', - '1': 'left', - }, - 'left_right_balance': { - '0x7F': 'mask', # % contribution - '0x80': 'right', # data corresponds to right if set, otherwise unknown - }, - 'left_right_balance_100': { - '0x3FFF': 'mask', # % contribution scaled by 100 - '0x8000': 'right', # data corresponds to right if set, otherwise unknown - }, - 'length_type': { - '0': 'idle', # Rest period. Length with no strokes - '1': 'active', # Length with strokes. - }, - 'day_of_week': { - '0': 'sunday', - '1': 'monday', - '2': 'tuesday', - '3': 'wednesday', - '4': 'thursday', - '5': 'friday', - '6': 'saturday', - }, - 'connectivity_capabilities': { - '0x00000001': 'bluetooth', - '0x00000002': 'bluetooth_le', - '0x00000004': 'ant', - '0x00000008': 'activity_upload', - '0x00000010': 'course_download', - '0x00000020': 'workout_download', - '0x00000040': 'live_track', - '0x00000080': 'weather_conditions', - '0x00000100': 'weather_alerts', - '0x00000200': 'gps_ephemeris_download', - '0x00000400': 'explicit_archive', - '0x00000800': 'setup_incomplete', - '0x00001000': 'continue_sync_after_software_update', - '0x00002000': 'connect_iq_app_download', - '0x00004000': 'golf_course_download', - '0x00008000': 'device_initiates_sync', # Indicates device is in control of initiating all syncs - '0x00010000': 'connect_iq_watch_app_download', - '0x00020000': 'connect_iq_widget_download', - '0x00040000': 'connect_iq_watch_face_download', - '0x00080000': 'connect_iq_data_field_download', - '0x00100000': 'connect_iq_app_managment', # Device supports delete and reorder of apps via GCM - '0x00200000': 'swing_sensor', - '0x00400000': 'swing_sensor_remote', - '0x00800000': 'incident_detection', # Device supports incident detection - '0x01000000': 'audio_prompts', - '0x02000000': 'wifi_verification', # Device supports reporting wifi verification via GCM - '0x04000000': 'true_up', # Device supports True Up - '0x08000000': 'find_my_watch', # Device supports Find My Watch - '0x10000000': 'remote_manual_sync', - '0x20000000': 'live_track_auto_start', # Device supports LiveTrack auto start - '0x40000000': 'live_track_messaging', # Device supports LiveTrack Messaging - '0x80000000': 'instant_input', # Device supports instant input feature - }, - 'weather_report': { - '0': 'current', - '1': 'forecast', # Deprecated use hourly_forecast instead - '1': 'hourly_forecast', - '2': 'daily_forecast', - }, - 'weather_status': { - '0': 'clear', - '1': 'partly_cloudy', - '2': 'mostly_cloudy', - '3': 'rain', - '4': 'snow', - '5': 'windy', - '6': 'thunderstorms', - '7': 'wintry_mix', - '8': 'fog', - '11': 'hazy', - '12': 'hail', - '13': 'scattered_showers', - '14': 'scattered_thunderstorms', - '15': 'unknown_precipitation', - '16': 'light_rain', - '17': 'heavy_rain', - '18': 'light_snow', - '19': 'heavy_snow', - '20': 'light_rain_snow', - '21': 'heavy_rain_snow', - '22': 'cloudy', - }, - 'weather_severity': { - '0': 'unknown', - '1': 'warning', - '2': 'watch', - '3': 'advisory', - '4': 'statement', - }, - 'weather_severe_type': { - '0': 'unspecified', - '1': 'tornado', - '2': 'tsunami', - '3': 'hurricane', - '4': 'extreme_wind', - '5': 'typhoon', - '6': 'inland_hurricane', - '7': 'hurricane_force_wind', - '8': 'waterspout', - '9': 'severe_thunderstorm', - '10': 'wreckhouse_winds', - '11': 'les_suetes_wind', - '12': 'avalanche', - '13': 'flash_flood', - '14': 'tropical_storm', - '15': 'inland_tropical_storm', - '16': 'blizzard', - '17': 'ice_storm', - '18': 'freezing_rain', - '19': 'debris_flow', - '20': 'flash_freeze', - '21': 'dust_storm', - '22': 'high_wind', - '23': 'winter_storm', - '24': 'heavy_freezing_spray', - '25': 'extreme_cold', - '26': 'wind_chill', - '27': 'cold_wave', - '28': 'heavy_snow_alert', - '29': 'lake_effect_blowing_snow', - '30': 'snow_squall', - '31': 'lake_effect_snow', - '32': 'winter_weather', - '33': 'sleet', - '34': 'snowfall', - '35': 'snow_and_blowing_snow', - '36': 'blowing_snow', - '37': 'snow_alert', - '38': 'arctic_outflow', - '39': 'freezing_drizzle', - '40': 'storm', - '41': 'storm_surge', - '42': 'rainfall', - '43': 'areal_flood', - '44': 'coastal_flood', - '45': 'lakeshore_flood', - '46': 'excessive_heat', - '47': 'heat', - '48': 'weather', - '49': 'high_heat_and_humidity', - '50': 'humidex_and_health', - '51': 'humidex', - '52': 'gale', - '53': 'freezing_spray', - '54': 'special_marine', - '55': 'squall', - '56': 'strong_wind', - '57': 'lake_wind', - '58': 'marine_weather', - '59': 'wind', - '60': 'small_craft_hazardous_seas', - '61': 'hazardous_seas', - '62': 'small_craft', - '63': 'small_craft_winds', - '64': 'small_craft_rough_bar', - '65': 'high_water_level', - '66': 'ashfall', - '67': 'freezing_fog', - '68': 'dense_fog', - '69': 'dense_smoke', - '70': 'blowing_dust', - '71': 'hard_freeze', - '72': 'freeze', - '73': 'frost', - '74': 'fire_weather', - '75': 'flood', - '76': 'rip_tide', - '77': 'high_surf', - '78': 'smog', - '79': 'air_quality', - '80': 'brisk_wind', - '81': 'air_stagnation', - '82': 'low_water', - '83': 'hydrological', - '84': 'special_weather', - }, - 'time_into_day': { - }, - 'localtime_into_day': { - }, - 'stroke_type': { - '0': 'no_event', - '1': 'other', # stroke was detected but cannot be identified - '2': 'serve', - '3': 'forehand', - '4': 'backhand', - '5': 'smash', - }, - 'body_location': { - '0': 'left_leg', - '1': 'left_calf', - '2': 'left_shin', - '3': 'left_hamstring', - '4': 'left_quad', - '5': 'left_glute', - '6': 'right_leg', - '7': 'right_calf', - '8': 'right_shin', - '9': 'right_hamstring', - '10': 'right_quad', - '11': 'right_glute', - '12': 'torso_back', - '13': 'left_lower_back', - '14': 'left_upper_back', - '15': 'right_lower_back', - '16': 'right_upper_back', - '17': 'torso_front', - '18': 'left_abdomen', - '19': 'left_chest', - '20': 'right_abdomen', - '21': 'right_chest', - '22': 'left_arm', - '23': 'left_shoulder', - '24': 'left_bicep', - '25': 'left_tricep', - '26': 'left_brachioradialis', # Left anterior forearm - '27': 'left_forearm_extensors', # Left posterior forearm - '28': 'right_arm', - '29': 'right_shoulder', - '30': 'right_bicep', - '31': 'right_tricep', - '32': 'right_brachioradialis', # Right anterior forearm - '33': 'right_forearm_extensors', # Right posterior forearm - '34': 'neck', - '35': 'throat', - '36': 'waist_mid_back', - '37': 'waist_front', - '38': 'waist_left', - '39': 'waist_right', - }, - 'segment_lap_status': { - '0': 'end', - '1': 'fail', - }, - 'segment_leaderboard_type': { - '0': 'overall', - '1': 'personal_best', - '2': 'connections', - '3': 'group', - '4': 'challenger', - '5': 'kom', - '6': 'qom', - '7': 'pr', - '8': 'goal', - '9': 'carrot', - '10': 'club_leader', - '11': 'rival', - '12': 'last', - '13': 'recent_best', - '14': 'course_record', - }, - 'segment_delete_status': { - '0': 'do_not_delete', - '1': 'delete_one', - '2': 'delete_all', - }, - 'segment_selection_type': { - '0': 'starred', - '1': 'suggested', - }, - 'source_type': { - '0': 'ant', # External device connected with ANT - '1': 'antplus', # External device connected with ANT+ - '2': 'bluetooth', # External device connected with BT - '3': 'bluetooth_low_energy', # External device connected with BLE - '4': 'wifi', # External device connected with Wifi - '5': 'local', # Onboard device - }, - 'local_device_type': { - '0': 'gps', # Onboard gps receiver - '1': 'glonass', # Onboard glonass receiver - '2': 'gps_glonass', # Onboard gps glonass receiver - '3': 'accelerometer', # Onboard sensor - '4': 'barometer', # Onboard sensor - '5': 'temperature', # Onboard sensor - '10': 'whr', # Onboard wrist HR sensor - '12': 'sensor_hub', # Onboard software package - }, - 'ble_device_type': { - '0': 'connected_gps', # GPS that is provided over a proprietary bluetooth service - '1': 'heart_rate', - '2': 'bike_power', - '3': 'bike_speed_cadence', - '4': 'bike_speed', - '5': 'bike_cadence', - '6': 'footpod', - '7': 'bike_trainer', # Indoor-Bike FTMS protocol - }, - 'ant_channel_id': { - '0xF0000000': 'ant_extended_device_number_upper_nibble', - '0x0F000000': 'ant_transmission_type_lower_nibble', - '0x00FF0000': 'ant_device_type', - '0x0000FFFF': 'ant_device_number', - }, - 'display_orientation': { - '0': 'auto', # automatic if the device supports it - '1': 'portrait', - '2': 'landscape', - '3': 'portrait_flipped', # portrait mode but rotated 180 degrees - '4': 'landscape_flipped', # landscape mode but rotated 180 degrees - }, - 'workout_equipment': { - '0': 'none', - '1': 'swim_fins', - '2': 'swim_kickboard', - '3': 'swim_paddles', - '4': 'swim_pull_buoy', - '5': 'swim_snorkel', - }, - 'watchface_mode': { - '0': 'digital', - '1': 'analog', - '2': 'connect_iq', - '3': 'disabled', - }, - 'digital_watchface_layout': { - '0': 'traditional', - '1': 'modern', - '2': 'bold', - }, - 'analog_watchface_layout': { - '0': 'minimal', - '1': 'traditional', - '2': 'modern', - }, - 'rider_position_type': { - '0': 'seated', - '1': 'standing', - '2': 'transition_to_seated', - '3': 'transition_to_standing', - }, - 'power_phase_type': { - '0': 'power_phase_start_angle', - '1': 'power_phase_end_angle', - '2': 'power_phase_arc_length', - '3': 'power_phase_center', - }, - 'camera_event_type': { - '0': 'video_start', # Start of video recording - '1': 'video_split', # Mark of video file split (end of one file, beginning of the other) - '2': 'video_end', # End of video recording - '3': 'photo_taken', # Still photo taken - '4': 'video_second_stream_start', - '5': 'video_second_stream_split', - '6': 'video_second_stream_end', - '7': 'video_split_start', # Mark of video file split start - '8': 'video_second_stream_split_start', - '11': 'video_pause', # Mark when a video recording has been paused - '12': 'video_second_stream_pause', - '13': 'video_resume', # Mark when a video recording has been resumed - '14': 'video_second_stream_resume', - }, - 'sensor_type': { - '0': 'accelerometer', - '1': 'gyroscope', - '2': 'compass', # Magnetometer - '3': 'barometer', - }, - 'bike_light_network_config_type': { - '0': 'auto', - '4': 'individual', - '5': 'high_visibility', - '6': 'trail', - }, - 'comm_timeout_type': { - '0': 'wildcard_pairing_timeout', # Timeout pairing to any device - '1': 'pairing_timeout', # Timeout pairing to previously paired device - '2': 'connection_lost', # Temporary loss of communications - '3': 'connection_timeout', # Connection closed due to extended bad communications - }, - 'camera_orientation_type': { - '0': 'camera_orientation_0', - '1': 'camera_orientation_90', - '2': 'camera_orientation_180', - '3': 'camera_orientation_270', - }, - 'attitude_stage': { - '0': 'failed', - '1': 'aligning', - '2': 'degraded', - '3': 'valid', - }, - 'attitude_validity': { - '0x0001': 'track_angle_heading_valid', - '0x0002': 'pitch_valid', - '0x0004': 'roll_valid', - '0x0008': 'lateral_body_accel_valid', - '0x0010': 'normal_body_accel_valid', - '0x0020': 'turn_rate_valid', - '0x0040': 'hw_fail', - '0x0080': 'mag_invalid', - '0x0100': 'no_gps', - '0x0200': 'gps_invalid', - '0x0400': 'solution_coasting', - '0x0800': 'true_track_angle', - '0x1000': 'magnetic_heading', - }, - 'auto_sync_frequency': { - '0': 'never', - '1': 'occasionally', - '2': 'frequent', - '3': 'once_a_day', - '4': 'remote', - }, - 'exd_layout': { - '0': 'full_screen', - '1': 'half_vertical', - '2': 'half_horizontal', - '3': 'half_vertical_right_split', - '4': 'half_horizontal_bottom_split', - '5': 'full_quarter_split', - '6': 'half_vertical_left_split', - '7': 'half_horizontal_top_split', - '8': 'dynamic', # The EXD may display the configured concepts in any layout it sees fit. - }, - 'exd_display_type': { - '0': 'numerical', - '1': 'simple', - '2': 'graph', - '3': 'bar', - '4': 'circle_graph', - '5': 'virtual_partner', - '6': 'balance', - '7': 'string_list', - '8': 'string', - '9': 'simple_dynamic_icon', - '10': 'gauge', - }, - 'exd_data_units': { - '0': 'no_units', - '1': 'laps', - '2': 'miles_per_hour', - '3': 'kilometers_per_hour', - '4': 'feet_per_hour', - '5': 'meters_per_hour', - '6': 'degrees_celsius', - '7': 'degrees_farenheit', - '8': 'zone', - '9': 'gear', - '10': 'rpm', - '11': 'bpm', - '12': 'degrees', - '13': 'millimeters', - '14': 'meters', - '15': 'kilometers', - '16': 'feet', - '17': 'yards', - '18': 'kilofeet', - '19': 'miles', - '20': 'time', - '21': 'enum_turn_type', - '22': 'percent', - '23': 'watts', - '24': 'watts_per_kilogram', - '25': 'enum_battery_status', - '26': 'enum_bike_light_beam_angle_mode', - '27': 'enum_bike_light_battery_status', - '28': 'enum_bike_light_network_config_type', - '29': 'lights', - '30': 'seconds', - '31': 'minutes', - '32': 'hours', - '33': 'calories', - '34': 'kilojoules', - '35': 'milliseconds', - '36': 'second_per_mile', - '37': 'second_per_kilometer', - '38': 'centimeter', - '39': 'enum_course_point', - '40': 'bradians', - '41': 'enum_sport', - '42': 'inches_hg', - '43': 'mm_hg', - '44': 'mbars', - '45': 'hecto_pascals', - '46': 'feet_per_min', - '47': 'meters_per_min', - '48': 'meters_per_sec', - '49': 'eight_cardinal', - }, - 'exd_qualifiers': { - '0': 'no_qualifier', - '1': 'instantaneous', - '2': 'average', - '3': 'lap', - '4': 'maximum', - '5': 'maximum_average', - '6': 'maximum_lap', - '7': 'last_lap', - '8': 'average_lap', - '9': 'to_destination', - '10': 'to_go', - '11': 'to_next', - '12': 'next_course_point', - '13': 'total', - '14': 'three_second_average', - '15': 'ten_second_average', - '16': 'thirty_second_average', - '17': 'percent_maximum', - '18': 'percent_maximum_average', - '19': 'lap_percent_maximum', - '20': 'elapsed', - '21': 'sunrise', - '22': 'sunset', - '23': 'compared_to_virtual_partner', - '24': 'maximum_24h', - '25': 'minimum_24h', - '26': 'minimum', - '27': 'first', - '28': 'second', - '29': 'third', - '30': 'shifter', - '31': 'last_sport', - '32': 'moving', - '33': 'stopped', - '34': 'estimated_total', - '242': 'zone_9', - '243': 'zone_8', - '244': 'zone_7', - '245': 'zone_6', - '246': 'zone_5', - '247': 'zone_4', - '248': 'zone_3', - '249': 'zone_2', - '250': 'zone_1', - }, - 'exd_descriptors': { - '0': 'bike_light_battery_status', - '1': 'beam_angle_status', - '2': 'batery_level', - '3': 'light_network_mode', - '4': 'number_lights_connected', - '5': 'cadence', - '6': 'distance', - '7': 'estimated_time_of_arrival', - '8': 'heading', - '9': 'time', - '10': 'battery_level', - '11': 'trainer_resistance', - '12': 'trainer_target_power', - '13': 'time_seated', - '14': 'time_standing', - '15': 'elevation', - '16': 'grade', - '17': 'ascent', - '18': 'descent', - '19': 'vertical_speed', - '20': 'di2_battery_level', - '21': 'front_gear', - '22': 'rear_gear', - '23': 'gear_ratio', - '24': 'heart_rate', - '25': 'heart_rate_zone', - '26': 'time_in_heart_rate_zone', - '27': 'heart_rate_reserve', - '28': 'calories', - '29': 'gps_accuracy', - '30': 'gps_signal_strength', - '31': 'temperature', - '32': 'time_of_day', - '33': 'balance', - '34': 'pedal_smoothness', - '35': 'power', - '36': 'functional_threshold_power', - '37': 'intensity_factor', - '38': 'work', - '39': 'power_ratio', - '40': 'normalized_power', - '41': 'training_stress_Score', - '42': 'time_on_zone', - '43': 'speed', - '44': 'laps', - '45': 'reps', - '46': 'workout_step', - '47': 'course_distance', - '48': 'navigation_distance', - '49': 'course_estimated_time_of_arrival', - '50': 'navigation_estimated_time_of_arrival', - '51': 'course_time', - '52': 'navigation_time', - '53': 'course_heading', - '54': 'navigation_heading', - '55': 'power_zone', - '56': 'torque_effectiveness', - '57': 'timer_time', - '58': 'power_weight_ratio', - '59': 'left_platform_center_offset', - '60': 'right_platform_center_offset', - '61': 'left_power_phase_start_angle', - '62': 'right_power_phase_start_angle', - '63': 'left_power_phase_finish_angle', - '64': 'right_power_phase_finish_angle', - '65': 'gears', # Combined gear information - '66': 'pace', - '67': 'training_effect', - '68': 'vertical_oscillation', - '69': 'vertical_ratio', - '70': 'ground_contact_time', - '71': 'left_ground_contact_time_balance', - '72': 'right_ground_contact_time_balance', - '73': 'stride_length', - '74': 'running_cadence', - '75': 'performance_condition', - '76': 'course_type', - '77': 'time_in_power_zone', - '78': 'navigation_turn', - '79': 'course_location', - '80': 'navigation_location', - '81': 'compass', - '82': 'gear_combo', - '83': 'muscle_oxygen', - '84': 'icon', - '85': 'compass_heading', - '86': 'gps_heading', - '87': 'gps_elevation', - '88': 'anaerobic_training_effect', - '89': 'course', - '90': 'off_course', - '91': 'glide_ratio', - '92': 'vertical_distance', - '93': 'vmg', - '94': 'ambient_pressure', - '95': 'pressure', - '96': 'vam', - }, - 'auto_activity_detect': { - '0x00000000': 'none', - '0x00000001': 'running', - '0x00000002': 'cycling', - '0x00000004': 'swimming', - '0x00000008': 'walking', - '0x00000020': 'elliptical', - '0x00000400': 'sedentary', - }, - 'supported_exd_screen_layouts': { - '0x00000001': 'full_screen', - '0x00000002': 'half_vertical', - '0x00000004': 'half_horizontal', - '0x00000008': 'half_vertical_right_split', - '0x00000010': 'half_horizontal_bottom_split', - '0x00000020': 'full_quarter_split', - '0x00000040': 'half_vertical_left_split', - '0x00000080': 'half_horizontal_top_split', - }, - 'fit_base_type': { - '0': 'enum', - '1': 'sint8', - '2': 'uint8', - '131': 'sint16', - '132': 'uint16', - '133': 'sint32', - '134': 'uint32', - '7': 'string', - '136': 'float32', - '137': 'float64', - '10': 'uint8z', - '139': 'uint16z', - '140': 'uint32z', - '13': 'byte', - '142': 'sint64', - '143': 'uint64', - '144': 'uint64z', - }, - 'turn_type': { - '0': 'arriving_idx', - '1': 'arriving_left_idx', - '2': 'arriving_right_idx', - '3': 'arriving_via_idx', - '4': 'arriving_via_left_idx', - '5': 'arriving_via_right_idx', - '6': 'bear_keep_left_idx', - '7': 'bear_keep_right_idx', - '8': 'continue_idx', - '9': 'exit_left_idx', - '10': 'exit_right_idx', - '11': 'ferry_idx', - '12': 'roundabout_45_idx', - '13': 'roundabout_90_idx', - '14': 'roundabout_135_idx', - '15': 'roundabout_180_idx', - '16': 'roundabout_225_idx', - '17': 'roundabout_270_idx', - '18': 'roundabout_315_idx', - '19': 'roundabout_360_idx', - '20': 'roundabout_neg_45_idx', - '21': 'roundabout_neg_90_idx', - '22': 'roundabout_neg_135_idx', - '23': 'roundabout_neg_180_idx', - '24': 'roundabout_neg_225_idx', - '25': 'roundabout_neg_270_idx', - '26': 'roundabout_neg_315_idx', - '27': 'roundabout_neg_360_idx', - '28': 'roundabout_generic_idx', - '29': 'roundabout_neg_generic_idx', - '30': 'sharp_turn_left_idx', - '31': 'sharp_turn_right_idx', - '32': 'turn_left_idx', - '33': 'turn_right_idx', - '34': 'uturn_left_idx', - '35': 'uturn_right_idx', - '36': 'icon_inv_idx', - '37': 'icon_idx_cnt', - }, - 'bike_light_beam_angle_mode': { - '0': 'manual', - '1': 'auto', - }, - 'fit_base_unit': { - '0': 'other', - '1': 'kilogram', - '2': 'pound', - }, - 'set_type': { - '0': 'rest', - '1': 'active', - }, - 'max_met_category': { - '0': 'generic', - '1': 'cycling', - }, - 'exercise_category': { - '0': 'bench_press', - '1': 'calf_raise', - '2': 'cardio', - '3': 'carry', - '4': 'chop', - '5': 'core', - '6': 'crunch', - '7': 'curl', - '8': 'deadlift', - '9': 'flye', - '10': 'hip_raise', - '11': 'hip_stability', - '12': 'hip_swing', - '13': 'hyperextension', - '14': 'lateral_raise', - '15': 'leg_curl', - '16': 'leg_raise', - '17': 'lunge', - '18': 'olympic_lift', - '19': 'plank', - '20': 'plyo', - '21': 'pull_up', - '22': 'push_up', - '23': 'row', - '24': 'shoulder_press', - '25': 'shoulder_stability', - '26': 'shrug', - '27': 'sit_up', - '28': 'squat', - '29': 'total_body', - '30': 'triceps_extension', - '31': 'warm_up', - '32': 'run', - '33': 'bike', - '34': 'cardio_sensors', # Exercises within workouts that use GPS/sensors rather than rep counting - '35': 'move', - '36': 'pose', - '37': 'banded_exercises', - '38': 'battle_rope', - '39': 'elliptical', - '40': 'floor_climb', - '41': 'indoor_bike', - '42': 'indoor_row', - '43': 'ladder', - '44': 'sandbag', - '45': 'sled', - '46': 'sledge_hammer', - '47': 'stair_stepper', - '49': 'suspension', - '50': 'tire', - '52': 'run_indoor', - '53': 'bike_outdoor', - '65534': 'unknown', - }, - 'bench_press_exercise_name': { - '0': 'alternating_dumbbell_chest_press_on_swiss_ball', - '1': 'barbell_bench_press', - '2': 'barbell_board_bench_press', - '3': 'barbell_floor_press', - '4': 'close_grip_barbell_bench_press', - '5': 'decline_dumbbell_bench_press', - '6': 'dumbbell_bench_press', - '7': 'dumbbell_floor_press', - '8': 'incline_barbell_bench_press', - '9': 'incline_dumbbell_bench_press', - '10': 'incline_smith_machine_bench_press', - '11': 'isometric_barbell_bench_press', - '12': 'kettlebell_chest_press', - '13': 'neutral_grip_dumbbell_bench_press', - '14': 'neutral_grip_dumbbell_incline_bench_press', - '15': 'one_arm_floor_press', - '16': 'weighted_one_arm_floor_press', - '17': 'partial_lockout', - '18': 'reverse_grip_barbell_bench_press', - '19': 'reverse_grip_incline_bench_press', - '20': 'single_arm_cable_chest_press', - '21': 'single_arm_dumbbell_bench_press', - '22': 'smith_machine_bench_press', - '23': 'swiss_ball_dumbbell_chest_press', - '24': 'triple_stop_barbell_bench_press', - '25': 'wide_grip_barbell_bench_press', - '26': 'alternating_dumbbell_chest_press', - }, - 'calf_raise_exercise_name': { - '0': '3_way_calf_raise', - '1': '3_way_weighted_calf_raise', - '2': '3_way_single_leg_calf_raise', - '3': '3_way_weighted_single_leg_calf_raise', - '4': 'donkey_calf_raise', - '5': 'weighted_donkey_calf_raise', - '6': 'seated_calf_raise', - '7': 'weighted_seated_calf_raise', - '8': 'seated_dumbbell_toe_raise', - '9': 'single_leg_bent_knee_calf_raise', - '10': 'weighted_single_leg_bent_knee_calf_raise', - '11': 'single_leg_decline_push_up', - '12': 'single_leg_donkey_calf_raise', - '13': 'weighted_single_leg_donkey_calf_raise', - '14': 'single_leg_hip_raise_with_knee_hold', - '15': 'single_leg_standing_calf_raise', - '16': 'single_leg_standing_dumbbell_calf_raise', - '17': 'standing_barbell_calf_raise', - '18': 'standing_calf_raise', - '19': 'weighted_standing_calf_raise', - '20': 'standing_dumbbell_calf_raise', - }, - 'cardio_exercise_name': { - '0': 'bob_and_weave_circle', - '1': 'weighted_bob_and_weave_circle', - '2': 'cardio_core_crawl', - '3': 'weighted_cardio_core_crawl', - '4': 'double_under', - '5': 'weighted_double_under', - '6': 'jump_rope', - '7': 'weighted_jump_rope', - '8': 'jump_rope_crossover', - '9': 'weighted_jump_rope_crossover', - '10': 'jump_rope_jog', - '11': 'weighted_jump_rope_jog', - '12': 'jumping_jacks', - '13': 'weighted_jumping_jacks', - '14': 'ski_moguls', - '15': 'weighted_ski_moguls', - '16': 'split_jacks', - '17': 'weighted_split_jacks', - '18': 'squat_jacks', - '19': 'weighted_squat_jacks', - '20': 'triple_under', - '21': 'weighted_triple_under', - '22': 'elliptical', - '23': 'spinning', - '24': 'pole_paddle_forward_wheelchair', - '25': 'pole_paddle_backward_wheelchair', - '26': 'pole_handcycle_forward_wheelchair', - '27': 'pole_handcycle_backward_wheelchair', - '28': 'pole_rainbow_wheelchair', - '29': 'double_punch_forward_wheelchair', - '30': 'double_punch_down_wheelchair', - '31': 'double_punch_sideways_wheelchair', - '32': 'double_punch_up_wheelchair', - '33': 'sit_ski_wheelchair', - '34': 'sitting_jacks_wheelchair', - '35': 'punch_forward_wheelchair', - '36': 'punch_down_wheelchair', - '37': 'punch_sideways_wheelchair', - '38': 'punch_up_wheelchair', - '39': 'punch_bag_wheelchair', - '40': 'pole_dd_ff_uu_wheelchair', - '41': 'butterfly_arms_wheelchair', - '42': 'punch', - }, - 'carry_exercise_name': { - '0': 'bar_holds', - '1': 'farmers_walk', - '2': 'farmers_walk_on_toes', - '3': 'hex_dumbbell_hold', - '4': 'overhead_carry', - '5': 'dumbbell_waiter_carry', - '6': 'farmers_carry_walk_lunge', - '7': 'farmers_carry', - '8': 'farmers_carry_on_toes', - }, - 'chop_exercise_name': { - '0': 'cable_pull_through', - '1': 'cable_rotational_lift', - '2': 'cable_woodchop', - '3': 'cross_chop_to_knee', - '4': 'weighted_cross_chop_to_knee', - '5': 'dumbbell_chop', - '6': 'half_kneeling_rotation', - '7': 'weighted_half_kneeling_rotation', - '8': 'half_kneeling_rotational_chop', - '9': 'half_kneeling_rotational_reverse_chop', - '10': 'half_kneeling_stability_chop', - '11': 'half_kneeling_stability_reverse_chop', - '12': 'kneeling_rotational_chop', - '13': 'kneeling_rotational_reverse_chop', - '14': 'kneeling_stability_chop', - '15': 'kneeling_woodchopper', - '16': 'medicine_ball_wood_chops', - '17': 'power_squat_chops', - '18': 'weighted_power_squat_chops', - '19': 'standing_rotational_chop', - '20': 'standing_split_rotational_chop', - '21': 'standing_split_rotational_reverse_chop', - '22': 'standing_stability_reverse_chop', - }, - 'core_exercise_name': { - '0': 'abs_jabs', - '1': 'weighted_abs_jabs', - '2': 'alternating_plate_reach', - '3': 'barbell_rollout', - '4': 'weighted_barbell_rollout', - '5': 'body_bar_oblique_twist', - '6': 'cable_core_press', - '7': 'cable_side_bend', - '8': 'side_bend', - '9': 'weighted_side_bend', - '10': 'crescent_circle', - '11': 'weighted_crescent_circle', - '12': 'cycling_russian_twist', - '13': 'weighted_cycling_russian_twist', - '14': 'elevated_feet_russian_twist', - '15': 'weighted_elevated_feet_russian_twist', - '16': 'half_turkish_get_up', - '17': 'kettlebell_windmill', - '18': 'kneeling_ab_wheel', - '19': 'weighted_kneeling_ab_wheel', - '20': 'modified_front_lever', - '21': 'open_knee_tucks', - '22': 'weighted_open_knee_tucks', - '23': 'side_abs_leg_lift', - '24': 'weighted_side_abs_leg_lift', - '25': 'swiss_ball_jackknife', - '26': 'weighted_swiss_ball_jackknife', - '27': 'swiss_ball_pike', - '28': 'weighted_swiss_ball_pike', - '29': 'swiss_ball_rollout', - '30': 'weighted_swiss_ball_rollout', - '31': 'triangle_hip_press', - '32': 'weighted_triangle_hip_press', - '33': 'trx_suspended_jackknife', - '34': 'weighted_trx_suspended_jackknife', - '35': 'u_boat', - '36': 'weighted_u_boat', - '37': 'windmill_switches', - '38': 'weighted_windmill_switches', - '39': 'alternating_slide_out', - '40': 'weighted_alternating_slide_out', - '41': 'ghd_back_extensions', - '42': 'weighted_ghd_back_extensions', - '43': 'overhead_walk', - '44': 'inchworm', - '45': 'weighted_modified_front_lever', - '46': 'russian_twist', - '47': 'abdominal_leg_rotations', # Deprecated do not use - '48': 'arm_and_leg_extension_on_knees', - '49': 'bicycle', - '50': 'bicep_curl_with_leg_extension', - '51': 'cat_cow', - '52': 'corkscrew', - '53': 'criss_cross', - '54': 'criss_cross_with_ball', # Deprecated do not use - '55': 'double_leg_stretch', - '56': 'knee_folds', - '57': 'lower_lift', - '58': 'neck_pull', - '59': 'pelvic_clocks', - '60': 'roll_over', - '61': 'roll_up', - '62': 'rolling', - '63': 'rowing_1', - '64': 'rowing_2', - '65': 'scissors', - '66': 'single_leg_circles', - '67': 'single_leg_stretch', - '68': 'snake_twist_1_and_2', # Deprecated do not use - '69': 'swan', - '70': 'swimming', - '71': 'teaser', - '72': 'the_hundred', - '73': 'bicep_curl_with_leg_extension_with_weights', - '75': 'hanging_l_sit', - '77': 'lower_lift_with_weights', - '79': 'ring_l_sit', - '80': 'rowing_1_with_weights', - '81': 'rowing_2_with_weights', - '82': 'scissors_with_weights', - '83': 'single_leg_stretch_with_weights', - '84': 'toes_to_elbows', - '85': 'weighted_criss_cross', - '86': 'weighted_double_leg_stretch', - '87': 'weighted_the_hundred', - '88': 'l_sit', - '89': 'turkish_get_up', - '90': 'weighted_ring_l_sit', - '91': 'weighted_hanging_l_sit', - '92': 'weighted_l_sit', - '93': 'side_bend_low_wheelchair', - '94': 'side_bend_mid_wheelchair', - '95': 'side_bend_high_wheelchair', - '96': 'seated_side_bend', - }, - 'crunch_exercise_name': { - '0': 'bicycle_crunch', - '1': 'cable_crunch', - '2': 'circular_arm_crunch', - '3': 'crossed_arms_crunch', - '4': 'weighted_crossed_arms_crunch', - '5': 'cross_leg_reverse_crunch', - '6': 'weighted_cross_leg_reverse_crunch', - '7': 'crunch_chop', - '8': 'weighted_crunch_chop', - '9': 'double_crunch', - '10': 'weighted_double_crunch', - '11': 'elbow_to_knee_crunch', - '12': 'weighted_elbow_to_knee_crunch', - '13': 'flutter_kicks', - '14': 'weighted_flutter_kicks', - '15': 'foam_roller_reverse_crunch_on_bench', - '16': 'weighted_foam_roller_reverse_crunch_on_bench', - '17': 'foam_roller_reverse_crunch_with_dumbbell', - '18': 'foam_roller_reverse_crunch_with_medicine_ball', - '19': 'frog_press', - '20': 'hanging_knee_raise_oblique_crunch', - '21': 'weighted_hanging_knee_raise_oblique_crunch', - '22': 'hip_crossover', - '23': 'weighted_hip_crossover', - '24': 'hollow_rock', - '25': 'weighted_hollow_rock', - '26': 'incline_reverse_crunch', - '27': 'weighted_incline_reverse_crunch', - '28': 'kneeling_cable_crunch', - '29': 'kneeling_cross_crunch', - '30': 'weighted_kneeling_cross_crunch', - '31': 'kneeling_oblique_cable_crunch', - '32': 'knees_to_elbow', - '33': 'leg_extensions', - '34': 'weighted_leg_extensions', - '35': 'leg_levers', - '36': 'mcgill_curl_up', - '37': 'weighted_mcgill_curl_up', - '38': 'modified_pilates_roll_up_with_ball', - '39': 'weighted_modified_pilates_roll_up_with_ball', - '40': 'pilates_crunch', - '41': 'weighted_pilates_crunch', - '42': 'pilates_roll_up_with_ball', - '43': 'weighted_pilates_roll_up_with_ball', - '44': 'raised_legs_crunch', - '45': 'weighted_raised_legs_crunch', - '46': 'reverse_crunch', - '47': 'weighted_reverse_crunch', - '48': 'reverse_crunch_on_a_bench', - '49': 'weighted_reverse_crunch_on_a_bench', - '50': 'reverse_curl_and_lift', - '51': 'weighted_reverse_curl_and_lift', - '52': 'rotational_lift', - '53': 'weighted_rotational_lift', - '54': 'seated_alternating_reverse_crunch', - '55': 'weighted_seated_alternating_reverse_crunch', - '56': 'seated_leg_u', - '57': 'weighted_seated_leg_u', - '58': 'side_to_side_crunch_and_weave', - '59': 'weighted_side_to_side_crunch_and_weave', - '60': 'single_leg_reverse_crunch', - '61': 'weighted_single_leg_reverse_crunch', - '62': 'skater_crunch_cross', - '63': 'weighted_skater_crunch_cross', - '64': 'standing_cable_crunch', - '65': 'standing_side_crunch', - '66': 'step_climb', - '67': 'weighted_step_climb', - '68': 'swiss_ball_crunch', - '69': 'swiss_ball_reverse_crunch', - '70': 'weighted_swiss_ball_reverse_crunch', - '71': 'swiss_ball_russian_twist', - '72': 'weighted_swiss_ball_russian_twist', - '73': 'swiss_ball_side_crunch', - '74': 'weighted_swiss_ball_side_crunch', - '75': 'thoracic_crunches_on_foam_roller', - '76': 'weighted_thoracic_crunches_on_foam_roller', - '77': 'triceps_crunch', - '78': 'weighted_bicycle_crunch', - '79': 'weighted_crunch', - '80': 'weighted_swiss_ball_crunch', - '81': 'toes_to_bar', - '82': 'weighted_toes_to_bar', - '83': 'crunch', - '84': 'straight_leg_crunch_with_ball', - '86': 'leg_climb_crunch', - }, - 'curl_exercise_name': { - '0': 'alternating_dumbbell_biceps_curl', - '1': 'alternating_dumbbell_biceps_curl_on_swiss_ball', - '2': 'alternating_incline_dumbbell_biceps_curl', - '3': 'barbell_biceps_curl', - '4': 'barbell_reverse_wrist_curl', - '5': 'barbell_wrist_curl', - '6': 'behind_the_back_barbell_reverse_wrist_curl', - '7': 'behind_the_back_one_arm_cable_curl', - '8': 'cable_biceps_curl', - '9': 'cable_hammer_curl', - '10': 'cheating_barbell_biceps_curl', - '11': 'close_grip_ez_bar_biceps_curl', - '12': 'cross_body_dumbbell_hammer_curl', - '13': 'dead_hang_biceps_curl', - '14': 'decline_hammer_curl', - '15': 'dumbbell_biceps_curl_with_static_hold', - '16': 'dumbbell_hammer_curl', - '17': 'dumbbell_reverse_wrist_curl', - '18': 'dumbbell_wrist_curl', - '19': 'ez_bar_preacher_curl', - '20': 'forward_bend_biceps_curl', - '21': 'hammer_curl_to_press', - '22': 'incline_dumbbell_biceps_curl', - '23': 'incline_offset_thumb_dumbbell_curl', - '24': 'kettlebell_biceps_curl', - '25': 'lying_concentration_cable_curl', - '26': 'one_arm_preacher_curl', - '27': 'plate_pinch_curl', - '28': 'preacher_curl_with_cable', - '29': 'reverse_ez_bar_curl', - '30': 'reverse_grip_wrist_curl', - '31': 'reverse_grip_barbell_biceps_curl', - '32': 'seated_alternating_dumbbell_biceps_curl', - '33': 'seated_dumbbell_biceps_curl', - '34': 'seated_reverse_dumbbell_curl', - '35': 'split_stance_offset_pinky_dumbbell_curl', - '36': 'standing_alternating_dumbbell_curls', - '37': 'standing_dumbbell_biceps_curl', - '38': 'standing_ez_bar_biceps_curl', - '39': 'static_curl', - '40': 'swiss_ball_dumbbell_overhead_triceps_extension', - '41': 'swiss_ball_ez_bar_preacher_curl', - '42': 'twisting_standing_dumbbell_biceps_curl', - '43': 'wide_grip_ez_bar_biceps_curl', - '44': 'one_arm_concentration_curl', - '45': 'standing_zottman_biceps_curl', - '46': 'dumbbell_biceps_curl', - '47': 'drag_curl_wheelchair', - '48': 'dumbbell_biceps_curl_wheelchair', - '49': 'bottle_curl', - '50': 'seated_bottle_curl', - }, - 'deadlift_exercise_name': { - '0': 'barbell_deadlift', - '1': 'barbell_straight_leg_deadlift', - '2': 'dumbbell_deadlift', - '3': 'dumbbell_single_leg_deadlift_to_row', - '4': 'dumbbell_straight_leg_deadlift', - '5': 'kettlebell_floor_to_shelf', - '6': 'one_arm_one_leg_deadlift', - '7': 'rack_pull', - '8': 'rotational_dumbbell_straight_leg_deadlift', - '9': 'single_arm_deadlift', - '10': 'single_leg_barbell_deadlift', - '11': 'single_leg_barbell_straight_leg_deadlift', - '12': 'single_leg_deadlift_with_barbell', - '13': 'single_leg_rdl_circuit', - '14': 'single_leg_romanian_deadlift_with_dumbbell', - '15': 'sumo_deadlift', - '16': 'sumo_deadlift_high_pull', - '17': 'trap_bar_deadlift', - '18': 'wide_grip_barbell_deadlift', - '20': 'kettlebell_deadlift', - '21': 'kettlebell_sumo_deadlift', - '23': 'romanian_deadlift', - '24': 'single_leg_romanian_deadlift_circuit', - '25': 'straight_leg_deadlift', - }, - 'flye_exercise_name': { - '0': 'cable_crossover', - '1': 'decline_dumbbell_flye', - '2': 'dumbbell_flye', - '3': 'incline_dumbbell_flye', - '4': 'kettlebell_flye', - '5': 'kneeling_rear_flye', - '6': 'single_arm_standing_cable_reverse_flye', - '7': 'swiss_ball_dumbbell_flye', - '8': 'arm_rotations', - '9': 'hug_a_tree', - '10': 'face_down_incline_reverse_flye', - '11': 'incline_reverse_flye', - '12': 'rear_delt_fly_wheelchair', - }, - 'hip_raise_exercise_name': { - '0': 'barbell_hip_thrust_on_floor', - '1': 'barbell_hip_thrust_with_bench', - '2': 'bent_knee_swiss_ball_reverse_hip_raise', - '3': 'weighted_bent_knee_swiss_ball_reverse_hip_raise', - '4': 'bridge_with_leg_extension', - '5': 'weighted_bridge_with_leg_extension', - '6': 'clam_bridge', - '7': 'front_kick_tabletop', - '8': 'weighted_front_kick_tabletop', - '9': 'hip_extension_and_cross', - '10': 'weighted_hip_extension_and_cross', - '11': 'hip_raise', - '12': 'weighted_hip_raise', - '13': 'hip_raise_with_feet_on_swiss_ball', - '14': 'weighted_hip_raise_with_feet_on_swiss_ball', - '15': 'hip_raise_with_head_on_bosu_ball', - '16': 'weighted_hip_raise_with_head_on_bosu_ball', - '17': 'hip_raise_with_head_on_swiss_ball', - '18': 'weighted_hip_raise_with_head_on_swiss_ball', - '19': 'hip_raise_with_knee_squeeze', - '20': 'weighted_hip_raise_with_knee_squeeze', - '21': 'incline_rear_leg_extension', - '22': 'weighted_incline_rear_leg_extension', - '23': 'kettlebell_swing', - '24': 'marching_hip_raise', - '25': 'weighted_marching_hip_raise', - '26': 'marching_hip_raise_with_feet_on_a_swiss_ball', - '27': 'weighted_marching_hip_raise_with_feet_on_a_swiss_ball', - '28': 'reverse_hip_raise', - '29': 'weighted_reverse_hip_raise', - '30': 'single_leg_hip_raise', - '31': 'weighted_single_leg_hip_raise', - '32': 'single_leg_hip_raise_with_foot_on_bench', - '33': 'weighted_single_leg_hip_raise_with_foot_on_bench', - '34': 'single_leg_hip_raise_with_foot_on_bosu_ball', - '35': 'weighted_single_leg_hip_raise_with_foot_on_bosu_ball', - '36': 'single_leg_hip_raise_with_foot_on_foam_roller', - '37': 'weighted_single_leg_hip_raise_with_foot_on_foam_roller', - '38': 'single_leg_hip_raise_with_foot_on_medicine_ball', - '39': 'weighted_single_leg_hip_raise_with_foot_on_medicine_ball', - '40': 'single_leg_hip_raise_with_head_on_bosu_ball', - '41': 'weighted_single_leg_hip_raise_with_head_on_bosu_ball', - '42': 'weighted_clam_bridge', - '43': 'single_leg_swiss_ball_hip_raise_and_leg_curl', - '44': 'clams', - '45': 'inner_thigh_circles', # Deprecated do not use - '46': 'inner_thigh_side_lift', # Deprecated do not use - '47': 'leg_circles', - '48': 'leg_lift', - '49': 'leg_lift_in_external_rotation', - }, - 'hip_stability_exercise_name': { - '0': 'band_side_lying_leg_raise', - '1': 'dead_bug', - '2': 'weighted_dead_bug', - '3': 'external_hip_raise', - '4': 'weighted_external_hip_raise', - '5': 'fire_hydrant_kicks', - '6': 'weighted_fire_hydrant_kicks', - '7': 'hip_circles', - '8': 'weighted_hip_circles', - '9': 'inner_thigh_lift', - '10': 'weighted_inner_thigh_lift', - '11': 'lateral_walks_with_band_at_ankles', - '12': 'pretzel_side_kick', - '13': 'weighted_pretzel_side_kick', - '14': 'prone_hip_internal_rotation', - '15': 'weighted_prone_hip_internal_rotation', - '16': 'quadruped', - '17': 'quadruped_hip_extension', - '18': 'weighted_quadruped_hip_extension', - '19': 'quadruped_with_leg_lift', - '20': 'weighted_quadruped_with_leg_lift', - '21': 'side_lying_leg_raise', - '22': 'weighted_side_lying_leg_raise', - '23': 'sliding_hip_adduction', - '24': 'weighted_sliding_hip_adduction', - '25': 'standing_adduction', - '26': 'weighted_standing_adduction', - '27': 'standing_cable_hip_abduction', - '28': 'standing_hip_abduction', - '29': 'weighted_standing_hip_abduction', - '30': 'standing_rear_leg_raise', - '31': 'weighted_standing_rear_leg_raise', - '32': 'supine_hip_internal_rotation', - '33': 'weighted_supine_hip_internal_rotation', - '34': 'lying_abduction_stretch', - }, - 'hip_swing_exercise_name': { - '0': 'single_arm_kettlebell_swing', - '1': 'single_arm_dumbbell_swing', - '2': 'step_out_swing', - '3': 'one_arm_swing', - }, - 'hyperextension_exercise_name': { - '0': 'back_extension_with_opposite_arm_and_leg_reach', - '1': 'weighted_back_extension_with_opposite_arm_and_leg_reach', - '2': 'base_rotations', - '3': 'weighted_base_rotations', - '4': 'bent_knee_reverse_hyperextension', - '5': 'weighted_bent_knee_reverse_hyperextension', - '6': 'hollow_hold_and_roll', - '7': 'weighted_hollow_hold_and_roll', - '8': 'kicks', - '9': 'weighted_kicks', - '10': 'knee_raises', - '11': 'weighted_knee_raises', - '12': 'kneeling_superman', - '13': 'weighted_kneeling_superman', - '14': 'lat_pull_down_with_row', - '15': 'medicine_ball_deadlift_to_reach', - '16': 'one_arm_one_leg_row', - '17': 'one_arm_row_with_band', - '18': 'overhead_lunge_with_medicine_ball', - '19': 'plank_knee_tucks', - '20': 'weighted_plank_knee_tucks', - '21': 'side_step', - '22': 'weighted_side_step', - '23': 'single_leg_back_extension', - '24': 'weighted_single_leg_back_extension', - '25': 'spine_extension', - '26': 'weighted_spine_extension', - '27': 'static_back_extension', - '28': 'weighted_static_back_extension', - '29': 'superman_from_floor', - '30': 'weighted_superman_from_floor', - '31': 'swiss_ball_back_extension', - '32': 'weighted_swiss_ball_back_extension', - '33': 'swiss_ball_hyperextension', - '34': 'weighted_swiss_ball_hyperextension', - '35': 'swiss_ball_opposite_arm_and_leg_lift', - '36': 'weighted_swiss_ball_opposite_arm_and_leg_lift', - '37': 'superman_on_swiss_ball', - '38': 'cobra', - '39': 'supine_floor_barre', # Deprecated do not use - }, - 'lateral_raise_exercise_name': { - '0': '45_degree_cable_external_rotation', - '1': 'alternating_lateral_raise_with_static_hold', - '2': 'bar_muscle_up', - '3': 'bent_over_lateral_raise', - '4': 'cable_diagonal_raise', - '5': 'cable_front_raise', - '6': 'calorie_row', - '7': 'combo_shoulder_raise', - '8': 'dumbbell_diagonal_raise', - '9': 'dumbbell_v_raise', - '10': 'front_raise', - '11': 'leaning_dumbbell_lateral_raise', - '12': 'lying_dumbbell_raise', - '13': 'muscle_up', - '14': 'one_arm_cable_lateral_raise', - '15': 'overhand_grip_rear_lateral_raise', - '16': 'plate_raises', - '17': 'ring_dip', - '18': 'weighted_ring_dip', - '19': 'ring_muscle_up', - '20': 'weighted_ring_muscle_up', - '21': 'rope_climb', - '22': 'weighted_rope_climb', - '23': 'scaption', - '24': 'seated_lateral_raise', - '25': 'seated_rear_lateral_raise', - '26': 'side_lying_lateral_raise', - '27': 'standing_lift', - '28': 'suspended_row', - '29': 'underhand_grip_rear_lateral_raise', - '30': 'wall_slide', - '31': 'weighted_wall_slide', - '32': 'arm_circles', - '33': 'shaving_the_head', - '34': 'dumbbell_lateral_raise', - '36': 'ring_dip_kipping', - '37': 'wall_walk', - '38': 'dumbbell_front_raise_wheelchair', - '39': 'dumbbell_lateral_raise_wheelchair', - '40': 'pole_double_arm_overhead_and_forward_wheelchair', - '41': 'pole_straight_arm_overhead_wheelchair', - }, - 'leg_curl_exercise_name': { - '0': 'leg_curl', - '1': 'weighted_leg_curl', - '2': 'good_morning', - '3': 'seated_barbell_good_morning', - '4': 'single_leg_barbell_good_morning', - '5': 'single_leg_sliding_leg_curl', - '6': 'sliding_leg_curl', - '7': 'split_barbell_good_morning', - '8': 'split_stance_extension', - '9': 'staggered_stance_good_morning', - '10': 'swiss_ball_hip_raise_and_leg_curl', - '11': 'zercher_good_morning', - '12': 'band_good_morning', - '13': 'bar_good_morning', - }, - 'leg_raise_exercise_name': { - '0': 'hanging_knee_raise', - '1': 'hanging_leg_raise', - '2': 'weighted_hanging_leg_raise', - '3': 'hanging_single_leg_raise', - '4': 'weighted_hanging_single_leg_raise', - '5': 'kettlebell_leg_raises', - '6': 'leg_lowering_drill', - '7': 'weighted_leg_lowering_drill', - '8': 'lying_straight_leg_raise', - '9': 'weighted_lying_straight_leg_raise', - '10': 'medicine_ball_leg_drops', - '11': 'quadruped_leg_raise', - '12': 'weighted_quadruped_leg_raise', - '13': 'reverse_leg_raise', - '14': 'weighted_reverse_leg_raise', - '15': 'reverse_leg_raise_on_swiss_ball', - '16': 'weighted_reverse_leg_raise_on_swiss_ball', - '17': 'single_leg_lowering_drill', - '18': 'weighted_single_leg_lowering_drill', - '19': 'weighted_hanging_knee_raise', - '20': 'lateral_stepover', - '21': 'weighted_lateral_stepover', - }, - 'lunge_exercise_name': { - '0': 'overhead_lunge', - '1': 'lunge_matrix', - '2': 'weighted_lunge_matrix', - '3': 'alternating_barbell_forward_lunge', - '4': 'alternating_dumbbell_lunge_with_reach', - '5': 'back_foot_elevated_dumbbell_split_squat', - '6': 'barbell_box_lunge', - '7': 'barbell_bulgarian_split_squat', - '8': 'barbell_crossover_lunge', - '9': 'barbell_front_split_squat', - '10': 'barbell_lunge', - '11': 'barbell_reverse_lunge', - '12': 'barbell_side_lunge', - '13': 'barbell_split_squat', - '14': 'core_control_rear_lunge', - '15': 'diagonal_lunge', - '16': 'drop_lunge', - '17': 'dumbbell_box_lunge', - '18': 'dumbbell_bulgarian_split_squat', - '19': 'dumbbell_crossover_lunge', - '20': 'dumbbell_diagonal_lunge', - '21': 'dumbbell_lunge', - '22': 'dumbbell_lunge_and_rotation', - '23': 'dumbbell_overhead_bulgarian_split_squat', - '24': 'dumbbell_reverse_lunge_to_high_knee_and_press', - '25': 'dumbbell_side_lunge', - '26': 'elevated_front_foot_barbell_split_squat', - '27': 'front_foot_elevated_dumbbell_split_squat', - '28': 'gunslinger_lunge', - '29': 'lawnmower_lunge', - '30': 'low_lunge_with_isometric_adduction', - '31': 'low_side_to_side_lunge', - '32': 'lunge', - '33': 'weighted_lunge', - '34': 'lunge_with_arm_reach', - '35': 'lunge_with_diagonal_reach', - '36': 'lunge_with_side_bend', - '37': 'offset_dumbbell_lunge', - '38': 'offset_dumbbell_reverse_lunge', - '39': 'overhead_bulgarian_split_squat', - '40': 'overhead_dumbbell_reverse_lunge', - '41': 'overhead_dumbbell_split_squat', - '42': 'overhead_lunge_with_rotation', - '43': 'reverse_barbell_box_lunge', - '44': 'reverse_box_lunge', - '45': 'reverse_dumbbell_box_lunge', - '46': 'reverse_dumbbell_crossover_lunge', - '47': 'reverse_dumbbell_diagonal_lunge', - '48': 'reverse_lunge_with_reach_back', - '49': 'weighted_reverse_lunge_with_reach_back', - '50': 'reverse_lunge_with_twist_and_overhead_reach', - '51': 'weighted_reverse_lunge_with_twist_and_overhead_reach', - '52': 'reverse_sliding_box_lunge', - '53': 'weighted_reverse_sliding_box_lunge', - '54': 'reverse_sliding_lunge', - '55': 'weighted_reverse_sliding_lunge', - '56': 'runners_lunge_to_balance', - '57': 'weighted_runners_lunge_to_balance', - '58': 'shifting_side_lunge', - '59': 'side_and_crossover_lunge', - '60': 'weighted_side_and_crossover_lunge', - '61': 'side_lunge', - '62': 'weighted_side_lunge', - '63': 'side_lunge_and_press', - '64': 'side_lunge_jump_off', - '65': 'side_lunge_sweep', - '66': 'weighted_side_lunge_sweep', - '67': 'side_lunge_to_crossover_tap', - '68': 'weighted_side_lunge_to_crossover_tap', - '69': 'side_to_side_lunge_chops', - '70': 'weighted_side_to_side_lunge_chops', - '71': 'siff_jump_lunge', - '72': 'weighted_siff_jump_lunge', - '73': 'single_arm_reverse_lunge_and_press', - '74': 'sliding_lateral_lunge', - '75': 'weighted_sliding_lateral_lunge', - '76': 'walking_barbell_lunge', - '77': 'walking_dumbbell_lunge', - '78': 'walking_lunge', - '79': 'weighted_walking_lunge', - '80': 'wide_grip_overhead_barbell_split_squat', - '81': 'alternating_dumbbell_lunge', - '82': 'dumbbell_reverse_lunge', - '83': 'overhead_dumbbell_lunge', - '84': 'scissor_power_switch', - '85': 'dumbbell_overhead_walking_lunge', - '86': 'curtsy_lunge', - '87': 'weighted_curtsy_lunge', - '88': 'weighted_shifting_side_lunge', - '89': 'weighted_side_lunge_and_press', - '90': 'weighted_side_lunge_jump_off', - }, - 'olympic_lift_exercise_name': { - '0': 'barbell_hang_power_clean', - '1': 'barbell_hang_squat_clean', - '2': 'barbell_power_clean', - '3': 'barbell_power_snatch', - '4': 'barbell_squat_clean', - '5': 'clean_and_jerk', - '6': 'barbell_hang_power_snatch', - '7': 'barbell_hang_pull', - '8': 'barbell_high_pull', - '9': 'barbell_snatch', - '10': 'barbell_split_jerk', - '11': 'clean', - '12': 'dumbbell_clean', - '13': 'dumbbell_hang_pull', - '14': 'one_hand_dumbbell_split_snatch', - '15': 'push_jerk', - '16': 'single_arm_dumbbell_snatch', - '17': 'single_arm_hang_snatch', - '18': 'single_arm_kettlebell_snatch', - '19': 'split_jerk', - '20': 'squat_clean_and_jerk', - '21': 'dumbbell_hang_snatch', - '22': 'dumbbell_power_clean_and_jerk', - '23': 'dumbbell_power_clean_and_push_press', - '24': 'dumbbell_power_clean_and_strict_press', - '25': 'dumbbell_snatch', - '26': 'medicine_ball_clean', - '27': 'clean_and_press', - '28': 'snatch', - }, - 'plank_exercise_name': { - '0': '45_degree_plank', - '1': 'weighted_45_degree_plank', - '2': '90_degree_static_hold', - '3': 'weighted_90_degree_static_hold', - '4': 'bear_crawl', - '5': 'weighted_bear_crawl', - '6': 'cross_body_mountain_climber', - '7': 'weighted_cross_body_mountain_climber', - '8': 'elbow_plank_pike_jacks', - '9': 'weighted_elbow_plank_pike_jacks', - '10': 'elevated_feet_plank', - '11': 'weighted_elevated_feet_plank', - '12': 'elevator_abs', - '13': 'weighted_elevator_abs', - '14': 'extended_plank', - '15': 'weighted_extended_plank', - '16': 'full_plank_passe_twist', - '17': 'weighted_full_plank_passe_twist', - '18': 'inching_elbow_plank', - '19': 'weighted_inching_elbow_plank', - '20': 'inchworm_to_side_plank', - '21': 'weighted_inchworm_to_side_plank', - '22': 'kneeling_plank', - '23': 'weighted_kneeling_plank', - '24': 'kneeling_side_plank_with_leg_lift', - '25': 'weighted_kneeling_side_plank_with_leg_lift', - '26': 'lateral_roll', - '27': 'weighted_lateral_roll', - '28': 'lying_reverse_plank', - '29': 'weighted_lying_reverse_plank', - '30': 'medicine_ball_mountain_climber', - '31': 'weighted_medicine_ball_mountain_climber', - '32': 'modified_mountain_climber_and_extension', - '33': 'weighted_modified_mountain_climber_and_extension', - '34': 'mountain_climber', - '35': 'weighted_mountain_climber', - '36': 'mountain_climber_on_sliding_discs', - '37': 'weighted_mountain_climber_on_sliding_discs', - '38': 'mountain_climber_with_feet_on_bosu_ball', - '39': 'weighted_mountain_climber_with_feet_on_bosu_ball', - '40': 'mountain_climber_with_hands_on_bench', - '41': 'mountain_climber_with_hands_on_swiss_ball', - '42': 'weighted_mountain_climber_with_hands_on_swiss_ball', - '43': 'plank', - '44': 'plank_jacks_with_feet_on_sliding_discs', - '45': 'weighted_plank_jacks_with_feet_on_sliding_discs', - '46': 'plank_knee_twist', - '47': 'weighted_plank_knee_twist', - '48': 'plank_pike_jumps', - '49': 'weighted_plank_pike_jumps', - '50': 'plank_pikes', - '51': 'weighted_plank_pikes', - '52': 'plank_to_stand_up', - '53': 'weighted_plank_to_stand_up', - '54': 'plank_with_arm_raise', - '55': 'weighted_plank_with_arm_raise', - '56': 'plank_with_knee_to_elbow', - '57': 'weighted_plank_with_knee_to_elbow', - '58': 'plank_with_oblique_crunch', - '59': 'weighted_plank_with_oblique_crunch', - '60': 'plyometric_side_plank', - '61': 'weighted_plyometric_side_plank', - '62': 'rolling_side_plank', - '63': 'weighted_rolling_side_plank', - '64': 'side_kick_plank', - '65': 'weighted_side_kick_plank', - '66': 'side_plank', - '67': 'weighted_side_plank', - '68': 'side_plank_and_row', - '69': 'weighted_side_plank_and_row', - '70': 'side_plank_lift', - '71': 'weighted_side_plank_lift', - '72': 'side_plank_with_elbow_on_bosu_ball', - '73': 'weighted_side_plank_with_elbow_on_bosu_ball', - '74': 'side_plank_with_feet_on_bench', - '75': 'weighted_side_plank_with_feet_on_bench', - '76': 'side_plank_with_knee_circle', - '77': 'weighted_side_plank_with_knee_circle', - '78': 'side_plank_with_knee_tuck', - '79': 'weighted_side_plank_with_knee_tuck', - '80': 'side_plank_with_leg_lift', - '81': 'weighted_side_plank_with_leg_lift', - '82': 'side_plank_with_reach_under', - '83': 'weighted_side_plank_with_reach_under', - '84': 'single_leg_elevated_feet_plank', - '85': 'weighted_single_leg_elevated_feet_plank', - '86': 'single_leg_flex_and_extend', - '87': 'weighted_single_leg_flex_and_extend', - '88': 'single_leg_side_plank', - '89': 'weighted_single_leg_side_plank', - '90': 'spiderman_plank', - '91': 'weighted_spiderman_plank', - '92': 'straight_arm_plank', - '93': 'weighted_straight_arm_plank', - '94': 'straight_arm_plank_with_shoulder_touch', - '95': 'weighted_straight_arm_plank_with_shoulder_touch', - '96': 'swiss_ball_plank', - '97': 'weighted_swiss_ball_plank', - '98': 'swiss_ball_plank_leg_lift', - '99': 'weighted_swiss_ball_plank_leg_lift', - '100': 'swiss_ball_plank_leg_lift_and_hold', - '101': 'swiss_ball_plank_with_feet_on_bench', - '102': 'weighted_swiss_ball_plank_with_feet_on_bench', - '103': 'swiss_ball_prone_jackknife', - '104': 'weighted_swiss_ball_prone_jackknife', - '105': 'swiss_ball_side_plank', - '106': 'weighted_swiss_ball_side_plank', - '107': 'three_way_plank', - '108': 'weighted_three_way_plank', - '109': 'towel_plank_and_knee_in', - '110': 'weighted_towel_plank_and_knee_in', - '111': 't_stabilization', - '112': 'weighted_t_stabilization', - '113': 'turkish_get_up_to_side_plank', - '114': 'weighted_turkish_get_up_to_side_plank', - '115': 'two_point_plank', - '116': 'weighted_two_point_plank', - '117': 'weighted_plank', - '118': 'wide_stance_plank_with_diagonal_arm_lift', - '119': 'weighted_wide_stance_plank_with_diagonal_arm_lift', - '120': 'wide_stance_plank_with_diagonal_leg_lift', - '121': 'weighted_wide_stance_plank_with_diagonal_leg_lift', - '122': 'wide_stance_plank_with_leg_lift', - '123': 'weighted_wide_stance_plank_with_leg_lift', - '124': 'wide_stance_plank_with_opposite_arm_and_leg_lift', - '125': 'weighted_mountain_climber_with_hands_on_bench', - '126': 'weighted_swiss_ball_plank_leg_lift_and_hold', - '127': 'weighted_wide_stance_plank_with_opposite_arm_and_leg_lift', - '128': 'plank_with_feet_on_swiss_ball', - '129': 'side_plank_to_plank_with_reach_under', - '130': 'bridge_with_glute_lower_lift', - '131': 'bridge_one_leg_bridge', - '132': 'plank_with_arm_variations', - '133': 'plank_with_leg_lift', - '134': 'reverse_plank_with_leg_pull', - '135': 'ring_plank_sprawls', - }, - 'plyo_exercise_name': { - '0': 'alternating_jump_lunge', - '1': 'weighted_alternating_jump_lunge', - '2': 'barbell_jump_squat', - '3': 'body_weight_jump_squat', - '4': 'weighted_jump_squat', - '5': 'cross_knee_strike', - '6': 'weighted_cross_knee_strike', - '7': 'depth_jump', - '8': 'weighted_depth_jump', - '9': 'dumbbell_jump_squat', - '10': 'dumbbell_split_jump', - '11': 'front_knee_strike', - '12': 'weighted_front_knee_strike', - '13': 'high_box_jump', - '14': 'weighted_high_box_jump', - '15': 'isometric_explosive_body_weight_jump_squat', - '16': 'weighted_isometric_explosive_jump_squat', - '17': 'lateral_leap_and_hop', - '18': 'weighted_lateral_leap_and_hop', - '19': 'lateral_plyo_squats', - '20': 'weighted_lateral_plyo_squats', - '21': 'lateral_slide', - '22': 'weighted_lateral_slide', - '23': 'medicine_ball_overhead_throws', - '24': 'medicine_ball_side_throw', - '25': 'medicine_ball_slam', - '26': 'side_to_side_medicine_ball_throws', - '27': 'side_to_side_shuffle_jump', - '28': 'weighted_side_to_side_shuffle_jump', - '29': 'squat_jump_onto_box', - '30': 'weighted_squat_jump_onto_box', - '31': 'squat_jumps_in_and_out', - '32': 'weighted_squat_jumps_in_and_out', - '33': 'box_jump', - '34': 'box_jump_overs', - '35': 'box_jump_overs_over_the_box', - '36': 'star_jump_squats', - '37': 'jump_squat', - }, - 'pull_up_exercise_name': { - '0': 'banded_pull_ups', - '1': '30_degree_lat_pulldown', - '2': 'band_assisted_chin_up', - '3': 'close_grip_chin_up', - '4': 'weighted_close_grip_chin_up', - '5': 'close_grip_lat_pulldown', - '6': 'crossover_chin_up', - '7': 'weighted_crossover_chin_up', - '8': 'ez_bar_pullover', - '9': 'hanging_hurdle', - '10': 'weighted_hanging_hurdle', - '11': 'kneeling_lat_pulldown', - '12': 'kneeling_underhand_grip_lat_pulldown', - '13': 'lat_pulldown', - '14': 'mixed_grip_chin_up', - '15': 'weighted_mixed_grip_chin_up', - '16': 'mixed_grip_pull_up', - '17': 'weighted_mixed_grip_pull_up', - '18': 'reverse_grip_pulldown', - '19': 'standing_cable_pullover', - '20': 'straight_arm_pulldown', - '21': 'swiss_ball_ez_bar_pullover', - '22': 'towel_pull_up', - '23': 'weighted_towel_pull_up', - '24': 'weighted_pull_up', - '25': 'wide_grip_lat_pulldown', - '26': 'wide_grip_pull_up', - '27': 'weighted_wide_grip_pull_up', - '28': 'burpee_pull_up', - '29': 'weighted_burpee_pull_up', - '30': 'jumping_pull_ups', - '31': 'weighted_jumping_pull_ups', - '32': 'kipping_pull_up', - '33': 'weighted_kipping_pull_up', - '34': 'l_pull_up', - '35': 'weighted_l_pull_up', - '36': 'suspended_chin_up', - '37': 'weighted_suspended_chin_up', - '38': 'pull_up', - '39': 'chin_up', - '40': 'neutral_grip_chin_up', - '41': 'weighted_chin_up', - '42': 'band_assisted_pull_up', - '43': 'neutral_grip_pull_up', - '44': 'weighted_neutral_grip_chin_up', - '45': 'weighted_neutral_grip_pull_up', - }, - 'push_up_exercise_name': { - '0': 'chest_press_with_band', - '1': 'alternating_staggered_push_up', - '2': 'weighted_alternating_staggered_push_up', - '3': 'alternating_hands_medicine_ball_push_up', - '4': 'weighted_alternating_hands_medicine_ball_push_up', - '5': 'bosu_ball_push_up', - '6': 'weighted_bosu_ball_push_up', - '7': 'clapping_push_up', - '8': 'weighted_clapping_push_up', - '9': 'close_grip_medicine_ball_push_up', - '10': 'weighted_close_grip_medicine_ball_push_up', - '11': 'close_hands_push_up', - '12': 'weighted_close_hands_push_up', - '13': 'decline_push_up', - '14': 'weighted_decline_push_up', - '15': 'diamond_push_up', - '16': 'weighted_diamond_push_up', - '17': 'explosive_crossover_push_up', - '18': 'weighted_explosive_crossover_push_up', - '19': 'explosive_push_up', - '20': 'weighted_explosive_push_up', - '21': 'feet_elevated_side_to_side_push_up', - '22': 'weighted_feet_elevated_side_to_side_push_up', - '23': 'hand_release_push_up', - '24': 'weighted_hand_release_push_up', - '25': 'handstand_push_up', - '26': 'weighted_handstand_push_up', - '27': 'incline_push_up', - '28': 'weighted_incline_push_up', - '29': 'isometric_explosive_push_up', - '30': 'weighted_isometric_explosive_push_up', - '31': 'judo_push_up', - '32': 'weighted_judo_push_up', - '33': 'kneeling_push_up', - '34': 'weighted_kneeling_push_up', - '35': 'medicine_ball_chest_pass', - '36': 'medicine_ball_push_up', - '37': 'weighted_medicine_ball_push_up', - '38': 'one_arm_push_up', - '39': 'weighted_one_arm_push_up', - '40': 'weighted_push_up', - '41': 'push_up_and_row', - '42': 'weighted_push_up_and_row', - '43': 'push_up_plus', - '44': 'weighted_push_up_plus', - '45': 'push_up_with_feet_on_swiss_ball', - '46': 'weighted_push_up_with_feet_on_swiss_ball', - '47': 'push_up_with_one_hand_on_medicine_ball', - '48': 'weighted_push_up_with_one_hand_on_medicine_ball', - '49': 'shoulder_push_up', - '50': 'weighted_shoulder_push_up', - '51': 'single_arm_medicine_ball_push_up', - '52': 'weighted_single_arm_medicine_ball_push_up', - '53': 'spiderman_push_up', - '54': 'weighted_spiderman_push_up', - '55': 'stacked_feet_push_up', - '56': 'weighted_stacked_feet_push_up', - '57': 'staggered_hands_push_up', - '58': 'weighted_staggered_hands_push_up', - '59': 'suspended_push_up', - '60': 'weighted_suspended_push_up', - '61': 'swiss_ball_push_up', - '62': 'weighted_swiss_ball_push_up', - '63': 'swiss_ball_push_up_plus', - '64': 'weighted_swiss_ball_push_up_plus', - '65': 't_push_up', - '66': 'weighted_t_push_up', - '67': 'triple_stop_push_up', - '68': 'weighted_triple_stop_push_up', - '69': 'wide_hands_push_up', - '70': 'weighted_wide_hands_push_up', - '71': 'parallette_handstand_push_up', - '72': 'weighted_parallette_handstand_push_up', - '73': 'ring_handstand_push_up', - '74': 'weighted_ring_handstand_push_up', - '75': 'ring_push_up', - '76': 'weighted_ring_push_up', - '77': 'push_up', - '78': 'pilates_pushup', - '79': 'dynamic_push_up', - '80': 'kipping_handstand_push_up', - '81': 'shoulder_tapping_push_up', - '82': 'biceps_push_up', - '83': 'hindu_push_up', - '84': 'pike_push_up', - '85': 'wide_grip_push_up', - '86': 'weighted_biceps_push_up', - '87': 'weighted_hindu_push_up', - '88': 'weighted_pike_push_up', - '89': 'kipping_parallette_handstand_push_up', - '90': 'wall_push_up', - }, - 'row_exercise_name': { - '0': 'barbell_straight_leg_deadlift_to_row', - '1': 'cable_row_standing', - '2': 'dumbbell_row', - '3': 'elevated_feet_inverted_row', - '4': 'weighted_elevated_feet_inverted_row', - '5': 'face_pull', - '6': 'face_pull_with_external_rotation', - '7': 'inverted_row_with_feet_on_swiss_ball', - '8': 'weighted_inverted_row_with_feet_on_swiss_ball', - '9': 'kettlebell_row', - '10': 'modified_inverted_row', - '11': 'weighted_modified_inverted_row', - '12': 'neutral_grip_alternating_dumbbell_row', - '13': 'one_arm_bent_over_row', - '14': 'one_legged_dumbbell_row', - '15': 'renegade_row', - '16': 'reverse_grip_barbell_row', - '17': 'rope_handle_cable_row', - '18': 'seated_cable_row', - '19': 'seated_dumbbell_row', - '20': 'single_arm_cable_row', - '21': 'single_arm_cable_row_and_rotation', - '22': 'single_arm_inverted_row', - '23': 'weighted_single_arm_inverted_row', - '24': 'single_arm_neutral_grip_dumbbell_row', - '25': 'single_arm_neutral_grip_dumbbell_row_and_rotation', - '26': 'suspended_inverted_row', - '27': 'weighted_suspended_inverted_row', - '28': 't_bar_row', - '29': 'towel_grip_inverted_row', - '30': 'weighted_towel_grip_inverted_row', - '31': 'underhand_grip_cable_row', - '32': 'v_grip_cable_row', - '33': 'wide_grip_seated_cable_row', - '34': 'alternating_dumbbell_row', - '35': 'inverted_row', - '36': 'row', - '37': 'weighted_row', - '38': 'indoor_row', - '39': 'banded_face_pulls', - '40': 'chest_supported_dumbbell_row', - '41': 'decline_ring_row', - '42': 'elevated_ring_row', - '43': 'rdl_bent_over_row_with_barbell_dumbbell', - '44': 'ring_row', - '45': 'barbell_row', - '46': 'bent_over_row_with_barbell', - '47': 'bent_over_row_with_dumbell', - '48': 'seated_underhand_grip_cable_row', - '49': 'trx_inverted_row', - '50': 'weighted_inverted_row', - '51': 'weighted_trx_inverted_row', - '52': 'dumbbell_row_wheelchair', - }, - 'shoulder_press_exercise_name': { - '0': 'alternating_dumbbell_shoulder_press', - '1': 'arnold_press', - '2': 'barbell_front_squat_to_push_press', - '3': 'barbell_push_press', - '4': 'barbell_shoulder_press', - '5': 'dead_curl_press', - '6': 'dumbbell_alternating_shoulder_press_and_twist', - '7': 'dumbbell_hammer_curl_to_lunge_to_press', - '8': 'dumbbell_push_press', - '9': 'floor_inverted_shoulder_press', - '10': 'weighted_floor_inverted_shoulder_press', - '11': 'inverted_shoulder_press', - '12': 'weighted_inverted_shoulder_press', - '13': 'one_arm_push_press', - '14': 'overhead_barbell_press', - '15': 'overhead_dumbbell_press', - '16': 'seated_barbell_shoulder_press', - '17': 'seated_dumbbell_shoulder_press', - '18': 'single_arm_dumbbell_shoulder_press', - '19': 'single_arm_step_up_and_press', - '20': 'smith_machine_overhead_press', - '21': 'split_stance_hammer_curl_to_press', - '22': 'swiss_ball_dumbbell_shoulder_press', - '23': 'weight_plate_front_raise', - '24': 'dumbbell_shoulder_press', - '25': 'military_press', - '27': 'strict_press', - '28': 'dumbbell_front_raise', - '29': 'dumbbell_curl_to_overhead_press_wheelchair', - '30': 'arnold_press_wheelchair', - '31': 'overhead_dumbbell_press_wheelchair', - }, - 'shoulder_stability_exercise_name': { - '0': '90_degree_cable_external_rotation', - '1': 'band_external_rotation', - '2': 'band_internal_rotation', - '3': 'bent_arm_lateral_raise_and_external_rotation', - '4': 'cable_external_rotation', - '5': 'dumbbell_face_pull_with_external_rotation', - '6': 'floor_i_raise', - '7': 'weighted_floor_i_raise', - '8': 'floor_t_raise', - '9': 'weighted_floor_t_raise', - '10': 'floor_y_raise', - '11': 'weighted_floor_y_raise', - '12': 'incline_i_raise', - '13': 'weighted_incline_i_raise', - '14': 'incline_l_raise', - '15': 'weighted_incline_l_raise', - '16': 'incline_t_raise', - '17': 'weighted_incline_t_raise', - '18': 'incline_w_raise', - '19': 'weighted_incline_w_raise', - '20': 'incline_y_raise', - '21': 'weighted_incline_y_raise', - '22': 'lying_external_rotation', - '23': 'seated_dumbbell_external_rotation', - '24': 'standing_l_raise', - '25': 'swiss_ball_i_raise', - '26': 'weighted_swiss_ball_i_raise', - '27': 'swiss_ball_t_raise', - '28': 'weighted_swiss_ball_t_raise', - '29': 'swiss_ball_w_raise', - '30': 'weighted_swiss_ball_w_raise', - '31': 'swiss_ball_y_raise', - '32': 'weighted_swiss_ball_y_raise', - '33': 'cable_internal_rotation', - '34': 'lying_internal_rotation', - '35': 'seated_dumbbell_internal_rotation', - }, - 'shrug_exercise_name': { - '0': 'barbell_jump_shrug', - '1': 'barbell_shrug', - '2': 'barbell_upright_row', - '3': 'behind_the_back_smith_machine_shrug', - '4': 'dumbbell_jump_shrug', - '5': 'dumbbell_shrug', - '6': 'dumbbell_upright_row', - '7': 'incline_dumbbell_shrug', - '8': 'overhead_barbell_shrug', - '9': 'overhead_dumbbell_shrug', - '10': 'scaption_and_shrug', - '11': 'scapular_retraction', - '12': 'serratus_chair_shrug', - '13': 'weighted_serratus_chair_shrug', - '14': 'serratus_shrug', - '15': 'weighted_serratus_shrug', - '16': 'wide_grip_jump_shrug', - '17': 'wide_grip_barbell_shrug', - '18': 'behind_the_back_shrug', - '19': 'dumbbell_shrug_wheelchair', - '20': 'shrug_wheelchair', - '21': 'shrug_arm_down_wheelchair', - '22': 'shrug_arm_mid_wheelchair', - '23': 'shrug_arm_up_wheelchair', - '24': 'upright_row', - }, - 'sit_up_exercise_name': { - '0': 'alternating_sit_up', - '1': 'weighted_alternating_sit_up', - '2': 'bent_knee_v_up', - '3': 'weighted_bent_knee_v_up', - '4': 'butterfly_sit_up', - '5': 'weighted_butterfly_situp', - '6': 'cross_punch_roll_up', - '7': 'weighted_cross_punch_roll_up', - '8': 'crossed_arms_sit_up', - '9': 'weighted_crossed_arms_sit_up', - '10': 'get_up_sit_up', - '11': 'weighted_get_up_sit_up', - '12': 'hovering_sit_up', - '13': 'weighted_hovering_sit_up', - '14': 'kettlebell_sit_up', - '15': 'medicine_ball_alternating_v_up', - '16': 'medicine_ball_sit_up', - '17': 'medicine_ball_v_up', - '18': 'modified_sit_up', - '19': 'negative_sit_up', - '20': 'one_arm_full_sit_up', - '21': 'reclining_circle', - '22': 'weighted_reclining_circle', - '23': 'reverse_curl_up', - '24': 'weighted_reverse_curl_up', - '25': 'single_leg_swiss_ball_jackknife', - '26': 'weighted_single_leg_swiss_ball_jackknife', - '27': 'the_teaser', - '28': 'the_teaser_weighted', - '29': 'three_part_roll_down', - '30': 'weighted_three_part_roll_down', - '31': 'v_up', - '32': 'weighted_v_up', - '33': 'weighted_russian_twist_on_swiss_ball', - '34': 'weighted_sit_up', - '35': 'x_abs', - '36': 'weighted_x_abs', - '37': 'sit_up', - '38': 'ghd_sit_ups', - '39': 'sit_up_turkish_get_up', - '40': 'russian_twist_on_swiss_ball', - }, - 'squat_exercise_name': { - '0': 'leg_press', - '1': 'back_squat_with_body_bar', - '2': 'back_squats', - '3': 'weighted_back_squats', - '4': 'balancing_squat', - '5': 'weighted_balancing_squat', - '6': 'barbell_back_squat', - '7': 'barbell_box_squat', - '8': 'barbell_front_squat', - '9': 'barbell_hack_squat', - '10': 'barbell_hang_squat_snatch', - '11': 'barbell_lateral_step_up', - '12': 'barbell_quarter_squat', - '13': 'barbell_siff_squat', - '14': 'barbell_squat_snatch', - '15': 'barbell_squat_with_heels_raised', - '16': 'barbell_stepover', - '17': 'barbell_step_up', - '18': 'bench_squat_with_rotational_chop', - '19': 'weighted_bench_squat_with_rotational_chop', - '20': 'body_weight_wall_squat', - '21': 'weighted_wall_squat', - '22': 'box_step_squat', - '23': 'weighted_box_step_squat', - '24': 'braced_squat', - '25': 'crossed_arm_barbell_front_squat', - '26': 'crossover_dumbbell_step_up', - '27': 'dumbbell_front_squat', - '28': 'dumbbell_split_squat', - '29': 'dumbbell_squat', - '30': 'dumbbell_squat_clean', - '31': 'dumbbell_stepover', - '32': 'dumbbell_step_up', - '33': 'elevated_single_leg_squat', - '34': 'weighted_elevated_single_leg_squat', - '35': 'figure_four_squats', - '36': 'weighted_figure_four_squats', - '37': 'goblet_squat', - '38': 'kettlebell_squat', - '39': 'kettlebell_swing_overhead', - '40': 'kettlebell_swing_with_flip_to_squat', - '41': 'lateral_dumbbell_step_up', - '42': 'one_legged_squat', - '43': 'overhead_dumbbell_squat', - '44': 'overhead_squat', - '45': 'partial_single_leg_squat', - '46': 'weighted_partial_single_leg_squat', - '47': 'pistol_squat', - '48': 'weighted_pistol_squat', - '49': 'plie_slides', - '50': 'weighted_plie_slides', - '51': 'plie_squat', - '52': 'weighted_plie_squat', - '53': 'prisoner_squat', - '54': 'weighted_prisoner_squat', - '55': 'single_leg_bench_get_up', - '56': 'weighted_single_leg_bench_get_up', - '57': 'single_leg_bench_squat', - '58': 'weighted_single_leg_bench_squat', - '59': 'single_leg_squat_on_swiss_ball', - '60': 'weighted_single_leg_squat_on_swiss_ball', - '61': 'squat', - '62': 'weighted_squat', - '63': 'squats_with_band', - '64': 'staggered_squat', - '65': 'weighted_staggered_squat', - '66': 'step_up', - '67': 'weighted_step_up', - '68': 'suitcase_squats', - '69': 'sumo_squat', - '70': 'sumo_squat_slide_in', - '71': 'weighted_sumo_squat_slide_in', - '72': 'sumo_squat_to_high_pull', - '73': 'sumo_squat_to_stand', - '74': 'weighted_sumo_squat_to_stand', - '75': 'sumo_squat_with_rotation', - '76': 'weighted_sumo_squat_with_rotation', - '77': 'swiss_ball_body_weight_wall_squat', - '78': 'weighted_swiss_ball_wall_squat', - '79': 'thrusters', - '80': 'uneven_squat', - '81': 'weighted_uneven_squat', - '82': 'waist_slimming_squat', - '83': 'wall_ball', - '84': 'wide_stance_barbell_squat', - '85': 'wide_stance_goblet_squat', - '86': 'zercher_squat', - '87': 'kbs_overhead', # Deprecated do not use - '88': 'squat_and_side_kick', - '89': 'squat_jumps_in_n_out', - '90': 'pilates_plie_squats_parallel_turned_out_flat_and_heels', - '91': 'releve_straight_leg_and_knee_bent_with_one_leg_variation', - '92': 'alternating_box_dumbbell_step_ups', - '93': 'dumbbell_overhead_squat_single_arm', - '94': 'dumbbell_squat_snatch', - '95': 'medicine_ball_squat', - '97': 'wall_ball_squat_and_press', - '98': 'squat_american_swing', - '100': 'air_squat', - '101': 'dumbbell_thrusters', - '102': 'overhead_barbell_squat', - }, - 'total_body_exercise_name': { - '0': 'burpee', - '1': 'weighted_burpee', - '2': 'burpee_box_jump', - '3': 'weighted_burpee_box_jump', - '4': 'high_pull_burpee', - '5': 'man_makers', - '6': 'one_arm_burpee', - '7': 'squat_thrusts', - '8': 'weighted_squat_thrusts', - '9': 'squat_plank_push_up', - '10': 'weighted_squat_plank_push_up', - '11': 'standing_t_rotation_balance', - '12': 'weighted_standing_t_rotation_balance', - '13': 'barbell_burpee', - '15': 'burpee_box_jump_over_yes_literally_jumping_over_the_box', - '16': 'burpee_box_jump_step_up_over', - '17': 'lateral_barbell_burpee', - '18': 'total_body_burpee_over_bar', - '19': 'burpee_box_jump_over', - '20': 'burpee_wheelchair', - }, - 'move_exercise_name': { - '0': 'arch_and_curl', - '1': 'arm_circles_with_ball_band_and_weight', - '2': 'arm_stretch', - '3': 'back_massage', - '4': 'belly_breathing', - '5': 'bridge_with_ball', - '6': 'diamond_leg_crunch', - '7': 'diamond_leg_lift', - '8': 'eight_point_shoulder_opener', - '9': 'foot_rolling', - '10': 'footwork', - '11': 'footwork_on_disc', - '12': 'forward_fold', - '13': 'frog_with_band', - '14': 'half_roll_up', - '15': 'hamstring_curl', - '16': 'hamstring_stretch', - '17': 'hip_stretch', - '18': 'hug_a_tree_with_ball_band_and_weight', - '19': 'knee_circles', - '20': 'knee_folds_on_disc', - '21': 'lateral_flexion', - '22': 'leg_stretch_with_band', - '23': 'leg_stretch_with_leg_circles', - '24': 'lower_lift_on_disc', - '25': 'lunge_squat', - '26': 'lunges_with_knee_lift', - '27': 'mermaid_stretch', - '28': 'neutral_pelvic_position', - '29': 'pelvic_clocks_on_disc', - '30': 'pilates_plie_squats_parallel_turned_out_flat_and_heels_with_chair', - '31': 'piriformis_stretch', - '32': 'plank_knee_crosses', - '33': 'plank_knee_pulls', - '34': 'plank_up_downs', - '35': 'prayer_mudra', - '36': 'psoas_lunge_stretch', - '37': 'ribcage_breathing', - '38': 'roll_down', - '39': 'roll_up_with_weight_and_band', - '40': 'saw', - '41': 'scapular_stabilization', - '42': 'scissors_on_disc', - '43': 'seated_hip_stretchup', - '44': 'seated_twist', - '45': 'shaving_the_head_with_ball_band_and_weight', - '46': 'spinal_twist', - '47': 'spinal_twist_stretch', - '48': 'spine_stretch_forward', - '49': 'squat_open_arm_twist_pose', - '50': 'squats_with_ball', - '51': 'stand_and_hang', - '52': 'standing_side_stretch', - '53': 'standing_single_leg_forward_bend_with_it_band_opener', - '54': 'straight_leg_crunch_with_leg_lift', - '55': 'straight_leg_crunch_with_leg_lift_with_ball', - '56': 'straight_leg_crunch_with_legs_crossed', - '57': 'straight_leg_crunch_with_legs_crossed_with_ball', - '58': 'straight_leg_diagonal_crunch', - '59': 'straight_leg_diagonal_crunch_with_ball', - '60': 'tailbone_curl', - '61': 'throat_lock', - '62': 'tick_tock_side_roll', - '63': 'twist', - '64': 'v_leg_crunches', - '65': 'v_sit', - '66': 'forward_fold_wheelchair', - '67': 'forward_fold_plus_wheelchair', - '68': 'arm_circles_low_forward_wheelchair', - '69': 'arm_circles_mid_forward_wheelchair', - '70': 'arm_circles_high_forward_wheelchair', - '71': 'arm_circles_low_backward_wheelchair', - '72': 'arm_circles_mid_backward_wheelchair', - '73': 'arm_circles_high_backward_wheelchair', - '74': 'core_twists_wheelchair', - '75': 'arm_raise_wheelchair', - '76': 'chest_expand_wheelchair', - '77': 'arm_extend_wheelchair', - '78': 'forward_bend_wheelchair', - '79': 'toe_touch_wheelchair', - '80': 'extended_toe_touch_wheelchair', - '81': 'seated_arm_circles', - '82': 'trunk_rotations', - '83': 'seated_trunk_rotations', - '84': 'toe_touch', - }, - 'pose_exercise_name': { - '0': 'all_fours', - '1': 'ankle_to_knee', - '2': 'baby_cobra', - '3': 'boat', - '4': 'bound_angle', - '5': 'bound_seated_single_leg_forward_bend', - '6': 'bow', - '7': 'bowed_half_moon', - '8': 'bridge', - '9': 'cat', - '10': 'chair', - '11': 'childs', - '12': 'corpse', - '13': 'cow_face', - '14': 'cow', - '15': 'devotional_warrior', - '16': 'dolphin_plank', - '17': 'dolphin', - '18': 'down_dog_knee_to_nose', - '19': 'down_dog_split', - '20': 'down_dog_split_open_hip_bent_knee', - '21': 'downward_facing_dog', - '22': 'eagle', - '23': 'easy_seated', - '24': 'extended_puppy', - '25': 'extended_side_angle', - '26': 'fish', - '27': 'four_limbed_staff', - '28': 'full_split', - '29': 'gate', - '30': 'half_chair_half_ankle_to_knee', - '31': 'half_moon', - '32': 'head_to_knee', - '33': 'heron', - '34': 'heros', - '35': 'high_lunge', - '36': 'knees_chest_chin', - '37': 'lizard', - '38': 'locust', - '39': 'low_lunge', - '40': 'low_lunge_twist', - '41': 'low_lunge_with_knee_down', - '42': 'mermaid', - '43': 'mountain', - '44': 'one_legged_downward_facing_pose_open_hip_bent_knee', - '45': 'one_legged_pigeon', - '46': 'peaceful_warrior', - '47': 'plank', - '48': 'plow', - '49': 'reclined_hand_to_foot', - '50': 'revolved_half_moon', - '51': 'revolved_head_to_knee', - '52': 'revolved_triangle', - '53': 'runners_lunge', - '54': 'seated_easy_side_bend', - '55': 'seated_easy_twist', - '56': 'seated_long_leg_forward_bend', - '57': 'seated_wide_leg_forward_bend', - '58': 'shoulder_stand', - '59': 'side_boat', - '60': 'side_plank', - '61': 'sphinx', - '62': 'squat_open_arm_twist', - '63': 'squat_palm_press', - '64': 'staff', - '65': 'standing_arms_up', - '66': 'standing_forward_bend_halfway_up', - '67': 'standing_forward_bend', - '68': 'standing_side_opener', - '69': 'standing_single_leg_forward_bend', - '70': 'standing_split', - '71': 'standing_wide_leg_forward_bend', - '72': 'standing_wide_leg_forward_bend_with_twist', - '73': 'supine_spinal_twist', - '74': 'table_top', - '75': 'thread_the_needle', - '76': 'thunderbolt', - '77': 'thunderbolt_pose_both_sides_arm_stretch', - '78': 'tree', - '79': 'triangle', - '80': 'up_dog', - '81': 'upward_facing_plank', - '82': 'warrior_one', - '83': 'warrior_three', - '84': 'warrior_two', - '85': 'wheel', - '86': 'wide_side_lunge', - '87': 'deep_breathing_wheelchair', - '88': 'deep_breathing_low_wheelchair', - '89': 'deep_breathing_mid_wheelchair', - '90': 'deep_breathing_high_wheelchair', - '91': 'prayer_wheelchair', - '92': 'overhead_prayer_wheelchair', - '93': 'cactus_wheelchair', - '94': 'breathing_punches_wheelchair', - '95': 'breathing_punches_extended_wheelchair', - '96': 'breathing_punches_overhead_wheelchair', - '97': 'breathing_punches_overhead_and_down_wheelchair', - '98': 'breathing_punches_side_wheelchair', - '99': 'breathing_punches_extended_side_wheelchair', - '100': 'breathing_punches_overhead_side_wheelchair', - '101': 'breathing_punches_overhead_and_down_side_wheelchair', - '102': 'left_hand_back_wheelchair', - '103': 'triangle_wheelchair', - '104': 'thread_the_needle_wheelchair', - '105': 'neck_flexion_and_extension_wheelchair', - '106': 'neck_lateral_flexion_wheelchair', - '107': 'spine_flexion_and_extension_wheelchair', - '108': 'spine_rotation_wheelchair', - '109': 'spine_lateral_flexion_wheelchair', - '110': 'alternative_skiing_wheelchair', - '111': 'reach_forward_wheelchair', - '112': 'warrior_wheelchair', - '113': 'reverse_warrior_wheelchair', - '114': 'downward_facing_dog_to_cobra', - '115': 'seated_cat_cow', - }, - 'triceps_extension_exercise_name': { - '0': 'bench_dip', - '1': 'weighted_bench_dip', - '2': 'body_weight_dip', - '3': 'cable_kickback', - '4': 'cable_lying_triceps_extension', - '5': 'cable_overhead_triceps_extension', - '6': 'dumbbell_kickback', - '7': 'dumbbell_lying_triceps_extension', - '8': 'ez_bar_overhead_triceps_extension', - '9': 'incline_dip', - '10': 'weighted_incline_dip', - '11': 'incline_ez_bar_lying_triceps_extension', - '12': 'lying_dumbbell_pullover_to_extension', - '13': 'lying_ez_bar_triceps_extension', - '14': 'lying_triceps_extension_to_close_grip_bench_press', - '15': 'overhead_dumbbell_triceps_extension', - '16': 'reclining_triceps_press', - '17': 'reverse_grip_pressdown', - '18': 'reverse_grip_triceps_pressdown', - '19': 'rope_pressdown', - '20': 'seated_barbell_overhead_triceps_extension', - '21': 'seated_dumbbell_overhead_triceps_extension', - '22': 'seated_ez_bar_overhead_triceps_extension', - '23': 'seated_single_arm_overhead_dumbbell_extension', - '24': 'single_arm_dumbbell_overhead_triceps_extension', - '25': 'single_dumbbell_seated_overhead_triceps_extension', - '26': 'single_leg_bench_dip_and_kick', - '27': 'weighted_single_leg_bench_dip_and_kick', - '28': 'single_leg_dip', - '29': 'weighted_single_leg_dip', - '30': 'static_lying_triceps_extension', - '31': 'suspended_dip', - '32': 'weighted_suspended_dip', - '33': 'swiss_ball_dumbbell_lying_triceps_extension', - '34': 'swiss_ball_ez_bar_lying_triceps_extension', - '35': 'swiss_ball_ez_bar_overhead_triceps_extension', - '36': 'tabletop_dip', - '37': 'weighted_tabletop_dip', - '38': 'triceps_extension_on_floor', - '39': 'triceps_pressdown', - '40': 'weighted_dip', - '41': 'alternating_dumbbell_lying_triceps_extension', - '42': 'triceps_press', - '43': 'dumbbell_kickback_wheelchair', - '44': 'overhead_dumbbell_triceps_extension_wheelchair', - }, - 'warm_up_exercise_name': { - '0': 'quadruped_rocking', - '1': 'neck_tilts', - '2': 'ankle_circles', - '3': 'ankle_dorsiflexion_with_band', - '4': 'ankle_internal_rotation', - '5': 'arm_circles', - '6': 'bent_over_reach_to_sky', - '7': 'cat_camel', - '8': 'elbow_to_foot_lunge', - '9': 'forward_and_backward_leg_swings', - '10': 'groiners', - '11': 'inverted_hamstring_stretch', - '12': 'lateral_duck_under', - '13': 'neck_rotations', - '14': 'opposite_arm_and_leg_balance', - '15': 'reach_roll_and_lift', - '16': 'scorpion', # Deprecated do not use - '17': 'shoulder_circles', - '18': 'side_to_side_leg_swings', - '19': 'sleeper_stretch', - '20': 'slide_out', - '21': 'swiss_ball_hip_crossover', - '22': 'swiss_ball_reach_roll_and_lift', - '23': 'swiss_ball_windshield_wipers', - '24': 'thoracic_rotation', - '25': 'walking_high_kicks', - '26': 'walking_high_knees', - '27': 'walking_knee_hugs', - '28': 'walking_leg_cradles', - '29': 'walkout', - '30': 'walkout_from_push_up_position', - '31': 'biceps_stretch', - '32': 'glutes_stretch', - '33': 'standing_hamstring_stretch', - '34': 'stretch_90_90', - '35': 'stretch_abs', - '36': 'stretch_butterfly', - '37': 'stretch_calf', - '38': 'stretch_cat_cow', - '39': 'stretch_childs_pose', - '40': 'stretch_cobra', - '41': 'stretch_forearms', - '42': 'stretch_forward_glutes', - '43': 'stretch_front_split', - '44': 'stretch_hamstring', - '45': 'stretch_hip_flexor_and_quad', - '46': 'stretch_lat', - '47': 'stretch_levator_scapulae', - '48': 'stretch_lunge_with_spinal_twist', - '49': 'stretch_lunging_hip_flexor', - '50': 'stretch_lying_abduction', - '51': 'stretch_lying_it_band', - '52': 'stretch_lying_knee_to_chest', - '53': 'stretch_lying_piriformis', - '54': 'stretch_lying_spinal_twist', - '55': 'stretch_neck', - '56': 'stretch_obliques', - '57': 'stretch_over_under_shoulder', - '58': 'stretch_pectoral', - '59': 'stretch_pigeon_pose', - '60': 'stretch_piriformis', - '61': 'stretch_quad', - '62': 'stretch_scorpion', - '63': 'stretch_shoulder', - '64': 'stretch_side', - '65': 'stretch_side_lunge', - '66': 'stretch_side_split', - '67': 'stretch_standing_it_band', - '68': 'stretch_straddle', - '69': 'stretch_triceps', - '70': 'stretch_wall_chest_and_shoulder', - '71': 'neck_rotations_wheelchair', - '72': 'half_kneeling_arm_rotation', - '73': 'three_way_ankle_mobilization', - '74': 'ninety_ninety_hip_switch', # 90_90_hip_switch - '75': 'active_frog', - '76': 'shoulder_sweeps', - '77': 'ankle_lunges', - '78': 'back_roll_foam_roller', - '79': 'bear_crawl', - '80': 'latissimus_dorsi_foam_roll', - '81': 'reverse_t_hip_opener', - '82': 'shoulder_rolls', - '83': 'chest_openers', - '84': 'triceps_stretch', - '85': 'upper_back_stretch', - '86': 'hip_circles', - '87': 'ankle_stretch', - '88': 'marching_in_place', - '89': 'triceps_stretch_wheelchair', - '90': 'upper_back_stretch_wheelchair', - }, - 'run_exercise_name': { - '0': 'run', - '1': 'walk', - '2': 'jog', - '3': 'sprint', - '4': 'run_or_walk', - '5': 'speed_walk', - '6': 'warm_up', - }, - 'bike_exercise_name': { - '0': 'bike', - '1': 'ride', - '2': 'sprint', - }, - 'banded_exercises_exercise_name': { - '1': 'ab_twist', - '2': 'back_extension', - '3': 'bicycle_crunch', - '4': 'calf_raises', - '5': 'chest_press', - '6': 'clam_shells', - '7': 'curl', - '8': 'deadbug', - '9': 'deadlift', - '10': 'donkey_kick', - '11': 'external_rotation', - '12': 'external_rotation_at_90_degree_abduction', - '13': 'face_pull', - '14': 'fire_hydrant', - '15': 'fly', - '16': 'front_raise', - '17': 'glute_bridge', - '18': 'hamstring_curls', - '19': 'high_plank_leg_lifts', - '20': 'hip_extension', - '21': 'internal_rotation', - '22': 'jumping_jack', - '23': 'kneeling_crunch', - '24': 'lateral_band_walks', - '25': 'lateral_raise', - '26': 'latpull', - '27': 'leg_abduction', - '28': 'leg_adduction', - '29': 'leg_extension', - '30': 'lunge', - '31': 'plank', - '32': 'pull_apart', - '33': 'push_ups', - '34': 'reverse_crunch', - '35': 'row', - '36': 'shoulder_abduction', - '37': 'shoulder_extension', - '38': 'shoulder_external_rotation', - '39': 'shoulder_flexion_to_90_degrees', - '40': 'side_plank_leg_lifts', - '41': 'side_raise', - '42': 'squat', - '43': 'squat_to_press', - '44': 'tricep_extension', - '45': 'tricep_kickback', - '46': 'upright_row', - '47': 'wall_crawl_with_external_rotation', - '49': 'lateral_raise_wheelchair', - '50': 'triceps_extension_wheelchair', - '51': 'chest_fly_incline_wheelchair', - '52': 'chest_fly_decline_wheelchair', - '53': 'pull_down_wheelchair', - '54': 'straight_arm_pull_down_wheelchair', - '55': 'curl_wheelchair', - '56': 'overhead_curl_wheelchair', - '57': 'face_pull_wheelchair', - '58': 'around_the_world_wheelchair', - '59': 'pull_apart_wheelchair', - '60': 'side_curl_wheelchair', - '61': 'overhead_press_wheelchair', - }, - 'battle_rope_exercise_name': { - '0': 'alternating_figure_eight', - '1': 'alternating_jump_wave', - '2': 'alternating_kneeling_to_standing_wave', - '3': 'alternating_lunge_wave', - '4': 'alternating_squat_wave', - '5': 'alternating_wave', - '6': 'alternating_wave_with_lateral_shuffle', - '7': 'clap_wave', - '8': 'double_arm_figure_eight', - '9': 'double_arm_side_to_side_snake', - '10': 'double_arm_side_wave', - '11': 'double_arm_slam', - '12': 'double_arm_wave', - '13': 'grappler_toss', - '14': 'hip_toss', - '15': 'in_and_out_wave', - '16': 'inside_circle', - '17': 'jumping_jacks', - '18': 'outside_circle', - '19': 'rainbow', - '20': 'side_plank_wave', - '21': 'sidewinder', - '22': 'sitting_russian_twist', - '23': 'snake_wave', - '24': 'split_jack', - '25': 'stage_coach', - '26': 'ultimate_warrior', - '27': 'upper_cuts', - }, - 'elliptical_exercise_name': { - '0': 'elliptical', - }, - 'floor_climb_exercise_name': { - '0': 'floor_climb', - }, - 'indoor_bike_exercise_name': { - '0': 'air_bike', - '1': 'assault_bike', - '3': 'stationary_bike', - }, - 'indoor_row_exercise_name': { - '0': 'rowing_machine', - }, - 'ladder_exercise_name': { - '0': 'agility', - '1': 'speed', - }, - 'sandbag_exercise_name': { - '0': 'around_the_world', - '1': 'back_squat', - '2': 'bear_crawl_pull_through', - '3': 'bear_hug_squat', - '4': 'clean', - '5': 'clean_and_press', - '6': 'curl', - '7': 'front_carry', - '8': 'front_squat', - '9': 'lunge', - '10': 'overhead_press', - '11': 'plank_pull_through', - '12': 'rotational_lunge', - '13': 'row', - '14': 'russian_twist', - '15': 'shouldering', - '16': 'shoveling', - '17': 'side_lunge', - '18': 'sprint', - '19': 'zercher_squat', - }, - 'sled_exercise_name': { - '0': 'backward_drag', - '1': 'chest_press', - '2': 'forward_drag', - '3': 'low_push', - '4': 'push', - '5': 'row', - }, - 'sledge_hammer_exercise_name': { - '0': 'lateral_swing', - '1': 'hammer_slam', - }, - 'stair_stepper_exercise_name': { - '0': 'stair_stepper', - }, - 'suspension_exercise_name': { - '0': 'chest_fly', - '1': 'chest_press', - '2': 'crunch', - '3': 'curl', - '4': 'dip', - '5': 'face_pull', - '6': 'glute_bridge', - '7': 'hamstring_curl', - '8': 'hip_drop', - '9': 'inverted_row', - '10': 'knee_drive_jump', - '11': 'knee_to_chest', - '12': 'lat_pullover', - '13': 'lunge', - '14': 'mountain_climber', - '15': 'pendulum', - '16': 'pike', - '17': 'plank', - '18': 'power_pull', - '19': 'pull_up', - '20': 'push_up', - '21': 'reverse_mountain_climber', - '22': 'reverse_plank', - '23': 'rollout', - '24': 'row', - '25': 'side_lunge', - '26': 'side_plank', - '27': 'single_leg_deadlift', - '28': 'single_leg_squat', - '29': 'sit_up', - '30': 'split', - '31': 'squat', - '32': 'squat_jump', - '33': 'tricep_press', - '34': 'y_fly', - }, - 'tire_exercise_name': { - '0': 'flip', - }, - 'bike_outdoor_exercise_name': { - '0': 'bike', - }, - 'run_indoor_exercise_name': { - '0': 'indoor_track_run', - '1': 'treadmill', - }, - 'water_type': { - '0': 'fresh', - '1': 'salt', - '2': 'en13319', - '3': 'custom', - }, - 'tissue_model_type': { - '0': 'zhl_16c', # Buhlmann's decompression algorithm, version C - }, - 'dive_gas_status': { - '0': 'disabled', - '1': 'enabled', - '2': 'backup_only', - }, - 'dive_alert': { - '0': 'ndl_reached', - '1': 'gas_switch_prompted', - '2': 'near_surface', - '3': 'approaching_ndl', - '4': 'po2_warn', - '5': 'po2_crit_high', - '6': 'po2_crit_low', - '7': 'time_alert', - '8': 'depth_alert', - '9': 'deco_ceiling_broken', - '10': 'deco_complete', - '11': 'safety_stop_broken', - '12': 'safety_stop_complete', - '13': 'cns_warning', - '14': 'cns_critical', - '15': 'otu_warning', - '16': 'otu_critical', - '17': 'ascent_critical', - '18': 'alert_dismissed_by_key', - '19': 'alert_dismissed_by_timeout', - '20': 'battery_low', - '21': 'battery_critical', - '22': 'safety_stop_started', - '23': 'approaching_first_deco_stop', - '24': 'setpoint_switch_auto_low', - '25': 'setpoint_switch_auto_high', - '26': 'setpoint_switch_manual_low', - '27': 'setpoint_switch_manual_high', - '28': 'auto_setpoint_switch_ignored', - '29': 'switched_to_open_circuit', - '30': 'switched_to_closed_circuit', - '32': 'tank_battery_low', - '33': 'po2_ccr_dil_low', # ccr diluent has low po2 - '34': 'deco_stop_cleared', # a deco stop has been cleared - '35': 'apnea_neutral_buoyancy', # Target Depth Apnea Alarm triggered - '36': 'apnea_target_depth', # Neutral Buoyance Apnea Alarm triggered - '37': 'apnea_surface', # Surface Apnea Alarm triggered - '38': 'apnea_high_speed', # High Speed Apnea Alarm triggered - '39': 'apnea_low_speed', # Low Speed Apnea Alarm triggered - }, - 'dive_alarm_type': { - '0': 'depth', # Alarm when a certain depth is crossed - '1': 'time', # Alarm when a certain time has transpired - '2': 'speed', # Alarm when a certain ascent or descent rate is exceeded - }, - 'dive_backlight_mode': { - '0': 'at_depth', - '1': 'always_on', - }, - 'sleep_level': { - '0': 'unmeasurable', - '1': 'awake', - '2': 'light', - '3': 'deep', - '4': 'rem', - }, - 'spo2_measurement_type': { - '0': 'off_wrist', - '1': 'spot_check', - '2': 'continuous_check', - '3': 'periodic', - }, - 'ccr_setpoint_switch_mode': { - '0': 'manual', # User switches setpoints manually - '1': 'automatic', # Switch automatically based on depth - }, - 'dive_gas_mode': { - '0': 'open_circuit', - '1': 'closed_circuit_diluent', - }, - 'projectile_type': { - '0': 'arrow', # Arrow projectile type - '1': 'rifle_cartridge', # Rifle cartridge projectile type - '2': 'pistol_cartridge', # Pistol cartridge projectile type - '3': 'shotshell', # Shotshell projectile type - '4': 'air_rifle_pellet', # Air rifle pellet projectile type - '5': 'other', # Other projectile type - }, - 'favero_product': { - '10': 'assioma_uno', - '12': 'assioma_duo', - }, - 'split_type': { - '1': 'ascent_split', - '2': 'descent_split', - '3': 'interval_active', - '4': 'interval_rest', - '5': 'interval_warmup', - '6': 'interval_cooldown', - '7': 'interval_recovery', - '8': 'interval_other', - '9': 'climb_active', - '10': 'climb_rest', - '11': 'surf_active', - '12': 'run_active', - '13': 'run_rest', - '14': 'workout_round', - '17': 'rwd_run', # run/walk detection running - '18': 'rwd_walk', # run/walk detection walking - '21': 'windsurf_active', - '22': 'rwd_stand', # run/walk detection standing - '23': 'transition', # Marks the time going from ascent_split to descent_split/used in backcountry ski - '28': 'ski_lift_split', - '29': 'ski_run_split', - }, - 'climb_pro_event': { - '0': 'approach', - '1': 'start', - '2': 'complete', - }, - 'gas_consumption_rate_type': { - '0': 'pressure_sac', # Pressure-based Surface Air Consumption - '1': 'volume_sac', # Volumetric Surface Air Consumption - '2': 'rmv', # Respiratory Minute Volume - }, - 'tap_sensitivity': { - '0': 'high', - '1': 'medium', - '2': 'low', - }, - 'radar_threat_level_type': { - '0': 'threat_unknown', - '1': 'threat_none', - '2': 'threat_approaching', - '3': 'threat_approaching_fast', - }, - 'sleep_disruption_severity': { - '0': 'none', - '1': 'low', - '2': 'medium', - '3': 'high', - }, - 'max_met_speed_source': { - '0': 'onboard_gps', - '1': 'connected_gps', - '2': 'cadence', - }, - 'max_met_heart_rate_source': { - '0': 'whr', # Wrist Heart Rate Monitor - '1': 'hrm', # Chest Strap Heart Rate Monitor - }, - 'hrv_status': { - '0': 'none', - '1': 'poor', - '2': 'low', - '3': 'unbalanced', - '4': 'balanced', - }, - 'no_fly_time_mode': { - '0': 'standard', # Standard Diver Alert Network no-fly guidance - '1': 'flat_24_hours', # Flat 24 hour no-fly guidance - }, - }, - 'mesg_num' : { - 'FILE_ID': 0, - 'FILE_CREATOR': 49, - 'TIMESTAMP_CORRELATION': 162, - 'SOFTWARE': 35, - 'SLAVE_DEVICE': 106, - 'CAPABILITIES': 1, - 'FILE_CAPABILITIES': 37, - 'MESG_CAPABILITIES': 38, - 'FIELD_CAPABILITIES': 39, - 'DEVICE_SETTINGS': 2, - 'USER_PROFILE': 3, - 'HRM_PROFILE': 4, - 'SDM_PROFILE': 5, - 'BIKE_PROFILE': 6, - 'CONNECTIVITY': 127, - 'WATCHFACE_SETTINGS': 159, - 'OHR_SETTINGS': 188, - 'TIME_IN_ZONE': 216, - 'ZONES_TARGET': 7, - 'SPORT': 12, - 'HR_ZONE': 8, - 'SPEED_ZONE': 53, - 'CADENCE_ZONE': 131, - 'POWER_ZONE': 9, - 'MET_ZONE': 10, - 'TRAINING_SETTINGS': 13, - 'DIVE_SETTINGS': 258, - 'DIVE_ALARM': 262, - 'DIVE_APNEA_ALARM': 393, - 'DIVE_GAS': 259, - 'GOAL': 15, - 'ACTIVITY': 34, - 'SESSION': 18, - 'LAP': 19, - 'LENGTH': 101, - 'RECORD': 20, - 'EVENT': 21, - 'DEVICE_INFO': 23, - 'DEVICE_AUX_BATTERY_INFO': 375, - 'TRAINING_FILE': 72, - 'WEATHER_CONDITIONS': 128, - 'WEATHER_ALERT': 129, - 'GPS_METADATA': 160, - 'CAMERA_EVENT': 161, - 'GYROSCOPE_DATA': 164, - 'ACCELEROMETER_DATA': 165, - 'MAGNETOMETER_DATA': 208, - 'BAROMETER_DATA': 209, - 'THREE_D_SENSOR_CALIBRATION': 167, - 'ONE_D_SENSOR_CALIBRATION': 210, - 'VIDEO_FRAME': 169, - 'OBDII_DATA': 174, - 'NMEA_SENTENCE': 177, - 'AVIATION_ATTITUDE': 178, - 'VIDEO': 184, - 'VIDEO_TITLE': 185, - 'VIDEO_DESCRIPTION': 186, - 'VIDEO_CLIP': 187, - 'SET': 225, - 'JUMP': 285, - 'SPLIT': 312, - 'SPLIT_SUMMARY': 313, - 'CLIMB_PRO': 317, - 'FIELD_DESCRIPTION': 206, - 'DEVELOPER_DATA_ID': 207, - 'COURSE': 31, - 'COURSE_POINT': 32, - 'SEGMENT_ID': 148, - 'SEGMENT_LEADERBOARD_ENTRY': 149, - 'SEGMENT_POINT': 150, - 'SEGMENT_LAP': 142, - 'SEGMENT_FILE': 151, - 'WORKOUT': 26, - 'WORKOUT_SESSION': 158, - 'WORKOUT_STEP': 27, - 'EXERCISE_TITLE': 264, - 'SCHEDULE': 28, - 'TOTALS': 33, - 'WEIGHT_SCALE': 30, - 'BLOOD_PRESSURE': 51, - 'MONITORING_INFO': 103, - 'MONITORING': 55, - 'MONITORING_HR_DATA': 211, - 'SPO2_DATA': 269, - 'HR': 132, - 'STRESS_LEVEL': 227, - 'MAX_MET_DATA': 229, - 'HSA_BODY_BATTERY_DATA': 314, - 'HSA_EVENT': 315, - 'HSA_ACCELEROMETER_DATA': 302, - 'HSA_GYROSCOPE_DATA': 376, - 'HSA_STEP_DATA': 304, - 'HSA_SPO2_DATA': 305, - 'HSA_STRESS_DATA': 306, - 'HSA_RESPIRATION_DATA': 307, - 'HSA_HEART_RATE_DATA': 308, - 'HSA_CONFIGURATION_DATA': 389, - 'HSA_WRIST_TEMPERATURE_DATA': 409, - 'MEMO_GLOB': 145, - 'SLEEP_LEVEL': 275, - 'ANT_CHANNEL_ID': 82, - 'ANT_RX': 80, - 'ANT_TX': 81, - 'EXD_SCREEN_CONFIGURATION': 200, - 'EXD_DATA_FIELD_CONFIGURATION': 201, - 'EXD_DATA_CONCEPT_CONFIGURATION': 202, - 'DIVE_SUMMARY': 268, - 'AAD_ACCEL_FEATURES': 289, - 'HRV': 78, - 'BEAT_INTERVALS': 290, - 'HRV_STATUS_SUMMARY': 370, - 'HRV_VALUE': 371, - 'RAW_BBI': 372, - 'RESPIRATION_RATE': 297, - 'CHRONO_SHOT_SESSION': 387, - 'CHRONO_SHOT_DATA': 388, - 'TANK_UPDATE': 319, - 'TANK_SUMMARY': 323, - 'SLEEP_ASSESSMENT': 346, - 'SLEEP_DISRUPTION_SEVERITY_PERIOD': 470, - 'SLEEP_DISRUPTION_OVERNIGHT_SEVERITY': 471, - 'SKIN_TEMP_OVERNIGHT': 398, - 'PAD': 105, - } -} +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### +# ****WARNING**** This file is auto-generated! Do NOT edit this file. +# Profile Version = 21.194.0Release +# Tag = production/release/21.194.0-0-g65135fc +############################################################################################ + + +Profile = { + 'version': { + 'major': 21, + 'minor': 194, + 'patch': 0, + 'type': "Release" + }, + 'common_fields': { + 'part_index': 250, + 'timestamp': 253, + 'message_index': 254 + }, + 'messages': { + 0: { + 'num': "0", # Must be first message in file. + 'name': "file_id", + 'messages_key': "file_id_mesgs", + 'fields': { + 0: { + 'num': 0, + 'name': "type", + 'type': "file", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "manufacturer", + 'type': "manufacturer", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "product", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "favero_product", + 'type': "favero_product", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "manufacturer", 'raw_value': 263, 'value_name': "favero_electronics" }, + ], + }, + { + 'name': "garmin_product", + 'type': "garmin_product", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "manufacturer", 'raw_value': 1, 'value_name': "garmin" }, + { 'num': 1, 'name': "manufacturer", 'raw_value': 15, 'value_name': "dynastream" }, + { 'num': 1, 'name': "manufacturer", 'raw_value': 13, 'value_name': "dynastream_oem" }, + { 'num': 1, 'name': "manufacturer", 'raw_value': 89, 'value_name': "tacx" }, + ], + }, + ] + }, + 3: { + 'num': 3, + 'name': "serial_number", + 'type': "uint32z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Only set for files that are can be created/erased. + 'name': "time_created", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # Only set for files that are not created/erased. + 'name': "number", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # Optional free form string to indicate the devices name or model + 'name': "product_name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 49: { + 'num': "49", + 'name': "file_creator", + 'messages_key': "file_creator_mesgs", + 'fields': { + 0: { + 'num': 0, + 'name': "software_version", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "hardware_version", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 162: { + 'num': "162", + 'name': "timestamp_correlation", + 'messages_key': "timestamp_correlation_mesgs", + 'fields': { + 253: { + 'num': 253, # Whole second part of UTC timestamp at the time the system timestamp was recorded. + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Fractional part of the UTC timestamp at the time the system timestamp was recorded. + 'name': "fractional_timestamp", + 'type': "uint16", + 'array': "false", + 'scale': [32768], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Whole second part of the system timestamp + 'name': "system_timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Fractional part of the system timestamp + 'name': "fractional_system_timestamp", + 'type': "uint16", + 'array': "false", + 'scale': [32768], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # timestamp epoch expressed in local time used to convert timestamps to local time + 'name': "local_timestamp", + 'type': "local_date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Millisecond part of the UTC timestamp at the time the system timestamp was recorded. + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # Millisecond part of the system timestamp + 'name': "system_timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 35: { + 'num': "35", + 'name': "software", + 'messages_key': "software_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "version", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "part_number", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 106: { + 'num': "106", + 'name': "slave_device", + 'messages_key': "slave_device_mesgs", + 'fields': { + 0: { + 'num': 0, + 'name': "manufacturer", + 'type': "manufacturer", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "product", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "favero_product", + 'type': "favero_product", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "manufacturer", 'raw_value': 263, 'value_name': "favero_electronics" }, + ], + }, + { + 'name': "garmin_product", + 'type': "garmin_product", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "manufacturer", 'raw_value': 1, 'value_name': "garmin" }, + { 'num': 0, 'name': "manufacturer", 'raw_value': 15, 'value_name': "dynastream" }, + { 'num': 0, 'name': "manufacturer", 'raw_value': 13, 'value_name': "dynastream_oem" }, + { 'num': 0, 'name': "manufacturer", 'raw_value': 89, 'value_name': "tacx" }, + ], + }, + ] + }, + }, +}, + 1: { + 'num': "1", + 'name': "capabilities", + 'messages_key': "capabilities_mesgs", + 'fields': { + 0: { + 'num': 0, # Use language_bits_x types where x is index of array. + 'name': "languages", + 'type': "uint8z", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Use sport_bits_x types where x is index of array. + 'name': "sports", + 'type': "sport_bits_0", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 21: { + 'num': 21, + 'name': "workouts_supported", + 'type': "workout_capabilities", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 23: { + 'num': 23, + 'name': "connectivity_supported", + 'type': "connectivity_capabilities", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 37: { + 'num': "37", + 'name': "file_capabilities", + 'messages_key': "file_capabilities_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "type", + 'type': "file", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "flags", + 'type': "file_flags", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "directory", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "max_count", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "max_size", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bytes", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 38: { + 'num': "38", + 'name': "mesg_capabilities", + 'messages_key': "mesg_capabilities_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "file", + 'type': "file", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "mesg_num", + 'type': "mesg_num", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "count_type", + 'type': "mesg_count", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "count", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "num_per_file", + 'type': "uint16", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 2, 'name': "count_type", 'raw_value': 0, 'value_name': "num_per_file" }, + ], + }, + { + 'name': "max_per_file", + 'type': "uint16", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 2, 'name': "count_type", 'raw_value': 1, 'value_name': "max_per_file" }, + ], + }, + { + 'name': "max_per_file_type", + 'type': "uint16", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 2, 'name': "count_type", 'raw_value': 2, 'value_name': "max_per_file_type" }, + ], + }, + ] + }, + }, +}, + 39: { + 'num': "39", + 'name': "field_capabilities", + 'messages_key': "field_capabilities_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "file", + 'type': "file", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "mesg_num", + 'type': "mesg_num", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "field_num", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "count", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 2: { + 'num': "2", + 'name': "device_settings", + 'messages_key': "device_settings_mesgs", + 'fields': { + 0: { + 'num': 0, # Index into time zone arrays. + 'name': "active_time_zone", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Offset from system time. Required to convert timestamp from system time to UTC. + 'name': "utc_offset", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Offset from system time. + 'name': "time_offset", + 'type': "uint32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Display mode for the time + 'name': "time_mode", + 'type': "time_mode", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # timezone offset in 1/4 hour increments + 'name': "time_zone_offset", + 'type': "sint8", + 'array': "true", + 'scale': [4], + 'offset': [0], + 'units': "hr", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, # Mode for backlight + 'name': "backlight_mode", + 'type': "backlight_mode", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 36: { + 'num': 36, # Enabled state of the activity tracker functionality + 'name': "activity_tracker_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 39: { + 'num': 39, # UTC timestamp used to set the devices clock and date + 'name': "clock_time", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 40: { + 'num': 40, # Bitfield to configure enabled screens for each supported loop + 'name': "pages_enabled", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 46: { + 'num': 46, # Enabled state of the move alert + 'name': "move_alert_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 47: { + 'num': 47, # Display mode for the date + 'name': "date_mode", + 'type': "date_mode", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 55: { + 'num': 55, + 'name': "display_orientation", + 'type': "display_orientation", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 56: { + 'num': 56, + 'name': "mounting_side", + 'type': "side", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 57: { + 'num': 57, # Bitfield to indicate one page as default for each supported loop + 'name': "default_page", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 58: { + 'num': 58, # Minimum steps before an autosync can occur + 'name': "autosync_min_steps", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "steps", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 59: { + 'num': 59, # Minimum minutes before an autosync can occur + 'name': "autosync_min_time", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "minutes", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 80: { + 'num': 80, # Enable auto-detect setting for the lactate threshold feature. + 'name': "lactate_threshold_autodetect_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 86: { + 'num': 86, # Automatically upload using BLE + 'name': "ble_auto_upload_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 89: { + 'num': 89, # Helps to conserve battery by changing modes + 'name': "auto_sync_frequency", + 'type': "auto_sync_frequency", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 90: { + 'num': 90, # Allows setting specific activities auto-activity detect enabled/disabled settings + 'name': "auto_activity_detect", + 'type': "auto_activity_detect", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 94: { + 'num': 94, # Number of screens configured to display + 'name': "number_of_screens", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 95: { + 'num': 95, # Smart Notification display orientation + 'name': "smart_notification_display_orientation", + 'type': "display_orientation", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 134: { + 'num': 134, + 'name': "tap_interface", + 'type': "switch", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 174: { + 'num': 174, # Used to hold the tap threshold setting + 'name': "tap_sensitivity", + 'type': "tap_sensitivity", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 3: { + 'num': "3", + 'name': "user_profile", + 'messages_key': "user_profile_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Used for Morning Report greeting + 'name': "friendly_name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "gender", + 'type': "gender", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "age", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "years", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "height", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "weight", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "kg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "language", + 'type': "language", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "elev_setting", + 'type': "display_measure", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "weight_setting", + 'type': "display_measure", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "resting_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "default_max_running_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "default_max_biking_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "default_max_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, + 'name': "hr_setting", + 'type': "display_heart", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "speed_setting", + 'type': "display_measure", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, + 'name': "dist_setting", + 'type': "display_measure", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 16: { + 'num': 16, + 'name': "power_setting", + 'type': "display_power", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 17: { + 'num': 17, + 'name': "activity_class", + 'type': "activity_class", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 18: { + 'num': 18, + 'name': "position_setting", + 'type': "display_position", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 21: { + 'num': 21, + 'name': "temperature_setting", + 'type': "display_measure", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 22: { + 'num': 22, + 'name': "local_id", + 'type': "user_local_id", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 23: { + 'num': 23, + 'name': "global_id", + 'type': "byte", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 28: { + 'num': 28, # Typical wake time + 'name': "wake_time", + 'type': "localtime_into_day", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 29: { + 'num': 29, # Typical bed time + 'name': "sleep_time", + 'type': "localtime_into_day", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 30: { + 'num': 30, + 'name': "height_setting", + 'type': "display_measure", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 31: { + 'num': 31, # User defined running step length set to 0 for auto length + 'name': "user_running_step_length", + 'type': "uint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 32: { + 'num': 32, # User defined walking step length set to 0 for auto length + 'name': "user_walking_step_length", + 'type': "uint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 47: { + 'num': 47, + 'name': "depth_setting", + 'type': "display_measure", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 49: { + 'num': 49, + 'name': "dive_count", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 4: { + 'num': "4", + 'name': "hrm_profile", + 'messages_key': "hrm_profile_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "hrm_ant_id", + 'type': "uint16z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "log_hrv", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "hrm_ant_id_trans_type", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 5: { + 'num': "5", + 'name': "sdm_profile", + 'messages_key': "sdm_profile_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "sdm_ant_id", + 'type': "uint16z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "sdm_cal_factor", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "odometer", + 'type': "uint32", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Use footpod for speed source instead of GPS + 'name': "speed_source", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "sdm_ant_id_trans_type", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Rollover counter that can be used to extend the odometer + 'name': "odometer_rollover", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 6: { + 'num': "6", + 'name': "bike_profile", + 'messages_key': "bike_profile_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "sport", + 'type': "sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "sub_sport", + 'type': "sub_sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "odometer", + 'type': "uint32", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "bike_spd_ant_id", + 'type': "uint16z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "bike_cad_ant_id", + 'type': "uint16z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "bike_spdcad_ant_id", + 'type': "uint16z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "bike_power_ant_id", + 'type': "uint16z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "custom_wheelsize", + 'type': "uint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "auto_wheelsize", + 'type': "uint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "bike_weight", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "kg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "power_cal_factor", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, + 'name': "auto_wheel_cal", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "auto_power_zero", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, + 'name': "id", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 15: { + 'num': 15, + 'name': "spd_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 16: { + 'num': 16, + 'name': "cad_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 17: { + 'num': 17, + 'name': "spdcad_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 18: { + 'num': 18, + 'name': "power_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 19: { + 'num': 19, + 'name': "crank_length", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [-110], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 20: { + 'num': 20, + 'name': "enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 21: { + 'num': 21, + 'name': "bike_spd_ant_id_trans_type", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 22: { + 'num': 22, + 'name': "bike_cad_ant_id_trans_type", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 23: { + 'num': 23, + 'name': "bike_spdcad_ant_id_trans_type", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 24: { + 'num': 24, + 'name': "bike_power_ant_id_trans_type", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 37: { + 'num': 37, # Rollover counter that can be used to extend the odometer + 'name': "odometer_rollover", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 38: { + 'num': 38, # Number of front gears + 'name': "front_gear_num", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 39: { + 'num': 39, # Number of teeth on each gear 0 is innermost + 'name': "front_gear", + 'type': "uint8z", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 40: { + 'num': 40, # Number of rear gears + 'name': "rear_gear_num", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 41: { + 'num': 41, # Number of teeth on each gear 0 is innermost + 'name': "rear_gear", + 'type': "uint8z", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 44: { + 'num': 44, + 'name': "shimano_di2_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 127: { + 'num': "127", + 'name': "connectivity", + 'messages_key': "connectivity_mesgs", + 'fields': { + 0: { + 'num': 0, # Use Bluetooth for connectivity features + 'name': "bluetooth_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Use Bluetooth Low Energy for connectivity features + 'name': "bluetooth_le_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Use ANT for connectivity features + 'name': "ant_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "live_tracking_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "weather_conditions_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "weather_alerts_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "auto_activity_upload_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "course_download_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "workout_download_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "gps_ephemeris_download_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "incident_detection_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, + 'name': "grouptrack_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 159: { + 'num': "159", + 'name': "watchface_settings", + 'messages_key': "watchface_settings_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "mode", + 'type': "watchface_mode", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "layout", + 'type': "byte", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "digital_layout", + 'type': "digital_watchface_layout", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "mode", 'raw_value': 0, 'value_name': "digital" }, + ], + }, + { + 'name': "analog_layout", + 'type': "analog_watchface_layout", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "mode", 'raw_value': 1, 'value_name': "analog" }, + ], + }, + ] + }, + }, +}, + 188: { + 'num': "188", + 'name': "ohr_settings", + 'messages_key': "ohr_settings_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "enabled", + 'type': "switch", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 216: { + 'num': "216", + 'name': "time_in_zone", + 'messages_key': "time_in_zone_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "reference_mesg", + 'type': "mesg_num", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "reference_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "time_in_hr_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "time_in_speed_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "time_in_cadence_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "time_in_power_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "hr_zone_high_boundary", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "speed_zone_high_boundary", + 'type': "uint16", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "cadence_zone_high_bondary", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "power_zone_high_boundary", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "hr_calc_type", + 'type': "hr_zone_calc", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "max_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, + 'name': "resting_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "threshold_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, + 'name': "pwr_calc_type", + 'type': "pwr_zone_calc", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 15: { + 'num': 15, + 'name': "functional_threshold_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 7: { + 'num': "7", + 'name': "zones_target", + 'messages_key': "zones_target_mesgs", + 'fields': { + 1: { + 'num': 1, + 'name': "max_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "threshold_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "functional_threshold_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "hr_calc_type", + 'type': "hr_zone_calc", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "pwr_calc_type", + 'type': "pwr_zone_calc", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 12: { + 'num': "12", + 'name': "sport", + 'messages_key': "sport_mesgs", + 'fields': { + 0: { + 'num': 0, + 'name': "sport", + 'type': "sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "sub_sport", + 'type': "sub_sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 8: { + 'num': "8", + 'name': "hr_zone", + 'messages_key': "hr_zone_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "high_bpm", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 53: { + 'num': "53", + 'name': "speed_zone", + 'messages_key': "speed_zone_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "high_value", + 'type': "uint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 131: { + 'num': "131", + 'name': "cadence_zone", + 'messages_key': "cadence_zone_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "high_value", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 9: { + 'num': "9", + 'name': "power_zone", + 'messages_key': "power_zone_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "high_value", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 10: { + 'num': "10", + 'name': "met_zone", + 'messages_key': "met_zone_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "high_bpm", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "calories", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "kcal / min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "fat_calories", + 'type': "uint8", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "kcal / min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 13: { + 'num': "13", + 'name': "training_settings", + 'messages_key': "training_settings_mesgs", + 'fields': { + 31: { + 'num': 31, + 'name': "target_distance", + 'type': "uint32", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 32: { + 'num': 32, + 'name': "target_speed", + 'type': "uint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 33: { + 'num': 33, + 'name': "target_time", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 153: { + 'num': 153, # A more precise target speed field + 'name': "precise_target_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 258: { + 'num': "258", + 'name': "dive_settings", + 'messages_key': "dive_settings_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "model", + 'type': "tissue_model_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "gf_low", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "gf_high", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "water_type", + 'type': "water_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # Fresh water is usually 1000; salt water is usually 1025 + 'name': "water_density", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kg/m^3", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Typically 1.40 + 'name': "po2_warn", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Typically 1.60 + 'name': "po2_critical", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "po2_deco", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "safety_stop_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "bottom_depth", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "bottom_time", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, + 'name': "apnea_countdown_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "apnea_countdown_time", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, + 'name': "backlight_mode", + 'type': "dive_backlight_mode", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 15: { + 'num': 15, + 'name': "backlight_brightness", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 16: { + 'num': 16, + 'name': "backlight_timeout", + 'type': "backlight_timeout", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 17: { + 'num': 17, # Time between surfacing and ending the activity + 'name': "repeat_dive_interval", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 18: { + 'num': 18, # Time at safety stop (if enabled) + 'name': "safety_stop_time", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 19: { + 'num': 19, + 'name': "heart_rate_source_type", + 'type': "source_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 20: { + 'num': 20, + 'name': "heart_rate_source", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "heart_rate_antplus_device_type", + 'type': "antplus_device_type", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "heart_rate_source_type", 'raw_value': 1, 'value_name': "antplus" }, + ], + }, + { + 'name': "heart_rate_local_device_type", + 'type': "local_device_type", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "heart_rate_source_type", 'raw_value': 5, 'value_name': "local" }, + ], + }, + ] + }, + 21: { + 'num': 21, # Index of travel dive_gas message + 'name': "travel_gas", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 22: { + 'num': 22, # If low PO2 should be switched to automatically + 'name': "ccr_low_setpoint_switch_mode", + 'type': "ccr_setpoint_switch_mode", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 23: { + 'num': 23, # Target PO2 when using low setpoint + 'name': "ccr_low_setpoint", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 24: { + 'num': 24, # Depth to switch to low setpoint in automatic mode + 'name': "ccr_low_setpoint_depth", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 25: { + 'num': 25, # If high PO2 should be switched to automatically + 'name': "ccr_high_setpoint_switch_mode", + 'type': "ccr_setpoint_switch_mode", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 26: { + 'num': 26, # Target PO2 when using high setpoint + 'name': "ccr_high_setpoint", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 27: { + 'num': 27, # Depth to switch to high setpoint in automatic mode + 'name': "ccr_high_setpoint_depth", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 29: { + 'num': 29, # Type of gas consumption rate to display. Some values are only valid if tank volume is known. + 'name': "gas_consumption_display", + 'type': "gas_consumption_rate_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 30: { + 'num': 30, # Indicates whether the up key is enabled during dives + 'name': "up_key_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 35: { + 'num': 35, # Sounds and vibration enabled or disabled in-dive + 'name': "dive_sounds", + 'type': "tone", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 36: { + 'num': 36, # Usually 1.0/1.5/2.0 representing 3/4.5/6m or 10/15/20ft + 'name': "last_stop_multiple", + 'type': "uint8", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 37: { + 'num': 37, # Indicates which guidelines to use for no-fly surface interval. + 'name': "no_fly_time_mode", + 'type': "no_fly_time_mode", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 262: { + 'num': "262", + 'name': "dive_alarm", + 'messages_key': "dive_alarm_mesgs", + 'fields': { + 254: { + 'num': 254, # Index of the alarm + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Depth setting (m) for depth type alarms + 'name': "depth", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Time setting (s) for time type alarms + 'name': "time", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Enablement flag + 'name': "enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Alarm type setting + 'name': "alarm_type", + 'type': "dive_alarm_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Tone and Vibe setting for the alarm + 'name': "sound", + 'type': "tone", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # Dive types the alarm will trigger on + 'name': "dive_types", + 'type': "sub_sport", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Alarm ID + 'name': "id", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Show a visible pop-up for this alarm + 'name': "popup_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # Trigger the alarm on descent + 'name': "trigger_on_descent", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, # Trigger the alarm on ascent + 'name': "trigger_on_ascent", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, # Repeat alarm each time threshold is crossed? + 'name': "repeating", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, # Ascent/descent rate (mps) setting for speed type alarms + 'name': "speed", + 'type': "sint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "mps", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 393: { + 'num': "393", + 'name': "dive_apnea_alarm", + 'messages_key': "dive_apnea_alarm_mesgs", + 'fields': { + 254: { + 'num': 254, # Index of the alarm + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Depth setting (m) for depth type alarms + 'name': "depth", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Time setting (s) for time type alarms + 'name': "time", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Enablement flag + 'name': "enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Alarm type setting + 'name': "alarm_type", + 'type': "dive_alarm_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Tone and Vibe setting for the alarm. + 'name': "sound", + 'type': "tone", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # Dive types the alarm will trigger on + 'name': "dive_types", + 'type': "sub_sport", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Alarm ID + 'name': "id", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Show a visible pop-up for this alarm + 'name': "popup_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # Trigger the alarm on descent + 'name': "trigger_on_descent", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, # Trigger the alarm on ascent + 'name': "trigger_on_ascent", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, # Repeat alarm each time threshold is crossed? + 'name': "repeating", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, # Ascent/descent rate (mps) setting for speed type alarms + 'name': "speed", + 'type': "sint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "mps", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 259: { + 'num': "259", + 'name': "dive_gas", + 'messages_key': "dive_gas_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "helium_content", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "oxygen_content", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "status", + 'type': "dive_gas_status", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "mode", + 'type': "dive_gas_mode", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 15: { + 'num': "15", + 'name': "goal", + 'messages_key': "goal_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "sport", + 'type': "sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "sub_sport", + 'type': "sub_sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "start_date", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "end_date", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "type", + 'type': "goal", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "value", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "repeat", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "target_value", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "recurrence", + 'type': "goal_recurrence", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "recurrence_value", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "source", + 'type': "goal_source", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 34: { + 'num': "34", + 'name': "activity", + 'messages_key': "activity_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Exclude pauses + 'name': "total_timer_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "num_sessions", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "type", + 'type': "activity", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "event", + 'type': "event", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "event_type", + 'type': "event_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # timestamp epoch expressed in local time, used to convert activity timestamps to local time + 'name': "local_timestamp", + 'type': "local_date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "event_group", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 18: { + 'num': "18", + 'name': "session", + 'messages_key': "session_mesgs", + 'fields': { + 254: { + 'num': 254, # Selected bit is set for the current session. + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # session + 'name': "event", + 'type': "event", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # stop + 'name': "event_type", + 'type': "event_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "start_time", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "start_position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "start_position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "sport", + 'type': "sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "sub_sport", + 'type': "sub_sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Time (includes pauses) + 'name': "total_elapsed_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # Timer Time (excludes pauses) + 'name': "total_timer_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "total_distance", + 'type': "uint32", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "total_cycles", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "cycles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "total_strides", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["strides"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 5, 'name': "sport", 'raw_value': 1, 'value_name': "running" }, + { 'num': 5, 'name': "sport", 'raw_value': 11, 'value_name': "walking" }, + ], + }, + { + 'name': "total_strokes", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["strokes"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 5, 'name': "sport", 'raw_value': 2, 'value_name': "cycling" }, + { 'num': 5, 'name': "sport", 'raw_value': 5, 'value_name': "swimming" }, + { 'num': 5, 'name': "sport", 'raw_value': 15, 'value_name': "rowing" }, + { 'num': 5, 'name': "sport", 'raw_value': 37, 'value_name': "stand_up_paddleboarding" }, + ], + }, + ] + }, + 11: { + 'num': 11, + 'name': "total_calories", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "total_fat_calories", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, # total_distance / total_timer_time + 'name': "avg_speed", + 'type': "uint16", + 'array': "false", + 'scale': [1000, ], + 'offset': [0, ], + 'units': ["m/s", ], + 'bits': [16,], + 'components': [124, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 15: { + 'num': 15, + 'name': "max_speed", + 'type': "uint16", + 'array': "false", + 'scale': [1000, ], + 'offset': [0, ], + 'units': ["m/s", ], + 'bits': [16,], + 'components': [125, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 16: { + 'num': 16, # average heart rate (excludes pause time) + 'name': "avg_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 17: { + 'num': 17, + 'name': "max_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 18: { + 'num': 18, # total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time + 'name': "avg_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "avg_running_cadence", + 'type': "uint8", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["strides/min"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 5, 'name': "sport", 'raw_value': 1, 'value_name': "running" }, + ], + }, + ] + }, + 19: { + 'num': 19, + 'name': "max_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "max_running_cadence", + 'type': "uint8", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["strides/min"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 5, 'name': "sport", 'raw_value': 1, 'value_name': "running" }, + ], + }, + ] + }, + 20: { + 'num': 20, # total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time + 'name': "avg_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 21: { + 'num': 21, + 'name': "max_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 22: { + 'num': 22, + 'name': "total_ascent", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 23: { + 'num': 23, + 'name': "total_descent", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 24: { + 'num': 24, + 'name': "total_training_effect", + 'type': "uint8", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 25: { + 'num': 25, + 'name': "first_lap_index", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 26: { + 'num': 26, + 'name': "num_laps", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 27: { + 'num': 27, + 'name': "event_group", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 28: { + 'num': 28, + 'name': "trigger", + 'type': "session_trigger", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 29: { + 'num': 29, # North east corner latitude + 'name': "nec_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 30: { + 'num': 30, # North east corner longitude + 'name': "nec_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 31: { + 'num': 31, # South west corner latitude + 'name': "swc_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 32: { + 'num': 32, # South west corner longitude + 'name': "swc_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 33: { + 'num': 33, # # of lengths of swim pool + 'name': "num_lengths", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "lengths", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 34: { + 'num': 34, + 'name': "normalized_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 35: { + 'num': 35, + 'name': "training_stress_score", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "tss", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 36: { + 'num': 36, + 'name': "intensity_factor", + 'type': "uint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "if", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 37: { + 'num': 37, + 'name': "left_right_balance", + 'type': "left_right_balance_100", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 38: { + 'num': 38, + 'name': "end_position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 39: { + 'num': 39, + 'name': "end_position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 41: { + 'num': 41, + 'name': "avg_stroke_count", + 'type': "uint32", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "strokes/lap", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 42: { + 'num': 42, + 'name': "avg_stroke_distance", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 43: { + 'num': 43, + 'name': "swim_stroke", + 'type': "swim_stroke", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "swim_stroke", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 44: { + 'num': 44, + 'name': "pool_length", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 45: { + 'num': 45, + 'name': "threshold_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 46: { + 'num': 46, + 'name': "pool_length_unit", + 'type': "display_measure", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 47: { + 'num': 47, # # of active lengths of swim pool + 'name': "num_active_lengths", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "lengths", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 48: { + 'num': 48, + 'name': "total_work", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "J", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 49: { + 'num': 49, + 'name': "avg_altitude", + 'type': "uint16", + 'array': "false", + 'scale': [5, ], + 'offset': [500, ], + 'units': ["m", ], + 'bits': [16,], + 'components': [126, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 50: { + 'num': 50, + 'name': "max_altitude", + 'type': "uint16", + 'array': "false", + 'scale': [5, ], + 'offset': [500, ], + 'units': ["m", ], + 'bits': [16,], + 'components': [128, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 51: { + 'num': 51, + 'name': "gps_accuracy", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 52: { + 'num': 52, + 'name': "avg_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 53: { + 'num': 53, + 'name': "avg_pos_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 54: { + 'num': 54, + 'name': "avg_neg_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 55: { + 'num': 55, + 'name': "max_pos_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 56: { + 'num': 56, + 'name': "max_neg_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 57: { + 'num': 57, + 'name': "avg_temperature", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 58: { + 'num': 58, + 'name': "max_temperature", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 59: { + 'num': 59, + 'name': "total_moving_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 60: { + 'num': 60, + 'name': "avg_pos_vertical_speed", + 'type': "sint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 61: { + 'num': 61, + 'name': "avg_neg_vertical_speed", + 'type': "sint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 62: { + 'num': 62, + 'name': "max_pos_vertical_speed", + 'type': "sint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 63: { + 'num': 63, + 'name': "max_neg_vertical_speed", + 'type': "sint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 64: { + 'num': 64, + 'name': "min_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 65: { + 'num': 65, + 'name': "time_in_hr_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 66: { + 'num': 66, + 'name': "time_in_speed_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 67: { + 'num': 67, + 'name': "time_in_cadence_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 68: { + 'num': 68, + 'name': "time_in_power_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 69: { + 'num': 69, + 'name': "avg_lap_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 70: { + 'num': 70, + 'name': "best_lap_index", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 71: { + 'num': 71, + 'name': "min_altitude", + 'type': "uint16", + 'array': "false", + 'scale': [5, ], + 'offset': [500, ], + 'units': ["m", ], + 'bits': [16,], + 'components': [127, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 82: { + 'num': 82, + 'name': "player_score", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 83: { + 'num': 83, + 'name': "opponent_score", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 84: { + 'num': 84, + 'name': "opponent_name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 85: { + 'num': 85, # stroke_type enum used as the index + 'name': "stroke_count", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 86: { + 'num': 86, # zone number used as the index + 'name': "zone_count", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 87: { + 'num': 87, + 'name': "max_ball_speed", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 88: { + 'num': 88, + 'name': "avg_ball_speed", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 89: { + 'num': 89, + 'name': "avg_vertical_oscillation", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 90: { + 'num': 90, + 'name': "avg_stance_time_percent", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 91: { + 'num': 91, + 'name': "avg_stance_time", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 92: { + 'num': 92, # fractional part of the avg_cadence + 'name': "avg_fractional_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 93: { + 'num': 93, # fractional part of the max_cadence + 'name': "max_fractional_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 94: { + 'num': 94, # fractional part of the total_cycles + 'name': "total_fractional_cycles", + 'type': "uint8", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "cycles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 95: { + 'num': 95, # Avg saturated and unsaturated hemoglobin + 'name': "avg_total_hemoglobin_conc", + 'type': "uint16", + 'array': "true", + 'scale': [100], + 'offset': [0], + 'units': "g/dL", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 96: { + 'num': 96, # Min saturated and unsaturated hemoglobin + 'name': "min_total_hemoglobin_conc", + 'type': "uint16", + 'array': "true", + 'scale': [100], + 'offset': [0], + 'units': "g/dL", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 97: { + 'num': 97, # Max saturated and unsaturated hemoglobin + 'name': "max_total_hemoglobin_conc", + 'type': "uint16", + 'array': "true", + 'scale': [100], + 'offset': [0], + 'units': "g/dL", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 98: { + 'num': 98, # Avg percentage of hemoglobin saturated with oxygen + 'name': "avg_saturated_hemoglobin_percent", + 'type': "uint16", + 'array': "true", + 'scale': [10], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 99: { + 'num': 99, # Min percentage of hemoglobin saturated with oxygen + 'name': "min_saturated_hemoglobin_percent", + 'type': "uint16", + 'array': "true", + 'scale': [10], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 100: { + 'num': 100, # Max percentage of hemoglobin saturated with oxygen + 'name': "max_saturated_hemoglobin_percent", + 'type': "uint16", + 'array': "true", + 'scale': [10], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 101: { + 'num': 101, + 'name': "avg_left_torque_effectiveness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 102: { + 'num': 102, + 'name': "avg_right_torque_effectiveness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 103: { + 'num': 103, + 'name': "avg_left_pedal_smoothness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 104: { + 'num': 104, + 'name': "avg_right_pedal_smoothness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 105: { + 'num': 105, + 'name': "avg_combined_pedal_smoothness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 110: { + 'num': 110, # Sport name from associated sport mesg + 'name': "sport_profile_name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 111: { + 'num': 111, + 'name': "sport_index", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 112: { + 'num': 112, # Total time spend in the standing position + 'name': "time_standing", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 113: { + 'num': 113, # Number of transitions to the standing state + 'name': "stand_count", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 114: { + 'num': 114, # Average platform center offset Left + 'name': "avg_left_pco", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 115: { + 'num': 115, # Average platform center offset Right + 'name': "avg_right_pco", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 116: { + 'num': 116, # Average left power phase angles. Indexes defined by power_phase_type. + 'name': "avg_left_power_phase", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 117: { + 'num': 117, # Average left power phase peak angles. Data value indexes defined by power_phase_type. + 'name': "avg_left_power_phase_peak", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 118: { + 'num': 118, # Average right power phase angles. Data value indexes defined by power_phase_type. + 'name': "avg_right_power_phase", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 119: { + 'num': 119, # Average right power phase peak angles data value indexes defined by power_phase_type. + 'name': "avg_right_power_phase_peak", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 120: { + 'num': 120, # Average power by position. Data value indexes defined by rider_position_type. + 'name': "avg_power_position", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 121: { + 'num': 121, # Maximum power by position. Data value indexes defined by rider_position_type. + 'name': "max_power_position", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 122: { + 'num': 122, # Average cadence by position. Data value indexes defined by rider_position_type. + 'name': "avg_cadence_position", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 123: { + 'num': 123, # Maximum cadence by position. Data value indexes defined by rider_position_type. + 'name': "max_cadence_position", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 124: { + 'num': 124, # total_distance / total_timer_time + 'name': "enhanced_avg_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 125: { + 'num': 125, + 'name': "enhanced_max_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 126: { + 'num': 126, + 'name': "enhanced_avg_altitude", + 'type': "uint32", + 'array': "false", + 'scale': [5], + 'offset': [500], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 127: { + 'num': 127, + 'name': "enhanced_min_altitude", + 'type': "uint32", + 'array': "false", + 'scale': [5], + 'offset': [500], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 128: { + 'num': 128, + 'name': "enhanced_max_altitude", + 'type': "uint32", + 'array': "false", + 'scale': [5], + 'offset': [500], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 129: { + 'num': 129, # lev average motor power during session + 'name': "avg_lev_motor_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 130: { + 'num': 130, # lev maximum motor power during session + 'name': "max_lev_motor_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 131: { + 'num': 131, # lev battery consumption during session + 'name': "lev_battery_consumption", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 132: { + 'num': 132, + 'name': "avg_vertical_ratio", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 133: { + 'num': 133, + 'name': "avg_stance_time_balance", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 134: { + 'num': 134, + 'name': "avg_step_length", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 137: { + 'num': 137, + 'name': "total_anaerobic_training_effect", + 'type': "uint8", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 139: { + 'num': 139, + 'name': "avg_vam", + 'type': "uint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 140: { + 'num': 140, # 0 if above water + 'name': "avg_depth", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 141: { + 'num': 141, # 0 if above water + 'name': "max_depth", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 142: { + 'num': 142, # Time since end of last dive + 'name': "surface_interval", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 143: { + 'num': 143, + 'name': "start_cns", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 144: { + 'num': 144, + 'name': "end_cns", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 145: { + 'num': 145, + 'name': "start_n2", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 146: { + 'num': 146, + 'name': "end_n2", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 147: { + 'num': 147, + 'name': "avg_respiration_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1, ], + 'offset': [0, ], + 'units': ["", ], + 'bits': [8,], + 'components': [169, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 148: { + 'num': 148, + 'name': "max_respiration_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1, ], + 'offset': [0, ], + 'units': ["", ], + 'bits': [8,], + 'components': [170, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 149: { + 'num': 149, + 'name': "min_respiration_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1, ], + 'offset': [0, ], + 'units': ["", ], + 'bits': [8,], + 'components': [180, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 150: { + 'num': 150, + 'name': "min_temperature", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 155: { + 'num': 155, + 'name': "o2_toxicity", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "OTUs", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 156: { + 'num': 156, + 'name': "dive_number", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 168: { + 'num': 168, + 'name': "training_load_peak", + 'type': "sint32", + 'array': "false", + 'scale': [65536], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 169: { + 'num': 169, + 'name': "enhanced_avg_respiration_rate", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "Breaths/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 170: { + 'num': 170, + 'name': "enhanced_max_respiration_rate", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "Breaths/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 180: { + 'num': 180, + 'name': "enhanced_min_respiration_rate", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 181: { + 'num': 181, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. + 'name': "total_grit", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kGrit", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 182: { + 'num': 182, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. + 'name': "total_flow", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "Flow", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 183: { + 'num': 183, + 'name': "jump_count", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 186: { + 'num': 186, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. + 'name': "avg_grit", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kGrit", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 187: { + 'num': 187, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. + 'name': "avg_flow", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "Flow", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 192: { + 'num': 192, # A 0-100 scale representing how a user felt while performing a workout. Low values are considered feeling bad, while high values are good. + 'name': "workout_feel", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 193: { + 'num': 193, # Common Borg CR10 / 0-10 RPE scale, multiplied 10x.. Aggregate score for all workouts in a single session. + 'name': "workout_rpe", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 194: { + 'num': 194, # Average SPO2 for the monitoring session + 'name': "avg_spo2", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 195: { + 'num': 195, # Average stress for the monitoring session + 'name': "avg_stress", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 196: { + 'num': 196, + 'name': "metabolic_calories", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 197: { + 'num': 197, # Standard deviation of R-R interval (SDRR) - Heart rate variability measure most useful for wellness users. + 'name': "sdrr_hrv", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mS", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 198: { + 'num': 198, # Root mean square successive difference (RMSSD) - Heart rate variability measure most useful for athletes + 'name': "rmssd_hrv", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mS", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 199: { + 'num': 199, # fractional part of total_ascent + 'name': "total_fractional_ascent", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 200: { + 'num': 200, # fractional part of total_descent + 'name': "total_fractional_descent", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 208: { + 'num': 208, + 'name': "avg_core_temperature", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 209: { + 'num': 209, + 'name': "min_core_temperature", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 210: { + 'num': 210, + 'name': "max_core_temperature", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 19: { + 'num': "19", + 'name': "lap", + 'messages_key': "lap_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "event", + 'type': "event", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "event_type", + 'type': "event_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "start_time", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "start_position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "start_position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "end_position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "end_position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Time (includes pauses) + 'name': "total_elapsed_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # Timer Time (excludes pauses) + 'name': "total_timer_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "total_distance", + 'type': "uint32", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "total_cycles", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "cycles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "total_strides", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["strides"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 25, 'name': "sport", 'raw_value': 1, 'value_name': "running" }, + { 'num': 25, 'name': "sport", 'raw_value': 11, 'value_name': "walking" }, + ], + }, + { + 'name': "total_strokes", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["strokes"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 25, 'name': "sport", 'raw_value': 2, 'value_name': "cycling" }, + { 'num': 25, 'name': "sport", 'raw_value': 5, 'value_name': "swimming" }, + { 'num': 25, 'name': "sport", 'raw_value': 15, 'value_name': "rowing" }, + { 'num': 25, 'name': "sport", 'raw_value': 37, 'value_name': "stand_up_paddleboarding" }, + ], + }, + ] + }, + 11: { + 'num': 11, + 'name': "total_calories", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, # If New Leaf + 'name': "total_fat_calories", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "avg_speed", + 'type': "uint16", + 'array': "false", + 'scale': [1000, ], + 'offset': [0, ], + 'units': ["m/s", ], + 'bits': [16,], + 'components': [110, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 14: { + 'num': 14, + 'name': "max_speed", + 'type': "uint16", + 'array': "false", + 'scale': [1000, ], + 'offset': [0, ], + 'units': ["m/s", ], + 'bits': [16,], + 'components': [111, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 15: { + 'num': 15, + 'name': "avg_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 16: { + 'num': 16, + 'name': "max_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 17: { + 'num': 17, # total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time + 'name': "avg_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "avg_running_cadence", + 'type': "uint8", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["strides/min"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 25, 'name': "sport", 'raw_value': 1, 'value_name': "running" }, + ], + }, + ] + }, + 18: { + 'num': 18, + 'name': "max_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "max_running_cadence", + 'type': "uint8", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["strides/min"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 25, 'name': "sport", 'raw_value': 1, 'value_name': "running" }, + ], + }, + ] + }, + 19: { + 'num': 19, # total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time + 'name': "avg_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 20: { + 'num': 20, + 'name': "max_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 21: { + 'num': 21, + 'name': "total_ascent", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 22: { + 'num': 22, + 'name': "total_descent", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 23: { + 'num': 23, + 'name': "intensity", + 'type': "intensity", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 24: { + 'num': 24, + 'name': "lap_trigger", + 'type': "lap_trigger", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 25: { + 'num': 25, + 'name': "sport", + 'type': "sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 26: { + 'num': 26, + 'name': "event_group", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 32: { + 'num': 32, # # of lengths of swim pool + 'name': "num_lengths", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "lengths", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 33: { + 'num': 33, + 'name': "normalized_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 34: { + 'num': 34, + 'name': "left_right_balance", + 'type': "left_right_balance_100", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 35: { + 'num': 35, + 'name': "first_length_index", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 37: { + 'num': 37, + 'name': "avg_stroke_distance", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 38: { + 'num': 38, + 'name': "swim_stroke", + 'type': "swim_stroke", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 39: { + 'num': 39, + 'name': "sub_sport", + 'type': "sub_sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 40: { + 'num': 40, # # of active lengths of swim pool + 'name': "num_active_lengths", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "lengths", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 41: { + 'num': 41, + 'name': "total_work", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "J", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 42: { + 'num': 42, + 'name': "avg_altitude", + 'type': "uint16", + 'array': "false", + 'scale': [5, ], + 'offset': [500, ], + 'units': ["m", ], + 'bits': [16,], + 'components': [112, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 43: { + 'num': 43, + 'name': "max_altitude", + 'type': "uint16", + 'array': "false", + 'scale': [5, ], + 'offset': [500, ], + 'units': ["m", ], + 'bits': [16,], + 'components': [114, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 44: { + 'num': 44, + 'name': "gps_accuracy", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 45: { + 'num': 45, + 'name': "avg_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 46: { + 'num': 46, + 'name': "avg_pos_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 47: { + 'num': 47, + 'name': "avg_neg_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 48: { + 'num': 48, + 'name': "max_pos_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 49: { + 'num': 49, + 'name': "max_neg_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 50: { + 'num': 50, + 'name': "avg_temperature", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 51: { + 'num': 51, + 'name': "max_temperature", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 52: { + 'num': 52, + 'name': "total_moving_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 53: { + 'num': 53, + 'name': "avg_pos_vertical_speed", + 'type': "sint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 54: { + 'num': 54, + 'name': "avg_neg_vertical_speed", + 'type': "sint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 55: { + 'num': 55, + 'name': "max_pos_vertical_speed", + 'type': "sint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 56: { + 'num': 56, + 'name': "max_neg_vertical_speed", + 'type': "sint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 57: { + 'num': 57, + 'name': "time_in_hr_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 58: { + 'num': 58, + 'name': "time_in_speed_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 59: { + 'num': 59, + 'name': "time_in_cadence_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 60: { + 'num': 60, + 'name': "time_in_power_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 61: { + 'num': 61, + 'name': "repetition_num", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 62: { + 'num': 62, + 'name': "min_altitude", + 'type': "uint16", + 'array': "false", + 'scale': [5, ], + 'offset': [500, ], + 'units': ["m", ], + 'bits': [16,], + 'components': [113, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 63: { + 'num': 63, + 'name': "min_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 71: { + 'num': 71, + 'name': "wkt_step_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 74: { + 'num': 74, + 'name': "opponent_score", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 75: { + 'num': 75, # stroke_type enum used as the index + 'name': "stroke_count", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 76: { + 'num': 76, # zone number used as the index + 'name': "zone_count", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 77: { + 'num': 77, + 'name': "avg_vertical_oscillation", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 78: { + 'num': 78, + 'name': "avg_stance_time_percent", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 79: { + 'num': 79, + 'name': "avg_stance_time", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 80: { + 'num': 80, # fractional part of the avg_cadence + 'name': "avg_fractional_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 81: { + 'num': 81, # fractional part of the max_cadence + 'name': "max_fractional_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 82: { + 'num': 82, # fractional part of the total_cycles + 'name': "total_fractional_cycles", + 'type': "uint8", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "cycles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 83: { + 'num': 83, + 'name': "player_score", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 84: { + 'num': 84, # Avg saturated and unsaturated hemoglobin + 'name': "avg_total_hemoglobin_conc", + 'type': "uint16", + 'array': "true", + 'scale': [100], + 'offset': [0], + 'units': "g/dL", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 85: { + 'num': 85, # Min saturated and unsaturated hemoglobin + 'name': "min_total_hemoglobin_conc", + 'type': "uint16", + 'array': "true", + 'scale': [100], + 'offset': [0], + 'units': "g/dL", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 86: { + 'num': 86, # Max saturated and unsaturated hemoglobin + 'name': "max_total_hemoglobin_conc", + 'type': "uint16", + 'array': "true", + 'scale': [100], + 'offset': [0], + 'units': "g/dL", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 87: { + 'num': 87, # Avg percentage of hemoglobin saturated with oxygen + 'name': "avg_saturated_hemoglobin_percent", + 'type': "uint16", + 'array': "true", + 'scale': [10], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 88: { + 'num': 88, # Min percentage of hemoglobin saturated with oxygen + 'name': "min_saturated_hemoglobin_percent", + 'type': "uint16", + 'array': "true", + 'scale': [10], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 89: { + 'num': 89, # Max percentage of hemoglobin saturated with oxygen + 'name': "max_saturated_hemoglobin_percent", + 'type': "uint16", + 'array': "true", + 'scale': [10], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 91: { + 'num': 91, + 'name': "avg_left_torque_effectiveness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 92: { + 'num': 92, + 'name': "avg_right_torque_effectiveness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 93: { + 'num': 93, + 'name': "avg_left_pedal_smoothness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 94: { + 'num': 94, + 'name': "avg_right_pedal_smoothness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 95: { + 'num': 95, + 'name': "avg_combined_pedal_smoothness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 98: { + 'num': 98, # Total time spent in the standing position + 'name': "time_standing", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 99: { + 'num': 99, # Number of transitions to the standing state + 'name': "stand_count", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 100: { + 'num': 100, # Average left platform center offset + 'name': "avg_left_pco", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 101: { + 'num': 101, # Average right platform center offset + 'name': "avg_right_pco", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 102: { + 'num': 102, # Average left power phase angles. Data value indexes defined by power_phase_type. + 'name': "avg_left_power_phase", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 103: { + 'num': 103, # Average left power phase peak angles. Data value indexes defined by power_phase_type. + 'name': "avg_left_power_phase_peak", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 104: { + 'num': 104, # Average right power phase angles. Data value indexes defined by power_phase_type. + 'name': "avg_right_power_phase", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 105: { + 'num': 105, # Average right power phase peak angles. Data value indexes defined by power_phase_type. + 'name': "avg_right_power_phase_peak", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 106: { + 'num': 106, # Average power by position. Data value indexes defined by rider_position_type. + 'name': "avg_power_position", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 107: { + 'num': 107, # Maximum power by position. Data value indexes defined by rider_position_type. + 'name': "max_power_position", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 108: { + 'num': 108, # Average cadence by position. Data value indexes defined by rider_position_type. + 'name': "avg_cadence_position", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 109: { + 'num': 109, # Maximum cadence by position. Data value indexes defined by rider_position_type. + 'name': "max_cadence_position", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 110: { + 'num': 110, + 'name': "enhanced_avg_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 111: { + 'num': 111, + 'name': "enhanced_max_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 112: { + 'num': 112, + 'name': "enhanced_avg_altitude", + 'type': "uint32", + 'array': "false", + 'scale': [5], + 'offset': [500], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 113: { + 'num': 113, + 'name': "enhanced_min_altitude", + 'type': "uint32", + 'array': "false", + 'scale': [5], + 'offset': [500], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 114: { + 'num': 114, + 'name': "enhanced_max_altitude", + 'type': "uint32", + 'array': "false", + 'scale': [5], + 'offset': [500], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 115: { + 'num': 115, # lev average motor power during lap + 'name': "avg_lev_motor_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 116: { + 'num': 116, # lev maximum motor power during lap + 'name': "max_lev_motor_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 117: { + 'num': 117, # lev battery consumption during lap + 'name': "lev_battery_consumption", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 118: { + 'num': 118, + 'name': "avg_vertical_ratio", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 119: { + 'num': 119, + 'name': "avg_stance_time_balance", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 120: { + 'num': 120, + 'name': "avg_step_length", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 121: { + 'num': 121, + 'name': "avg_vam", + 'type': "uint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 122: { + 'num': 122, # 0 if above water + 'name': "avg_depth", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 123: { + 'num': 123, # 0 if above water + 'name': "max_depth", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 124: { + 'num': 124, + 'name': "min_temperature", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 136: { + 'num': 136, + 'name': "enhanced_avg_respiration_rate", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "Breaths/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 137: { + 'num': 137, + 'name': "enhanced_max_respiration_rate", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "Breaths/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 147: { + 'num': 147, + 'name': "avg_respiration_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1, ], + 'offset': [0, ], + 'units': ["", ], + 'bits': [8,], + 'components': [136, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 148: { + 'num': 148, + 'name': "max_respiration_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1, ], + 'offset': [0, ], + 'units': ["", ], + 'bits': [8,], + 'components': [137, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 149: { + 'num': 149, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. + 'name': "total_grit", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kGrit", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 150: { + 'num': 150, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. + 'name': "total_flow", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "Flow", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 151: { + 'num': 151, + 'name': "jump_count", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 153: { + 'num': 153, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. + 'name': "avg_grit", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kGrit", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 154: { + 'num': 154, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. + 'name': "avg_flow", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "Flow", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 156: { + 'num': 156, # fractional part of total_ascent + 'name': "total_fractional_ascent", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 157: { + 'num': 157, # fractional part of total_descent + 'name': "total_fractional_descent", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 158: { + 'num': 158, + 'name': "avg_core_temperature", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 159: { + 'num': 159, + 'name': "min_core_temperature", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 160: { + 'num': 160, + 'name': "max_core_temperature", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 101: { + 'num': "101", + 'name': "length", + 'messages_key': "length_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "event", + 'type': "event", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "event_type", + 'type': "event_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "start_time", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "total_elapsed_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "total_timer_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "total_strokes", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "strokes", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "avg_speed", + 'type': "uint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "swim_stroke", + 'type': "swim_stroke", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "swim_stroke", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "avg_swimming_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "strokes/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "event_group", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "total_calories", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, + 'name': "length_type", + 'type': "length_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 18: { + 'num': 18, + 'name': "player_score", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 19: { + 'num': 19, + 'name': "opponent_score", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 20: { + 'num': 20, # stroke_type enum used as the index + 'name': "stroke_count", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 21: { + 'num': 21, # zone number used as the index + 'name': "zone_count", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 22: { + 'num': 22, + 'name': "enhanced_avg_respiration_rate", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "Breaths/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 23: { + 'num': 23, + 'name': "enhanced_max_respiration_rate", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "Breaths/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 24: { + 'num': 24, + 'name': "avg_respiration_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1, ], + 'offset': [0, ], + 'units': ["", ], + 'bits': [8,], + 'components': [22, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 25: { + 'num': 25, + 'name': "max_respiration_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1, ], + 'offset': [0, ], + 'units': ["", ], + 'bits': [8,], + 'components': [23, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + }, +}, + 20: { + 'num': "20", + 'name': "record", + 'messages_key': "record_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "altitude", + 'type': "uint16", + 'array': "false", + 'scale': [5, ], + 'offset': [500, ], + 'units': ["m", ], + 'bits': [16,], + 'components': [78, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "cadence", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "distance", + 'type': "uint32", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': True, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "speed", + 'type': "uint16", + 'array': "false", + 'scale': [1000, ], + 'offset': [0, ], + 'units': ["m/s", ], + 'bits': [16,], + 'components': [73, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "compressed_speed_distance", + 'type': "byte", + 'array': "true", + 'scale': [100, 16, ], + 'offset': [0, 0, ], + 'units': ["m/s", "m", ], + 'bits': [12,12,], + 'components': [6, 5, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, # Relative. 0 is none 254 is Max. + 'name': "resistance", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "time_from_course", + 'type': "sint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, + 'name': "cycle_length", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "temperature", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 17: { + 'num': 17, # Speed at 1s intervals. Timestamp field indicates time of last array element. + 'name': "speed_1s", + 'type': "uint8", + 'array': "true", + 'scale': [16], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 18: { + 'num': 18, + 'name': "cycles", + 'type': "uint8", + 'array': "false", + 'scale': [1, ], + 'offset': [0, ], + 'units': ["cycles", ], + 'bits': [8,], + 'components': [19, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 19: { + 'num': 19, + 'name': "total_cycles", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "cycles", + 'bits': [], + 'components': [], + 'is_accumulated': True, + 'has_components': False, + 'sub_fields': [] + }, + 28: { + 'num': 28, + 'name': "compressed_accumulated_power", + 'type': "uint16", + 'array': "false", + 'scale': [1, ], + 'offset': [0, ], + 'units': ["watts", ], + 'bits': [16,], + 'components': [29, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 29: { + 'num': 29, + 'name': "accumulated_power", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': True, + 'has_components': False, + 'sub_fields': [] + }, + 30: { + 'num': 30, + 'name': "left_right_balance", + 'type': "left_right_balance", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 31: { + 'num': 31, + 'name': "gps_accuracy", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 32: { + 'num': 32, + 'name': "vertical_speed", + 'type': "sint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 33: { + 'num': 33, + 'name': "calories", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 39: { + 'num': 39, + 'name': "vertical_oscillation", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 40: { + 'num': 40, + 'name': "stance_time_percent", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 41: { + 'num': 41, + 'name': "stance_time", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 42: { + 'num': 42, + 'name': "activity_type", + 'type': "activity_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 43: { + 'num': 43, + 'name': "left_torque_effectiveness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 44: { + 'num': 44, + 'name': "right_torque_effectiveness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 45: { + 'num': 45, + 'name': "left_pedal_smoothness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 46: { + 'num': 46, + 'name': "right_pedal_smoothness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 47: { + 'num': 47, + 'name': "combined_pedal_smoothness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 48: { + 'num': 48, + 'name': "time128", + 'type': "uint8", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 49: { + 'num': 49, + 'name': "stroke_type", + 'type': "stroke_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 50: { + 'num': 50, + 'name': "zone", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 51: { + 'num': 51, + 'name': "ball_speed", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 52: { + 'num': 52, # Log cadence and fractional cadence for backwards compatability + 'name': "cadence256", + 'type': "uint16", + 'array': "false", + 'scale': [256], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 53: { + 'num': 53, + 'name': "fractional_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 54: { + 'num': 54, # Total saturated and unsaturated hemoglobin + 'name': "total_hemoglobin_conc", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "g/dL", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 55: { + 'num': 55, # Min saturated and unsaturated hemoglobin + 'name': "total_hemoglobin_conc_min", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "g/dL", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 56: { + 'num': 56, # Max saturated and unsaturated hemoglobin + 'name': "total_hemoglobin_conc_max", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "g/dL", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 57: { + 'num': 57, # Percentage of hemoglobin saturated with oxygen + 'name': "saturated_hemoglobin_percent", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 58: { + 'num': 58, # Min percentage of hemoglobin saturated with oxygen + 'name': "saturated_hemoglobin_percent_min", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 59: { + 'num': 59, # Max percentage of hemoglobin saturated with oxygen + 'name': "saturated_hemoglobin_percent_max", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 62: { + 'num': 62, + 'name': "device_index", + 'type': "device_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 67: { + 'num': 67, # Left platform center offset + 'name': "left_pco", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 68: { + 'num': 68, # Right platform center offset + 'name': "right_pco", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 69: { + 'num': 69, # Left power phase angles. Data value indexes defined by power_phase_type. + 'name': "left_power_phase", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 70: { + 'num': 70, # Left power phase peak angles. Data value indexes defined by power_phase_type. + 'name': "left_power_phase_peak", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 71: { + 'num': 71, # Right power phase angles. Data value indexes defined by power_phase_type. + 'name': "right_power_phase", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 72: { + 'num': 72, # Right power phase peak angles. Data value indexes defined by power_phase_type. + 'name': "right_power_phase_peak", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 73: { + 'num': 73, + 'name': "enhanced_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 78: { + 'num': 78, + 'name': "enhanced_altitude", + 'type': "uint32", + 'array': "false", + 'scale': [5], + 'offset': [500], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 81: { + 'num': 81, # lev battery state of charge + 'name': "battery_soc", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 82: { + 'num': 82, # lev motor power + 'name': "motor_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 83: { + 'num': 83, + 'name': "vertical_ratio", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 84: { + 'num': 84, + 'name': "stance_time_balance", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 85: { + 'num': 85, + 'name': "step_length", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 87: { + 'num': 87, # Supports larger cycle sizes needed for paddlesports. Max cycle size: 655.35 + 'name': "cycle_length16", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 91: { + 'num': 91, # Includes atmospheric pressure + 'name': "absolute_pressure", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "Pa", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 92: { + 'num': 92, # 0 if above water + 'name': "depth", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 93: { + 'num': 93, # 0 if above water + 'name': "next_stop_depth", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 94: { + 'num': 94, + 'name': "next_stop_time", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 95: { + 'num': 95, + 'name': "time_to_surface", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 96: { + 'num': 96, + 'name': "ndl_time", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 97: { + 'num': 97, + 'name': "cns_load", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 98: { + 'num': 98, + 'name': "n2_load", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 99: { + 'num': 99, + 'name': "respiration_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1, ], + 'offset': [0, ], + 'units': ["s", ], + 'bits': [8,], + 'components': [108, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 108: { + 'num': 108, + 'name': "enhanced_respiration_rate", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "Breaths/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 114: { + 'num': 114, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. + 'name': "grit", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 115: { + 'num': 115, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. + 'name': "flow", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 116: { + 'num': 116, # Current Stress value + 'name': "current_stress", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 117: { + 'num': 117, + 'name': "ebike_travel_range", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "km", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 118: { + 'num': 118, + 'name': "ebike_battery_level", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 119: { + 'num': 119, + 'name': "ebike_assist_mode", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "depends on sensor", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 120: { + 'num': 120, + 'name': "ebike_assist_level_percent", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 123: { + 'num': 123, + 'name': "air_time_remaining", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 124: { + 'num': 124, # Pressure-based surface air consumption + 'name': "pressure_sac", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "bar/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 125: { + 'num': 125, # Volumetric surface air consumption + 'name': "volume_sac", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "L/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 126: { + 'num': 126, # Respiratory minute volume + 'name': "rmv", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "L/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 127: { + 'num': 127, + 'name': "ascent_rate", + 'type': "sint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 129: { + 'num': 129, # Current partial pressure of oxygen + 'name': "po2", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 139: { + 'num': 139, + 'name': "core_temperature", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 21: { + 'num': "21", + 'name': "event", + 'messages_key': "event_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "event", + 'type': "event", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "event_type", + 'type': "event_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "data16", + 'type': "uint16", + 'array': "false", + 'scale': [1, ], + 'offset': [0, ], + 'units': ["", ], + 'bits': [16,], + 'components': [3, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "data", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "timer_trigger", + 'type': "timer_trigger", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 0, 'value_name': "timer" }, + ], + }, + { + 'name': "course_point_index", + 'type': "message_index", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 10, 'value_name': "course_point" }, + ], + }, + { + 'name': "battery_level", + 'type': "uint16", + 'array': "", + 'scale': [1000], + 'offset': [0], + 'units': ["V"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 11, 'value_name': "battery" }, + ], + }, + { + 'name': "virtual_partner_speed", + 'type': "uint16", + 'array': "", + 'scale': [1000], + 'offset': [0], + 'units': ["m/s"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 12, 'value_name': "virtual_partner_pace" }, + ], + }, + { + 'name': "hr_high_alert", + 'type': "uint8", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["bpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 13, 'value_name': "hr_high_alert" }, + ], + }, + { + 'name': "hr_low_alert", + 'type': "uint8", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["bpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 14, 'value_name': "hr_low_alert" }, + ], + }, + { + 'name': "speed_high_alert", + 'type': "uint32", + 'array': "", + 'scale': [1000], + 'offset': [0], + 'units': ["m/s"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 15, 'value_name': "speed_high_alert" }, + ], + }, + { + 'name': "speed_low_alert", + 'type': "uint32", + 'array': "", + 'scale': [1000], + 'offset': [0], + 'units': ["m/s"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 16, 'value_name': "speed_low_alert" }, + ], + }, + { + 'name': "cad_high_alert", + 'type': "uint16", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["rpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 17, 'value_name': "cad_high_alert" }, + ], + }, + { + 'name': "cad_low_alert", + 'type': "uint16", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["rpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 18, 'value_name': "cad_low_alert" }, + ], + }, + { + 'name': "power_high_alert", + 'type': "uint16", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["watts"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 19, 'value_name': "power_high_alert" }, + ], + }, + { + 'name': "power_low_alert", + 'type': "uint16", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["watts"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 20, 'value_name': "power_low_alert" }, + ], + }, + { + 'name': "time_duration_alert", + 'type': "uint32", + 'array': "", + 'scale': [1000], + 'offset': [0], + 'units': ["s"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 23, 'value_name': "time_duration_alert" }, + ], + }, + { + 'name': "distance_duration_alert", + 'type': "uint32", + 'array': "", + 'scale': [100], + 'offset': [0], + 'units': ["m"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 24, 'value_name': "distance_duration_alert" }, + ], + }, + { + 'name': "calorie_duration_alert", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["calories"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 25, 'value_name': "calorie_duration_alert" }, + ], + }, + { + 'name': "fitness_equipment_state", + 'type': "fitness_equipment_state", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 27, 'value_name': "fitness_equipment" }, + ], + }, + { + 'name': "sport_point", + 'type': "uint32", + 'array': "", + 'scale': [1, 1, ], + 'offset': [0, 0, ], + 'units': ["", "", ], + 'bits': [16,16,], + 'components': [7, 8, ], + 'has_components': True, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 33, 'value_name': "sport_point" }, + ], + }, + { + 'name': "gear_change_data", + 'type': "uint32", + 'array': "", + 'scale': [1, 1, 1, 1, ], + 'offset': [0, 0, 0, 0, ], + 'units': ["", "", "", "", ], + 'bits': [8,8,8,8,], + 'components': [11, 12, 9, 10, ], + 'has_components': True, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 42, 'value_name': "front_gear_change" }, + { 'num': 0, 'name': "event", 'raw_value': 43, 'value_name': "rear_gear_change" }, + ], + }, + { + 'name': "rider_position", # Indicates the rider position value. + 'type': "rider_position_type", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 44, 'value_name': "rider_position_change" }, + ], + }, + { + 'name': "comm_timeout", + 'type': "comm_timeout_type", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 47, 'value_name': "comm_timeout" }, + ], + }, + { + 'name': "dive_alert", + 'type': "dive_alert", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 56, 'value_name': "dive_alert" }, + ], + }, + { + 'name': "auto_activity_detect_duration", + 'type': "uint16", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["min"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 54, 'value_name': "auto_activity_detect" }, + ], + }, + { + 'name': "radar_threat_alert", # The first byte is the radar_threat_level_max, the second byte is the radar_threat_count, third bytes is the average approach speed, and the 4th byte is the max approach speed + 'type': "uint32", + 'array': "", + 'scale': [1, 1, 10, 10, ], + 'offset': [0, 0, 0, 0, ], + 'units': ["", "", "", "", ], + 'bits': [8,8,8,8,], + 'components': [21, 22, 23, 24, ], + 'has_components': True, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 75, 'value_name': "radar_threat_alert" }, + ], + }, + ] + }, + 4: { + 'num': 4, + 'name': "event_group", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Do not populate directly. Autogenerated by decoder for sport_point subfield components + 'name': "score", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # Do not populate directly. Autogenerated by decoder for sport_point subfield components + 'name': "opponent_score", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Front gear number. 1 is innermost. + 'name': "front_gear_num", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Number of front teeth. + 'name': "front_gear", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Rear gear number. 1 is innermost. + 'name': "rear_gear_num", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, # Do not populate directly. Autogenerated by decoder for gear_change subfield components. Number of rear teeth. + 'name': "rear_gear", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "device_index", + 'type': "device_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, # Activity Type associated with an auto_activity_detect event + 'name': "activity_type", + 'type': "activity_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 15: { + 'num': 15, # Timestamp of when the event started + 'name': "start_timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "auto_activity_detect_start_timestamp", # Auto Activity Detect Start Timestamp. + 'type': "date_time", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["s"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "event", 'raw_value': 54, 'value_name': "auto_activity_detect" }, + ], + }, + ] + }, + 21: { + 'num': 21, # Do not populate directly. Autogenerated by decoder for threat_alert subfield components. + 'name': "radar_threat_level_max", + 'type': "radar_threat_level_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 22: { + 'num': 22, # Do not populate directly. Autogenerated by decoder for threat_alert subfield components. + 'name': "radar_threat_count", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 23: { + 'num': 23, # Do not populate directly. Autogenerated by decoder for radar_threat_alert subfield components + 'name': "radar_threat_avg_approach_speed", + 'type': "uint8", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 24: { + 'num': 24, # Do not populate directly. Autogenerated by decoder for radar_threat_alert subfield components + 'name': "radar_threat_max_approach_speed", + 'type': "uint8", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 23: { + 'num': "23", + 'name': "device_info", + 'messages_key': "device_info_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "device_index", + 'type': "device_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "device_type", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "ble_device_type", + 'type': "ble_device_type", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 25, 'name': "source_type", 'raw_value': 3, 'value_name': "bluetooth_low_energy" }, + ], + }, + { + 'name': "antplus_device_type", + 'type': "antplus_device_type", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 25, 'name': "source_type", 'raw_value': 1, 'value_name': "antplus" }, + ], + }, + { + 'name': "ant_device_type", + 'type': "uint8", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 25, 'name': "source_type", 'raw_value': 0, 'value_name': "ant" }, + ], + }, + { + 'name': "local_device_type", + 'type': "local_device_type", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 25, 'name': "source_type", 'raw_value': 5, 'value_name': "local" }, + ], + }, + ] + }, + 2: { + 'num': 2, + 'name': "manufacturer", + 'type': "manufacturer", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "serial_number", + 'type': "uint32z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "product", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "favero_product", + 'type': "favero_product", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 2, 'name': "manufacturer", 'raw_value': 263, 'value_name': "favero_electronics" }, + ], + }, + { + 'name': "garmin_product", + 'type': "garmin_product", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 2, 'name': "manufacturer", 'raw_value': 1, 'value_name': "garmin" }, + { 'num': 2, 'name': "manufacturer", 'raw_value': 15, 'value_name': "dynastream" }, + { 'num': 2, 'name': "manufacturer", 'raw_value': 13, 'value_name': "dynastream_oem" }, + { 'num': 2, 'name': "manufacturer", 'raw_value': 89, 'value_name': "tacx" }, + ], + }, + ] + }, + 5: { + 'num': 5, + 'name': "software_version", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "hardware_version", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Reset by new battery or charge. + 'name': "cum_operating_time", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "battery_voltage", + 'type': "uint16", + 'array': "false", + 'scale': [256], + 'offset': [0], + 'units': "V", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "battery_status", + 'type': "battery_status", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 18: { + 'num': 18, # Indicates the location of the sensor + 'name': "sensor_position", + 'type': "body_location", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 19: { + 'num': 19, # Used to describe the sensor or location + 'name': "descriptor", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 20: { + 'num': 20, + 'name': "ant_transmission_type", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 21: { + 'num': 21, + 'name': "ant_device_number", + 'type': "uint16z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 22: { + 'num': 22, + 'name': "ant_network", + 'type': "ant_network", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 25: { + 'num': 25, + 'name': "source_type", + 'type': "source_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 27: { + 'num': 27, # Optional free form string to indicate the devices name or model + 'name': "product_name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 32: { + 'num': 32, + 'name': "battery_level", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 375: { + 'num': "375", + 'name': "device_aux_battery_info", + 'messages_key': "device_aux_battery_info_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "device_index", + 'type': "device_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "battery_voltage", + 'type': "uint16", + 'array': "false", + 'scale': [256], + 'offset': [0], + 'units': "V", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "battery_status", + 'type': "battery_status", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "battery_identifier", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 72: { + 'num': "72", # Corresponds to file_id of workout or course. + 'name': "training_file", + 'messages_key': "training_file_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "type", + 'type': "file", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "manufacturer", + 'type': "manufacturer", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "product", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "favero_product", + 'type': "favero_product", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "manufacturer", 'raw_value': 263, 'value_name': "favero_electronics" }, + ], + }, + { + 'name': "garmin_product", + 'type': "garmin_product", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "manufacturer", 'raw_value': 1, 'value_name': "garmin" }, + { 'num': 1, 'name': "manufacturer", 'raw_value': 15, 'value_name': "dynastream" }, + { 'num': 1, 'name': "manufacturer", 'raw_value': 13, 'value_name': "dynastream_oem" }, + { 'num': 1, 'name': "manufacturer", 'raw_value': 89, 'value_name': "tacx" }, + ], + }, + ] + }, + 3: { + 'num': 3, + 'name': "serial_number", + 'type': "uint32z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "time_created", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 128: { + 'num': "128", + 'name': "weather_conditions", + 'messages_key': "weather_conditions_mesgs", + 'fields': { + 253: { + 'num': 253, # time of update for current conditions, else forecast time + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Current or forecast + 'name': "weather_report", + 'type': "weather_report", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "temperature", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Corresponds to GSC Response weatherIcon field + 'name': "condition", + 'type': "weather_status", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "wind_direction", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "wind_speed", + 'type': "uint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # range 0-100 + 'name': "precipitation_probability", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Heat Index if GCS heatIdx above or equal to 90F or wind chill if GCS windChill below or equal to 32F + 'name': "temperature_feels_like", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "relative_humidity", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # string corresponding to GCS response location string + 'name': "location", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "observed_at_time", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "observed_location_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "observed_location_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, + 'name': "day_of_week", + 'type': "day_of_week", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "high_temperature", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, + 'name': "low_temperature", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 129: { + 'num': "129", + 'name': "weather_alert", + 'messages_key': "weather_alert_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Unique identifier from GCS report ID string, length is 12 + 'name': "report_id", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Time alert was issued + 'name': "issue_time", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Time alert expires + 'name': "expire_time", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Warning, Watch, Advisory, Statement + 'name': "severity", + 'type': "weather_severity", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Tornado, Severe Thunderstorm, etc. + 'name': "type", + 'type': "weather_severe_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 160: { + 'num': "160", + 'name': "gps_metadata", + 'messages_key': "gps_metadata_mesgs", + 'fields': { + 253: { + 'num': 253, # Whole second part of the timestamp. + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Millisecond part of the timestamp. + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "enhanced_altitude", + 'type': "uint32", + 'array': "false", + 'scale': [5], + 'offset': [500], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "enhanced_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "heading", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Used to correlate UTC to system time if the timestamp of the message is in system time. This UTC time is derived from the GPS data. + 'name': "utc_timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # velocity[0] is lon velocity. Velocity[1] is lat velocity. Velocity[2] is altitude velocity. + 'name': "velocity", + 'type': "sint16", + 'array': "true", + 'scale': [100], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 161: { + 'num': "161", + 'name': "camera_event", + 'messages_key': "camera_event_mesgs", + 'fields': { + 253: { + 'num': 253, # Whole second part of the timestamp. + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Millisecond part of the timestamp. + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "camera_event_type", + 'type': "camera_event_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "camera_file_uuid", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "camera_orientation", + 'type': "camera_orientation_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 164: { + 'num': "164", + 'name': "gyroscope_data", + 'messages_key': "gyroscope_data_mesgs", + 'fields': { + 253: { + 'num': 253, # Whole second part of the timestamp + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Millisecond part of the timestamp. + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Each time in the array describes the time at which the gyro sample with the corrosponding index was taken. Limited to 30 samples in each message. The samples may span across seconds. Array size must match the number of samples in gyro_x and gyro_y and gyro_z + 'name': "sample_time_offset", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. + 'name': "gyro_x", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. + 'name': "gyro_y", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. + 'name': "gyro_z", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # Calibrated gyro reading + 'name': "calibrated_gyro_x", + 'type': "float32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "deg/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Calibrated gyro reading + 'name': "calibrated_gyro_y", + 'type': "float32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "deg/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Calibrated gyro reading + 'name': "calibrated_gyro_z", + 'type': "float32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "deg/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 165: { + 'num': "165", + 'name': "accelerometer_data", + 'messages_key': "accelerometer_data_mesgs", + 'fields': { + 253: { + 'num': 253, # Whole second part of the timestamp + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Millisecond part of the timestamp. + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Each time in the array describes the time at which the accelerometer sample with the corrosponding index was taken. Limited to 30 samples in each message. The samples may span across seconds. Array size must match the number of samples in accel_x and accel_y and accel_z + 'name': "sample_time_offset", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. + 'name': "accel_x", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. + 'name': "accel_y", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. + 'name': "accel_z", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # Calibrated accel reading + 'name': "calibrated_accel_x", + 'type': "float32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "g", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Calibrated accel reading + 'name': "calibrated_accel_y", + 'type': "float32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "g", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Calibrated accel reading + 'name': "calibrated_accel_z", + 'type': "float32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "g", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # Calibrated accel reading + 'name': "compressed_calibrated_accel_x", + 'type': "sint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "mG", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, # Calibrated accel reading + 'name': "compressed_calibrated_accel_y", + 'type': "sint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "mG", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, # Calibrated accel reading + 'name': "compressed_calibrated_accel_z", + 'type': "sint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "mG", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 208: { + 'num': "208", + 'name': "magnetometer_data", + 'messages_key': "magnetometer_data_mesgs", + 'fields': { + 253: { + 'num': 253, # Whole second part of the timestamp + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Millisecond part of the timestamp. + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Each time in the array describes the time at which the compass sample with the corrosponding index was taken. Limited to 30 samples in each message. The samples may span across seconds. Array size must match the number of samples in cmps_x and cmps_y and cmps_z + 'name': "sample_time_offset", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. + 'name': "mag_x", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. + 'name': "mag_y", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # These are the raw ADC reading. Maximum number of samples is 30 in each message. The samples may span across seconds. A conversion will need to be done on this data once read. + 'name': "mag_z", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # Calibrated Magnetometer reading + 'name': "calibrated_mag_x", + 'type': "float32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "G", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Calibrated Magnetometer reading + 'name': "calibrated_mag_y", + 'type': "float32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "G", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Calibrated Magnetometer reading + 'name': "calibrated_mag_z", + 'type': "float32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "G", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 209: { + 'num': "209", + 'name': "barometer_data", + 'messages_key': "barometer_data_mesgs", + 'fields': { + 253: { + 'num': 253, # Whole second part of the timestamp + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Millisecond part of the timestamp. + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Each time in the array describes the time at which the barometer sample with the corrosponding index was taken. The samples may span across seconds. Array size must match the number of samples in baro_cal + 'name': "sample_time_offset", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # These are the raw ADC reading. The samples may span across seconds. A conversion will need to be done on this data once read. + 'name': "baro_pres", + 'type': "uint32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "Pa", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 167: { + 'num': "167", + 'name': "three_d_sensor_calibration", + 'messages_key': "three_d_sensor_calibration_mesgs", + 'fields': { + 253: { + 'num': 253, # Whole second part of the timestamp + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Indicates which sensor the calibration is for + 'name': "sensor_type", + 'type': "sensor_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Calibration factor used to convert from raw ADC value to degrees, g, etc. + 'name': "calibration_factor", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "accel_cal_factor", # Accelerometer calibration factor + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["g"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "sensor_type", 'raw_value': 0, 'value_name': "accelerometer" }, + ], + }, + { + 'name': "gyro_cal_factor", # Gyro calibration factor + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["deg/s"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "sensor_type", 'raw_value': 1, 'value_name': "gyroscope" }, + ], + }, + ] + }, + 2: { + 'num': 2, # Calibration factor divisor + 'name': "calibration_divisor", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Level shift value used to shift the ADC value back into range + 'name': "level_shift", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Internal calibration factors, one for each: xy, yx, zx + 'name': "offset_cal", + 'type': "sint32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # 3 x 3 rotation matrix (row major) + 'name': "orientation_matrix", + 'type': "sint32", + 'array': "true", + 'scale': [65535], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 210: { + 'num': "210", + 'name': "one_d_sensor_calibration", + 'messages_key': "one_d_sensor_calibration_mesgs", + 'fields': { + 253: { + 'num': 253, # Whole second part of the timestamp + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Indicates which sensor the calibration is for + 'name': "sensor_type", + 'type': "sensor_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Calibration factor used to convert from raw ADC value to degrees, g, etc. + 'name': "calibration_factor", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "baro_cal_factor", # Barometer calibration factor + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["Pa"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "sensor_type", 'raw_value': 3, 'value_name': "barometer" }, + ], + }, + ] + }, + 2: { + 'num': 2, # Calibration factor divisor + 'name': "calibration_divisor", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "counts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Level shift value used to shift the ADC value back into range + 'name': "level_shift", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Internal Calibration factor + 'name': "offset_cal", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 169: { + 'num': "169", + 'name': "video_frame", + 'messages_key': "video_frame_mesgs", + 'fields': { + 253: { + 'num': 253, # Whole second part of the timestamp + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Millisecond part of the timestamp. + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Number of the frame that the timestamp and timestamp_ms correlate to + 'name': "frame_number", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 174: { + 'num': "174", + 'name': "obdii_data", + 'messages_key': "obdii_data_mesgs", + 'fields': { + 253: { + 'num': 253, # Timestamp message was output + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Fractional part of timestamp, added to timestamp + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Offset of PID reading [i] from start_timestamp+start_timestamp_ms. Readings may span accross seconds. + 'name': "time_offset", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Parameter ID + 'name': "pid", + 'type': "byte", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Raw parameter data + 'name': "raw_data", + 'type': "byte", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Optional, data size of PID[i]. If not specified refer to SAE J1979. + 'name': "pid_data_size", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # System time associated with sample expressed in ms, can be used instead of time_offset. There will be a system_time value for each raw_data element. For multibyte pids the system_time is repeated. + 'name': "system_time", + 'type': "uint32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Timestamp of first sample recorded in the message. Used with time_offset to generate time of each sample + 'name': "start_timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Fractional part of start_timestamp + 'name': "start_timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 177: { + 'num': "177", + 'name': "nmea_sentence", + 'messages_key': "nmea_sentence_mesgs", + 'fields': { + 253: { + 'num': 253, # Timestamp message was output + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Fractional part of timestamp, added to timestamp + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # NMEA sentence + 'name': "sentence", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 178: { + 'num': "178", + 'name': "aviation_attitude", + 'messages_key': "aviation_attitude_mesgs", + 'fields': { + 253: { + 'num': 253, # Timestamp message was output + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Fractional part of timestamp, added to timestamp + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # System time associated with sample expressed in ms. + 'name': "system_time", + 'type': "uint32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Range -PI/2 to +PI/2 + 'name': "pitch", + 'type': "sint16", + 'array': "true", + 'scale': [10430.38], + 'offset': [0], + 'units': "radians", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Range -PI to +PI + 'name': "roll", + 'type': "sint16", + 'array': "true", + 'scale': [10430.38], + 'offset': [0], + 'units': "radians", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Range -78.4 to +78.4 (-8 Gs to 8 Gs) + 'name': "accel_lateral", + 'type': "sint16", + 'array': "true", + 'scale': [100], + 'offset': [0], + 'units': "m/s^2", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # Range -78.4 to +78.4 (-8 Gs to 8 Gs) + 'name': "accel_normal", + 'type': "sint16", + 'array': "true", + 'scale': [100], + 'offset': [0], + 'units': "m/s^2", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Range -8.727 to +8.727 (-500 degs/sec to +500 degs/sec) + 'name': "turn_rate", + 'type': "sint16", + 'array': "true", + 'scale': [1024], + 'offset': [0], + 'units': "radians/second", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "stage", + 'type': "attitude_stage", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # The percent complete of the current attitude stage. Set to 0 for attitude stages 0, 1 and 2 and to 100 for attitude stage 3 by AHRS modules that do not support it. Range - 100 + 'name': "attitude_stage_complete", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, # Track Angle/Heading Range 0 - 2pi + 'name': "track", + 'type': "uint16", + 'array': "true", + 'scale': [10430.38], + 'offset': [0], + 'units': "radians", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "validity", + 'type': "attitude_validity", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 184: { + 'num': "184", + 'name': "video", + 'messages_key': "video_mesgs", + 'fields': { + 0: { + 'num': 0, + 'name': "url", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "hosting_provider", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Playback time of video + 'name': "duration", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 185: { + 'num': "185", + 'name': "video_title", + 'messages_key': "video_title_mesgs", + 'fields': { + 254: { + 'num': 254, # Long titles will be split into multiple parts + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Total number of title parts + 'name': "message_count", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "text", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 186: { + 'num': "186", + 'name': "video_description", + 'messages_key': "video_description_mesgs", + 'fields': { + 254: { + 'num': 254, # Long descriptions will be split into multiple parts + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Total number of description parts + 'name': "message_count", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "text", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 187: { + 'num': "187", + 'name': "video_clip", + 'messages_key': "video_clip_mesgs", + 'fields': { + 0: { + 'num': 0, + 'name': "clip_number", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "start_timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "start_timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "end_timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "end_timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Start of clip in video time + 'name': "clip_start", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # End of clip in video time + 'name': "clip_end", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 225: { + 'num': "225", + 'name': "set", + 'messages_key': "set_mesgs", + 'fields': { + 254: { + 'num': 254, # Timestamp of the set + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "duration", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # # of repitions of the movement + 'name': "repetitions", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Amount of weight applied for the set + 'name': "weight", + 'type': "uint16", + 'array': "false", + 'scale': [16], + 'offset': [0], + 'units': "kg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "set_type", + 'type': "set_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Start time of the set + 'name': "start_time", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "category", + 'type': "exercise_category", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # Based on the associated category, see [category]_exercise_names + 'name': "category_subtype", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "weight_display_unit", + 'type': "fit_base_unit", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "wkt_step_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 285: { + 'num': "285", + 'name': "jump", + 'messages_key': "jump_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "distance", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "height", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "rotations", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "hang_time", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # A score for a jump calculated based on hang time, rotations, and distance. + 'name': "score", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "speed", + 'type': "uint16", + 'array': "false", + 'scale': [1000, ], + 'offset': [0, ], + 'units': ["m/s", ], + 'bits': [16,], + 'components': [8, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "enhanced_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 312: { + 'num': "312", + 'name': "split", + 'messages_key': "split_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "split_type", + 'type': "split_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "total_elapsed_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "total_timer_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "total_distance", + 'type': "uint32", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "avg_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "start_time", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "total_ascent", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, + 'name': "total_descent", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 21: { + 'num': 21, + 'name': "start_position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 22: { + 'num': 22, + 'name': "start_position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 23: { + 'num': 23, + 'name': "end_position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 24: { + 'num': 24, + 'name': "end_position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 25: { + 'num': 25, + 'name': "max_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 26: { + 'num': 26, + 'name': "avg_vert_speed", + 'type': "sint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 27: { + 'num': 27, + 'name': "end_time", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 28: { + 'num': 28, + 'name': "total_calories", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 74: { + 'num': 74, + 'name': "start_elevation", + 'type': "uint32", + 'array': "false", + 'scale': [5], + 'offset': [500], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 110: { + 'num': 110, + 'name': "total_moving_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 313: { + 'num': "313", + 'name': "split_summary", + 'messages_key': "split_summary_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "split_type", + 'type': "split_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "num_splits", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "total_timer_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "total_distance", + 'type': "uint32", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "avg_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "max_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "total_ascent", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "total_descent", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "avg_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "max_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, + 'name': "avg_vert_speed", + 'type': "sint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "total_calories", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 77: { + 'num': 77, + 'name': "total_moving_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 317: { + 'num': "317", + 'name': "climb_pro", + 'messages_key': "climb_pro_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "climb_pro_event", + 'type': "climb_pro_event", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "climb_number", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "climb_category", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "current_dist", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 206: { + 'num': "206", # Must be logged before developer field is used + 'name': "field_description", + 'messages_key': "field_description_mesgs", + 'fields': { + 0: { + 'num': 0, + 'name': "developer_data_index", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "field_definition_number", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "fit_base_type_id", + 'type': "fit_base_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "field_name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "array", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "components", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "scale", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "offset", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "units", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "bits", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "accumulate", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "fit_base_unit_id", + 'type': "fit_base_unit", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, + 'name': "native_mesg_num", + 'type': "mesg_num", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 15: { + 'num': 15, + 'name': "native_field_num", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 207: { + 'num': "207", # Must be logged before field description + 'name': "developer_data_id", + 'messages_key': "developer_data_id_mesgs", + 'fields': { + 0: { + 'num': 0, + 'name': "developer_id", + 'type': "byte", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "application_id", + 'type': "byte", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "manufacturer_id", + 'type': "manufacturer", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "developer_data_index", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "application_version", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 31: { + 'num': "31", + 'name': "course", + 'messages_key': "course_mesgs", + 'fields': { + 4: { + 'num': 4, + 'name': "sport", + 'type': "sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "capabilities", + 'type': "course_capabilities", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "sub_sport", + 'type': "sub_sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 32: { + 'num': "32", + 'name': "course_point", + 'messages_key': "course_point_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "distance", + 'type': "uint32", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "type", + 'type': "course_point", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "favorite", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 148: { + 'num': "148", # Unique Identification data for a segment file + 'name': "segment_id", + 'messages_key': "segment_id_mesgs", + 'fields': { + 0: { + 'num': 0, # Friendly name assigned to segment + 'name': "name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # UUID of the segment + 'name': "uuid", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Sport associated with the segment + 'name': "sport", + 'type': "sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Segment enabled for evaluation + 'name': "enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Primary key of the user that created the segment + 'name': "user_profile_primary_key", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # ID of the device that created the segment + 'name': "device_id", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Index for the Leader Board entry selected as the default race participant + 'name': "default_race_leader", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Indicates if any segments should be deleted + 'name': "delete_status", + 'type': "segment_delete_status", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # Indicates how the segment was selected to be sent to the device + 'name': "selection_type", + 'type': "segment_selection_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 149: { + 'num': "149", # Unique Identification data for an individual segment leader within a segment file + 'name': "segment_leaderboard_entry", + 'messages_key': "segment_leaderboard_entry_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Friendly name assigned to leader + 'name': "name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Leader classification + 'name': "type", + 'type': "segment_leaderboard_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Primary user ID of this leader + 'name': "group_primary_key", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # ID of the activity associated with this leader time + 'name': "activity_id", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Segment Time (includes pauses) + 'name': "segment_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # String version of the activity_id. 21 characters long, express in decimal + 'name': "activity_id_string", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 150: { + 'num': "150", # Navigation and race evaluation point for a segment decribing a point along the segment path and time it took each segment leader to reach that point + 'name': "segment_point", + 'messages_key': "segment_point_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Accumulated distance along the segment at the described point + 'name': "distance", + 'type': "uint32", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Accumulated altitude along the segment at the described point + 'name': "altitude", + 'type': "uint16", + 'array': "false", + 'scale': [5, ], + 'offset': [500, ], + 'units': ["m", ], + 'bits': [16,], + 'components': [6, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 5: { + 'num': 5, # Accumualted time each leader board member required to reach the described point. This value is zero for all leader board members at the starting point of the segment. + 'name': "leader_time", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Accumulated altitude along the segment at the described point + 'name': "enhanced_altitude", + 'type': "uint32", + 'array': "false", + 'scale': [5], + 'offset': [500], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 142: { + 'num': "142", + 'name': "segment_lap", + 'messages_key': "segment_lap_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "event", + 'type': "event", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "event_type", + 'type': "event_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "start_time", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "start_position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "start_position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "end_position_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "end_position_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Time (includes pauses) + 'name': "total_elapsed_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # Timer Time (excludes pauses) + 'name': "total_timer_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "total_distance", + 'type': "uint32", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "total_cycles", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "cycles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "total_strokes", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["strokes"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 23, 'name': "sport", 'raw_value': 2, 'value_name': "cycling" }, + ], + }, + ] + }, + 11: { + 'num': 11, + 'name': "total_calories", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, # If New Leaf + 'name': "total_fat_calories", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "avg_speed", + 'type': "uint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, + 'name': "max_speed", + 'type': "uint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 15: { + 'num': 15, + 'name': "avg_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 16: { + 'num': 16, + 'name': "max_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 17: { + 'num': 17, # total_cycles / total_timer_time if non_zero_avg_cadence otherwise total_cycles / total_elapsed_time + 'name': "avg_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 18: { + 'num': 18, + 'name': "max_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 19: { + 'num': 19, # total_power / total_timer_time if non_zero_avg_power otherwise total_power / total_elapsed_time + 'name': "avg_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 20: { + 'num': 20, + 'name': "max_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 21: { + 'num': 21, + 'name': "total_ascent", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 22: { + 'num': 22, + 'name': "total_descent", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 23: { + 'num': 23, + 'name': "sport", + 'type': "sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 24: { + 'num': 24, + 'name': "event_group", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 25: { + 'num': 25, # North east corner latitude. + 'name': "nec_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 26: { + 'num': 26, # North east corner longitude. + 'name': "nec_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 27: { + 'num': 27, # South west corner latitude. + 'name': "swc_lat", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 28: { + 'num': 28, # South west corner latitude. + 'name': "swc_long", + 'type': "sint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "semicircles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 29: { + 'num': 29, + 'name': "name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 30: { + 'num': 30, + 'name': "normalized_power", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 31: { + 'num': 31, + 'name': "left_right_balance", + 'type': "left_right_balance_100", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 32: { + 'num': 32, + 'name': "sub_sport", + 'type': "sub_sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 33: { + 'num': 33, + 'name': "total_work", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "J", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 34: { + 'num': 34, + 'name': "avg_altitude", + 'type': "uint16", + 'array': "false", + 'scale': [5, ], + 'offset': [500, ], + 'units': ["m", ], + 'bits': [16,], + 'components': [91, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 35: { + 'num': 35, + 'name': "max_altitude", + 'type': "uint16", + 'array': "false", + 'scale': [5, ], + 'offset': [500, ], + 'units': ["m", ], + 'bits': [16,], + 'components': [92, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 36: { + 'num': 36, + 'name': "gps_accuracy", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 37: { + 'num': 37, + 'name': "avg_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 38: { + 'num': 38, + 'name': "avg_pos_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 39: { + 'num': 39, + 'name': "avg_neg_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 40: { + 'num': 40, + 'name': "max_pos_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 41: { + 'num': 41, + 'name': "max_neg_grade", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 42: { + 'num': 42, + 'name': "avg_temperature", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 43: { + 'num': 43, + 'name': "max_temperature", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 44: { + 'num': 44, + 'name': "total_moving_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 45: { + 'num': 45, + 'name': "avg_pos_vertical_speed", + 'type': "sint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 46: { + 'num': 46, + 'name': "avg_neg_vertical_speed", + 'type': "sint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 47: { + 'num': 47, + 'name': "max_pos_vertical_speed", + 'type': "sint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 48: { + 'num': 48, + 'name': "max_neg_vertical_speed", + 'type': "sint16", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 49: { + 'num': 49, + 'name': "time_in_hr_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 50: { + 'num': 50, + 'name': "time_in_speed_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 51: { + 'num': 51, + 'name': "time_in_cadence_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 52: { + 'num': 52, + 'name': "time_in_power_zone", + 'type': "uint32", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 53: { + 'num': 53, + 'name': "repetition_num", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 54: { + 'num': 54, + 'name': "min_altitude", + 'type': "uint16", + 'array': "false", + 'scale': [5, ], + 'offset': [500, ], + 'units': ["m", ], + 'bits': [16,], + 'components': [93, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 55: { + 'num': 55, + 'name': "min_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 56: { + 'num': 56, + 'name': "active_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 57: { + 'num': 57, + 'name': "wkt_step_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 58: { + 'num': 58, + 'name': "sport_event", + 'type': "sport_event", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 59: { + 'num': 59, + 'name': "avg_left_torque_effectiveness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 60: { + 'num': 60, + 'name': "avg_right_torque_effectiveness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 61: { + 'num': 61, + 'name': "avg_left_pedal_smoothness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 62: { + 'num': 62, + 'name': "avg_right_pedal_smoothness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 63: { + 'num': 63, + 'name': "avg_combined_pedal_smoothness", + 'type': "uint8", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 64: { + 'num': 64, + 'name': "status", + 'type': "segment_lap_status", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 65: { + 'num': 65, + 'name': "uuid", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 66: { + 'num': 66, # fractional part of the avg_cadence + 'name': "avg_fractional_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 67: { + 'num': 67, # fractional part of the max_cadence + 'name': "max_fractional_cadence", + 'type': "uint8", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 68: { + 'num': 68, # fractional part of the total_cycles + 'name': "total_fractional_cycles", + 'type': "uint8", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "cycles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 69: { + 'num': 69, + 'name': "front_gear_shift_count", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 70: { + 'num': 70, + 'name': "rear_gear_shift_count", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 71: { + 'num': 71, # Total time spent in the standing position + 'name': "time_standing", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 72: { + 'num': 72, # Number of transitions to the standing state + 'name': "stand_count", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 73: { + 'num': 73, # Average left platform center offset + 'name': "avg_left_pco", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 74: { + 'num': 74, # Average right platform center offset + 'name': "avg_right_pco", + 'type': "sint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 75: { + 'num': 75, # Average left power phase angles. Data value indexes defined by power_phase_type. + 'name': "avg_left_power_phase", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 76: { + 'num': 76, # Average left power phase peak angles. Data value indexes defined by power_phase_type. + 'name': "avg_left_power_phase_peak", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 77: { + 'num': 77, # Average right power phase angles. Data value indexes defined by power_phase_type. + 'name': "avg_right_power_phase", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 78: { + 'num': 78, # Average right power phase peak angles. Data value indexes defined by power_phase_type. + 'name': "avg_right_power_phase_peak", + 'type': "uint8", + 'array': "true", + 'scale': [0.7111111], + 'offset': [0], + 'units': "degrees", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 79: { + 'num': 79, # Average power by position. Data value indexes defined by rider_position_type. + 'name': "avg_power_position", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 80: { + 'num': 80, # Maximum power by position. Data value indexes defined by rider_position_type. + 'name': "max_power_position", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "watts", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 81: { + 'num': 81, # Average cadence by position. Data value indexes defined by rider_position_type. + 'name': "avg_cadence_position", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 82: { + 'num': 82, # Maximum cadence by position. Data value indexes defined by rider_position_type. + 'name': "max_cadence_position", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "rpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 83: { + 'num': 83, # Manufacturer that produced the segment + 'name': "manufacturer", + 'type': "manufacturer", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 84: { + 'num': 84, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. + 'name': "total_grit", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kGrit", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 85: { + 'num': 85, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. + 'name': "total_flow", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "Flow", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 86: { + 'num': 86, # The grit score estimates how challenging a route could be for a cyclist in terms of time spent going over sharp turns or large grade slopes. + 'name': "avg_grit", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kGrit", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 87: { + 'num': 87, # The flow score estimates how long distance wise a cyclist deaccelerates over intervals where deacceleration is unnecessary such as smooth turns or small grade angle intervals. + 'name': "avg_flow", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "Flow", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 89: { + 'num': 89, # fractional part of total_ascent + 'name': "total_fractional_ascent", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 90: { + 'num': 90, # fractional part of total_descent + 'name': "total_fractional_descent", + 'type': "uint8", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 91: { + 'num': 91, + 'name': "enhanced_avg_altitude", + 'type': "uint32", + 'array': "false", + 'scale': [5], + 'offset': [500], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 92: { + 'num': 92, + 'name': "enhanced_max_altitude", + 'type': "uint32", + 'array': "false", + 'scale': [5], + 'offset': [500], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 93: { + 'num': 93, + 'name': "enhanced_min_altitude", + 'type': "uint32", + 'array': "false", + 'scale': [5], + 'offset': [500], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 151: { + 'num': "151", # Summary of the unique segment and leaderboard information associated with a segment file. This message is used to compile a segment list file describing all segment files on a device. The segment list file is used when refreshing the contents of a segment file with the latest available leaderboard information. + 'name': "segment_file", + 'messages_key': "segment_file_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # UUID of the segment file + 'name': "file_uuid", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Enabled state of the segment file + 'name': "enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Primary key of the user that created the segment file + 'name': "user_profile_primary_key", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Leader type of each leader in the segment file + 'name': "leader_type", + 'type': "segment_leaderboard_type", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # Group primary key of each leader in the segment file + 'name': "leader_group_primary_key", + 'type': "uint32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, # Activity ID of each leader in the segment file + 'name': "leader_activity_id", + 'type': "uint32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, # String version of the activity ID of each leader in the segment file. 21 characters long for each ID, express in decimal + 'name': "leader_activity_id_string", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, # Index for the Leader Board entry selected as the default race participant + 'name': "default_race_leader", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 26: { + 'num': "26", + 'name': "workout", + 'messages_key': "workout_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "sport", + 'type': "sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "capabilities", + 'type': "workout_capabilities", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # number of valid steps + 'name': "num_valid_steps", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "wkt_name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "sub_sport", + 'type': "sub_sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, + 'name': "pool_length", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 15: { + 'num': 15, + 'name': "pool_length_unit", + 'type': "display_measure", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 17: { + 'num': 17, # Description of the workout + 'name': "wkt_description", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 158: { + 'num': "158", + 'name': "workout_session", + 'messages_key': "workout_session_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "sport", + 'type': "sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "sub_sport", + 'type': "sub_sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "num_valid_steps", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "first_step_index", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "pool_length", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "pool_length_unit", + 'type': "display_measure", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 27: { + 'num': "27", + 'name': "workout_step", + 'messages_key': "workout_step_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "wkt_step_name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "duration_type", + 'type': "wkt_step_duration", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "duration_value", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "duration_time", + 'type': "uint32", + 'array': "", + 'scale': [1000], + 'offset': [0], + 'units': ["s"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "duration_type", 'raw_value': 0, 'value_name': "time" }, + { 'num': 1, 'name': "duration_type", 'raw_value': 28, 'value_name': "repetition_time" }, + ], + }, + { + 'name': "duration_distance", + 'type': "uint32", + 'array': "", + 'scale': [100], + 'offset': [0], + 'units': ["m"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "duration_type", 'raw_value': 1, 'value_name': "distance" }, + ], + }, + { + 'name': "duration_hr", + 'type': "workout_hr", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["% or bpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "duration_type", 'raw_value': 2, 'value_name': "hr_less_than" }, + { 'num': 1, 'name': "duration_type", 'raw_value': 3, 'value_name': "hr_greater_than" }, + ], + }, + { + 'name': "duration_calories", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["calories"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "duration_type", 'raw_value': 4, 'value_name': "calories" }, + ], + }, + { + 'name': "duration_step", # message_index of step to loop back to. Steps are assumed to be in the order by message_index. custom_name and intensity members are undefined for this duration type. + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "duration_type", 'raw_value': 6, 'value_name': "repeat_until_steps_cmplt" }, + { 'num': 1, 'name': "duration_type", 'raw_value': 7, 'value_name': "repeat_until_time" }, + { 'num': 1, 'name': "duration_type", 'raw_value': 8, 'value_name': "repeat_until_distance" }, + { 'num': 1, 'name': "duration_type", 'raw_value': 9, 'value_name': "repeat_until_calories" }, + { 'num': 1, 'name': "duration_type", 'raw_value': 10, 'value_name': "repeat_until_hr_less_than" }, + { 'num': 1, 'name': "duration_type", 'raw_value': 11, 'value_name': "repeat_until_hr_greater_than" }, + { 'num': 1, 'name': "duration_type", 'raw_value': 12, 'value_name': "repeat_until_power_less_than" }, + { 'num': 1, 'name': "duration_type", 'raw_value': 13, 'value_name': "repeat_until_power_greater_than" }, + ], + }, + { + 'name': "duration_power", + 'type': "workout_power", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["% or watts"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "duration_type", 'raw_value': 14, 'value_name': "power_less_than" }, + { 'num': 1, 'name': "duration_type", 'raw_value': 15, 'value_name': "power_greater_than" }, + ], + }, + { + 'name': "duration_reps", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "duration_type", 'raw_value': 29, 'value_name': "reps" }, + ], + }, + ] + }, + 3: { + 'num': 3, + 'name': "target_type", + 'type': "wkt_step_target", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "target_value", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "target_speed_zone", # speed zone (1-10);Custom =0; + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 3, 'name': "target_type", 'raw_value': 0, 'value_name': "speed" }, + ], + }, + { + 'name': "target_hr_zone", # hr zone (1-5);Custom =0; + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 3, 'name': "target_type", 'raw_value': 1, 'value_name': "heart_rate" }, + ], + }, + { + 'name': "target_cadence_zone", # Zone (1-?); Custom = 0; + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 3, 'name': "target_type", 'raw_value': 3, 'value_name': "cadence" }, + ], + }, + { + 'name': "target_power_zone", # Power Zone ( 1-7); Custom = 0; + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 3, 'name': "target_type", 'raw_value': 4, 'value_name': "power" }, + ], + }, + { + 'name': "repeat_steps", # # of repetitions + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "duration_type", 'raw_value': 6, 'value_name': "repeat_until_steps_cmplt" }, + ], + }, + { + 'name': "repeat_time", + 'type': "uint32", + 'array': "", + 'scale': [1000], + 'offset': [0], + 'units': ["s"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "duration_type", 'raw_value': 7, 'value_name': "repeat_until_time" }, + ], + }, + { + 'name': "repeat_distance", + 'type': "uint32", + 'array': "", + 'scale': [100], + 'offset': [0], + 'units': ["m"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "duration_type", 'raw_value': 8, 'value_name': "repeat_until_distance" }, + ], + }, + { + 'name': "repeat_calories", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["calories"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "duration_type", 'raw_value': 9, 'value_name': "repeat_until_calories" }, + ], + }, + { + 'name': "repeat_hr", + 'type': "workout_hr", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["% or bpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "duration_type", 'raw_value': 10, 'value_name': "repeat_until_hr_less_than" }, + { 'num': 1, 'name': "duration_type", 'raw_value': 11, 'value_name': "repeat_until_hr_greater_than" }, + ], + }, + { + 'name': "repeat_power", + 'type': "workout_power", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["% or watts"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 1, 'name': "duration_type", 'raw_value': 12, 'value_name': "repeat_until_power_less_than" }, + { 'num': 1, 'name': "duration_type", 'raw_value': 13, 'value_name': "repeat_until_power_greater_than" }, + ], + }, + { + 'name': "target_stroke_type", + 'type': "swim_stroke", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 3, 'name': "target_type", 'raw_value': 11, 'value_name': "swim_stroke" }, + ], + }, + ] + }, + 5: { + 'num': 5, + 'name': "custom_target_value_low", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "custom_target_speed_low", + 'type': "uint32", + 'array': "", + 'scale': [1000], + 'offset': [0], + 'units': ["m/s"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 3, 'name': "target_type", 'raw_value': 0, 'value_name': "speed" }, + ], + }, + { + 'name': "custom_target_heart_rate_low", + 'type': "workout_hr", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["% or bpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 3, 'name': "target_type", 'raw_value': 1, 'value_name': "heart_rate" }, + ], + }, + { + 'name': "custom_target_cadence_low", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["rpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 3, 'name': "target_type", 'raw_value': 3, 'value_name': "cadence" }, + ], + }, + { + 'name': "custom_target_power_low", + 'type': "workout_power", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["% or watts"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 3, 'name': "target_type", 'raw_value': 4, 'value_name': "power" }, + ], + }, + ] + }, + 6: { + 'num': 6, + 'name': "custom_target_value_high", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "custom_target_speed_high", + 'type': "uint32", + 'array': "", + 'scale': [1000], + 'offset': [0], + 'units': ["m/s"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 3, 'name': "target_type", 'raw_value': 0, 'value_name': "speed" }, + ], + }, + { + 'name': "custom_target_heart_rate_high", + 'type': "workout_hr", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["% or bpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 3, 'name': "target_type", 'raw_value': 1, 'value_name': "heart_rate" }, + ], + }, + { + 'name': "custom_target_cadence_high", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["rpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 3, 'name': "target_type", 'raw_value': 3, 'value_name': "cadence" }, + ], + }, + { + 'name': "custom_target_power_high", + 'type': "workout_power", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["% or watts"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 3, 'name': "target_type", 'raw_value': 4, 'value_name': "power" }, + ], + }, + ] + }, + 7: { + 'num': 7, + 'name': "intensity", + 'type': "intensity", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "notes", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "equipment", + 'type': "workout_equipment", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "exercise_category", + 'type': "exercise_category", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "exercise_name", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, + 'name': "exercise_weight", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "kg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "weight_display_unit", + 'type': "fit_base_unit", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 19: { + 'num': 19, + 'name': "secondary_target_type", + 'type': "wkt_step_target", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 20: { + 'num': 20, + 'name': "secondary_target_value", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "secondary_target_speed_zone", # speed zone (1-10);Custom =0; + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "secondary_target_type", 'raw_value': 0, 'value_name': "speed" }, + ], + }, + { + 'name': "secondary_target_hr_zone", # hr zone (1-5);Custom =0; + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "secondary_target_type", 'raw_value': 1, 'value_name': "heart_rate" }, + ], + }, + { + 'name': "secondary_target_cadence_zone", # Zone (1-?); Custom = 0; + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "secondary_target_type", 'raw_value': 3, 'value_name': "cadence" }, + ], + }, + { + 'name': "secondary_target_power_zone", # Power Zone ( 1-7); Custom = 0; + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "secondary_target_type", 'raw_value': 4, 'value_name': "power" }, + ], + }, + { + 'name': "secondary_target_stroke_type", + 'type': "swim_stroke", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "secondary_target_type", 'raw_value': 11, 'value_name': "swim_stroke" }, + ], + }, + ] + }, + 21: { + 'num': 21, + 'name': "secondary_custom_target_value_low", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "secondary_custom_target_speed_low", + 'type': "uint32", + 'array': "", + 'scale': [1000], + 'offset': [0], + 'units': ["m/s"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "secondary_target_type", 'raw_value': 0, 'value_name': "speed" }, + ], + }, + { + 'name': "secondary_custom_target_heart_rate_low", + 'type': "workout_hr", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["% or bpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "secondary_target_type", 'raw_value': 1, 'value_name': "heart_rate" }, + ], + }, + { + 'name': "secondary_custom_target_cadence_low", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["rpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "secondary_target_type", 'raw_value': 3, 'value_name': "cadence" }, + ], + }, + { + 'name': "secondary_custom_target_power_low", + 'type': "workout_power", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["% or watts"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "secondary_target_type", 'raw_value': 4, 'value_name': "power" }, + ], + }, + ] + }, + 22: { + 'num': 22, + 'name': "secondary_custom_target_value_high", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "secondary_custom_target_speed_high", + 'type': "uint32", + 'array': "", + 'scale': [1000], + 'offset': [0], + 'units': ["m/s"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "secondary_target_type", 'raw_value': 0, 'value_name': "speed" }, + ], + }, + { + 'name': "secondary_custom_target_heart_rate_high", + 'type': "workout_hr", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["% or bpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "secondary_target_type", 'raw_value': 1, 'value_name': "heart_rate" }, + ], + }, + { + 'name': "secondary_custom_target_cadence_high", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["rpm"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "secondary_target_type", 'raw_value': 3, 'value_name': "cadence" }, + ], + }, + { + 'name': "secondary_custom_target_power_high", + 'type': "workout_power", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["% or watts"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 19, 'name': "secondary_target_type", 'raw_value': 4, 'value_name': "power" }, + ], + }, + ] + }, + }, +}, + 264: { + 'num': "264", + 'name': "exercise_title", + 'messages_key': "exercise_title_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "exercise_category", + 'type': "exercise_category", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "exercise_name", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "wkt_step_name", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 28: { + 'num': "28", + 'name': "schedule", + 'messages_key': "schedule_mesgs", + 'fields': { + 0: { + 'num': 0, # Corresponds to file_id of scheduled workout / course. + 'name': "manufacturer", + 'type': "manufacturer", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Corresponds to file_id of scheduled workout / course. + 'name': "product", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "favero_product", + 'type': "favero_product", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "manufacturer", 'raw_value': 263, 'value_name': "favero_electronics" }, + ], + }, + { + 'name': "garmin_product", + 'type': "garmin_product", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': [""], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 0, 'name': "manufacturer", 'raw_value': 1, 'value_name': "garmin" }, + { 'num': 0, 'name': "manufacturer", 'raw_value': 15, 'value_name': "dynastream" }, + { 'num': 0, 'name': "manufacturer", 'raw_value': 13, 'value_name': "dynastream_oem" }, + { 'num': 0, 'name': "manufacturer", 'raw_value': 89, 'value_name': "tacx" }, + ], + }, + ] + }, + 2: { + 'num': 2, # Corresponds to file_id of scheduled workout / course. + 'name': "serial_number", + 'type': "uint32z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Corresponds to file_id of scheduled workout / course. + 'name': "time_created", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # TRUE if this activity has been started + 'name': "completed", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "type", + 'type': "schedule", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "scheduled_time", + 'type': "local_date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 33: { + 'num': "33", + 'name': "totals", + 'messages_key': "totals_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Excludes pauses + 'name': "timer_time", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "distance", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "calories", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "sport", + 'type': "sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Includes pauses + 'name': "elapsed_time", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "sessions", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "active_time", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "sport_index", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 30: { + 'num': "30", + 'name': "weight_scale", + 'messages_key': "weight_scale_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "weight", + 'type': "weight", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "kg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "percent_fat", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "percent_hydration", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "%", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "visceral_fat_mass", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "kg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "bone_mass", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "kg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "muscle_mass", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "kg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "basal_met", + 'type': "uint16", + 'array': "false", + 'scale': [4], + 'offset': [0], + 'units': "kcal/day", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "physique_rating", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, # ~4kJ per kcal, 0.25 allows max 16384 kcal + 'name': "active_met", + 'type': "uint16", + 'array': "false", + 'scale': [4], + 'offset': [0], + 'units': "kcal/day", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "metabolic_age", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "years", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "visceral_fat_rating", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, # Associates this weight scale message to a user. This corresponds to the index of the user profile message in the weight scale file. + 'name': "user_profile_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, + 'name': "bmi", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "kg/m^2", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 51: { + 'num': "51", + 'name': "blood_pressure", + 'messages_key': "blood_pressure_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "systolic_pressure", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mmHg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "diastolic_pressure", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mmHg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "mean_arterial_pressure", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mmHg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "map_3_sample_mean", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mmHg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "map_morning_values", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mmHg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "map_evening_values", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "mmHg", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "heart_rate_type", + 'type': "hr_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "status", + 'type': "bp_status", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, # Associates this blood pressure message to a user. This corresponds to the index of the user profile message in the blood pressure file. + 'name': "user_profile_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 103: { + 'num': "103", + 'name': "monitoring_info", + 'messages_key': "monitoring_info_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Use to convert activity timestamps to local time if device does not support time zone and daylight savings time correction. + 'name': "local_timestamp", + 'type': "local_date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "activity_type", + 'type': "activity_type", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Indexed by activity_type + 'name': "cycles_to_distance", + 'type': "uint16", + 'array': "true", + 'scale': [5000], + 'offset': [0], + 'units': "m/cycle", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Indexed by activity_type + 'name': "cycles_to_calories", + 'type': "uint16", + 'array': "true", + 'scale': [5000], + 'offset': [0], + 'units': "kcal/cycle", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "resting_metabolic_rate", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal / day", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 55: { + 'num': "55", + 'name': "monitoring", + 'messages_key': "monitoring_mesgs", + 'fields': { + 253: { + 'num': 253, # Must align to logging interval, for example, time must be 00:00:00 for daily log. + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Associates this data to device_info message. Not required for file with single device (sensor). + 'name': "device_index", + 'type': "device_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Accumulated total calories. Maintained by MonitoringReader for each activity_type. See SDK documentation + 'name': "calories", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Accumulated distance. Maintained by MonitoringReader for each activity_type. See SDK documentation. + 'name': "distance", + 'type': "uint32", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Accumulated cycles. Maintained by MonitoringReader for each activity_type. See SDK documentation. + 'name': "cycles", + 'type': "uint32", + 'array': "false", + 'scale': [2], + 'offset': [0], + 'units': "cycles", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [{ + 'name': "steps", + 'type': "uint32", + 'array': "", + 'scale': [1], + 'offset': [0], + 'units': ["steps"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 5, 'name': "activity_type", 'raw_value': 6, 'value_name': "walking" }, + { 'num': 5, 'name': "activity_type", 'raw_value': 1, 'value_name': "running" }, + ], + }, + { + 'name': "strokes", + 'type': "uint32", + 'array': "", + 'scale': [2], + 'offset': [0], + 'units': ["strokes"], + 'bits': [], + 'components': [], + 'has_components': False, + 'map':[ + { 'num': 5, 'name': "activity_type", 'raw_value': 2, 'value_name': "cycling" }, + { 'num': 5, 'name': "activity_type", 'raw_value': 5, 'value_name': "swimming" }, + ], + }, + ] + }, + 4: { + 'num': 4, + 'name': "active_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "activity_type", + 'type': "activity_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "activity_subtype", + 'type': "activity_subtype", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "activity_level", + 'type': "activity_level", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "distance_16", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "100 * m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "cycles_16", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "2 * cycles (steps)", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "active_time_16", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, # Must align to logging interval, for example, time must be 00:00:00 for daily log. + 'name': "local_timestamp", + 'type': "local_date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, # Avg temperature during the logging interval ended at timestamp + 'name': "temperature", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, # Min temperature during the logging interval ended at timestamp + 'name': "temperature_min", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 15: { + 'num': 15, # Max temperature during the logging interval ended at timestamp + 'name': "temperature_max", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "C", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 16: { + 'num': 16, # Indexed using minute_activity_level enum + 'name': "activity_time", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "minutes", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 19: { + 'num': 19, + 'name': "active_calories", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "kcal", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 24: { + 'num': 24, # Indicates single type / intensity for duration since last monitoring message. + 'name': "current_activity_type_intensity", + 'type': "byte", + 'array': "false", + 'scale': [1, 1, ], + 'offset': [0, 0, ], + 'units': ["", "", ], + 'bits': [5,3,], + 'components': [5, 28, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 25: { + 'num': 25, + 'name': "timestamp_min_8", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 26: { + 'num': 26, + 'name': "timestamp_16", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 27: { + 'num': 27, + 'name': "heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 28: { + 'num': 28, + 'name': "intensity", + 'type': "uint8", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 29: { + 'num': 29, + 'name': "duration_min", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 30: { + 'num': 30, + 'name': "duration", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 31: { + 'num': 31, + 'name': "ascent", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 32: { + 'num': 32, + 'name': "descent", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 33: { + 'num': 33, + 'name': "moderate_activity_minutes", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "minutes", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 34: { + 'num': 34, + 'name': "vigorous_activity_minutes", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "minutes", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 211: { + 'num': "211", + 'name': "monitoring_hr_data", + 'messages_key': "monitoring_hr_data_mesgs", + 'fields': { + 253: { + 'num': 253, # Must align to logging interval, for example, time must be 00:00:00 for daily log. + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # 7-day rolling average + 'name': "resting_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # RHR for today only. (Feeds into 7-day average) + 'name': "current_day_resting_heart_rate", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 269: { + 'num': "269", + 'name': "spo2_data", + 'messages_key': "spo2_data_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "reading_spo2", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "reading_confidence", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Mode when data was captured + 'name': "mode", + 'type': "spo2_measurement_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 132: { + 'num': "132", + 'name': "hr", + 'messages_key': "hr_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "fractional_timestamp", + 'type': "uint16", + 'array': "false", + 'scale': [32768], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "time256", + 'type': "uint8", + 'array': "false", + 'scale': [256, ], + 'offset': [0, ], + 'units': ["s", ], + 'bits': [8,], + 'components': [0, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "filtered_bpm", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "event_timestamp", + 'type': "uint32", + 'array': "true", + 'scale': [1024], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': True, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "event_timestamp_12", + 'type': "byte", + 'array': "true", + 'scale': [1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, ], + 'offset': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + 'units': ["s", "", "", "", "", "", "", "", "", "", ], + 'bits': [12,12,12,12,12,12,12,12,12,12,], + 'components': [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + }, +}, + 227: { + 'num': "227", # Value from 1 to 100 calculated by FirstBeat + 'name': "stress_level", + 'messages_key': "stress_level_mesgs", + 'fields': { + 0: { + 'num': 0, + 'name': "stress_level_value", + 'type': "sint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Time stress score was calculated + 'name': "stress_level_time", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 229: { + 'num': "229", + 'name': "max_met_data", + 'messages_key': "max_met_data_mesgs", + 'fields': { + 0: { + 'num': 0, # Time maxMET and vo2 were calculated + 'name': "update_time", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "vo2_max", + 'type': "uint16", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "mL/kg/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "sport", + 'type': "sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "sub_sport", + 'type': "sub_sport", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "max_met_category", + 'type': "max_met_category", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, # Indicates if calibrated data was used in the calculation + 'name': "calibrated_data", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, # Indicates if the estimate was obtained using a chest strap or wrist heart rate + 'name': "hr_source", + 'type': "max_met_heart_rate_source", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, # Indidcates if the estimate was obtained using onboard GPS or connected GPS + 'name': "speed_source", + 'type': "max_met_speed_source", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 314: { + 'num': "314", # Body battery data used for HSA custom data logging + 'name': "hsa_body_battery_data", + 'messages_key': "hsa_body_battery_data_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Processing interval length in seconds + 'name': "processing_interval", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Body battery level: [0,100] Blank: -16 + 'name': "level", + 'type': "sint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Body battery charged value + 'name': "charged", + 'type': "sint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Body battery uncharged value + 'name': "uncharged", + 'type': "sint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 315: { + 'num': "315", # HSA events + 'name': "hsa_event", + 'messages_key': "hsa_event_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Event ID. Health SDK use only + 'name': "event_id", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 302: { + 'num': "302", # Raw accelerometer data used for HSA custom data logging + 'name': "hsa_accelerometer_data", + 'messages_key': "hsa_accelerometer_data_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Millisecond resolution of the timestamp + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Sampling Interval in Milliseconds + 'name': "sampling_interval", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # X-Axis Measurement + 'name': "accel_x", + 'type': "sint16", + 'array': "true", + 'scale': [1.024], + 'offset': [0], + 'units': "mG", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Y-Axis Measurement + 'name': "accel_y", + 'type': "sint16", + 'array': "true", + 'scale': [1.024], + 'offset': [0], + 'units': "mG", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Z-Axis Measurement + 'name': "accel_z", + 'type': "sint16", + 'array': "true", + 'scale': [1.024], + 'offset': [0], + 'units': "mG", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # 32 kHz timestamp + 'name': "timestamp_32k", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 376: { + 'num': "376", + 'name': "hsa_gyroscope_data", + 'messages_key': "hsa_gyroscope_data_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Millisecond resolution of the timestamp + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Sampling Interval in 32 kHz timescale + 'name': "sampling_interval", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "1/32768 s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # X-Axis Measurement + 'name': "gyro_x", + 'type': "sint16", + 'array': "true", + 'scale': [28.57143], + 'offset': [0], + 'units': "deg/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Y-Axis Measurement + 'name': "gyro_y", + 'type': "sint16", + 'array': "true", + 'scale': [28.57143], + 'offset': [0], + 'units': "deg/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Z-Axis Measurement + 'name': "gyro_z", + 'type': "sint16", + 'array': "true", + 'scale': [28.57143], + 'offset': [0], + 'units': "deg/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # 32 kHz timestamp + 'name': "timestamp_32k", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "1/32768 s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 304: { + 'num': "304", # User's current daily step data used for HSA custom data logging + 'name': "hsa_step_data", + 'messages_key': "hsa_step_data_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Processing interval length in seconds. File start: 0xFFFFFFEF File stop: 0xFFFFFFEE + 'name': "processing_interval", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Total step sum + 'name': "steps", + 'type': "uint32", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "steps", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 305: { + 'num': "305", # User's current SpO2 data used for HSA custom data logging + 'name': "hsa_spo2_data", + 'messages_key': "hsa_spo2_data_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Processing interval length in seconds + 'name': "processing_interval", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # SpO2 Reading: [70,100] Blank: 240 + 'name': "reading_spo2", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # SpO2 Confidence: [0,254] + 'name': "confidence", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 306: { + 'num': "306", # User's current stress data used for HSA custom data logging + 'name': "hsa_stress_data", + 'messages_key': "hsa_stress_data_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Processing interval length in seconds + 'name': "processing_interval", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Stress Level: [0,100] Off wrist: -1 Excess motion: -2 Not enough data: -3 Recovering from exercise: -4 Unidentified: -5 Blank: -16 + 'name': "stress_level", + 'type': "sint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 307: { + 'num': "307", # User's current respiration data used for HSA custom data logging + 'name': "hsa_respiration_data", + 'messages_key': "hsa_respiration_data_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Processing interval length in seconds + 'name': "processing_interval", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Breaths / min: [1,100] Invalid: 255 Excess motion: 254 Off wrist: 253 Not available: 252 Blank: 2.4 + 'name': "respiration_rate", + 'type': "sint16", + 'array': "true", + 'scale': [100], + 'offset': [0], + 'units': "breaths/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 308: { + 'num': "308", # User's current heart rate data used for HSA custom data logging + 'name': "hsa_heart_rate_data", + 'messages_key': "hsa_heart_rate_data_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Processing interval length in seconds + 'name': "processing_interval", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Status of measurements in buffer - 0 indicates SEARCHING 1 indicates LOCKED + 'name': "status", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Beats / min. Blank: 0 + 'name': "heart_rate", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "bpm", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 389: { + 'num': "389", # Configuration data for HSA custom data logging + 'name': "hsa_configuration_data", + 'messages_key': "hsa_configuration_data_mesgs", + 'fields': { + 253: { + 'num': 253, # Encoded configuration data + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Encoded configuration data. Health SDK use only + 'name': "data", + 'type': "byte", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Size in bytes of data field + 'name': "data_size", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 409: { + 'num': "409", # Wrist temperature data used for HSA custom data logging + 'name': "hsa_wrist_temperature_data", + 'messages_key': "hsa_wrist_temperature_data_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Processing interval length in seconds + 'name': "processing_interval", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Wrist temperature reading + 'name': "value", + 'type': "uint16", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "degC", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 145: { + 'num': "145", + 'name': "memo_glob", + 'messages_key': "memo_glob_mesgs", + 'fields': { + 250: { + 'num': 250, # Sequence number of memo blocks + 'name': "part_index", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Deprecated. Use data field. + 'name': "memo", + 'type': "byte", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Message Number of the parent message + 'name': "mesg_num", + 'type': "mesg_num", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Index of mesg that this glob is associated with. + 'name': "parent_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Field within the parent that this glob is associated with + 'name': "field_num", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Block of utf8 bytes. Note, mutltibyte characters may be split across adjoining memo_glob messages. + 'name': "data", + 'type': "uint8z", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 275: { + 'num': "275", + 'name': "sleep_level", + 'messages_key': "sleep_level_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "sleep_level", + 'type': "sleep_level", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 82: { + 'num': "82", + 'name': "ant_channel_id", + 'messages_key': "ant_channel_id_mesgs", + 'fields': { + 0: { + 'num': 0, + 'name': "channel_number", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "device_type", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "device_number", + 'type': "uint16z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "transmission_type", + 'type': "uint8z", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "device_index", + 'type': "device_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 80: { + 'num': "80", + 'name': "ant_rx", + 'messages_key': "ant_rx_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "fractional_timestamp", + 'type': "uint16", + 'array': "false", + 'scale': [32768], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "mesg_id", + 'type': "byte", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "mesg_data", + 'type': "byte", + 'array': "true", + 'scale': [1, 1, 1, 1, 1, 1, 1, 1, 1, ], + 'offset': [0, 0, 0, 0, 0, 0, 0, 0, 0, ], + 'units': ["", "", "", "", "", "", "", "", "", ], + 'bits': [8,8,8,8,8,8,8,8,8,], + 'components': [3, 4, 4, 4, 4, 4, 4, 4, 4, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "channel_number", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "data", + 'type': "byte", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 81: { + 'num': "81", + 'name': "ant_tx", + 'messages_key': "ant_tx_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "fractional_timestamp", + 'type': "uint16", + 'array': "false", + 'scale': [32768], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "mesg_id", + 'type': "byte", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "mesg_data", + 'type': "byte", + 'array': "true", + 'scale': [1, 1, 1, 1, 1, 1, 1, 1, 1, ], + 'offset': [0, 0, 0, 0, 0, 0, 0, 0, 0, ], + 'units': ["", "", "", "", "", "", "", "", "", ], + 'bits': [8,8,8,8,8,8,8,8,8,], + 'components': [3, 4, 4, 4, 4, 4, 4, 4, 4, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "channel_number", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "data", + 'type': "byte", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 200: { + 'num': "200", + 'name': "exd_screen_configuration", + 'messages_key': "exd_screen_configuration_mesgs", + 'fields': { + 0: { + 'num': 0, + 'name': "screen_index", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # number of fields in screen + 'name': "field_count", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "layout", + 'type': "exd_layout", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "screen_enabled", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 201: { + 'num': "201", + 'name': "exd_data_field_configuration", + 'messages_key': "exd_data_field_configuration_mesgs", + 'fields': { + 0: { + 'num': 0, + 'name': "screen_index", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "concept_field", + 'type': "byte", + 'array': "false", + 'scale': [1, 1, ], + 'offset': [0, 0, ], + 'units': ["", "", ], + 'bits': [4,4,], + 'components': [2, 3, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "field_id", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "concept_count", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "display_type", + 'type': "exd_display_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "title", + 'type': "string", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 202: { + 'num': "202", + 'name': "exd_data_concept_configuration", + 'messages_key': "exd_data_concept_configuration_mesgs", + 'fields': { + 0: { + 'num': 0, + 'name': "screen_index", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "concept_field", + 'type': "byte", + 'array': "false", + 'scale': [1, 1, ], + 'offset': [0, 0, ], + 'units': ["", "", ], + 'bits': [4,4,], + 'components': [2, 3, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "field_id", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "concept_index", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "data_page", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "concept_key", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "scaling", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "data_units", + 'type': "exd_data_units", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "qualifier", + 'type': "exd_qualifiers", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "descriptor", + 'type': "exd_descriptors", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "is_signed", + 'type': "bool", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 268: { + 'num': "268", + 'name': "dive_summary", + 'messages_key': "dive_summary_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "reference_mesg", + 'type': "mesg_num", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "reference_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # 0 if above water + 'name': "avg_depth", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # 0 if above water + 'name': "max_depth", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Time since end of last dive + 'name': "surface_interval", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "start_cns", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "end_cns", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, + 'name': "start_n2", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, + 'name': "end_n2", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "percent", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, + 'name': "o2_toxicity", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "OTUs", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, + 'name': "dive_number", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, + 'name': "bottom_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 12: { + 'num': 12, # Average pressure-based surface air consumption + 'name': "avg_pressure_sac", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "bar/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 13: { + 'num': 13, # Average volumetric surface air consumption + 'name': "avg_volume_sac", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "L/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, # Average respiratory minute volume + 'name': "avg_rmv", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "L/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 15: { + 'num': 15, # Time to reach deepest level stop + 'name': "descent_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 16: { + 'num': 16, # Time after leaving bottom until reaching surface + 'name': "ascent_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 17: { + 'num': 17, # Average ascent rate, not including descents or stops + 'name': "avg_ascent_rate", + 'type': "sint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 22: { + 'num': 22, # Average descent rate, not including ascents or stops + 'name': "avg_descent_rate", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 23: { + 'num': 23, # Maximum ascent rate + 'name': "max_ascent_rate", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 24: { + 'num': 24, # Maximum descent rate + 'name': "max_descent_rate", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 25: { + 'num': 25, # Time spent neither ascending nor descending + 'name': "hang_time", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 289: { + 'num': "289", # Number of acclerometer zero crossings summed over the specified time interval + 'name': "aad_accel_features", + 'messages_key': "aad_accel_features_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Time interval length in seconds + 'name': "time", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Total accelerometer energy in the interval + 'name': "energy_total", + 'type': "uint32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Count of zero crossings + 'name': "zero_cross_cnt", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Instance ID of zero crossing algorithm + 'name': "instance", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Total accelerometer time above threshold in the interval + 'name': "time_above_threshold", + 'type': "uint16", + 'array': "false", + 'scale': [25], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 78: { + 'num': "78", # Heart rate variability + 'name': "hrv", + 'messages_key': "hrv_mesgs", + 'fields': { + 0: { + 'num': 0, # Time between beats + 'name': "time", + 'type': "uint16", + 'array': "true", + 'scale': [1000], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 290: { + 'num': "290", # Array of heart beat intervals + 'name': "beat_intervals", + 'messages_key': "beat_intervals_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Milliseconds past date_time + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Array of millisecond times between beats + 'name': "time", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 370: { + 'num': "370", + 'name': "hrv_status_summary", + 'messages_key': "hrv_status_summary_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # 7 day RMSSD average over sleep + 'name': "weekly_average", + 'type': "uint16", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Last night RMSSD average over sleep + 'name': "last_night_average", + 'type': "uint16", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # 5 minute high RMSSD value over sleep + 'name': "last_night_5_min_high", + 'type': "uint16", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # 3 week baseline, upper boundary of low HRV status + 'name': "baseline_low_upper", + 'type': "uint16", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # 3 week baseline, lower boundary of balanced HRV status + 'name': "baseline_balanced_lower", + 'type': "uint16", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # 3 week baseline, upper boundary of balanced HRV status + 'name': "baseline_balanced_upper", + 'type': "uint16", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "status", + 'type': "hrv_status", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 371: { + 'num': "371", + 'name': "hrv_value", + 'messages_key': "hrv_value_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # 5 minute RMSSD + 'name': "value", + 'type': "uint16", + 'array': "false", + 'scale': [128], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 372: { + 'num': "372", # Raw Beat-to-Beat Interval values + 'name': "raw_bbi", + 'messages_key': "raw_bbi_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Millisecond resolution of the timestamp + 'name': "timestamp_ms", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # 1 bit for gap indicator, 1 bit for quality indicator, and 14 bits for Beat-to-Beat interval values in whole-integer millisecond resolution + 'name': "data", + 'type': "uint16", + 'array': "true", + 'scale': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ], + 'offset': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], + 'units': ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ], + 'bits': [14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,14,1,1,], + 'components': [2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, ], + 'is_accumulated': False, + 'has_components': True, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Array of millisecond times between beats + 'name': "time", + 'type': "uint16", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "ms", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # 1 = high confidence. 0 = low confidence. N/A when gap = 1 + 'name': "quality", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # 1 = gap (time represents ms gap length). 0 = BBI data + 'name': "gap", + 'type': "uint8", + 'array': "true", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 297: { + 'num': "297", + 'name': "respiration_rate", + 'messages_key': "respiration_rate_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, # Breaths * 100 /min, -300 indicates invalid, -200 indicates large motion, -100 indicates off wrist + 'name': "respiration_rate", + 'type': "sint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "breaths/min", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 387: { + 'num': "387", # Specifically used for XERO products. + 'name': "chrono_shot_session", + 'messages_key': "chrono_shot_session_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "min_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "max_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "avg_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "shot_count", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, + 'name': "projectile_type", + 'type': "projectile_type", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, + 'name': "grain_weight", + 'type': "uint32", + 'array': "false", + 'scale': [10], + 'offset': [0], + 'units': "gr", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, + 'name': "standard_deviation", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 388: { + 'num': "388", # Specifically used for XERO products. + 'name': "chrono_shot_data", + 'messages_key': "chrono_shot_data_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "shot_speed", + 'type': "uint32", + 'array': "false", + 'scale': [1000], + 'offset': [0], + 'units': "m/s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "shot_num", + 'type': "uint16", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 319: { + 'num': "319", + 'name': "tank_update", + 'messages_key': "tank_update_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "sensor", + 'type': "ant_channel_id", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "pressure", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "bar", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 323: { + 'num': "323", + 'name': "tank_summary", + 'messages_key': "tank_summary_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "s", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "sensor", + 'type': "ant_channel_id", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, + 'name': "start_pressure", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "bar", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, + 'name': "end_pressure", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "bar", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, + 'name': "volume_used", + 'type': "uint32", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "L", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 346: { + 'num': "346", + 'name': "sleep_assessment", + 'messages_key': "sleep_assessment_mesgs", + 'fields': { + 0: { + 'num': 0, # Average of awake_time_score and awakenings_count_score. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. + 'name': "combined_awake_score", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # Score that evaluates the total time spent awake between sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. + 'name': "awake_time_score", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # Score that evaluates the number of awakenings that interrupt sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. + 'name': "awakenings_count_score", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 3: { + 'num': 3, # Score that evaluates the amount of deep sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. + 'name': "deep_sleep_score", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Score that evaluates the quality of sleep based on sleep stages, heart-rate variability and possible awakenings during the night. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. + 'name': "sleep_duration_score", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 5: { + 'num': 5, # Score that evaluates the amount of light sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. + 'name': "light_sleep_score", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 6: { + 'num': 6, # Total score that summarizes the overall quality of sleep, combining sleep duration and quality. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. + 'name': "overall_sleep_score", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 7: { + 'num': 7, # Score that evaluates the quality of sleep based on sleep stages, heart-rate variability and possible awakenings during the night. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. + 'name': "sleep_quality_score", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 8: { + 'num': 8, # Score that evaluates stress and recovery during sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. + 'name': "sleep_recovery_score", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 9: { + 'num': 9, # Score that evaluates the amount of REM sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. + 'name': "rem_sleep_score", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 10: { + 'num': 10, # Score that evaluates the amount of restlessness during sleep. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. + 'name': "sleep_restlessness_score", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 11: { + 'num': 11, # The number of awakenings during sleep. + 'name': "awakenings_count", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 14: { + 'num': 14, # Score that evaluates the sleep interruptions. If valid: 0 (worst) to 100 (best). If unknown: FIT_UINT8_INVALID. + 'name': "interruptions_score", + 'type': "uint8", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 15: { + 'num': 15, # Excludes stress during awake periods in the sleep window + 'name': "average_stress_during_sleep", + 'type': "uint16", + 'array': "false", + 'scale': [100], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 470: { + 'num': "470", + 'name': "sleep_disruption_severity_period", + 'messages_key': "sleep_disruption_severity_period_mesgs", + 'fields': { + 254: { + 'num': 254, + 'name': "message_index", + 'type': "message_index", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "severity", + 'type': "sleep_disruption_severity", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 471: { + 'num': "471", + 'name': "sleep_disruption_overnight_severity", + 'messages_key': "sleep_disruption_overnight_severity_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "severity", + 'type': "sleep_disruption_severity", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 398: { + 'num': "398", + 'name': "skin_temp_overnight", + 'messages_key': "skin_temp_overnight_mesgs", + 'fields': { + 253: { + 'num': 253, + 'name': "timestamp", + 'type': "date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 0: { + 'num': 0, + 'name': "local_timestamp", + 'type': "local_date_time", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 1: { + 'num': 1, # The average overnight deviation from baseline temperature in degrees C + 'name': "average_deviation", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 2: { + 'num': 2, # The average 7 day overnight deviation from baseline temperature in degrees C + 'name': "average_7_day_deviation", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + 4: { + 'num': 4, # Final overnight temperature value + 'name': "nightly_value", + 'type': "float32", + 'array': "false", + 'scale': [1], + 'offset': [0], + 'units': "", + 'bits': [], + 'components': [], + 'is_accumulated': False, + 'has_components': False, + 'sub_fields': [] + }, + }, +}, + 105: { + 'num': "105", + 'name': "pad", + 'messages_key': "pad_mesgs", + 'fields': { + }, +}, +}, +'types': { + 'file': { + '1': 'device', # Read only, single file. Must be in root directory. + '2': 'settings', # Read/write, single file. Directory=Settings + '3': 'sport', # Read/write, multiple files, file number = sport type. Directory=Sports + '4': 'activity', # Read/erase, multiple files. Directory=Activities + '5': 'workout', # Read/write/erase, multiple files. Directory=Workouts + '6': 'course', # Read/write/erase, multiple files. Directory=Courses + '7': 'schedules', # Read/write, single file. Directory=Schedules + '9': 'weight', # Read only, single file. Circular buffer. All message definitions at start of file. Directory=Weight + '10': 'totals', # Read only, single file. Directory=Totals + '11': 'goals', # Read/write, single file. Directory=Goals + '14': 'blood_pressure', # Read only. Directory=Blood Pressure + '15': 'monitoring_a', # Read only. Directory=Monitoring. File number=sub type. + '20': 'activity_summary', # Read/erase, multiple files. Directory=Activities + '28': 'monitoring_daily', + '32': 'monitoring_b', # Read only. Directory=Monitoring. File number=identifier + '34': 'segment', # Read/write/erase. Multiple Files. Directory=Segments + '35': 'segment_list', # Read/write/erase. Single File. Directory=Segments + '40': 'exd_configuration', # Read/write/erase. Single File. Directory=Settings + '0xF7': 'mfg_range_min', # 0xF7 - 0xFE reserved for manufacturer specific file types + '0xFE': 'mfg_range_max', # 0xF7 - 0xFE reserved for manufacturer specific file types + }, + 'mesg_num': { + '0': 'file_id', + '1': 'capabilities', + '2': 'device_settings', + '3': 'user_profile', + '4': 'hrm_profile', + '5': 'sdm_profile', + '6': 'bike_profile', + '7': 'zones_target', + '8': 'hr_zone', + '9': 'power_zone', + '10': 'met_zone', + '12': 'sport', + '13': 'training_settings', + '15': 'goal', + '18': 'session', + '19': 'lap', + '20': 'record', + '21': 'event', + '23': 'device_info', + '26': 'workout', + '27': 'workout_step', + '28': 'schedule', + '30': 'weight_scale', + '31': 'course', + '32': 'course_point', + '33': 'totals', + '34': 'activity', + '35': 'software', + '37': 'file_capabilities', + '38': 'mesg_capabilities', + '39': 'field_capabilities', + '49': 'file_creator', + '51': 'blood_pressure', + '53': 'speed_zone', + '55': 'monitoring', + '72': 'training_file', + '78': 'hrv', + '80': 'ant_rx', + '81': 'ant_tx', + '82': 'ant_channel_id', + '101': 'length', + '103': 'monitoring_info', + '105': 'pad', + '106': 'slave_device', + '127': 'connectivity', + '128': 'weather_conditions', + '129': 'weather_alert', + '131': 'cadence_zone', + '132': 'hr', + '142': 'segment_lap', + '145': 'memo_glob', + '148': 'segment_id', + '149': 'segment_leaderboard_entry', + '150': 'segment_point', + '151': 'segment_file', + '158': 'workout_session', + '159': 'watchface_settings', + '160': 'gps_metadata', + '161': 'camera_event', + '162': 'timestamp_correlation', + '164': 'gyroscope_data', + '165': 'accelerometer_data', + '167': 'three_d_sensor_calibration', + '169': 'video_frame', + '174': 'obdii_data', + '177': 'nmea_sentence', + '178': 'aviation_attitude', + '184': 'video', + '185': 'video_title', + '186': 'video_description', + '187': 'video_clip', + '188': 'ohr_settings', + '200': 'exd_screen_configuration', + '201': 'exd_data_field_configuration', + '202': 'exd_data_concept_configuration', + '206': 'field_description', + '207': 'developer_data_id', + '208': 'magnetometer_data', + '209': 'barometer_data', + '210': 'one_d_sensor_calibration', + '211': 'monitoring_hr_data', + '216': 'time_in_zone', + '225': 'set', + '227': 'stress_level', + '229': 'max_met_data', + '258': 'dive_settings', + '259': 'dive_gas', + '262': 'dive_alarm', + '264': 'exercise_title', + '268': 'dive_summary', + '269': 'spo2_data', + '275': 'sleep_level', + '285': 'jump', + '289': 'aad_accel_features', + '290': 'beat_intervals', + '297': 'respiration_rate', + '302': 'hsa_accelerometer_data', + '304': 'hsa_step_data', + '305': 'hsa_spo2_data', + '306': 'hsa_stress_data', + '307': 'hsa_respiration_data', + '308': 'hsa_heart_rate_data', + '312': 'split', + '313': 'split_summary', + '314': 'hsa_body_battery_data', + '315': 'hsa_event', + '317': 'climb_pro', + '319': 'tank_update', + '323': 'tank_summary', + '346': 'sleep_assessment', + '370': 'hrv_status_summary', + '371': 'hrv_value', + '372': 'raw_bbi', + '375': 'device_aux_battery_info', + '376': 'hsa_gyroscope_data', + '387': 'chrono_shot_session', + '388': 'chrono_shot_data', + '389': 'hsa_configuration_data', + '393': 'dive_apnea_alarm', + '398': 'skin_temp_overnight', + '409': 'hsa_wrist_temperature_data', # Message number for the HSA wrist temperature data message + '470': 'sleep_disruption_severity_period', + '471': 'sleep_disruption_overnight_severity', + '0xFF00': 'mfg_range_min', # 0xFF00 - 0xFFFE reserved for manufacturer specific messages + '0xFFFE': 'mfg_range_max', # 0xFF00 - 0xFFFE reserved for manufacturer specific messages + }, + 'checksum': { + '0': 'clear', # Allows clear of checksum for flash memory where can only write 1 to 0 without erasing sector. + '1': 'ok', # Set to mark checksum as valid if computes to invalid values 0 or 0xFF. Checksum can also be set to ok to save encoding computation time. + }, + 'file_flags': { + '0x02': 'read', + '0x04': 'write', + '0x08': 'erase', + }, + 'mesg_count': { + '0': 'num_per_file', + '1': 'max_per_file', + '2': 'max_per_file_type', + }, + 'date_time': { + '0x10000000': 'min', # if date_time is < 0x10000000 then it is system time (seconds from device power on) + }, + 'local_date_time': { + '0x10000000': 'min', # if date_time is < 0x10000000 then it is system time (seconds from device power on) + }, + 'message_index': { + '0x8000': 'selected', # message is selected if set + '0x7000': 'reserved', # reserved (default 0) + '0x0FFF': 'mask', # index + }, + 'device_index': { + '0': 'creator', # Creator of the file is always device index 0. + }, + 'gender': { + '0': 'female', + '1': 'male', + }, + 'language': { + '0': 'english', + '1': 'french', + '2': 'italian', + '3': 'german', + '4': 'spanish', + '5': 'croatian', + '6': 'czech', + '7': 'danish', + '8': 'dutch', + '9': 'finnish', + '10': 'greek', + '11': 'hungarian', + '12': 'norwegian', + '13': 'polish', + '14': 'portuguese', + '15': 'slovakian', + '16': 'slovenian', + '17': 'swedish', + '18': 'russian', + '19': 'turkish', + '20': 'latvian', + '21': 'ukrainian', + '22': 'arabic', + '23': 'farsi', + '24': 'bulgarian', + '25': 'romanian', + '26': 'chinese', + '27': 'japanese', + '28': 'korean', + '29': 'taiwanese', + '30': 'thai', + '31': 'hebrew', + '32': 'brazilian_portuguese', + '33': 'indonesian', + '34': 'malaysian', + '35': 'vietnamese', + '36': 'burmese', + '37': 'mongolian', + '254': 'custom', + }, + 'language_bits_0': { + '0x01': 'english', + '0x02': 'french', + '0x04': 'italian', + '0x08': 'german', + '0x10': 'spanish', + '0x20': 'croatian', + '0x40': 'czech', + '0x80': 'danish', + }, + 'language_bits_1': { + '0x01': 'dutch', + '0x02': 'finnish', + '0x04': 'greek', + '0x08': 'hungarian', + '0x10': 'norwegian', + '0x20': 'polish', + '0x40': 'portuguese', + '0x80': 'slovakian', + }, + 'language_bits_2': { + '0x01': 'slovenian', + '0x02': 'swedish', + '0x04': 'russian', + '0x08': 'turkish', + '0x10': 'latvian', + '0x20': 'ukrainian', + '0x40': 'arabic', + '0x80': 'farsi', + }, + 'language_bits_3': { + '0x01': 'bulgarian', + '0x02': 'romanian', + '0x04': 'chinese', + '0x08': 'japanese', + '0x10': 'korean', + '0x20': 'taiwanese', + '0x40': 'thai', + '0x80': 'hebrew', + }, + 'language_bits_4': { + '0x01': 'brazilian_portuguese', + '0x02': 'indonesian', + '0x04': 'malaysian', + '0x08': 'vietnamese', + '0x10': 'burmese', + '0x20': 'mongolian', + }, + 'time_zone': { + '0': 'almaty', + '1': 'bangkok', + '2': 'bombay', + '3': 'brasilia', + '4': 'cairo', + '5': 'cape_verde_is', + '6': 'darwin', + '7': 'eniwetok', + '8': 'fiji', + '9': 'hong_kong', + '10': 'islamabad', + '11': 'kabul', + '12': 'magadan', + '13': 'mid_atlantic', + '14': 'moscow', + '15': 'muscat', + '16': 'newfoundland', + '17': 'samoa', + '18': 'sydney', + '19': 'tehran', + '20': 'tokyo', + '21': 'us_alaska', + '22': 'us_atlantic', + '23': 'us_central', + '24': 'us_eastern', + '25': 'us_hawaii', + '26': 'us_mountain', + '27': 'us_pacific', + '28': 'other', + '29': 'auckland', + '30': 'kathmandu', + '31': 'europe_western_wet', + '32': 'europe_central_cet', + '33': 'europe_eastern_eet', + '34': 'jakarta', + '35': 'perth', + '36': 'adelaide', + '37': 'brisbane', + '38': 'tasmania', + '39': 'iceland', + '40': 'amsterdam', + '41': 'athens', + '42': 'barcelona', + '43': 'berlin', + '44': 'brussels', + '45': 'budapest', + '46': 'copenhagen', + '47': 'dublin', + '48': 'helsinki', + '49': 'lisbon', + '50': 'london', + '51': 'madrid', + '52': 'munich', + '53': 'oslo', + '54': 'paris', + '55': 'prague', + '56': 'reykjavik', + '57': 'rome', + '58': 'stockholm', + '59': 'vienna', + '60': 'warsaw', + '61': 'zurich', + '62': 'quebec', + '63': 'ontario', + '64': 'manitoba', + '65': 'saskatchewan', + '66': 'alberta', + '67': 'british_columbia', + '68': 'boise', + '69': 'boston', + '70': 'chicago', + '71': 'dallas', + '72': 'denver', + '73': 'kansas_city', + '74': 'las_vegas', + '75': 'los_angeles', + '76': 'miami', + '77': 'minneapolis', + '78': 'new_york', + '79': 'new_orleans', + '80': 'phoenix', + '81': 'santa_fe', + '82': 'seattle', + '83': 'washington_dc', + '84': 'us_arizona', + '85': 'chita', + '86': 'ekaterinburg', + '87': 'irkutsk', + '88': 'kaliningrad', + '89': 'krasnoyarsk', + '90': 'novosibirsk', + '91': 'petropavlovsk_kamchatskiy', + '92': 'samara', + '93': 'vladivostok', + '94': 'mexico_central', + '95': 'mexico_mountain', + '96': 'mexico_pacific', + '97': 'cape_town', + '98': 'winkhoek', + '99': 'lagos', + '100': 'riyahd', + '101': 'venezuela', + '102': 'australia_lh', + '103': 'santiago', + '253': 'manual', + '254': 'automatic', + }, + 'display_measure': { + '0': 'metric', + '1': 'statute', + '2': 'nautical', + }, + 'display_heart': { + '0': 'bpm', + '1': 'max', + '2': 'reserve', + }, + 'display_power': { + '0': 'watts', + '1': 'percent_ftp', + }, + 'display_position': { + '0': 'degree', # dd.dddddd + '1': 'degree_minute', # dddmm.mmm + '2': 'degree_minute_second', # dddmmss + '3': 'austrian_grid', # Austrian Grid (BMN) + '4': 'british_grid', # British National Grid + '5': 'dutch_grid', # Dutch grid system + '6': 'hungarian_grid', # Hungarian grid system + '7': 'finnish_grid', # Finnish grid system Zone3 KKJ27 + '8': 'german_grid', # Gausss Krueger (German) + '9': 'icelandic_grid', # Icelandic Grid + '10': 'indonesian_equatorial', # Indonesian Equatorial LCO + '11': 'indonesian_irian', # Indonesian Irian LCO + '12': 'indonesian_southern', # Indonesian Southern LCO + '13': 'india_zone_0', # India zone 0 + '14': 'india_zone_IA', # India zone IA + '15': 'india_zone_IB', # India zone IB + '16': 'india_zone_IIA', # India zone IIA + '17': 'india_zone_IIB', # India zone IIB + '18': 'india_zone_IIIA', # India zone IIIA + '19': 'india_zone_IIIB', # India zone IIIB + '20': 'india_zone_IVA', # India zone IVA + '21': 'india_zone_IVB', # India zone IVB + '22': 'irish_transverse', # Irish Transverse Mercator + '23': 'irish_grid', # Irish Grid + '24': 'loran', # Loran TD + '25': 'maidenhead_grid', # Maidenhead grid system + '26': 'mgrs_grid', # MGRS grid system + '27': 'new_zealand_grid', # New Zealand grid system + '28': 'new_zealand_transverse', # New Zealand Transverse Mercator + '29': 'qatar_grid', # Qatar National Grid + '30': 'modified_swedish_grid', # Modified RT-90 (Sweden) + '31': 'swedish_grid', # RT-90 (Sweden) + '32': 'south_african_grid', # South African Grid + '33': 'swiss_grid', # Swiss CH-1903 grid + '34': 'taiwan_grid', # Taiwan Grid + '35': 'united_states_grid', # United States National Grid + '36': 'utm_ups_grid', # UTM/UPS grid system + '37': 'west_malayan', # West Malayan RSO + '38': 'borneo_rso', # Borneo RSO + '39': 'estonian_grid', # Estonian grid system + '40': 'latvian_grid', # Latvian Transverse Mercator + '41': 'swedish_ref_99_grid', # Reference Grid 99 TM (Swedish) + }, + 'switch': { + '0': 'off', + '1': 'on', + '2': 'auto', + }, + 'sport': { + '0': 'generic', + '1': 'running', + '2': 'cycling', + '3': 'transition', # Mulitsport transition + '4': 'fitness_equipment', + '5': 'swimming', + '6': 'basketball', + '7': 'soccer', + '8': 'tennis', + '9': 'american_football', + '10': 'training', + '11': 'walking', + '12': 'cross_country_skiing', + '13': 'alpine_skiing', + '14': 'snowboarding', + '15': 'rowing', + '16': 'mountaineering', + '17': 'hiking', + '18': 'multisport', + '19': 'paddling', + '20': 'flying', + '21': 'e_biking', + '22': 'motorcycling', + '23': 'boating', + '24': 'driving', + '25': 'golf', + '26': 'hang_gliding', + '27': 'horseback_riding', + '28': 'hunting', + '29': 'fishing', + '30': 'inline_skating', + '31': 'rock_climbing', + '32': 'sailing', + '33': 'ice_skating', + '34': 'sky_diving', + '35': 'snowshoeing', + '36': 'snowmobiling', + '37': 'stand_up_paddleboarding', + '38': 'surfing', + '39': 'wakeboarding', + '40': 'water_skiing', + '41': 'kayaking', + '42': 'rafting', + '43': 'windsurfing', + '44': 'kitesurfing', + '45': 'tactical', + '46': 'jumpmaster', + '47': 'boxing', + '48': 'floor_climbing', + '49': 'baseball', + '53': 'diving', + '62': 'hiit', + '64': 'racket', + '65': 'wheelchair_push_walk', + '66': 'wheelchair_push_run', + '67': 'meditation', + '69': 'disc_golf', + '71': 'cricket', + '72': 'rugby', + '73': 'hockey', + '74': 'lacrosse', + '75': 'volleyball', + '76': 'water_tubing', + '77': 'wakesurfing', + '80': 'mixed_martial_arts', + '82': 'snorkeling', + '83': 'dance', + '84': 'jump_rope', + '254': 'all', # All is for goals only to include all sports. + }, + 'sport_bits_0': { + '0x01': 'generic', + '0x02': 'running', + '0x04': 'cycling', + '0x08': 'transition', # Mulitsport transition + '0x10': 'fitness_equipment', + '0x20': 'swimming', + '0x40': 'basketball', + '0x80': 'soccer', + }, + 'sport_bits_1': { + '0x01': 'tennis', + '0x02': 'american_football', + '0x04': 'training', + '0x08': 'walking', + '0x10': 'cross_country_skiing', + '0x20': 'alpine_skiing', + '0x40': 'snowboarding', + '0x80': 'rowing', + }, + 'sport_bits_2': { + '0x01': 'mountaineering', + '0x02': 'hiking', + '0x04': 'multisport', + '0x08': 'paddling', + '0x10': 'flying', + '0x20': 'e_biking', + '0x40': 'motorcycling', + '0x80': 'boating', + }, + 'sport_bits_3': { + '0x01': 'driving', + '0x02': 'golf', + '0x04': 'hang_gliding', + '0x08': 'horseback_riding', + '0x10': 'hunting', + '0x20': 'fishing', + '0x40': 'inline_skating', + '0x80': 'rock_climbing', + }, + 'sport_bits_4': { + '0x01': 'sailing', + '0x02': 'ice_skating', + '0x04': 'sky_diving', + '0x08': 'snowshoeing', + '0x10': 'snowmobiling', + '0x20': 'stand_up_paddleboarding', + '0x40': 'surfing', + '0x80': 'wakeboarding', + }, + 'sport_bits_5': { + '0x01': 'water_skiing', + '0x02': 'kayaking', + '0x04': 'rafting', + '0x08': 'windsurfing', + '0x10': 'kitesurfing', + '0x20': 'tactical', + '0x40': 'jumpmaster', + '0x80': 'boxing', + }, + 'sport_bits_6': { + '0x01': 'floor_climbing', + }, + 'sub_sport': { + '0': 'generic', + '1': 'treadmill', # Run/Fitness Equipment + '2': 'street', # Run + '3': 'trail', # Run + '4': 'track', # Run + '5': 'spin', # Cycling + '6': 'indoor_cycling', # Cycling/Fitness Equipment + '7': 'road', # Cycling + '8': 'mountain', # Cycling + '9': 'downhill', # Cycling + '10': 'recumbent', # Cycling + '11': 'cyclocross', # Cycling + '12': 'hand_cycling', # Cycling + '13': 'track_cycling', # Cycling + '14': 'indoor_rowing', # Fitness Equipment + '15': 'elliptical', # Fitness Equipment + '16': 'stair_climbing', # Fitness Equipment + '17': 'lap_swimming', # Swimming + '18': 'open_water', # Swimming + '19': 'flexibility_training', # Training + '20': 'strength_training', # Training + '21': 'warm_up', # Tennis + '22': 'match', # Tennis + '23': 'exercise', # Tennis + '24': 'challenge', + '25': 'indoor_skiing', # Fitness Equipment + '26': 'cardio_training', # Training + '27': 'indoor_walking', # Walking/Fitness Equipment + '28': 'e_bike_fitness', # E-Biking + '29': 'bmx', # Cycling + '30': 'casual_walking', # Walking + '31': 'speed_walking', # Walking + '32': 'bike_to_run_transition', # Transition + '33': 'run_to_bike_transition', # Transition + '34': 'swim_to_bike_transition', # Transition + '35': 'atv', # Motorcycling + '36': 'motocross', # Motorcycling + '37': 'backcountry', # Alpine Skiing/Snowboarding + '38': 'resort', # Alpine Skiing/Snowboarding + '39': 'rc_drone', # Flying + '40': 'wingsuit', # Flying + '41': 'whitewater', # Kayaking/Rafting + '42': 'skate_skiing', # Cross Country Skiing + '43': 'yoga', # Training + '44': 'pilates', # Fitness Equipment + '45': 'indoor_running', # Run + '46': 'gravel_cycling', # Cycling + '47': 'e_bike_mountain', # Cycling + '48': 'commuting', # Cycling + '49': 'mixed_surface', # Cycling + '50': 'navigate', + '51': 'track_me', + '52': 'map', + '53': 'single_gas_diving', # Diving + '54': 'multi_gas_diving', # Diving + '55': 'gauge_diving', # Diving + '56': 'apnea_diving', # Diving + '57': 'apnea_hunting', # Diving + '58': 'virtual_activity', + '59': 'obstacle', # Used for events where participants run, crawl through mud, climb over walls, etc. + '62': 'breathing', + '65': 'sail_race', # Sailing + '67': 'ultra', # Ultramarathon + '68': 'indoor_climbing', # Climbing + '69': 'bouldering', # Climbing + '70': 'hiit', # High Intensity Interval Training + '73': 'amrap', # HIIT + '74': 'emom', # HIIT + '75': 'tabata', # HIIT + '84': 'pickleball', # Racket + '85': 'padel', # Racket + '86': 'indoor_wheelchair_walk', + '87': 'indoor_wheelchair_run', + '88': 'indoor_hand_cycling', + '94': 'squash', + '95': 'badminton', + '96': 'racquetball', + '97': 'table_tennis', + '110': 'fly_canopy', # Flying + '111': 'fly_paraglide', # Flying + '112': 'fly_paramotor', # Flying + '113': 'fly_pressurized', # Flying + '114': 'fly_navigate', # Flying + '115': 'fly_timer', # Flying + '116': 'fly_altimeter', # Flying + '117': 'fly_wx', # Flying + '118': 'fly_vfr', # Flying + '119': 'fly_ifr', # Flying + '254': 'all', + }, + 'sport_event': { + '0': 'uncategorized', + '1': 'geocaching', + '2': 'fitness', + '3': 'recreation', + '4': 'race', + '5': 'special_event', + '6': 'training', + '7': 'transportation', + '8': 'touring', + }, + 'activity': { + '0': 'manual', + '1': 'auto_multi_sport', + }, + 'intensity': { + '0': 'active', + '1': 'rest', + '2': 'warmup', + '3': 'cooldown', + '4': 'recovery', + '5': 'interval', + '6': 'other', + }, + 'session_trigger': { + '0': 'activity_end', + '1': 'manual', # User changed sport. + '2': 'auto_multi_sport', # Auto multi-sport feature is enabled and user pressed lap button to advance session. + '3': 'fitness_equipment', # Auto sport change caused by user linking to fitness equipment. + }, + 'autolap_trigger': { + '0': 'time', + '1': 'distance', + '2': 'position_start', + '3': 'position_lap', + '4': 'position_waypoint', + '5': 'position_marked', + '6': 'off', + '13': 'auto_select', + }, + 'lap_trigger': { + '0': 'manual', + '1': 'time', + '2': 'distance', + '3': 'position_start', + '4': 'position_lap', + '5': 'position_waypoint', + '6': 'position_marked', + '7': 'session_end', + '8': 'fitness_equipment', + }, + 'time_mode': { + '0': 'hour12', + '1': 'hour24', # Does not use a leading zero and has a colon + '2': 'military', # Uses a leading zero and does not have a colon + '3': 'hour_12_with_seconds', + '4': 'hour_24_with_seconds', + '5': 'utc', + }, + 'backlight_mode': { + '0': 'off', + '1': 'manual', + '2': 'key_and_messages', + '3': 'auto_brightness', + '4': 'smart_notifications', + '5': 'key_and_messages_night', + '6': 'key_and_messages_and_smart_notifications', + }, + 'date_mode': { + '0': 'day_month', + '1': 'month_day', + }, + 'backlight_timeout': { + '0': 'infinite', # Backlight stays on forever. + }, + 'event': { + '0': 'timer', # Group 0. Start / stop_all + '3': 'workout', # start / stop + '4': 'workout_step', # Start at beginning of workout. Stop at end of each step. + '5': 'power_down', # stop_all group 0 + '6': 'power_up', # stop_all group 0 + '7': 'off_course', # start / stop group 0 + '8': 'session', # Stop at end of each session. + '9': 'lap', # Stop at end of each lap. + '10': 'course_point', # marker + '11': 'battery', # marker + '12': 'virtual_partner_pace', # Group 1. Start at beginning of activity if VP enabled, when VP pace is changed during activity or VP enabled mid activity. stop_disable when VP disabled. + '13': 'hr_high_alert', # Group 0. Start / stop when in alert condition. + '14': 'hr_low_alert', # Group 0. Start / stop when in alert condition. + '15': 'speed_high_alert', # Group 0. Start / stop when in alert condition. + '16': 'speed_low_alert', # Group 0. Start / stop when in alert condition. + '17': 'cad_high_alert', # Group 0. Start / stop when in alert condition. + '18': 'cad_low_alert', # Group 0. Start / stop when in alert condition. + '19': 'power_high_alert', # Group 0. Start / stop when in alert condition. + '20': 'power_low_alert', # Group 0. Start / stop when in alert condition. + '21': 'recovery_hr', # marker + '22': 'battery_low', # marker + '23': 'time_duration_alert', # Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled. + '24': 'distance_duration_alert', # Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled. + '25': 'calorie_duration_alert', # Group 1. Start if enabled mid activity (not required at start of activity). Stop when duration is reached. stop_disable if disabled. + '26': 'activity', # Group 1.. Stop at end of activity. + '27': 'fitness_equipment', # marker + '28': 'length', # Stop at end of each length. + '32': 'user_marker', # marker + '33': 'sport_point', # marker + '36': 'calibration', # start/stop/marker + '42': 'front_gear_change', # marker + '43': 'rear_gear_change', # marker + '44': 'rider_position_change', # marker + '45': 'elev_high_alert', # Group 0. Start / stop when in alert condition. + '46': 'elev_low_alert', # Group 0. Start / stop when in alert condition. + '47': 'comm_timeout', # marker + '54': 'auto_activity_detect', # marker + '56': 'dive_alert', # marker + '57': 'dive_gas_switched', # marker + '71': 'tank_pressure_reserve', # marker + '72': 'tank_pressure_critical', # marker + '73': 'tank_lost', # marker + '75': 'radar_threat_alert', # start/stop/marker + '76': 'tank_battery_low', # marker + '81': 'tank_pod_connected', # marker - tank pod has connected + '82': 'tank_pod_disconnected', # marker - tank pod has lost connection + }, + 'event_type': { + '0': 'start', + '1': 'stop', + '2': 'consecutive_depreciated', + '3': 'marker', + '4': 'stop_all', + '5': 'begin_depreciated', + '6': 'end_depreciated', + '7': 'end_all_depreciated', + '8': 'stop_disable', + '9': 'stop_disable_all', + }, + 'timer_trigger': { + '0': 'manual', + '1': 'auto', + '2': 'fitness_equipment', + }, + 'fitness_equipment_state': { + '0': 'ready', + '1': 'in_use', + '2': 'paused', + '3': 'unknown', # lost connection to fitness equipment + }, + 'tone': { + '0': 'off', + '1': 'tone', + '2': 'vibrate', + '3': 'tone_and_vibrate', + }, + 'autoscroll': { + '0': 'none', + '1': 'slow', + '2': 'medium', + '3': 'fast', + }, + 'activity_class': { + '0x7F': 'level', # 0 to 100 + '100': 'level_max', + '0x80': 'athlete', + }, + 'hr_zone_calc': { + '0': 'custom', + '1': 'percent_max_hr', + '2': 'percent_hrr', + '3': 'percent_lthr', + }, + 'pwr_zone_calc': { + '0': 'custom', + '1': 'percent_ftp', + }, + 'wkt_step_duration': { + '0': 'time', + '1': 'distance', + '2': 'hr_less_than', + '3': 'hr_greater_than', + '4': 'calories', + '5': 'open', + '6': 'repeat_until_steps_cmplt', + '7': 'repeat_until_time', + '8': 'repeat_until_distance', + '9': 'repeat_until_calories', + '10': 'repeat_until_hr_less_than', + '11': 'repeat_until_hr_greater_than', + '12': 'repeat_until_power_less_than', + '13': 'repeat_until_power_greater_than', + '14': 'power_less_than', + '15': 'power_greater_than', + '16': 'training_peaks_tss', + '17': 'repeat_until_power_last_lap_less_than', + '18': 'repeat_until_max_power_last_lap_less_than', + '19': 'power_3s_less_than', + '20': 'power_10s_less_than', + '21': 'power_30s_less_than', + '22': 'power_3s_greater_than', + '23': 'power_10s_greater_than', + '24': 'power_30s_greater_than', + '25': 'power_lap_less_than', + '26': 'power_lap_greater_than', + '27': 'repeat_until_training_peaks_tss', + '28': 'repetition_time', + '29': 'reps', + '31': 'time_only', + }, + 'wkt_step_target': { + '0': 'speed', + '1': 'heart_rate', + '2': 'open', + '3': 'cadence', + '4': 'power', + '5': 'grade', + '6': 'resistance', + '7': 'power_3s', + '8': 'power_10s', + '9': 'power_30s', + '10': 'power_lap', + '11': 'swim_stroke', + '12': 'speed_lap', + '13': 'heart_rate_lap', + }, + 'goal': { + '0': 'time', + '1': 'distance', + '2': 'calories', + '3': 'frequency', + '4': 'steps', + '5': 'ascent', + '6': 'active_minutes', + }, + 'goal_recurrence': { + '0': 'off', + '1': 'daily', + '2': 'weekly', + '3': 'monthly', + '4': 'yearly', + '5': 'custom', + }, + 'goal_source': { + '0': 'auto', # Device generated + '1': 'community', # Social network sourced goal + '2': 'user', # Manually generated + }, + 'schedule': { + '0': 'workout', + '1': 'course', + }, + 'course_point': { + '0': 'generic', + '1': 'summit', + '2': 'valley', + '3': 'water', + '4': 'food', + '5': 'danger', + '6': 'left', + '7': 'right', + '8': 'straight', + '9': 'first_aid', + '10': 'fourth_category', + '11': 'third_category', + '12': 'second_category', + '13': 'first_category', + '14': 'hors_category', + '15': 'sprint', + '16': 'left_fork', + '17': 'right_fork', + '18': 'middle_fork', + '19': 'slight_left', + '20': 'sharp_left', + '21': 'slight_right', + '22': 'sharp_right', + '23': 'u_turn', + '24': 'segment_start', + '25': 'segment_end', + '27': 'campsite', + '28': 'aid_station', + '29': 'rest_area', + '30': 'general_distance', # Used with UpAhead + '31': 'service', + '32': 'energy_gel', + '33': 'sports_drink', + '34': 'mile_marker', + '35': 'checkpoint', + '36': 'shelter', + '37': 'meeting_spot', + '38': 'overlook', + '39': 'toilet', + '40': 'shower', + '41': 'gear', + '42': 'sharp_curve', + '43': 'steep_incline', + '44': 'tunnel', + '45': 'bridge', + '46': 'obstacle', + '47': 'crossing', + '48': 'store', + '49': 'transition', + '50': 'navaid', + '51': 'transport', + '52': 'alert', + '53': 'info', + }, + 'manufacturer': { + '1': 'garmin', + '2': 'garmin_fr405_antfs', # Do not use. Used by FR405 for ANTFS man id. + '3': 'zephyr', + '4': 'dayton', + '5': 'idt', + '6': 'srm', + '7': 'quarq', + '8': 'ibike', + '9': 'saris', + '10': 'spark_hk', + '11': 'tanita', + '12': 'echowell', + '13': 'dynastream_oem', + '14': 'nautilus', + '15': 'dynastream', + '16': 'timex', + '17': 'metrigear', + '18': 'xelic', + '19': 'beurer', + '20': 'cardiosport', + '21': 'a_and_d', + '22': 'hmm', + '23': 'suunto', + '24': 'thita_elektronik', + '25': 'gpulse', + '26': 'clean_mobile', + '27': 'pedal_brain', + '28': 'peaksware', + '29': 'saxonar', + '30': 'lemond_fitness', + '31': 'dexcom', + '32': 'wahoo_fitness', + '33': 'octane_fitness', + '34': 'archinoetics', + '35': 'the_hurt_box', + '36': 'citizen_systems', + '37': 'magellan', + '38': 'osynce', + '39': 'holux', + '40': 'concept2', + '41': 'shimano', + '42': 'one_giant_leap', + '43': 'ace_sensor', + '44': 'brim_brothers', + '45': 'xplova', + '46': 'perception_digital', + '47': 'bf1systems', + '48': 'pioneer', + '49': 'spantec', + '50': 'metalogics', + '51': '4iiiis', + '52': 'seiko_epson', + '53': 'seiko_epson_oem', + '54': 'ifor_powell', + '55': 'maxwell_guider', + '56': 'star_trac', + '57': 'breakaway', + '58': 'alatech_technology_ltd', + '59': 'mio_technology_europe', + '60': 'rotor', + '61': 'geonaute', + '62': 'id_bike', + '63': 'specialized', + '64': 'wtek', + '65': 'physical_enterprises', + '66': 'north_pole_engineering', + '67': 'bkool', + '68': 'cateye', + '69': 'stages_cycling', + '70': 'sigmasport', + '71': 'tomtom', + '72': 'peripedal', + '73': 'wattbike', + '76': 'moxy', + '77': 'ciclosport', + '78': 'powerbahn', + '79': 'acorn_projects_aps', + '80': 'lifebeam', + '81': 'bontrager', + '82': 'wellgo', + '83': 'scosche', + '84': 'magura', + '85': 'woodway', + '86': 'elite', + '87': 'nielsen_kellerman', + '88': 'dk_city', + '89': 'tacx', + '90': 'direction_technology', + '91': 'magtonic', + '92': '1partcarbon', + '93': 'inside_ride_technologies', + '94': 'sound_of_motion', + '95': 'stryd', + '96': 'icg', # Indoorcycling Group + '97': 'MiPulse', + '98': 'bsx_athletics', + '99': 'look', + '100': 'campagnolo_srl', + '101': 'body_bike_smart', + '102': 'praxisworks', + '103': 'limits_technology', # Limits Technology Ltd. + '104': 'topaction_technology', # TopAction Technology Inc. + '105': 'cosinuss', + '106': 'fitcare', + '107': 'magene', + '108': 'giant_manufacturing_co', + '109': 'tigrasport', # Tigrasport + '110': 'salutron', + '111': 'technogym', + '112': 'bryton_sensors', + '113': 'latitude_limited', + '114': 'soaring_technology', + '115': 'igpsport', + '116': 'thinkrider', + '117': 'gopher_sport', + '118': 'waterrower', + '119': 'orangetheory', + '120': 'inpeak', + '121': 'kinetic', + '122': 'johnson_health_tech', + '123': 'polar_electro', + '124': 'seesense', + '125': 'nci_technology', + '126': 'iqsquare', + '127': 'leomo', + '128': 'ifit_com', + '129': 'coros_byte', + '130': 'versa_design', + '131': 'chileaf', + '132': 'cycplus', + '133': 'gravaa_byte', + '134': 'sigeyi', + '135': 'coospo', + '136': 'geoid', + '137': 'bosch', + '138': 'kyto', + '139': 'kinetic_sports', + '140': 'decathlon_byte', + '141': 'tq_systems', + '142': 'tag_heuer', + '143': 'keiser_fitness', + '144': 'zwift_byte', + '145': 'porsche_ep', + '146': 'blackbird', + '147': 'meilan_byte', + '148': 'ezon', + '149': 'laisi', + '150': 'myzone', + '151': 'abawo', + '152': 'bafang', + '153': 'luhong_technology', + '255': 'development', + '257': 'healthandlife', + '258': 'lezyne', + '259': 'scribe_labs', + '260': 'zwift', + '261': 'watteam', + '262': 'recon', + '263': 'favero_electronics', + '264': 'dynovelo', + '265': 'strava', + '266': 'precor', # Amer Sports + '267': 'bryton', + '268': 'sram', + '269': 'navman', # MiTAC Global Corporation (Mio Technology) + '270': 'cobi', # COBI GmbH + '271': 'spivi', + '272': 'mio_magellan', + '273': 'evesports', + '274': 'sensitivus_gauge', + '275': 'podoon', + '276': 'life_time_fitness', + '277': 'falco_e_motors', # Falco eMotors Inc. + '278': 'minoura', + '279': 'cycliq', + '280': 'luxottica', + '281': 'trainer_road', + '282': 'the_sufferfest', + '283': 'fullspeedahead', + '284': 'virtualtraining', + '285': 'feedbacksports', + '286': 'omata', + '287': 'vdo', + '288': 'magneticdays', + '289': 'hammerhead', + '290': 'kinetic_by_kurt', + '291': 'shapelog', + '292': 'dabuziduo', + '293': 'jetblack', + '294': 'coros', + '295': 'virtugo', + '296': 'velosense', + '297': 'cycligentinc', + '298': 'trailforks', + '299': 'mahle_ebikemotion', + '300': 'nurvv', + '301': 'microprogram', + '302': 'zone5cloud', + '303': 'greenteg', + '304': 'yamaha_motors', + '305': 'whoop', + '306': 'gravaa', + '307': 'onelap', + '308': 'monark_exercise', + '309': 'form', + '310': 'decathlon', + '311': 'syncros', + '312': 'heatup', + '313': 'cannondale', + '314': 'true_fitness', + '315': 'RGT_cycling', + '316': 'vasa', + '317': 'race_republic', + '318': 'fazua', + '319': 'oreka_training', + '320': 'lsec', # Lishun Electric & Communication + '321': 'lululemon_studio', + '322': 'shanyue', + '323': 'spinning_mda', + '324': 'hilldating', + '325': 'aero_sensor', + '326': 'nike', + '327': 'magicshine', + '328': 'ictrainer', + '329': 'absolute_cycling', + '330': 'eo_swimbetter', + '331': 'mywhoosh', + '332': 'ravemen', + '333': 'tektro_racing_products', + '334': 'darad_innovation_corporation', + '335': 'cycloptim', + '337': 'runna', + '339': 'zepp', + '340': 'peloton', + '341': 'carv', + '342': 'tissot', + '5759': 'actigraphcorp', + }, + 'garmin_product': { + '1': 'hrm1', + '2': 'axh01', # AXH01 HRM chipset + '3': 'axb01', + '4': 'axb02', + '5': 'hrm2ss', + '6': 'dsi_alf02', + '7': 'hrm3ss', + '8': 'hrm_run_single_byte_product_id', # hrm_run model for HRM ANT+ messaging + '9': 'bsm', # BSM model for ANT+ messaging + '10': 'bcm', # BCM model for ANT+ messaging + '11': 'axs01', # AXS01 HRM Bike Chipset model for ANT+ messaging + '12': 'hrm_tri_single_byte_product_id', # hrm_tri model for HRM ANT+ messaging + '13': 'hrm4_run_single_byte_product_id', # hrm4 run model for HRM ANT+ messaging + '14': 'fr225_single_byte_product_id', # fr225 model for HRM ANT+ messaging + '15': 'gen3_bsm_single_byte_product_id', # gen3_bsm model for Bike Speed ANT+ messaging + '16': 'gen3_bcm_single_byte_product_id', # gen3_bcm model for Bike Cadence ANT+ messaging + '22': 'hrm_fit_single_byte_product_id', + '255': 'OHR', # Garmin Wearable Optical Heart Rate Sensor for ANT+ HR Profile Broadcasting + '473': 'fr301_china', + '474': 'fr301_japan', + '475': 'fr301_korea', + '494': 'fr301_taiwan', + '717': 'fr405', # Forerunner 405 + '782': 'fr50', # Forerunner 50 + '987': 'fr405_japan', + '988': 'fr60', # Forerunner 60 + '1011': 'dsi_alf01', + '1018': 'fr310xt', # Forerunner 310 + '1036': 'edge500', + '1124': 'fr110', # Forerunner 110 + '1169': 'edge800', + '1199': 'edge500_taiwan', + '1213': 'edge500_japan', + '1253': 'chirp', + '1274': 'fr110_japan', + '1325': 'edge200', + '1328': 'fr910xt', + '1333': 'edge800_taiwan', + '1334': 'edge800_japan', + '1341': 'alf04', + '1345': 'fr610', + '1360': 'fr210_japan', + '1380': 'vector_ss', + '1381': 'vector_cp', + '1386': 'edge800_china', + '1387': 'edge500_china', + '1405': 'approach_g10', + '1410': 'fr610_japan', + '1422': 'edge500_korea', + '1436': 'fr70', + '1446': 'fr310xt_4t', + '1461': 'amx', + '1482': 'fr10', + '1497': 'edge800_korea', + '1499': 'swim', + '1537': 'fr910xt_china', + '1551': 'fenix', + '1555': 'edge200_taiwan', + '1561': 'edge510', + '1567': 'edge810', + '1570': 'tempe', + '1600': 'fr910xt_japan', + '1623': 'fr620', + '1632': 'fr220', + '1664': 'fr910xt_korea', + '1688': 'fr10_japan', + '1721': 'edge810_japan', + '1735': 'virb_elite', + '1736': 'edge_touring', # Also Edge Touring Plus + '1742': 'edge510_japan', + '1743': 'hrm_tri', # Also HRM-Swim + '1752': 'hrm_run', + '1765': 'fr920xt', + '1821': 'edge510_asia', + '1822': 'edge810_china', + '1823': 'edge810_taiwan', + '1836': 'edge1000', + '1837': 'vivo_fit', + '1853': 'virb_remote', + '1885': 'vivo_ki', + '1903': 'fr15', + '1907': 'vivo_active', + '1918': 'edge510_korea', + '1928': 'fr620_japan', + '1929': 'fr620_china', + '1930': 'fr220_japan', + '1931': 'fr220_china', + '1936': 'approach_s6', + '1956': 'vivo_smart', + '1967': 'fenix2', + '1988': 'epix', + '2050': 'fenix3', + '2052': 'edge1000_taiwan', + '2053': 'edge1000_japan', + '2061': 'fr15_japan', + '2067': 'edge520', + '2070': 'edge1000_china', + '2072': 'fr620_russia', + '2073': 'fr220_russia', + '2079': 'vector_s', + '2100': 'edge1000_korea', + '2130': 'fr920xt_taiwan', + '2131': 'fr920xt_china', + '2132': 'fr920xt_japan', + '2134': 'virbx', + '2135': 'vivo_smart_apac', + '2140': 'etrex_touch', + '2147': 'edge25', + '2148': 'fr25', + '2150': 'vivo_fit2', + '2153': 'fr225', + '2156': 'fr630', + '2157': 'fr230', + '2158': 'fr735xt', + '2160': 'vivo_active_apac', + '2161': 'vector_2', + '2162': 'vector_2s', + '2172': 'virbxe', + '2173': 'fr620_taiwan', + '2174': 'fr220_taiwan', + '2175': 'truswing', + '2187': 'd2airvenu', + '2188': 'fenix3_china', + '2189': 'fenix3_twn', + '2192': 'varia_headlight', + '2193': 'varia_taillight_old', + '2204': 'edge_explore_1000', + '2219': 'fr225_asia', + '2225': 'varia_radar_taillight', + '2226': 'varia_radar_display', + '2238': 'edge20', + '2260': 'edge520_asia', + '2261': 'edge520_japan', + '2262': 'd2_bravo', + '2266': 'approach_s20', + '2271': 'vivo_smart2', + '2274': 'edge1000_thai', + '2276': 'varia_remote', + '2288': 'edge25_asia', + '2289': 'edge25_jpn', + '2290': 'edge20_asia', + '2292': 'approach_x40', + '2293': 'fenix3_japan', + '2294': 'vivo_smart_emea', + '2310': 'fr630_asia', + '2311': 'fr630_jpn', + '2313': 'fr230_jpn', + '2327': 'hrm4_run', + '2332': 'epix_japan', + '2337': 'vivo_active_hr', + '2347': 'vivo_smart_gps_hr', + '2348': 'vivo_smart_hr', + '2361': 'vivo_smart_hr_asia', + '2362': 'vivo_smart_gps_hr_asia', + '2368': 'vivo_move', + '2379': 'varia_taillight', + '2396': 'fr235_asia', + '2397': 'fr235_japan', + '2398': 'varia_vision', + '2406': 'vivo_fit3', + '2407': 'fenix3_korea', + '2408': 'fenix3_sea', + '2413': 'fenix3_hr', + '2417': 'virb_ultra_30', + '2429': 'index_smart_scale', + '2431': 'fr235', + '2432': 'fenix3_chronos', + '2441': 'oregon7xx', + '2444': 'rino7xx', + '2457': 'epix_korea', + '2473': 'fenix3_hr_chn', + '2474': 'fenix3_hr_twn', + '2475': 'fenix3_hr_jpn', + '2476': 'fenix3_hr_sea', + '2477': 'fenix3_hr_kor', + '2496': 'nautix', + '2497': 'vivo_active_hr_apac', + '2503': 'fr35', + '2512': 'oregon7xx_ww', + '2530': 'edge_820', + '2531': 'edge_explore_820', + '2533': 'fr735xt_apac', + '2534': 'fr735xt_japan', + '2544': 'fenix5s', + '2547': 'd2_bravo_titanium', + '2567': 'varia_ut800', # Varia UT 800 SW + '2593': 'running_dynamics_pod', + '2599': 'edge_820_china', + '2600': 'edge_820_japan', + '2604': 'fenix5x', + '2606': 'vivo_fit_jr', + '2622': 'vivo_smart3', + '2623': 'vivo_sport', + '2628': 'edge_820_taiwan', + '2629': 'edge_820_korea', + '2630': 'edge_820_sea', + '2650': 'fr35_hebrew', + '2656': 'approach_s60', + '2667': 'fr35_apac', + '2668': 'fr35_japan', + '2675': 'fenix3_chronos_asia', + '2687': 'virb_360', + '2691': 'fr935', + '2697': 'fenix5', + '2700': 'vivoactive3', + '2733': 'fr235_china_nfc', + '2769': 'foretrex_601_701', + '2772': 'vivo_move_hr', + '2713': 'edge_1030', + '2727': 'fr35_sea', + '2787': 'vector_3', + '2796': 'fenix5_asia', + '2797': 'fenix5s_asia', + '2798': 'fenix5x_asia', + '2806': 'approach_z80', + '2814': 'fr35_korea', + '2819': 'd2charlie', + '2831': 'vivo_smart3_apac', + '2832': 'vivo_sport_apac', + '2833': 'fr935_asia', + '2859': 'descent', + '2878': 'vivo_fit4', + '2886': 'fr645', + '2888': 'fr645m', + '2891': 'fr30', + '2900': 'fenix5s_plus', + '2909': 'Edge_130', + '2924': 'edge_1030_asia', + '2927': 'vivosmart_4', + '2945': 'vivo_move_hr_asia', + '2962': 'approach_x10', + '2977': 'fr30_asia', + '2988': 'vivoactive3m_w', + '3003': 'fr645_asia', + '3004': 'fr645m_asia', + '3011': 'edge_explore', + '3028': 'gpsmap66', + '3049': 'approach_s10', + '3066': 'vivoactive3m_l', + '3076': 'fr245', + '3077': 'fr245_music', + '3085': 'approach_g80', + '3092': 'edge_130_asia', + '3095': 'edge_1030_bontrager', + '3110': 'fenix5_plus', + '3111': 'fenix5x_plus', + '3112': 'edge_520_plus', + '3113': 'fr945', + '3121': 'edge_530', + '3122': 'edge_830', + '3126': 'instinct_esports', + '3134': 'fenix5s_plus_apac', + '3135': 'fenix5x_plus_apac', + '3142': 'edge_520_plus_apac', + '3143': 'descent_t1', + '3144': 'fr235l_asia', + '3145': 'fr245_asia', + '3163': 'vivo_active3m_apac', + '3192': 'gen3_bsm', # gen3 bike speed sensor + '3193': 'gen3_bcm', # gen3 bike cadence sensor + '3218': 'vivo_smart4_asia', + '3224': 'vivoactive4_small', + '3225': 'vivoactive4_large', + '3226': 'venu', + '3246': 'marq_driver', + '3247': 'marq_aviator', + '3248': 'marq_captain', + '3249': 'marq_commander', + '3250': 'marq_expedition', + '3251': 'marq_athlete', + '3258': 'descent_mk2', + '3282': 'fr45', + '3284': 'gpsmap66i', + '3287': 'fenix6S_sport', + '3288': 'fenix6S', + '3289': 'fenix6_sport', + '3290': 'fenix6', + '3291': 'fenix6x', + '3299': 'hrm_dual', # HRM-Dual + '3300': 'hrm_pro', # HRM-Pro + '3308': 'vivo_move3_premium', + '3314': 'approach_s40', + '3321': 'fr245m_asia', + '3349': 'edge_530_apac', + '3350': 'edge_830_apac', + '3378': 'vivo_move3', + '3387': 'vivo_active4_small_asia', + '3388': 'vivo_active4_large_asia', + '3389': 'vivo_active4_oled_asia', + '3405': 'swim2', + '3420': 'marq_driver_asia', + '3421': 'marq_aviator_asia', + '3422': 'vivo_move3_asia', + '3441': 'fr945_asia', + '3446': 'vivo_active3t_chn', + '3448': 'marq_captain_asia', + '3449': 'marq_commander_asia', + '3450': 'marq_expedition_asia', + '3451': 'marq_athlete_asia', + '3461': 'index_smart_scale_2', + '3466': 'instinct_solar', + '3469': 'fr45_asia', + '3473': 'vivoactive3_daimler', + '3498': 'legacy_rey', + '3499': 'legacy_darth_vader', + '3500': 'legacy_captain_marvel', + '3501': 'legacy_first_avenger', + '3512': 'fenix6s_sport_asia', + '3513': 'fenix6s_asia', + '3514': 'fenix6_sport_asia', + '3515': 'fenix6_asia', + '3516': 'fenix6x_asia', + '3535': 'legacy_captain_marvel_asia', + '3536': 'legacy_first_avenger_asia', + '3537': 'legacy_rey_asia', + '3538': 'legacy_darth_vader_asia', + '3542': 'descent_mk2s', + '3558': 'edge_130_plus', + '3570': 'edge_1030_plus', + '3578': 'rally_200', # Rally 100/200 Power Meter Series + '3589': 'fr745', + '3596': 'venusq_music', + '3599': 'venusq_music_v2', + '3600': 'venusq', + '3615': 'lily', + '3624': 'marq_adventurer', + '3638': 'enduro', + '3639': 'swim2_apac', + '3648': 'marq_adventurer_asia', + '3652': 'fr945_lte', + '3702': 'descent_mk2_asia', # Mk2 and Mk2i + '3703': 'venu2', + '3704': 'venu2s', + '3737': 'venu_daimler_asia', + '3739': 'marq_golfer', + '3740': 'venu_daimler', + '3794': 'fr745_asia', + '3808': 'varia_rct715', + '3809': 'lily_asia', + '3812': 'edge_1030_plus_asia', + '3813': 'edge_130_plus_asia', + '3823': 'approach_s12', + '3872': 'enduro_asia', + '3837': 'venusq_asia', + '3843': 'edge_1040', + '3850': 'marq_golfer_asia', + '3851': 'venu2_plus', + '3865': 'gnss', # Airoha AG3335M Family + '3869': 'fr55', + '3888': 'instinct_2', + '3889': 'instinct_2s', + '3905': 'fenix7s', + '3906': 'fenix7', + '3907': 'fenix7x', + '3908': 'fenix7s_apac', + '3909': 'fenix7_apac', + '3910': 'fenix7x_apac', + ' 3927': 'approach_g12', + '3930': 'descent_mk2s_asia', + '3934': 'approach_s42', + '3943': 'epix_gen2', + '3944': 'epix_gen2_apac', + '3949': 'venu2s_asia', + '3950': 'venu2_asia', + '3978': 'fr945_lte_asia', + '3982': 'vivo_move_sport', + '3983': 'vivomove_trend', + '3986': 'approach_S12_asia', + '3990': 'fr255_music', + '3991': 'fr255_small_music', + '3992': 'fr255', + '3993': 'fr255_small', + ' 4001': 'approach_g12_asia', + '4002': 'approach_s42_asia', + '4005': 'descent_g1', + '4017': 'venu2_plus_asia', + '4024': 'fr955', + '4033': 'fr55_asia', + '4061': 'edge_540', + '4062': 'edge_840', + '4063': 'vivosmart_5', + '4071': 'instinct_2_asia', + '4105': 'marq_gen2', # Adventurer, Athlete, Captain, Golfer + '4115': 'venusq2', + '4116': 'venusq2music', + '4124': 'marq_gen2_aviator', + '4125': 'd2_air_x10', + '4130': 'hrm_pro_plus', + '4132': 'descent_g1_asia', + '4135': 'tactix7', + '4155': 'instinct_crossover', + '4169': 'edge_explore2', + '4222': 'descent_mk3', + '4223': 'descent_mk3i', + '4233': 'approach_s70', + '4257': 'fr265_large', + '4258': 'fr265_small', + '4260': 'venu3', + '4261': 'venu3s', + '4265': 'tacx_neo_smart', # Neo Smart, Tacx + '4266': 'tacx_neo2_smart', # Neo 2 Smart, Tacx + '4267': 'tacx_neo2_t_smart', # Neo 2T Smart, Tacx + '4268': 'tacx_neo_smart_bike', # Neo Smart Bike, Tacx + '4269': 'tacx_satori_smart', # Satori Smart, Tacx + '4270': 'tacx_flow_smart', # Flow Smart, Tacx + '4271': 'tacx_vortex_smart', # Vortex Smart, Tacx + '4272': 'tacx_bushido_smart', # Bushido Smart, Tacx + '4273': 'tacx_genius_smart', # Genius Smart, Tacx + '4274': 'tacx_flux_flux_s_smart', # Flux/Flux S Smart, Tacx + '4275': 'tacx_flux2_smart', # Flux 2 Smart, Tacx + '4276': 'tacx_magnum', # Magnum, Tacx + '4305': 'edge_1040_asia', + '4312': 'epix_gen2_pro_42', + '4313': 'epix_gen2_pro_47', + '4314': 'epix_gen2_pro_51', + '4315': 'fr965', + '4341': 'enduro2', + '4374': 'fenix7s_pro_solar', + '4375': 'fenix7_pro_solar', + '4376': 'fenix7x_pro_solar', + '4380': 'lily2', + '4394': 'instinct_2x', + '4426': 'vivoactive5', + '4432': 'fr165', + '4433': 'fr165_music', + '4440': 'edge_1050', + '4442': 'descent_t2', + '4446': 'hrm_fit', + '4472': 'marq_gen2_commander', + '4477': 'lily_athlete', # aka the Lily 2 Active + '4525': 'rally_x10', # Rally 110/210 + '4532': 'fenix8_solar', + '4533': 'fenix8_solar_large', + '4534': 'fenix8_small', + '4536': 'fenix8', + '4556': 'd2_mach1_pro', + '4575': 'enduro3', + '4583': 'instinctE_40mm', + '4584': 'instinctE_45mm', + '4585': 'instinct3_solar_45mm', + '4586': 'instinct3_amoled_45mm', + '4587': 'instinct3_amoled_50mm', + '4588': 'descent_g2', + '4603': 'venu_x1', + '4606': 'hrm_200', + '4625': 'vivoactive6', + '4631': 'fenix8_pro', + '4633': 'edge_550', + '4634': 'edge_850', + '4643': 'venu4', + '4644': 'venu4s', + '4647': 'approachS44', + '4655': 'edge_mtb', + '4656': 'approachS50', + '4666': 'fenix_e', + '4745': 'bounce2', + '4759': 'instinct3_solar_50mm', + '4775': 'tactix8_amoled', + '4776': 'tactix8_solar', + '4825': 'approach_j1', + '4879': 'd2_mach2', + '4678': 'instinct_crossover_amoled', + '4944': 'd2_air_x15', + '10007': 'sdm4', # SDM4 footpod + '10014': 'edge_remote', + '20533': 'tacx_training_app_win', + '20534': 'tacx_training_app_mac', + '20565': 'tacx_training_app_mac_catalyst', + '20119': 'training_center', + '30045': 'tacx_training_app_android', + '30046': 'tacx_training_app_ios', + '30047': 'tacx_training_app_legacy', + '65531': 'connectiq_simulator', + '65532': 'android_antplus_plugin', + '65534': 'connect', # Garmin Connect website + }, + 'antplus_device_type': { + '1': 'antfs', + '11': 'bike_power', + '12': 'environment_sensor_legacy', + '15': 'multi_sport_speed_distance', + '16': 'control', + '17': 'fitness_equipment', + '18': 'blood_pressure', + '19': 'geocache_node', + '20': 'light_electric_vehicle', + '25': 'env_sensor', + '26': 'racquet', + '27': 'control_hub', + '31': 'muscle_oxygen', + '34': 'shifting', + '35': 'bike_light_main', + '36': 'bike_light_shared', + '38': 'exd', + '40': 'bike_radar', + '46': 'bike_aero', + '119': 'weight_scale', + '120': 'heart_rate', + '121': 'bike_speed_cadence', + '122': 'bike_cadence', + '123': 'bike_speed', + '124': 'stride_speed_distance', + }, + 'ant_network': { + '0': 'public', + '1': 'antplus', + '2': 'antfs', + '3': 'private', + }, + 'workout_capabilities': { + '0x00000001': 'interval', + '0x00000002': 'custom', + '0x00000004': 'fitness_equipment', + '0x00000008': 'firstbeat', + '0x00000010': 'new_leaf', + '0x00000020': 'tcx', # For backwards compatibility. Watch should add missing id fields then clear flag. + '0x00000080': 'speed', # Speed source required for workout step. + '0x00000100': 'heart_rate', # Heart rate source required for workout step. + '0x00000200': 'distance', # Distance source required for workout step. + '0x00000400': 'cadence', # Cadence source required for workout step. + '0x00000800': 'power', # Power source required for workout step. + '0x00001000': 'grade', # Grade source required for workout step. + '0x00002000': 'resistance', # Resistance source required for workout step. + '0x00004000': 'protected', + }, + 'battery_status': { + '1': 'new', + '2': 'good', + '3': 'ok', + '4': 'low', + '5': 'critical', + '6': 'charging', + '7': 'unknown', + }, + 'hr_type': { + '0': 'normal', + '1': 'irregular', + }, + 'course_capabilities': { + '0x00000001': 'processed', + '0x00000002': 'valid', + '0x00000004': 'time', + '0x00000008': 'distance', + '0x00000010': 'position', + '0x00000020': 'heart_rate', + '0x00000040': 'power', + '0x00000080': 'cadence', + '0x00000100': 'training', + '0x00000200': 'navigation', + '0x00000400': 'bikeway', + '0x00001000': 'aviation', # Denote course files to be used as flight plans + }, + 'weight': { + '0xFFFE': 'calculating', + }, + 'workout_hr': { + '100': 'bpm_offset', + }, + 'workout_power': { + '1000': 'watts_offset', + }, + 'bp_status': { + '0': 'no_error', + '1': 'error_incomplete_data', + '2': 'error_no_measurement', + '3': 'error_data_out_of_range', + '4': 'error_irregular_heart_rate', + }, + 'user_local_id': { + '0x0000': 'local_min', + '0x000F': 'local_max', + '0x0010': 'stationary_min', + '0x00FF': 'stationary_max', + '0x0100': 'portable_min', + '0xFFFE': 'portable_max', + }, + 'swim_stroke': { + '0': 'freestyle', + '1': 'backstroke', + '2': 'breaststroke', + '3': 'butterfly', + '4': 'drill', + '5': 'mixed', + '6': 'im', # IM is a mixed interval containing the same number of lengths for each of: Butterfly, Backstroke, Breaststroke, Freestyle, swam in that order. + '7': 'im_by_round', # For repeated workout steps, a new individual medly stroke is used for each round. + '8': 'rimo', # Reverse IM Order + }, + 'activity_type': { + '0': 'generic', + '1': 'running', + '2': 'cycling', + '3': 'transition', # Mulitsport transition + '4': 'fitness_equipment', + '5': 'swimming', + '6': 'walking', + '8': 'sedentary', + '254': 'all', # All is for goals only to include all sports. + }, + 'activity_subtype': { + '0': 'generic', + '1': 'treadmill', # Run + '2': 'street', # Run + '3': 'trail', # Run + '4': 'track', # Run + '5': 'spin', # Cycling + '6': 'indoor_cycling', # Cycling + '7': 'road', # Cycling + '8': 'mountain', # Cycling + '9': 'downhill', # Cycling + '10': 'recumbent', # Cycling + '11': 'cyclocross', # Cycling + '12': 'hand_cycling', # Cycling + '13': 'track_cycling', # Cycling + '14': 'indoor_rowing', # Fitness Equipment + '15': 'elliptical', # Fitness Equipment + '16': 'stair_climbing', # Fitness Equipment + '17': 'lap_swimming', # Swimming + '18': 'open_water', # Swimming + '254': 'all', + }, + 'activity_level': { + '0': 'low', + '1': 'medium', + '2': 'high', + }, + 'side': { + '0': 'right', + '1': 'left', + }, + 'left_right_balance': { + '0x7F': 'mask', # % contribution + '0x80': 'right', # data corresponds to right if set, otherwise unknown + }, + 'left_right_balance_100': { + '0x3FFF': 'mask', # % contribution scaled by 100 + '0x8000': 'right', # data corresponds to right if set, otherwise unknown + }, + 'length_type': { + '0': 'idle', # Rest period. Length with no strokes + '1': 'active', # Length with strokes. + }, + 'day_of_week': { + '0': 'sunday', + '1': 'monday', + '2': 'tuesday', + '3': 'wednesday', + '4': 'thursday', + '5': 'friday', + '6': 'saturday', + }, + 'connectivity_capabilities': { + '0x00000001': 'bluetooth', + '0x00000002': 'bluetooth_le', + '0x00000004': 'ant', + '0x00000008': 'activity_upload', + '0x00000010': 'course_download', + '0x00000020': 'workout_download', + '0x00000040': 'live_track', + '0x00000080': 'weather_conditions', + '0x00000100': 'weather_alerts', + '0x00000200': 'gps_ephemeris_download', + '0x00000400': 'explicit_archive', + '0x00000800': 'setup_incomplete', + '0x00001000': 'continue_sync_after_software_update', + '0x00002000': 'connect_iq_app_download', + '0x00004000': 'golf_course_download', + '0x00008000': 'device_initiates_sync', # Indicates device is in control of initiating all syncs + '0x00010000': 'connect_iq_watch_app_download', + '0x00020000': 'connect_iq_widget_download', + '0x00040000': 'connect_iq_watch_face_download', + '0x00080000': 'connect_iq_data_field_download', + '0x00100000': 'connect_iq_app_managment', # Device supports delete and reorder of apps via GCM + '0x00200000': 'swing_sensor', + '0x00400000': 'swing_sensor_remote', + '0x00800000': 'incident_detection', # Device supports incident detection + '0x01000000': 'audio_prompts', + '0x02000000': 'wifi_verification', # Device supports reporting wifi verification via GCM + '0x04000000': 'true_up', # Device supports True Up + '0x08000000': 'find_my_watch', # Device supports Find My Watch + '0x10000000': 'remote_manual_sync', + '0x20000000': 'live_track_auto_start', # Device supports LiveTrack auto start + '0x40000000': 'live_track_messaging', # Device supports LiveTrack Messaging + '0x80000000': 'instant_input', # Device supports instant input feature + }, + 'weather_report': { + '0': 'current', + '1': 'forecast', # Deprecated use hourly_forecast instead + '1': 'hourly_forecast', + '2': 'daily_forecast', + }, + 'weather_status': { + '0': 'clear', + '1': 'partly_cloudy', + '2': 'mostly_cloudy', + '3': 'rain', + '4': 'snow', + '5': 'windy', + '6': 'thunderstorms', + '7': 'wintry_mix', + '8': 'fog', + '11': 'hazy', + '12': 'hail', + '13': 'scattered_showers', + '14': 'scattered_thunderstorms', + '15': 'unknown_precipitation', + '16': 'light_rain', + '17': 'heavy_rain', + '18': 'light_snow', + '19': 'heavy_snow', + '20': 'light_rain_snow', + '21': 'heavy_rain_snow', + '22': 'cloudy', + }, + 'weather_severity': { + '0': 'unknown', + '1': 'warning', + '2': 'watch', + '3': 'advisory', + '4': 'statement', + }, + 'weather_severe_type': { + '0': 'unspecified', + '1': 'tornado', + '2': 'tsunami', + '3': 'hurricane', + '4': 'extreme_wind', + '5': 'typhoon', + '6': 'inland_hurricane', + '7': 'hurricane_force_wind', + '8': 'waterspout', + '9': 'severe_thunderstorm', + '10': 'wreckhouse_winds', + '11': 'les_suetes_wind', + '12': 'avalanche', + '13': 'flash_flood', + '14': 'tropical_storm', + '15': 'inland_tropical_storm', + '16': 'blizzard', + '17': 'ice_storm', + '18': 'freezing_rain', + '19': 'debris_flow', + '20': 'flash_freeze', + '21': 'dust_storm', + '22': 'high_wind', + '23': 'winter_storm', + '24': 'heavy_freezing_spray', + '25': 'extreme_cold', + '26': 'wind_chill', + '27': 'cold_wave', + '28': 'heavy_snow_alert', + '29': 'lake_effect_blowing_snow', + '30': 'snow_squall', + '31': 'lake_effect_snow', + '32': 'winter_weather', + '33': 'sleet', + '34': 'snowfall', + '35': 'snow_and_blowing_snow', + '36': 'blowing_snow', + '37': 'snow_alert', + '38': 'arctic_outflow', + '39': 'freezing_drizzle', + '40': 'storm', + '41': 'storm_surge', + '42': 'rainfall', + '43': 'areal_flood', + '44': 'coastal_flood', + '45': 'lakeshore_flood', + '46': 'excessive_heat', + '47': 'heat', + '48': 'weather', + '49': 'high_heat_and_humidity', + '50': 'humidex_and_health', + '51': 'humidex', + '52': 'gale', + '53': 'freezing_spray', + '54': 'special_marine', + '55': 'squall', + '56': 'strong_wind', + '57': 'lake_wind', + '58': 'marine_weather', + '59': 'wind', + '60': 'small_craft_hazardous_seas', + '61': 'hazardous_seas', + '62': 'small_craft', + '63': 'small_craft_winds', + '64': 'small_craft_rough_bar', + '65': 'high_water_level', + '66': 'ashfall', + '67': 'freezing_fog', + '68': 'dense_fog', + '69': 'dense_smoke', + '70': 'blowing_dust', + '71': 'hard_freeze', + '72': 'freeze', + '73': 'frost', + '74': 'fire_weather', + '75': 'flood', + '76': 'rip_tide', + '77': 'high_surf', + '78': 'smog', + '79': 'air_quality', + '80': 'brisk_wind', + '81': 'air_stagnation', + '82': 'low_water', + '83': 'hydrological', + '84': 'special_weather', + }, + 'time_into_day': { + }, + 'localtime_into_day': { + }, + 'stroke_type': { + '0': 'no_event', + '1': 'other', # stroke was detected but cannot be identified + '2': 'serve', + '3': 'forehand', + '4': 'backhand', + '5': 'smash', + }, + 'body_location': { + '0': 'left_leg', + '1': 'left_calf', + '2': 'left_shin', + '3': 'left_hamstring', + '4': 'left_quad', + '5': 'left_glute', + '6': 'right_leg', + '7': 'right_calf', + '8': 'right_shin', + '9': 'right_hamstring', + '10': 'right_quad', + '11': 'right_glute', + '12': 'torso_back', + '13': 'left_lower_back', + '14': 'left_upper_back', + '15': 'right_lower_back', + '16': 'right_upper_back', + '17': 'torso_front', + '18': 'left_abdomen', + '19': 'left_chest', + '20': 'right_abdomen', + '21': 'right_chest', + '22': 'left_arm', + '23': 'left_shoulder', + '24': 'left_bicep', + '25': 'left_tricep', + '26': 'left_brachioradialis', # Left anterior forearm + '27': 'left_forearm_extensors', # Left posterior forearm + '28': 'right_arm', + '29': 'right_shoulder', + '30': 'right_bicep', + '31': 'right_tricep', + '32': 'right_brachioradialis', # Right anterior forearm + '33': 'right_forearm_extensors', # Right posterior forearm + '34': 'neck', + '35': 'throat', + '36': 'waist_mid_back', + '37': 'waist_front', + '38': 'waist_left', + '39': 'waist_right', + }, + 'segment_lap_status': { + '0': 'end', + '1': 'fail', + }, + 'segment_leaderboard_type': { + '0': 'overall', + '1': 'personal_best', + '2': 'connections', + '3': 'group', + '4': 'challenger', + '5': 'kom', + '6': 'qom', + '7': 'pr', + '8': 'goal', + '9': 'carrot', + '10': 'club_leader', + '11': 'rival', + '12': 'last', + '13': 'recent_best', + '14': 'course_record', + }, + 'segment_delete_status': { + '0': 'do_not_delete', + '1': 'delete_one', + '2': 'delete_all', + }, + 'segment_selection_type': { + '0': 'starred', + '1': 'suggested', + }, + 'source_type': { + '0': 'ant', # External device connected with ANT + '1': 'antplus', # External device connected with ANT+ + '2': 'bluetooth', # External device connected with BT + '3': 'bluetooth_low_energy', # External device connected with BLE + '4': 'wifi', # External device connected with Wifi + '5': 'local', # Onboard device + }, + 'local_device_type': { + '0': 'gps', # Onboard gps receiver + '1': 'glonass', # Onboard glonass receiver + '2': 'gps_glonass', # Onboard gps glonass receiver + '3': 'accelerometer', # Onboard sensor + '4': 'barometer', # Onboard sensor + '5': 'temperature', # Onboard sensor + '10': 'whr', # Onboard wrist HR sensor + '12': 'sensor_hub', # Onboard software package + }, + 'ble_device_type': { + '0': 'connected_gps', # GPS that is provided over a proprietary bluetooth service + '1': 'heart_rate', + '2': 'bike_power', + '3': 'bike_speed_cadence', + '4': 'bike_speed', + '5': 'bike_cadence', + '6': 'footpod', + '7': 'bike_trainer', # Indoor-Bike FTMS protocol + }, + 'ant_channel_id': { + '0xF0000000': 'ant_extended_device_number_upper_nibble', + '0x0F000000': 'ant_transmission_type_lower_nibble', + '0x00FF0000': 'ant_device_type', + '0x0000FFFF': 'ant_device_number', + }, + 'display_orientation': { + '0': 'auto', # automatic if the device supports it + '1': 'portrait', + '2': 'landscape', + '3': 'portrait_flipped', # portrait mode but rotated 180 degrees + '4': 'landscape_flipped', # landscape mode but rotated 180 degrees + }, + 'workout_equipment': { + '0': 'none', + '1': 'swim_fins', + '2': 'swim_kickboard', + '3': 'swim_paddles', + '4': 'swim_pull_buoy', + '5': 'swim_snorkel', + }, + 'watchface_mode': { + '0': 'digital', + '1': 'analog', + '2': 'connect_iq', + '3': 'disabled', + }, + 'digital_watchface_layout': { + '0': 'traditional', + '1': 'modern', + '2': 'bold', + }, + 'analog_watchface_layout': { + '0': 'minimal', + '1': 'traditional', + '2': 'modern', + }, + 'rider_position_type': { + '0': 'seated', + '1': 'standing', + '2': 'transition_to_seated', + '3': 'transition_to_standing', + }, + 'power_phase_type': { + '0': 'power_phase_start_angle', + '1': 'power_phase_end_angle', + '2': 'power_phase_arc_length', + '3': 'power_phase_center', + }, + 'camera_event_type': { + '0': 'video_start', # Start of video recording + '1': 'video_split', # Mark of video file split (end of one file, beginning of the other) + '2': 'video_end', # End of video recording + '3': 'photo_taken', # Still photo taken + '4': 'video_second_stream_start', + '5': 'video_second_stream_split', + '6': 'video_second_stream_end', + '7': 'video_split_start', # Mark of video file split start + '8': 'video_second_stream_split_start', + '11': 'video_pause', # Mark when a video recording has been paused + '12': 'video_second_stream_pause', + '13': 'video_resume', # Mark when a video recording has been resumed + '14': 'video_second_stream_resume', + }, + 'sensor_type': { + '0': 'accelerometer', + '1': 'gyroscope', + '2': 'compass', # Magnetometer + '3': 'barometer', + }, + 'bike_light_network_config_type': { + '0': 'auto', + '4': 'individual', + '5': 'high_visibility', + '6': 'trail', + }, + 'comm_timeout_type': { + '0': 'wildcard_pairing_timeout', # Timeout pairing to any device + '1': 'pairing_timeout', # Timeout pairing to previously paired device + '2': 'connection_lost', # Temporary loss of communications + '3': 'connection_timeout', # Connection closed due to extended bad communications + }, + 'camera_orientation_type': { + '0': 'camera_orientation_0', + '1': 'camera_orientation_90', + '2': 'camera_orientation_180', + '3': 'camera_orientation_270', + }, + 'attitude_stage': { + '0': 'failed', + '1': 'aligning', + '2': 'degraded', + '3': 'valid', + }, + 'attitude_validity': { + '0x0001': 'track_angle_heading_valid', + '0x0002': 'pitch_valid', + '0x0004': 'roll_valid', + '0x0008': 'lateral_body_accel_valid', + '0x0010': 'normal_body_accel_valid', + '0x0020': 'turn_rate_valid', + '0x0040': 'hw_fail', + '0x0080': 'mag_invalid', + '0x0100': 'no_gps', + '0x0200': 'gps_invalid', + '0x0400': 'solution_coasting', + '0x0800': 'true_track_angle', + '0x1000': 'magnetic_heading', + }, + 'auto_sync_frequency': { + '0': 'never', + '1': 'occasionally', + '2': 'frequent', + '3': 'once_a_day', + '4': 'remote', + }, + 'exd_layout': { + '0': 'full_screen', + '1': 'half_vertical', + '2': 'half_horizontal', + '3': 'half_vertical_right_split', + '4': 'half_horizontal_bottom_split', + '5': 'full_quarter_split', + '6': 'half_vertical_left_split', + '7': 'half_horizontal_top_split', + '8': 'dynamic', # The EXD may display the configured concepts in any layout it sees fit. + }, + 'exd_display_type': { + '0': 'numerical', + '1': 'simple', + '2': 'graph', + '3': 'bar', + '4': 'circle_graph', + '5': 'virtual_partner', + '6': 'balance', + '7': 'string_list', + '8': 'string', + '9': 'simple_dynamic_icon', + '10': 'gauge', + }, + 'exd_data_units': { + '0': 'no_units', + '1': 'laps', + '2': 'miles_per_hour', + '3': 'kilometers_per_hour', + '4': 'feet_per_hour', + '5': 'meters_per_hour', + '6': 'degrees_celsius', + '7': 'degrees_farenheit', + '8': 'zone', + '9': 'gear', + '10': 'rpm', + '11': 'bpm', + '12': 'degrees', + '13': 'millimeters', + '14': 'meters', + '15': 'kilometers', + '16': 'feet', + '17': 'yards', + '18': 'kilofeet', + '19': 'miles', + '20': 'time', + '21': 'enum_turn_type', + '22': 'percent', + '23': 'watts', + '24': 'watts_per_kilogram', + '25': 'enum_battery_status', + '26': 'enum_bike_light_beam_angle_mode', + '27': 'enum_bike_light_battery_status', + '28': 'enum_bike_light_network_config_type', + '29': 'lights', + '30': 'seconds', + '31': 'minutes', + '32': 'hours', + '33': 'calories', + '34': 'kilojoules', + '35': 'milliseconds', + '36': 'second_per_mile', + '37': 'second_per_kilometer', + '38': 'centimeter', + '39': 'enum_course_point', + '40': 'bradians', + '41': 'enum_sport', + '42': 'inches_hg', + '43': 'mm_hg', + '44': 'mbars', + '45': 'hecto_pascals', + '46': 'feet_per_min', + '47': 'meters_per_min', + '48': 'meters_per_sec', + '49': 'eight_cardinal', + }, + 'exd_qualifiers': { + '0': 'no_qualifier', + '1': 'instantaneous', + '2': 'average', + '3': 'lap', + '4': 'maximum', + '5': 'maximum_average', + '6': 'maximum_lap', + '7': 'last_lap', + '8': 'average_lap', + '9': 'to_destination', + '10': 'to_go', + '11': 'to_next', + '12': 'next_course_point', + '13': 'total', + '14': 'three_second_average', + '15': 'ten_second_average', + '16': 'thirty_second_average', + '17': 'percent_maximum', + '18': 'percent_maximum_average', + '19': 'lap_percent_maximum', + '20': 'elapsed', + '21': 'sunrise', + '22': 'sunset', + '23': 'compared_to_virtual_partner', + '24': 'maximum_24h', + '25': 'minimum_24h', + '26': 'minimum', + '27': 'first', + '28': 'second', + '29': 'third', + '30': 'shifter', + '31': 'last_sport', + '32': 'moving', + '33': 'stopped', + '34': 'estimated_total', + '242': 'zone_9', + '243': 'zone_8', + '244': 'zone_7', + '245': 'zone_6', + '246': 'zone_5', + '247': 'zone_4', + '248': 'zone_3', + '249': 'zone_2', + '250': 'zone_1', + }, + 'exd_descriptors': { + '0': 'bike_light_battery_status', + '1': 'beam_angle_status', + '2': 'batery_level', + '3': 'light_network_mode', + '4': 'number_lights_connected', + '5': 'cadence', + '6': 'distance', + '7': 'estimated_time_of_arrival', + '8': 'heading', + '9': 'time', + '10': 'battery_level', + '11': 'trainer_resistance', + '12': 'trainer_target_power', + '13': 'time_seated', + '14': 'time_standing', + '15': 'elevation', + '16': 'grade', + '17': 'ascent', + '18': 'descent', + '19': 'vertical_speed', + '20': 'di2_battery_level', + '21': 'front_gear', + '22': 'rear_gear', + '23': 'gear_ratio', + '24': 'heart_rate', + '25': 'heart_rate_zone', + '26': 'time_in_heart_rate_zone', + '27': 'heart_rate_reserve', + '28': 'calories', + '29': 'gps_accuracy', + '30': 'gps_signal_strength', + '31': 'temperature', + '32': 'time_of_day', + '33': 'balance', + '34': 'pedal_smoothness', + '35': 'power', + '36': 'functional_threshold_power', + '37': 'intensity_factor', + '38': 'work', + '39': 'power_ratio', + '40': 'normalized_power', + '41': 'training_stress_Score', + '42': 'time_on_zone', + '43': 'speed', + '44': 'laps', + '45': 'reps', + '46': 'workout_step', + '47': 'course_distance', + '48': 'navigation_distance', + '49': 'course_estimated_time_of_arrival', + '50': 'navigation_estimated_time_of_arrival', + '51': 'course_time', + '52': 'navigation_time', + '53': 'course_heading', + '54': 'navigation_heading', + '55': 'power_zone', + '56': 'torque_effectiveness', + '57': 'timer_time', + '58': 'power_weight_ratio', + '59': 'left_platform_center_offset', + '60': 'right_platform_center_offset', + '61': 'left_power_phase_start_angle', + '62': 'right_power_phase_start_angle', + '63': 'left_power_phase_finish_angle', + '64': 'right_power_phase_finish_angle', + '65': 'gears', # Combined gear information + '66': 'pace', + '67': 'training_effect', + '68': 'vertical_oscillation', + '69': 'vertical_ratio', + '70': 'ground_contact_time', + '71': 'left_ground_contact_time_balance', + '72': 'right_ground_contact_time_balance', + '73': 'stride_length', + '74': 'running_cadence', + '75': 'performance_condition', + '76': 'course_type', + '77': 'time_in_power_zone', + '78': 'navigation_turn', + '79': 'course_location', + '80': 'navigation_location', + '81': 'compass', + '82': 'gear_combo', + '83': 'muscle_oxygen', + '84': 'icon', + '85': 'compass_heading', + '86': 'gps_heading', + '87': 'gps_elevation', + '88': 'anaerobic_training_effect', + '89': 'course', + '90': 'off_course', + '91': 'glide_ratio', + '92': 'vertical_distance', + '93': 'vmg', + '94': 'ambient_pressure', + '95': 'pressure', + '96': 'vam', + }, + 'auto_activity_detect': { + '0x00000000': 'none', + '0x00000001': 'running', + '0x00000002': 'cycling', + '0x00000004': 'swimming', + '0x00000008': 'walking', + '0x00000020': 'elliptical', + '0x00000400': 'sedentary', + }, + 'supported_exd_screen_layouts': { + '0x00000001': 'full_screen', + '0x00000002': 'half_vertical', + '0x00000004': 'half_horizontal', + '0x00000008': 'half_vertical_right_split', + '0x00000010': 'half_horizontal_bottom_split', + '0x00000020': 'full_quarter_split', + '0x00000040': 'half_vertical_left_split', + '0x00000080': 'half_horizontal_top_split', + }, + 'fit_base_type': { + '0': 'enum', + '1': 'sint8', + '2': 'uint8', + '131': 'sint16', + '132': 'uint16', + '133': 'sint32', + '134': 'uint32', + '7': 'string', + '136': 'float32', + '137': 'float64', + '10': 'uint8z', + '139': 'uint16z', + '140': 'uint32z', + '13': 'byte', + '142': 'sint64', + '143': 'uint64', + '144': 'uint64z', + }, + 'turn_type': { + '0': 'arriving_idx', + '1': 'arriving_left_idx', + '2': 'arriving_right_idx', + '3': 'arriving_via_idx', + '4': 'arriving_via_left_idx', + '5': 'arriving_via_right_idx', + '6': 'bear_keep_left_idx', + '7': 'bear_keep_right_idx', + '8': 'continue_idx', + '9': 'exit_left_idx', + '10': 'exit_right_idx', + '11': 'ferry_idx', + '12': 'roundabout_45_idx', + '13': 'roundabout_90_idx', + '14': 'roundabout_135_idx', + '15': 'roundabout_180_idx', + '16': 'roundabout_225_idx', + '17': 'roundabout_270_idx', + '18': 'roundabout_315_idx', + '19': 'roundabout_360_idx', + '20': 'roundabout_neg_45_idx', + '21': 'roundabout_neg_90_idx', + '22': 'roundabout_neg_135_idx', + '23': 'roundabout_neg_180_idx', + '24': 'roundabout_neg_225_idx', + '25': 'roundabout_neg_270_idx', + '26': 'roundabout_neg_315_idx', + '27': 'roundabout_neg_360_idx', + '28': 'roundabout_generic_idx', + '29': 'roundabout_neg_generic_idx', + '30': 'sharp_turn_left_idx', + '31': 'sharp_turn_right_idx', + '32': 'turn_left_idx', + '33': 'turn_right_idx', + '34': 'uturn_left_idx', + '35': 'uturn_right_idx', + '36': 'icon_inv_idx', + '37': 'icon_idx_cnt', + }, + 'bike_light_beam_angle_mode': { + '0': 'manual', + '1': 'auto', + }, + 'fit_base_unit': { + '0': 'other', + '1': 'kilogram', + '2': 'pound', + }, + 'set_type': { + '0': 'rest', + '1': 'active', + }, + 'max_met_category': { + '0': 'generic', + '1': 'cycling', + }, + 'exercise_category': { + '0': 'bench_press', + '1': 'calf_raise', + '2': 'cardio', + '3': 'carry', + '4': 'chop', + '5': 'core', + '6': 'crunch', + '7': 'curl', + '8': 'deadlift', + '9': 'flye', + '10': 'hip_raise', + '11': 'hip_stability', + '12': 'hip_swing', + '13': 'hyperextension', + '14': 'lateral_raise', + '15': 'leg_curl', + '16': 'leg_raise', + '17': 'lunge', + '18': 'olympic_lift', + '19': 'plank', + '20': 'plyo', + '21': 'pull_up', + '22': 'push_up', + '23': 'row', + '24': 'shoulder_press', + '25': 'shoulder_stability', + '26': 'shrug', + '27': 'sit_up', + '28': 'squat', + '29': 'total_body', + '30': 'triceps_extension', + '31': 'warm_up', + '32': 'run', + '33': 'bike', + '34': 'cardio_sensors', # Exercises within workouts that use GPS/sensors rather than rep counting + '35': 'move', + '36': 'pose', + '37': 'banded_exercises', + '38': 'battle_rope', + '39': 'elliptical', + '40': 'floor_climb', + '41': 'indoor_bike', + '42': 'indoor_row', + '43': 'ladder', + '44': 'sandbag', + '45': 'sled', + '46': 'sledge_hammer', + '47': 'stair_stepper', + '49': 'suspension', + '50': 'tire', + '52': 'run_indoor', + '53': 'bike_outdoor', + '65534': 'unknown', + }, + 'bench_press_exercise_name': { + '0': 'alternating_dumbbell_chest_press_on_swiss_ball', + '1': 'barbell_bench_press', + '2': 'barbell_board_bench_press', + '3': 'barbell_floor_press', + '4': 'close_grip_barbell_bench_press', + '5': 'decline_dumbbell_bench_press', + '6': 'dumbbell_bench_press', + '7': 'dumbbell_floor_press', + '8': 'incline_barbell_bench_press', + '9': 'incline_dumbbell_bench_press', + '10': 'incline_smith_machine_bench_press', + '11': 'isometric_barbell_bench_press', + '12': 'kettlebell_chest_press', + '13': 'neutral_grip_dumbbell_bench_press', + '14': 'neutral_grip_dumbbell_incline_bench_press', + '15': 'one_arm_floor_press', + '16': 'weighted_one_arm_floor_press', + '17': 'partial_lockout', + '18': 'reverse_grip_barbell_bench_press', + '19': 'reverse_grip_incline_bench_press', + '20': 'single_arm_cable_chest_press', + '21': 'single_arm_dumbbell_bench_press', + '22': 'smith_machine_bench_press', + '23': 'swiss_ball_dumbbell_chest_press', + '24': 'triple_stop_barbell_bench_press', + '25': 'wide_grip_barbell_bench_press', + '26': 'alternating_dumbbell_chest_press', + }, + 'calf_raise_exercise_name': { + '0': '3_way_calf_raise', + '1': '3_way_weighted_calf_raise', + '2': '3_way_single_leg_calf_raise', + '3': '3_way_weighted_single_leg_calf_raise', + '4': 'donkey_calf_raise', + '5': 'weighted_donkey_calf_raise', + '6': 'seated_calf_raise', + '7': 'weighted_seated_calf_raise', + '8': 'seated_dumbbell_toe_raise', + '9': 'single_leg_bent_knee_calf_raise', + '10': 'weighted_single_leg_bent_knee_calf_raise', + '11': 'single_leg_decline_push_up', + '12': 'single_leg_donkey_calf_raise', + '13': 'weighted_single_leg_donkey_calf_raise', + '14': 'single_leg_hip_raise_with_knee_hold', + '15': 'single_leg_standing_calf_raise', + '16': 'single_leg_standing_dumbbell_calf_raise', + '17': 'standing_barbell_calf_raise', + '18': 'standing_calf_raise', + '19': 'weighted_standing_calf_raise', + '20': 'standing_dumbbell_calf_raise', + }, + 'cardio_exercise_name': { + '0': 'bob_and_weave_circle', + '1': 'weighted_bob_and_weave_circle', + '2': 'cardio_core_crawl', + '3': 'weighted_cardio_core_crawl', + '4': 'double_under', + '5': 'weighted_double_under', + '6': 'jump_rope', + '7': 'weighted_jump_rope', + '8': 'jump_rope_crossover', + '9': 'weighted_jump_rope_crossover', + '10': 'jump_rope_jog', + '11': 'weighted_jump_rope_jog', + '12': 'jumping_jacks', + '13': 'weighted_jumping_jacks', + '14': 'ski_moguls', + '15': 'weighted_ski_moguls', + '16': 'split_jacks', + '17': 'weighted_split_jacks', + '18': 'squat_jacks', + '19': 'weighted_squat_jacks', + '20': 'triple_under', + '21': 'weighted_triple_under', + '22': 'elliptical', + '23': 'spinning', + '24': 'pole_paddle_forward_wheelchair', + '25': 'pole_paddle_backward_wheelchair', + '26': 'pole_handcycle_forward_wheelchair', + '27': 'pole_handcycle_backward_wheelchair', + '28': 'pole_rainbow_wheelchair', + '29': 'double_punch_forward_wheelchair', + '30': 'double_punch_down_wheelchair', + '31': 'double_punch_sideways_wheelchair', + '32': 'double_punch_up_wheelchair', + '33': 'sit_ski_wheelchair', + '34': 'sitting_jacks_wheelchair', + '35': 'punch_forward_wheelchair', + '36': 'punch_down_wheelchair', + '37': 'punch_sideways_wheelchair', + '38': 'punch_up_wheelchair', + '39': 'punch_bag_wheelchair', + '40': 'pole_dd_ff_uu_wheelchair', + '41': 'butterfly_arms_wheelchair', + '42': 'punch', + }, + 'carry_exercise_name': { + '0': 'bar_holds', + '1': 'farmers_walk', + '2': 'farmers_walk_on_toes', + '3': 'hex_dumbbell_hold', + '4': 'overhead_carry', + '5': 'dumbbell_waiter_carry', + '6': 'farmers_carry_walk_lunge', + '7': 'farmers_carry', + '8': 'farmers_carry_on_toes', + }, + 'chop_exercise_name': { + '0': 'cable_pull_through', + '1': 'cable_rotational_lift', + '2': 'cable_woodchop', + '3': 'cross_chop_to_knee', + '4': 'weighted_cross_chop_to_knee', + '5': 'dumbbell_chop', + '6': 'half_kneeling_rotation', + '7': 'weighted_half_kneeling_rotation', + '8': 'half_kneeling_rotational_chop', + '9': 'half_kneeling_rotational_reverse_chop', + '10': 'half_kneeling_stability_chop', + '11': 'half_kneeling_stability_reverse_chop', + '12': 'kneeling_rotational_chop', + '13': 'kneeling_rotational_reverse_chop', + '14': 'kneeling_stability_chop', + '15': 'kneeling_woodchopper', + '16': 'medicine_ball_wood_chops', + '17': 'power_squat_chops', + '18': 'weighted_power_squat_chops', + '19': 'standing_rotational_chop', + '20': 'standing_split_rotational_chop', + '21': 'standing_split_rotational_reverse_chop', + '22': 'standing_stability_reverse_chop', + }, + 'core_exercise_name': { + '0': 'abs_jabs', + '1': 'weighted_abs_jabs', + '2': 'alternating_plate_reach', + '3': 'barbell_rollout', + '4': 'weighted_barbell_rollout', + '5': 'body_bar_oblique_twist', + '6': 'cable_core_press', + '7': 'cable_side_bend', + '8': 'side_bend', + '9': 'weighted_side_bend', + '10': 'crescent_circle', + '11': 'weighted_crescent_circle', + '12': 'cycling_russian_twist', + '13': 'weighted_cycling_russian_twist', + '14': 'elevated_feet_russian_twist', + '15': 'weighted_elevated_feet_russian_twist', + '16': 'half_turkish_get_up', + '17': 'kettlebell_windmill', + '18': 'kneeling_ab_wheel', + '19': 'weighted_kneeling_ab_wheel', + '20': 'modified_front_lever', + '21': 'open_knee_tucks', + '22': 'weighted_open_knee_tucks', + '23': 'side_abs_leg_lift', + '24': 'weighted_side_abs_leg_lift', + '25': 'swiss_ball_jackknife', + '26': 'weighted_swiss_ball_jackknife', + '27': 'swiss_ball_pike', + '28': 'weighted_swiss_ball_pike', + '29': 'swiss_ball_rollout', + '30': 'weighted_swiss_ball_rollout', + '31': 'triangle_hip_press', + '32': 'weighted_triangle_hip_press', + '33': 'trx_suspended_jackknife', + '34': 'weighted_trx_suspended_jackknife', + '35': 'u_boat', + '36': 'weighted_u_boat', + '37': 'windmill_switches', + '38': 'weighted_windmill_switches', + '39': 'alternating_slide_out', + '40': 'weighted_alternating_slide_out', + '41': 'ghd_back_extensions', + '42': 'weighted_ghd_back_extensions', + '43': 'overhead_walk', + '44': 'inchworm', + '45': 'weighted_modified_front_lever', + '46': 'russian_twist', + '47': 'abdominal_leg_rotations', # Deprecated do not use + '48': 'arm_and_leg_extension_on_knees', + '49': 'bicycle', + '50': 'bicep_curl_with_leg_extension', + '51': 'cat_cow', + '52': 'corkscrew', + '53': 'criss_cross', + '54': 'criss_cross_with_ball', # Deprecated do not use + '55': 'double_leg_stretch', + '56': 'knee_folds', + '57': 'lower_lift', + '58': 'neck_pull', + '59': 'pelvic_clocks', + '60': 'roll_over', + '61': 'roll_up', + '62': 'rolling', + '63': 'rowing_1', + '64': 'rowing_2', + '65': 'scissors', + '66': 'single_leg_circles', + '67': 'single_leg_stretch', + '68': 'snake_twist_1_and_2', # Deprecated do not use + '69': 'swan', + '70': 'swimming', + '71': 'teaser', + '72': 'the_hundred', + '73': 'bicep_curl_with_leg_extension_with_weights', + '75': 'hanging_l_sit', + '77': 'lower_lift_with_weights', + '79': 'ring_l_sit', + '80': 'rowing_1_with_weights', + '81': 'rowing_2_with_weights', + '82': 'scissors_with_weights', + '83': 'single_leg_stretch_with_weights', + '84': 'toes_to_elbows', + '85': 'weighted_criss_cross', + '86': 'weighted_double_leg_stretch', + '87': 'weighted_the_hundred', + '88': 'l_sit', + '89': 'turkish_get_up', + '90': 'weighted_ring_l_sit', + '91': 'weighted_hanging_l_sit', + '92': 'weighted_l_sit', + '93': 'side_bend_low_wheelchair', + '94': 'side_bend_mid_wheelchair', + '95': 'side_bend_high_wheelchair', + '96': 'seated_side_bend', + }, + 'crunch_exercise_name': { + '0': 'bicycle_crunch', + '1': 'cable_crunch', + '2': 'circular_arm_crunch', + '3': 'crossed_arms_crunch', + '4': 'weighted_crossed_arms_crunch', + '5': 'cross_leg_reverse_crunch', + '6': 'weighted_cross_leg_reverse_crunch', + '7': 'crunch_chop', + '8': 'weighted_crunch_chop', + '9': 'double_crunch', + '10': 'weighted_double_crunch', + '11': 'elbow_to_knee_crunch', + '12': 'weighted_elbow_to_knee_crunch', + '13': 'flutter_kicks', + '14': 'weighted_flutter_kicks', + '15': 'foam_roller_reverse_crunch_on_bench', + '16': 'weighted_foam_roller_reverse_crunch_on_bench', + '17': 'foam_roller_reverse_crunch_with_dumbbell', + '18': 'foam_roller_reverse_crunch_with_medicine_ball', + '19': 'frog_press', + '20': 'hanging_knee_raise_oblique_crunch', + '21': 'weighted_hanging_knee_raise_oblique_crunch', + '22': 'hip_crossover', + '23': 'weighted_hip_crossover', + '24': 'hollow_rock', + '25': 'weighted_hollow_rock', + '26': 'incline_reverse_crunch', + '27': 'weighted_incline_reverse_crunch', + '28': 'kneeling_cable_crunch', + '29': 'kneeling_cross_crunch', + '30': 'weighted_kneeling_cross_crunch', + '31': 'kneeling_oblique_cable_crunch', + '32': 'knees_to_elbow', + '33': 'leg_extensions', + '34': 'weighted_leg_extensions', + '35': 'leg_levers', + '36': 'mcgill_curl_up', + '37': 'weighted_mcgill_curl_up', + '38': 'modified_pilates_roll_up_with_ball', + '39': 'weighted_modified_pilates_roll_up_with_ball', + '40': 'pilates_crunch', + '41': 'weighted_pilates_crunch', + '42': 'pilates_roll_up_with_ball', + '43': 'weighted_pilates_roll_up_with_ball', + '44': 'raised_legs_crunch', + '45': 'weighted_raised_legs_crunch', + '46': 'reverse_crunch', + '47': 'weighted_reverse_crunch', + '48': 'reverse_crunch_on_a_bench', + '49': 'weighted_reverse_crunch_on_a_bench', + '50': 'reverse_curl_and_lift', + '51': 'weighted_reverse_curl_and_lift', + '52': 'rotational_lift', + '53': 'weighted_rotational_lift', + '54': 'seated_alternating_reverse_crunch', + '55': 'weighted_seated_alternating_reverse_crunch', + '56': 'seated_leg_u', + '57': 'weighted_seated_leg_u', + '58': 'side_to_side_crunch_and_weave', + '59': 'weighted_side_to_side_crunch_and_weave', + '60': 'single_leg_reverse_crunch', + '61': 'weighted_single_leg_reverse_crunch', + '62': 'skater_crunch_cross', + '63': 'weighted_skater_crunch_cross', + '64': 'standing_cable_crunch', + '65': 'standing_side_crunch', + '66': 'step_climb', + '67': 'weighted_step_climb', + '68': 'swiss_ball_crunch', + '69': 'swiss_ball_reverse_crunch', + '70': 'weighted_swiss_ball_reverse_crunch', + '71': 'swiss_ball_russian_twist', + '72': 'weighted_swiss_ball_russian_twist', + '73': 'swiss_ball_side_crunch', + '74': 'weighted_swiss_ball_side_crunch', + '75': 'thoracic_crunches_on_foam_roller', + '76': 'weighted_thoracic_crunches_on_foam_roller', + '77': 'triceps_crunch', + '78': 'weighted_bicycle_crunch', + '79': 'weighted_crunch', + '80': 'weighted_swiss_ball_crunch', + '81': 'toes_to_bar', + '82': 'weighted_toes_to_bar', + '83': 'crunch', + '84': 'straight_leg_crunch_with_ball', + '86': 'leg_climb_crunch', + }, + 'curl_exercise_name': { + '0': 'alternating_dumbbell_biceps_curl', + '1': 'alternating_dumbbell_biceps_curl_on_swiss_ball', + '2': 'alternating_incline_dumbbell_biceps_curl', + '3': 'barbell_biceps_curl', + '4': 'barbell_reverse_wrist_curl', + '5': 'barbell_wrist_curl', + '6': 'behind_the_back_barbell_reverse_wrist_curl', + '7': 'behind_the_back_one_arm_cable_curl', + '8': 'cable_biceps_curl', + '9': 'cable_hammer_curl', + '10': 'cheating_barbell_biceps_curl', + '11': 'close_grip_ez_bar_biceps_curl', + '12': 'cross_body_dumbbell_hammer_curl', + '13': 'dead_hang_biceps_curl', + '14': 'decline_hammer_curl', + '15': 'dumbbell_biceps_curl_with_static_hold', + '16': 'dumbbell_hammer_curl', + '17': 'dumbbell_reverse_wrist_curl', + '18': 'dumbbell_wrist_curl', + '19': 'ez_bar_preacher_curl', + '20': 'forward_bend_biceps_curl', + '21': 'hammer_curl_to_press', + '22': 'incline_dumbbell_biceps_curl', + '23': 'incline_offset_thumb_dumbbell_curl', + '24': 'kettlebell_biceps_curl', + '25': 'lying_concentration_cable_curl', + '26': 'one_arm_preacher_curl', + '27': 'plate_pinch_curl', + '28': 'preacher_curl_with_cable', + '29': 'reverse_ez_bar_curl', + '30': 'reverse_grip_wrist_curl', + '31': 'reverse_grip_barbell_biceps_curl', + '32': 'seated_alternating_dumbbell_biceps_curl', + '33': 'seated_dumbbell_biceps_curl', + '34': 'seated_reverse_dumbbell_curl', + '35': 'split_stance_offset_pinky_dumbbell_curl', + '36': 'standing_alternating_dumbbell_curls', + '37': 'standing_dumbbell_biceps_curl', + '38': 'standing_ez_bar_biceps_curl', + '39': 'static_curl', + '40': 'swiss_ball_dumbbell_overhead_triceps_extension', + '41': 'swiss_ball_ez_bar_preacher_curl', + '42': 'twisting_standing_dumbbell_biceps_curl', + '43': 'wide_grip_ez_bar_biceps_curl', + '44': 'one_arm_concentration_curl', + '45': 'standing_zottman_biceps_curl', + '46': 'dumbbell_biceps_curl', + '47': 'drag_curl_wheelchair', + '48': 'dumbbell_biceps_curl_wheelchair', + '49': 'bottle_curl', + '50': 'seated_bottle_curl', + }, + 'deadlift_exercise_name': { + '0': 'barbell_deadlift', + '1': 'barbell_straight_leg_deadlift', + '2': 'dumbbell_deadlift', + '3': 'dumbbell_single_leg_deadlift_to_row', + '4': 'dumbbell_straight_leg_deadlift', + '5': 'kettlebell_floor_to_shelf', + '6': 'one_arm_one_leg_deadlift', + '7': 'rack_pull', + '8': 'rotational_dumbbell_straight_leg_deadlift', + '9': 'single_arm_deadlift', + '10': 'single_leg_barbell_deadlift', + '11': 'single_leg_barbell_straight_leg_deadlift', + '12': 'single_leg_deadlift_with_barbell', + '13': 'single_leg_rdl_circuit', + '14': 'single_leg_romanian_deadlift_with_dumbbell', + '15': 'sumo_deadlift', + '16': 'sumo_deadlift_high_pull', + '17': 'trap_bar_deadlift', + '18': 'wide_grip_barbell_deadlift', + '20': 'kettlebell_deadlift', + '21': 'kettlebell_sumo_deadlift', + '23': 'romanian_deadlift', + '24': 'single_leg_romanian_deadlift_circuit', + '25': 'straight_leg_deadlift', + }, + 'flye_exercise_name': { + '0': 'cable_crossover', + '1': 'decline_dumbbell_flye', + '2': 'dumbbell_flye', + '3': 'incline_dumbbell_flye', + '4': 'kettlebell_flye', + '5': 'kneeling_rear_flye', + '6': 'single_arm_standing_cable_reverse_flye', + '7': 'swiss_ball_dumbbell_flye', + '8': 'arm_rotations', + '9': 'hug_a_tree', + '10': 'face_down_incline_reverse_flye', + '11': 'incline_reverse_flye', + '12': 'rear_delt_fly_wheelchair', + }, + 'hip_raise_exercise_name': { + '0': 'barbell_hip_thrust_on_floor', + '1': 'barbell_hip_thrust_with_bench', + '2': 'bent_knee_swiss_ball_reverse_hip_raise', + '3': 'weighted_bent_knee_swiss_ball_reverse_hip_raise', + '4': 'bridge_with_leg_extension', + '5': 'weighted_bridge_with_leg_extension', + '6': 'clam_bridge', + '7': 'front_kick_tabletop', + '8': 'weighted_front_kick_tabletop', + '9': 'hip_extension_and_cross', + '10': 'weighted_hip_extension_and_cross', + '11': 'hip_raise', + '12': 'weighted_hip_raise', + '13': 'hip_raise_with_feet_on_swiss_ball', + '14': 'weighted_hip_raise_with_feet_on_swiss_ball', + '15': 'hip_raise_with_head_on_bosu_ball', + '16': 'weighted_hip_raise_with_head_on_bosu_ball', + '17': 'hip_raise_with_head_on_swiss_ball', + '18': 'weighted_hip_raise_with_head_on_swiss_ball', + '19': 'hip_raise_with_knee_squeeze', + '20': 'weighted_hip_raise_with_knee_squeeze', + '21': 'incline_rear_leg_extension', + '22': 'weighted_incline_rear_leg_extension', + '23': 'kettlebell_swing', + '24': 'marching_hip_raise', + '25': 'weighted_marching_hip_raise', + '26': 'marching_hip_raise_with_feet_on_a_swiss_ball', + '27': 'weighted_marching_hip_raise_with_feet_on_a_swiss_ball', + '28': 'reverse_hip_raise', + '29': 'weighted_reverse_hip_raise', + '30': 'single_leg_hip_raise', + '31': 'weighted_single_leg_hip_raise', + '32': 'single_leg_hip_raise_with_foot_on_bench', + '33': 'weighted_single_leg_hip_raise_with_foot_on_bench', + '34': 'single_leg_hip_raise_with_foot_on_bosu_ball', + '35': 'weighted_single_leg_hip_raise_with_foot_on_bosu_ball', + '36': 'single_leg_hip_raise_with_foot_on_foam_roller', + '37': 'weighted_single_leg_hip_raise_with_foot_on_foam_roller', + '38': 'single_leg_hip_raise_with_foot_on_medicine_ball', + '39': 'weighted_single_leg_hip_raise_with_foot_on_medicine_ball', + '40': 'single_leg_hip_raise_with_head_on_bosu_ball', + '41': 'weighted_single_leg_hip_raise_with_head_on_bosu_ball', + '42': 'weighted_clam_bridge', + '43': 'single_leg_swiss_ball_hip_raise_and_leg_curl', + '44': 'clams', + '45': 'inner_thigh_circles', # Deprecated do not use + '46': 'inner_thigh_side_lift', # Deprecated do not use + '47': 'leg_circles', + '48': 'leg_lift', + '49': 'leg_lift_in_external_rotation', + }, + 'hip_stability_exercise_name': { + '0': 'band_side_lying_leg_raise', + '1': 'dead_bug', + '2': 'weighted_dead_bug', + '3': 'external_hip_raise', + '4': 'weighted_external_hip_raise', + '5': 'fire_hydrant_kicks', + '6': 'weighted_fire_hydrant_kicks', + '7': 'hip_circles', + '8': 'weighted_hip_circles', + '9': 'inner_thigh_lift', + '10': 'weighted_inner_thigh_lift', + '11': 'lateral_walks_with_band_at_ankles', + '12': 'pretzel_side_kick', + '13': 'weighted_pretzel_side_kick', + '14': 'prone_hip_internal_rotation', + '15': 'weighted_prone_hip_internal_rotation', + '16': 'quadruped', + '17': 'quadruped_hip_extension', + '18': 'weighted_quadruped_hip_extension', + '19': 'quadruped_with_leg_lift', + '20': 'weighted_quadruped_with_leg_lift', + '21': 'side_lying_leg_raise', + '22': 'weighted_side_lying_leg_raise', + '23': 'sliding_hip_adduction', + '24': 'weighted_sliding_hip_adduction', + '25': 'standing_adduction', + '26': 'weighted_standing_adduction', + '27': 'standing_cable_hip_abduction', + '28': 'standing_hip_abduction', + '29': 'weighted_standing_hip_abduction', + '30': 'standing_rear_leg_raise', + '31': 'weighted_standing_rear_leg_raise', + '32': 'supine_hip_internal_rotation', + '33': 'weighted_supine_hip_internal_rotation', + '34': 'lying_abduction_stretch', + }, + 'hip_swing_exercise_name': { + '0': 'single_arm_kettlebell_swing', + '1': 'single_arm_dumbbell_swing', + '2': 'step_out_swing', + '3': 'one_arm_swing', + }, + 'hyperextension_exercise_name': { + '0': 'back_extension_with_opposite_arm_and_leg_reach', + '1': 'weighted_back_extension_with_opposite_arm_and_leg_reach', + '2': 'base_rotations', + '3': 'weighted_base_rotations', + '4': 'bent_knee_reverse_hyperextension', + '5': 'weighted_bent_knee_reverse_hyperextension', + '6': 'hollow_hold_and_roll', + '7': 'weighted_hollow_hold_and_roll', + '8': 'kicks', + '9': 'weighted_kicks', + '10': 'knee_raises', + '11': 'weighted_knee_raises', + '12': 'kneeling_superman', + '13': 'weighted_kneeling_superman', + '14': 'lat_pull_down_with_row', + '15': 'medicine_ball_deadlift_to_reach', + '16': 'one_arm_one_leg_row', + '17': 'one_arm_row_with_band', + '18': 'overhead_lunge_with_medicine_ball', + '19': 'plank_knee_tucks', + '20': 'weighted_plank_knee_tucks', + '21': 'side_step', + '22': 'weighted_side_step', + '23': 'single_leg_back_extension', + '24': 'weighted_single_leg_back_extension', + '25': 'spine_extension', + '26': 'weighted_spine_extension', + '27': 'static_back_extension', + '28': 'weighted_static_back_extension', + '29': 'superman_from_floor', + '30': 'weighted_superman_from_floor', + '31': 'swiss_ball_back_extension', + '32': 'weighted_swiss_ball_back_extension', + '33': 'swiss_ball_hyperextension', + '34': 'weighted_swiss_ball_hyperextension', + '35': 'swiss_ball_opposite_arm_and_leg_lift', + '36': 'weighted_swiss_ball_opposite_arm_and_leg_lift', + '37': 'superman_on_swiss_ball', + '38': 'cobra', + '39': 'supine_floor_barre', # Deprecated do not use + }, + 'lateral_raise_exercise_name': { + '0': '45_degree_cable_external_rotation', + '1': 'alternating_lateral_raise_with_static_hold', + '2': 'bar_muscle_up', + '3': 'bent_over_lateral_raise', + '4': 'cable_diagonal_raise', + '5': 'cable_front_raise', + '6': 'calorie_row', + '7': 'combo_shoulder_raise', + '8': 'dumbbell_diagonal_raise', + '9': 'dumbbell_v_raise', + '10': 'front_raise', + '11': 'leaning_dumbbell_lateral_raise', + '12': 'lying_dumbbell_raise', + '13': 'muscle_up', + '14': 'one_arm_cable_lateral_raise', + '15': 'overhand_grip_rear_lateral_raise', + '16': 'plate_raises', + '17': 'ring_dip', + '18': 'weighted_ring_dip', + '19': 'ring_muscle_up', + '20': 'weighted_ring_muscle_up', + '21': 'rope_climb', + '22': 'weighted_rope_climb', + '23': 'scaption', + '24': 'seated_lateral_raise', + '25': 'seated_rear_lateral_raise', + '26': 'side_lying_lateral_raise', + '27': 'standing_lift', + '28': 'suspended_row', + '29': 'underhand_grip_rear_lateral_raise', + '30': 'wall_slide', + '31': 'weighted_wall_slide', + '32': 'arm_circles', + '33': 'shaving_the_head', + '34': 'dumbbell_lateral_raise', + '36': 'ring_dip_kipping', + '37': 'wall_walk', + '38': 'dumbbell_front_raise_wheelchair', + '39': 'dumbbell_lateral_raise_wheelchair', + '40': 'pole_double_arm_overhead_and_forward_wheelchair', + '41': 'pole_straight_arm_overhead_wheelchair', + }, + 'leg_curl_exercise_name': { + '0': 'leg_curl', + '1': 'weighted_leg_curl', + '2': 'good_morning', + '3': 'seated_barbell_good_morning', + '4': 'single_leg_barbell_good_morning', + '5': 'single_leg_sliding_leg_curl', + '6': 'sliding_leg_curl', + '7': 'split_barbell_good_morning', + '8': 'split_stance_extension', + '9': 'staggered_stance_good_morning', + '10': 'swiss_ball_hip_raise_and_leg_curl', + '11': 'zercher_good_morning', + '12': 'band_good_morning', + '13': 'bar_good_morning', + }, + 'leg_raise_exercise_name': { + '0': 'hanging_knee_raise', + '1': 'hanging_leg_raise', + '2': 'weighted_hanging_leg_raise', + '3': 'hanging_single_leg_raise', + '4': 'weighted_hanging_single_leg_raise', + '5': 'kettlebell_leg_raises', + '6': 'leg_lowering_drill', + '7': 'weighted_leg_lowering_drill', + '8': 'lying_straight_leg_raise', + '9': 'weighted_lying_straight_leg_raise', + '10': 'medicine_ball_leg_drops', + '11': 'quadruped_leg_raise', + '12': 'weighted_quadruped_leg_raise', + '13': 'reverse_leg_raise', + '14': 'weighted_reverse_leg_raise', + '15': 'reverse_leg_raise_on_swiss_ball', + '16': 'weighted_reverse_leg_raise_on_swiss_ball', + '17': 'single_leg_lowering_drill', + '18': 'weighted_single_leg_lowering_drill', + '19': 'weighted_hanging_knee_raise', + '20': 'lateral_stepover', + '21': 'weighted_lateral_stepover', + }, + 'lunge_exercise_name': { + '0': 'overhead_lunge', + '1': 'lunge_matrix', + '2': 'weighted_lunge_matrix', + '3': 'alternating_barbell_forward_lunge', + '4': 'alternating_dumbbell_lunge_with_reach', + '5': 'back_foot_elevated_dumbbell_split_squat', + '6': 'barbell_box_lunge', + '7': 'barbell_bulgarian_split_squat', + '8': 'barbell_crossover_lunge', + '9': 'barbell_front_split_squat', + '10': 'barbell_lunge', + '11': 'barbell_reverse_lunge', + '12': 'barbell_side_lunge', + '13': 'barbell_split_squat', + '14': 'core_control_rear_lunge', + '15': 'diagonal_lunge', + '16': 'drop_lunge', + '17': 'dumbbell_box_lunge', + '18': 'dumbbell_bulgarian_split_squat', + '19': 'dumbbell_crossover_lunge', + '20': 'dumbbell_diagonal_lunge', + '21': 'dumbbell_lunge', + '22': 'dumbbell_lunge_and_rotation', + '23': 'dumbbell_overhead_bulgarian_split_squat', + '24': 'dumbbell_reverse_lunge_to_high_knee_and_press', + '25': 'dumbbell_side_lunge', + '26': 'elevated_front_foot_barbell_split_squat', + '27': 'front_foot_elevated_dumbbell_split_squat', + '28': 'gunslinger_lunge', + '29': 'lawnmower_lunge', + '30': 'low_lunge_with_isometric_adduction', + '31': 'low_side_to_side_lunge', + '32': 'lunge', + '33': 'weighted_lunge', + '34': 'lunge_with_arm_reach', + '35': 'lunge_with_diagonal_reach', + '36': 'lunge_with_side_bend', + '37': 'offset_dumbbell_lunge', + '38': 'offset_dumbbell_reverse_lunge', + '39': 'overhead_bulgarian_split_squat', + '40': 'overhead_dumbbell_reverse_lunge', + '41': 'overhead_dumbbell_split_squat', + '42': 'overhead_lunge_with_rotation', + '43': 'reverse_barbell_box_lunge', + '44': 'reverse_box_lunge', + '45': 'reverse_dumbbell_box_lunge', + '46': 'reverse_dumbbell_crossover_lunge', + '47': 'reverse_dumbbell_diagonal_lunge', + '48': 'reverse_lunge_with_reach_back', + '49': 'weighted_reverse_lunge_with_reach_back', + '50': 'reverse_lunge_with_twist_and_overhead_reach', + '51': 'weighted_reverse_lunge_with_twist_and_overhead_reach', + '52': 'reverse_sliding_box_lunge', + '53': 'weighted_reverse_sliding_box_lunge', + '54': 'reverse_sliding_lunge', + '55': 'weighted_reverse_sliding_lunge', + '56': 'runners_lunge_to_balance', + '57': 'weighted_runners_lunge_to_balance', + '58': 'shifting_side_lunge', + '59': 'side_and_crossover_lunge', + '60': 'weighted_side_and_crossover_lunge', + '61': 'side_lunge', + '62': 'weighted_side_lunge', + '63': 'side_lunge_and_press', + '64': 'side_lunge_jump_off', + '65': 'side_lunge_sweep', + '66': 'weighted_side_lunge_sweep', + '67': 'side_lunge_to_crossover_tap', + '68': 'weighted_side_lunge_to_crossover_tap', + '69': 'side_to_side_lunge_chops', + '70': 'weighted_side_to_side_lunge_chops', + '71': 'siff_jump_lunge', + '72': 'weighted_siff_jump_lunge', + '73': 'single_arm_reverse_lunge_and_press', + '74': 'sliding_lateral_lunge', + '75': 'weighted_sliding_lateral_lunge', + '76': 'walking_barbell_lunge', + '77': 'walking_dumbbell_lunge', + '78': 'walking_lunge', + '79': 'weighted_walking_lunge', + '80': 'wide_grip_overhead_barbell_split_squat', + '81': 'alternating_dumbbell_lunge', + '82': 'dumbbell_reverse_lunge', + '83': 'overhead_dumbbell_lunge', + '84': 'scissor_power_switch', + '85': 'dumbbell_overhead_walking_lunge', + '86': 'curtsy_lunge', + '87': 'weighted_curtsy_lunge', + '88': 'weighted_shifting_side_lunge', + '89': 'weighted_side_lunge_and_press', + '90': 'weighted_side_lunge_jump_off', + }, + 'olympic_lift_exercise_name': { + '0': 'barbell_hang_power_clean', + '1': 'barbell_hang_squat_clean', + '2': 'barbell_power_clean', + '3': 'barbell_power_snatch', + '4': 'barbell_squat_clean', + '5': 'clean_and_jerk', + '6': 'barbell_hang_power_snatch', + '7': 'barbell_hang_pull', + '8': 'barbell_high_pull', + '9': 'barbell_snatch', + '10': 'barbell_split_jerk', + '11': 'clean', + '12': 'dumbbell_clean', + '13': 'dumbbell_hang_pull', + '14': 'one_hand_dumbbell_split_snatch', + '15': 'push_jerk', + '16': 'single_arm_dumbbell_snatch', + '17': 'single_arm_hang_snatch', + '18': 'single_arm_kettlebell_snatch', + '19': 'split_jerk', + '20': 'squat_clean_and_jerk', + '21': 'dumbbell_hang_snatch', + '22': 'dumbbell_power_clean_and_jerk', + '23': 'dumbbell_power_clean_and_push_press', + '24': 'dumbbell_power_clean_and_strict_press', + '25': 'dumbbell_snatch', + '26': 'medicine_ball_clean', + '27': 'clean_and_press', + '28': 'snatch', + }, + 'plank_exercise_name': { + '0': '45_degree_plank', + '1': 'weighted_45_degree_plank', + '2': '90_degree_static_hold', + '3': 'weighted_90_degree_static_hold', + '4': 'bear_crawl', + '5': 'weighted_bear_crawl', + '6': 'cross_body_mountain_climber', + '7': 'weighted_cross_body_mountain_climber', + '8': 'elbow_plank_pike_jacks', + '9': 'weighted_elbow_plank_pike_jacks', + '10': 'elevated_feet_plank', + '11': 'weighted_elevated_feet_plank', + '12': 'elevator_abs', + '13': 'weighted_elevator_abs', + '14': 'extended_plank', + '15': 'weighted_extended_plank', + '16': 'full_plank_passe_twist', + '17': 'weighted_full_plank_passe_twist', + '18': 'inching_elbow_plank', + '19': 'weighted_inching_elbow_plank', + '20': 'inchworm_to_side_plank', + '21': 'weighted_inchworm_to_side_plank', + '22': 'kneeling_plank', + '23': 'weighted_kneeling_plank', + '24': 'kneeling_side_plank_with_leg_lift', + '25': 'weighted_kneeling_side_plank_with_leg_lift', + '26': 'lateral_roll', + '27': 'weighted_lateral_roll', + '28': 'lying_reverse_plank', + '29': 'weighted_lying_reverse_plank', + '30': 'medicine_ball_mountain_climber', + '31': 'weighted_medicine_ball_mountain_climber', + '32': 'modified_mountain_climber_and_extension', + '33': 'weighted_modified_mountain_climber_and_extension', + '34': 'mountain_climber', + '35': 'weighted_mountain_climber', + '36': 'mountain_climber_on_sliding_discs', + '37': 'weighted_mountain_climber_on_sliding_discs', + '38': 'mountain_climber_with_feet_on_bosu_ball', + '39': 'weighted_mountain_climber_with_feet_on_bosu_ball', + '40': 'mountain_climber_with_hands_on_bench', + '41': 'mountain_climber_with_hands_on_swiss_ball', + '42': 'weighted_mountain_climber_with_hands_on_swiss_ball', + '43': 'plank', + '44': 'plank_jacks_with_feet_on_sliding_discs', + '45': 'weighted_plank_jacks_with_feet_on_sliding_discs', + '46': 'plank_knee_twist', + '47': 'weighted_plank_knee_twist', + '48': 'plank_pike_jumps', + '49': 'weighted_plank_pike_jumps', + '50': 'plank_pikes', + '51': 'weighted_plank_pikes', + '52': 'plank_to_stand_up', + '53': 'weighted_plank_to_stand_up', + '54': 'plank_with_arm_raise', + '55': 'weighted_plank_with_arm_raise', + '56': 'plank_with_knee_to_elbow', + '57': 'weighted_plank_with_knee_to_elbow', + '58': 'plank_with_oblique_crunch', + '59': 'weighted_plank_with_oblique_crunch', + '60': 'plyometric_side_plank', + '61': 'weighted_plyometric_side_plank', + '62': 'rolling_side_plank', + '63': 'weighted_rolling_side_plank', + '64': 'side_kick_plank', + '65': 'weighted_side_kick_plank', + '66': 'side_plank', + '67': 'weighted_side_plank', + '68': 'side_plank_and_row', + '69': 'weighted_side_plank_and_row', + '70': 'side_plank_lift', + '71': 'weighted_side_plank_lift', + '72': 'side_plank_with_elbow_on_bosu_ball', + '73': 'weighted_side_plank_with_elbow_on_bosu_ball', + '74': 'side_plank_with_feet_on_bench', + '75': 'weighted_side_plank_with_feet_on_bench', + '76': 'side_plank_with_knee_circle', + '77': 'weighted_side_plank_with_knee_circle', + '78': 'side_plank_with_knee_tuck', + '79': 'weighted_side_plank_with_knee_tuck', + '80': 'side_plank_with_leg_lift', + '81': 'weighted_side_plank_with_leg_lift', + '82': 'side_plank_with_reach_under', + '83': 'weighted_side_plank_with_reach_under', + '84': 'single_leg_elevated_feet_plank', + '85': 'weighted_single_leg_elevated_feet_plank', + '86': 'single_leg_flex_and_extend', + '87': 'weighted_single_leg_flex_and_extend', + '88': 'single_leg_side_plank', + '89': 'weighted_single_leg_side_plank', + '90': 'spiderman_plank', + '91': 'weighted_spiderman_plank', + '92': 'straight_arm_plank', + '93': 'weighted_straight_arm_plank', + '94': 'straight_arm_plank_with_shoulder_touch', + '95': 'weighted_straight_arm_plank_with_shoulder_touch', + '96': 'swiss_ball_plank', + '97': 'weighted_swiss_ball_plank', + '98': 'swiss_ball_plank_leg_lift', + '99': 'weighted_swiss_ball_plank_leg_lift', + '100': 'swiss_ball_plank_leg_lift_and_hold', + '101': 'swiss_ball_plank_with_feet_on_bench', + '102': 'weighted_swiss_ball_plank_with_feet_on_bench', + '103': 'swiss_ball_prone_jackknife', + '104': 'weighted_swiss_ball_prone_jackknife', + '105': 'swiss_ball_side_plank', + '106': 'weighted_swiss_ball_side_plank', + '107': 'three_way_plank', + '108': 'weighted_three_way_plank', + '109': 'towel_plank_and_knee_in', + '110': 'weighted_towel_plank_and_knee_in', + '111': 't_stabilization', + '112': 'weighted_t_stabilization', + '113': 'turkish_get_up_to_side_plank', + '114': 'weighted_turkish_get_up_to_side_plank', + '115': 'two_point_plank', + '116': 'weighted_two_point_plank', + '117': 'weighted_plank', + '118': 'wide_stance_plank_with_diagonal_arm_lift', + '119': 'weighted_wide_stance_plank_with_diagonal_arm_lift', + '120': 'wide_stance_plank_with_diagonal_leg_lift', + '121': 'weighted_wide_stance_plank_with_diagonal_leg_lift', + '122': 'wide_stance_plank_with_leg_lift', + '123': 'weighted_wide_stance_plank_with_leg_lift', + '124': 'wide_stance_plank_with_opposite_arm_and_leg_lift', + '125': 'weighted_mountain_climber_with_hands_on_bench', + '126': 'weighted_swiss_ball_plank_leg_lift_and_hold', + '127': 'weighted_wide_stance_plank_with_opposite_arm_and_leg_lift', + '128': 'plank_with_feet_on_swiss_ball', + '129': 'side_plank_to_plank_with_reach_under', + '130': 'bridge_with_glute_lower_lift', + '131': 'bridge_one_leg_bridge', + '132': 'plank_with_arm_variations', + '133': 'plank_with_leg_lift', + '134': 'reverse_plank_with_leg_pull', + '135': 'ring_plank_sprawls', + }, + 'plyo_exercise_name': { + '0': 'alternating_jump_lunge', + '1': 'weighted_alternating_jump_lunge', + '2': 'barbell_jump_squat', + '3': 'body_weight_jump_squat', + '4': 'weighted_jump_squat', + '5': 'cross_knee_strike', + '6': 'weighted_cross_knee_strike', + '7': 'depth_jump', + '8': 'weighted_depth_jump', + '9': 'dumbbell_jump_squat', + '10': 'dumbbell_split_jump', + '11': 'front_knee_strike', + '12': 'weighted_front_knee_strike', + '13': 'high_box_jump', + '14': 'weighted_high_box_jump', + '15': 'isometric_explosive_body_weight_jump_squat', + '16': 'weighted_isometric_explosive_jump_squat', + '17': 'lateral_leap_and_hop', + '18': 'weighted_lateral_leap_and_hop', + '19': 'lateral_plyo_squats', + '20': 'weighted_lateral_plyo_squats', + '21': 'lateral_slide', + '22': 'weighted_lateral_slide', + '23': 'medicine_ball_overhead_throws', + '24': 'medicine_ball_side_throw', + '25': 'medicine_ball_slam', + '26': 'side_to_side_medicine_ball_throws', + '27': 'side_to_side_shuffle_jump', + '28': 'weighted_side_to_side_shuffle_jump', + '29': 'squat_jump_onto_box', + '30': 'weighted_squat_jump_onto_box', + '31': 'squat_jumps_in_and_out', + '32': 'weighted_squat_jumps_in_and_out', + '33': 'box_jump', + '34': 'box_jump_overs', + '35': 'box_jump_overs_over_the_box', + '36': 'star_jump_squats', + '37': 'jump_squat', + }, + 'pull_up_exercise_name': { + '0': 'banded_pull_ups', + '1': '30_degree_lat_pulldown', + '2': 'band_assisted_chin_up', + '3': 'close_grip_chin_up', + '4': 'weighted_close_grip_chin_up', + '5': 'close_grip_lat_pulldown', + '6': 'crossover_chin_up', + '7': 'weighted_crossover_chin_up', + '8': 'ez_bar_pullover', + '9': 'hanging_hurdle', + '10': 'weighted_hanging_hurdle', + '11': 'kneeling_lat_pulldown', + '12': 'kneeling_underhand_grip_lat_pulldown', + '13': 'lat_pulldown', + '14': 'mixed_grip_chin_up', + '15': 'weighted_mixed_grip_chin_up', + '16': 'mixed_grip_pull_up', + '17': 'weighted_mixed_grip_pull_up', + '18': 'reverse_grip_pulldown', + '19': 'standing_cable_pullover', + '20': 'straight_arm_pulldown', + '21': 'swiss_ball_ez_bar_pullover', + '22': 'towel_pull_up', + '23': 'weighted_towel_pull_up', + '24': 'weighted_pull_up', + '25': 'wide_grip_lat_pulldown', + '26': 'wide_grip_pull_up', + '27': 'weighted_wide_grip_pull_up', + '28': 'burpee_pull_up', + '29': 'weighted_burpee_pull_up', + '30': 'jumping_pull_ups', + '31': 'weighted_jumping_pull_ups', + '32': 'kipping_pull_up', + '33': 'weighted_kipping_pull_up', + '34': 'l_pull_up', + '35': 'weighted_l_pull_up', + '36': 'suspended_chin_up', + '37': 'weighted_suspended_chin_up', + '38': 'pull_up', + '39': 'chin_up', + '40': 'neutral_grip_chin_up', + '41': 'weighted_chin_up', + '42': 'band_assisted_pull_up', + '43': 'neutral_grip_pull_up', + '44': 'weighted_neutral_grip_chin_up', + '45': 'weighted_neutral_grip_pull_up', + }, + 'push_up_exercise_name': { + '0': 'chest_press_with_band', + '1': 'alternating_staggered_push_up', + '2': 'weighted_alternating_staggered_push_up', + '3': 'alternating_hands_medicine_ball_push_up', + '4': 'weighted_alternating_hands_medicine_ball_push_up', + '5': 'bosu_ball_push_up', + '6': 'weighted_bosu_ball_push_up', + '7': 'clapping_push_up', + '8': 'weighted_clapping_push_up', + '9': 'close_grip_medicine_ball_push_up', + '10': 'weighted_close_grip_medicine_ball_push_up', + '11': 'close_hands_push_up', + '12': 'weighted_close_hands_push_up', + '13': 'decline_push_up', + '14': 'weighted_decline_push_up', + '15': 'diamond_push_up', + '16': 'weighted_diamond_push_up', + '17': 'explosive_crossover_push_up', + '18': 'weighted_explosive_crossover_push_up', + '19': 'explosive_push_up', + '20': 'weighted_explosive_push_up', + '21': 'feet_elevated_side_to_side_push_up', + '22': 'weighted_feet_elevated_side_to_side_push_up', + '23': 'hand_release_push_up', + '24': 'weighted_hand_release_push_up', + '25': 'handstand_push_up', + '26': 'weighted_handstand_push_up', + '27': 'incline_push_up', + '28': 'weighted_incline_push_up', + '29': 'isometric_explosive_push_up', + '30': 'weighted_isometric_explosive_push_up', + '31': 'judo_push_up', + '32': 'weighted_judo_push_up', + '33': 'kneeling_push_up', + '34': 'weighted_kneeling_push_up', + '35': 'medicine_ball_chest_pass', + '36': 'medicine_ball_push_up', + '37': 'weighted_medicine_ball_push_up', + '38': 'one_arm_push_up', + '39': 'weighted_one_arm_push_up', + '40': 'weighted_push_up', + '41': 'push_up_and_row', + '42': 'weighted_push_up_and_row', + '43': 'push_up_plus', + '44': 'weighted_push_up_plus', + '45': 'push_up_with_feet_on_swiss_ball', + '46': 'weighted_push_up_with_feet_on_swiss_ball', + '47': 'push_up_with_one_hand_on_medicine_ball', + '48': 'weighted_push_up_with_one_hand_on_medicine_ball', + '49': 'shoulder_push_up', + '50': 'weighted_shoulder_push_up', + '51': 'single_arm_medicine_ball_push_up', + '52': 'weighted_single_arm_medicine_ball_push_up', + '53': 'spiderman_push_up', + '54': 'weighted_spiderman_push_up', + '55': 'stacked_feet_push_up', + '56': 'weighted_stacked_feet_push_up', + '57': 'staggered_hands_push_up', + '58': 'weighted_staggered_hands_push_up', + '59': 'suspended_push_up', + '60': 'weighted_suspended_push_up', + '61': 'swiss_ball_push_up', + '62': 'weighted_swiss_ball_push_up', + '63': 'swiss_ball_push_up_plus', + '64': 'weighted_swiss_ball_push_up_plus', + '65': 't_push_up', + '66': 'weighted_t_push_up', + '67': 'triple_stop_push_up', + '68': 'weighted_triple_stop_push_up', + '69': 'wide_hands_push_up', + '70': 'weighted_wide_hands_push_up', + '71': 'parallette_handstand_push_up', + '72': 'weighted_parallette_handstand_push_up', + '73': 'ring_handstand_push_up', + '74': 'weighted_ring_handstand_push_up', + '75': 'ring_push_up', + '76': 'weighted_ring_push_up', + '77': 'push_up', + '78': 'pilates_pushup', + '79': 'dynamic_push_up', + '80': 'kipping_handstand_push_up', + '81': 'shoulder_tapping_push_up', + '82': 'biceps_push_up', + '83': 'hindu_push_up', + '84': 'pike_push_up', + '85': 'wide_grip_push_up', + '86': 'weighted_biceps_push_up', + '87': 'weighted_hindu_push_up', + '88': 'weighted_pike_push_up', + '89': 'kipping_parallette_handstand_push_up', + '90': 'wall_push_up', + }, + 'row_exercise_name': { + '0': 'barbell_straight_leg_deadlift_to_row', + '1': 'cable_row_standing', + '2': 'dumbbell_row', + '3': 'elevated_feet_inverted_row', + '4': 'weighted_elevated_feet_inverted_row', + '5': 'face_pull', + '6': 'face_pull_with_external_rotation', + '7': 'inverted_row_with_feet_on_swiss_ball', + '8': 'weighted_inverted_row_with_feet_on_swiss_ball', + '9': 'kettlebell_row', + '10': 'modified_inverted_row', + '11': 'weighted_modified_inverted_row', + '12': 'neutral_grip_alternating_dumbbell_row', + '13': 'one_arm_bent_over_row', + '14': 'one_legged_dumbbell_row', + '15': 'renegade_row', + '16': 'reverse_grip_barbell_row', + '17': 'rope_handle_cable_row', + '18': 'seated_cable_row', + '19': 'seated_dumbbell_row', + '20': 'single_arm_cable_row', + '21': 'single_arm_cable_row_and_rotation', + '22': 'single_arm_inverted_row', + '23': 'weighted_single_arm_inverted_row', + '24': 'single_arm_neutral_grip_dumbbell_row', + '25': 'single_arm_neutral_grip_dumbbell_row_and_rotation', + '26': 'suspended_inverted_row', + '27': 'weighted_suspended_inverted_row', + '28': 't_bar_row', + '29': 'towel_grip_inverted_row', + '30': 'weighted_towel_grip_inverted_row', + '31': 'underhand_grip_cable_row', + '32': 'v_grip_cable_row', + '33': 'wide_grip_seated_cable_row', + '34': 'alternating_dumbbell_row', + '35': 'inverted_row', + '36': 'row', + '37': 'weighted_row', + '38': 'indoor_row', + '39': 'banded_face_pulls', + '40': 'chest_supported_dumbbell_row', + '41': 'decline_ring_row', + '42': 'elevated_ring_row', + '43': 'rdl_bent_over_row_with_barbell_dumbbell', + '44': 'ring_row', + '45': 'barbell_row', + '46': 'bent_over_row_with_barbell', + '47': 'bent_over_row_with_dumbell', + '48': 'seated_underhand_grip_cable_row', + '49': 'trx_inverted_row', + '50': 'weighted_inverted_row', + '51': 'weighted_trx_inverted_row', + '52': 'dumbbell_row_wheelchair', + }, + 'shoulder_press_exercise_name': { + '0': 'alternating_dumbbell_shoulder_press', + '1': 'arnold_press', + '2': 'barbell_front_squat_to_push_press', + '3': 'barbell_push_press', + '4': 'barbell_shoulder_press', + '5': 'dead_curl_press', + '6': 'dumbbell_alternating_shoulder_press_and_twist', + '7': 'dumbbell_hammer_curl_to_lunge_to_press', + '8': 'dumbbell_push_press', + '9': 'floor_inverted_shoulder_press', + '10': 'weighted_floor_inverted_shoulder_press', + '11': 'inverted_shoulder_press', + '12': 'weighted_inverted_shoulder_press', + '13': 'one_arm_push_press', + '14': 'overhead_barbell_press', + '15': 'overhead_dumbbell_press', + '16': 'seated_barbell_shoulder_press', + '17': 'seated_dumbbell_shoulder_press', + '18': 'single_arm_dumbbell_shoulder_press', + '19': 'single_arm_step_up_and_press', + '20': 'smith_machine_overhead_press', + '21': 'split_stance_hammer_curl_to_press', + '22': 'swiss_ball_dumbbell_shoulder_press', + '23': 'weight_plate_front_raise', + '24': 'dumbbell_shoulder_press', + '25': 'military_press', + '27': 'strict_press', + '28': 'dumbbell_front_raise', + '29': 'dumbbell_curl_to_overhead_press_wheelchair', + '30': 'arnold_press_wheelchair', + '31': 'overhead_dumbbell_press_wheelchair', + }, + 'shoulder_stability_exercise_name': { + '0': '90_degree_cable_external_rotation', + '1': 'band_external_rotation', + '2': 'band_internal_rotation', + '3': 'bent_arm_lateral_raise_and_external_rotation', + '4': 'cable_external_rotation', + '5': 'dumbbell_face_pull_with_external_rotation', + '6': 'floor_i_raise', + '7': 'weighted_floor_i_raise', + '8': 'floor_t_raise', + '9': 'weighted_floor_t_raise', + '10': 'floor_y_raise', + '11': 'weighted_floor_y_raise', + '12': 'incline_i_raise', + '13': 'weighted_incline_i_raise', + '14': 'incline_l_raise', + '15': 'weighted_incline_l_raise', + '16': 'incline_t_raise', + '17': 'weighted_incline_t_raise', + '18': 'incline_w_raise', + '19': 'weighted_incline_w_raise', + '20': 'incline_y_raise', + '21': 'weighted_incline_y_raise', + '22': 'lying_external_rotation', + '23': 'seated_dumbbell_external_rotation', + '24': 'standing_l_raise', + '25': 'swiss_ball_i_raise', + '26': 'weighted_swiss_ball_i_raise', + '27': 'swiss_ball_t_raise', + '28': 'weighted_swiss_ball_t_raise', + '29': 'swiss_ball_w_raise', + '30': 'weighted_swiss_ball_w_raise', + '31': 'swiss_ball_y_raise', + '32': 'weighted_swiss_ball_y_raise', + '33': 'cable_internal_rotation', + '34': 'lying_internal_rotation', + '35': 'seated_dumbbell_internal_rotation', + }, + 'shrug_exercise_name': { + '0': 'barbell_jump_shrug', + '1': 'barbell_shrug', + '2': 'barbell_upright_row', + '3': 'behind_the_back_smith_machine_shrug', + '4': 'dumbbell_jump_shrug', + '5': 'dumbbell_shrug', + '6': 'dumbbell_upright_row', + '7': 'incline_dumbbell_shrug', + '8': 'overhead_barbell_shrug', + '9': 'overhead_dumbbell_shrug', + '10': 'scaption_and_shrug', + '11': 'scapular_retraction', + '12': 'serratus_chair_shrug', + '13': 'weighted_serratus_chair_shrug', + '14': 'serratus_shrug', + '15': 'weighted_serratus_shrug', + '16': 'wide_grip_jump_shrug', + '17': 'wide_grip_barbell_shrug', + '18': 'behind_the_back_shrug', + '19': 'dumbbell_shrug_wheelchair', + '20': 'shrug_wheelchair', + '21': 'shrug_arm_down_wheelchair', + '22': 'shrug_arm_mid_wheelchair', + '23': 'shrug_arm_up_wheelchair', + '24': 'upright_row', + }, + 'sit_up_exercise_name': { + '0': 'alternating_sit_up', + '1': 'weighted_alternating_sit_up', + '2': 'bent_knee_v_up', + '3': 'weighted_bent_knee_v_up', + '4': 'butterfly_sit_up', + '5': 'weighted_butterfly_situp', + '6': 'cross_punch_roll_up', + '7': 'weighted_cross_punch_roll_up', + '8': 'crossed_arms_sit_up', + '9': 'weighted_crossed_arms_sit_up', + '10': 'get_up_sit_up', + '11': 'weighted_get_up_sit_up', + '12': 'hovering_sit_up', + '13': 'weighted_hovering_sit_up', + '14': 'kettlebell_sit_up', + '15': 'medicine_ball_alternating_v_up', + '16': 'medicine_ball_sit_up', + '17': 'medicine_ball_v_up', + '18': 'modified_sit_up', + '19': 'negative_sit_up', + '20': 'one_arm_full_sit_up', + '21': 'reclining_circle', + '22': 'weighted_reclining_circle', + '23': 'reverse_curl_up', + '24': 'weighted_reverse_curl_up', + '25': 'single_leg_swiss_ball_jackknife', + '26': 'weighted_single_leg_swiss_ball_jackknife', + '27': 'the_teaser', + '28': 'the_teaser_weighted', + '29': 'three_part_roll_down', + '30': 'weighted_three_part_roll_down', + '31': 'v_up', + '32': 'weighted_v_up', + '33': 'weighted_russian_twist_on_swiss_ball', + '34': 'weighted_sit_up', + '35': 'x_abs', + '36': 'weighted_x_abs', + '37': 'sit_up', + '38': 'ghd_sit_ups', + '39': 'sit_up_turkish_get_up', + '40': 'russian_twist_on_swiss_ball', + }, + 'squat_exercise_name': { + '0': 'leg_press', + '1': 'back_squat_with_body_bar', + '2': 'back_squats', + '3': 'weighted_back_squats', + '4': 'balancing_squat', + '5': 'weighted_balancing_squat', + '6': 'barbell_back_squat', + '7': 'barbell_box_squat', + '8': 'barbell_front_squat', + '9': 'barbell_hack_squat', + '10': 'barbell_hang_squat_snatch', + '11': 'barbell_lateral_step_up', + '12': 'barbell_quarter_squat', + '13': 'barbell_siff_squat', + '14': 'barbell_squat_snatch', + '15': 'barbell_squat_with_heels_raised', + '16': 'barbell_stepover', + '17': 'barbell_step_up', + '18': 'bench_squat_with_rotational_chop', + '19': 'weighted_bench_squat_with_rotational_chop', + '20': 'body_weight_wall_squat', + '21': 'weighted_wall_squat', + '22': 'box_step_squat', + '23': 'weighted_box_step_squat', + '24': 'braced_squat', + '25': 'crossed_arm_barbell_front_squat', + '26': 'crossover_dumbbell_step_up', + '27': 'dumbbell_front_squat', + '28': 'dumbbell_split_squat', + '29': 'dumbbell_squat', + '30': 'dumbbell_squat_clean', + '31': 'dumbbell_stepover', + '32': 'dumbbell_step_up', + '33': 'elevated_single_leg_squat', + '34': 'weighted_elevated_single_leg_squat', + '35': 'figure_four_squats', + '36': 'weighted_figure_four_squats', + '37': 'goblet_squat', + '38': 'kettlebell_squat', + '39': 'kettlebell_swing_overhead', + '40': 'kettlebell_swing_with_flip_to_squat', + '41': 'lateral_dumbbell_step_up', + '42': 'one_legged_squat', + '43': 'overhead_dumbbell_squat', + '44': 'overhead_squat', + '45': 'partial_single_leg_squat', + '46': 'weighted_partial_single_leg_squat', + '47': 'pistol_squat', + '48': 'weighted_pistol_squat', + '49': 'plie_slides', + '50': 'weighted_plie_slides', + '51': 'plie_squat', + '52': 'weighted_plie_squat', + '53': 'prisoner_squat', + '54': 'weighted_prisoner_squat', + '55': 'single_leg_bench_get_up', + '56': 'weighted_single_leg_bench_get_up', + '57': 'single_leg_bench_squat', + '58': 'weighted_single_leg_bench_squat', + '59': 'single_leg_squat_on_swiss_ball', + '60': 'weighted_single_leg_squat_on_swiss_ball', + '61': 'squat', + '62': 'weighted_squat', + '63': 'squats_with_band', + '64': 'staggered_squat', + '65': 'weighted_staggered_squat', + '66': 'step_up', + '67': 'weighted_step_up', + '68': 'suitcase_squats', + '69': 'sumo_squat', + '70': 'sumo_squat_slide_in', + '71': 'weighted_sumo_squat_slide_in', + '72': 'sumo_squat_to_high_pull', + '73': 'sumo_squat_to_stand', + '74': 'weighted_sumo_squat_to_stand', + '75': 'sumo_squat_with_rotation', + '76': 'weighted_sumo_squat_with_rotation', + '77': 'swiss_ball_body_weight_wall_squat', + '78': 'weighted_swiss_ball_wall_squat', + '79': 'thrusters', + '80': 'uneven_squat', + '81': 'weighted_uneven_squat', + '82': 'waist_slimming_squat', + '83': 'wall_ball', + '84': 'wide_stance_barbell_squat', + '85': 'wide_stance_goblet_squat', + '86': 'zercher_squat', + '87': 'kbs_overhead', # Deprecated do not use + '88': 'squat_and_side_kick', + '89': 'squat_jumps_in_n_out', + '90': 'pilates_plie_squats_parallel_turned_out_flat_and_heels', + '91': 'releve_straight_leg_and_knee_bent_with_one_leg_variation', + '92': 'alternating_box_dumbbell_step_ups', + '93': 'dumbbell_overhead_squat_single_arm', + '94': 'dumbbell_squat_snatch', + '95': 'medicine_ball_squat', + '97': 'wall_ball_squat_and_press', + '98': 'squat_american_swing', + '100': 'air_squat', + '101': 'dumbbell_thrusters', + '102': 'overhead_barbell_squat', + }, + 'total_body_exercise_name': { + '0': 'burpee', + '1': 'weighted_burpee', + '2': 'burpee_box_jump', + '3': 'weighted_burpee_box_jump', + '4': 'high_pull_burpee', + '5': 'man_makers', + '6': 'one_arm_burpee', + '7': 'squat_thrusts', + '8': 'weighted_squat_thrusts', + '9': 'squat_plank_push_up', + '10': 'weighted_squat_plank_push_up', + '11': 'standing_t_rotation_balance', + '12': 'weighted_standing_t_rotation_balance', + '13': 'barbell_burpee', + '15': 'burpee_box_jump_over_yes_literally_jumping_over_the_box', + '16': 'burpee_box_jump_step_up_over', + '17': 'lateral_barbell_burpee', + '18': 'total_body_burpee_over_bar', + '19': 'burpee_box_jump_over', + '20': 'burpee_wheelchair', + }, + 'move_exercise_name': { + '0': 'arch_and_curl', + '1': 'arm_circles_with_ball_band_and_weight', + '2': 'arm_stretch', + '3': 'back_massage', + '4': 'belly_breathing', + '5': 'bridge_with_ball', + '6': 'diamond_leg_crunch', + '7': 'diamond_leg_lift', + '8': 'eight_point_shoulder_opener', + '9': 'foot_rolling', + '10': 'footwork', + '11': 'footwork_on_disc', + '12': 'forward_fold', + '13': 'frog_with_band', + '14': 'half_roll_up', + '15': 'hamstring_curl', + '16': 'hamstring_stretch', + '17': 'hip_stretch', + '18': 'hug_a_tree_with_ball_band_and_weight', + '19': 'knee_circles', + '20': 'knee_folds_on_disc', + '21': 'lateral_flexion', + '22': 'leg_stretch_with_band', + '23': 'leg_stretch_with_leg_circles', + '24': 'lower_lift_on_disc', + '25': 'lunge_squat', + '26': 'lunges_with_knee_lift', + '27': 'mermaid_stretch', + '28': 'neutral_pelvic_position', + '29': 'pelvic_clocks_on_disc', + '30': 'pilates_plie_squats_parallel_turned_out_flat_and_heels_with_chair', + '31': 'piriformis_stretch', + '32': 'plank_knee_crosses', + '33': 'plank_knee_pulls', + '34': 'plank_up_downs', + '35': 'prayer_mudra', + '36': 'psoas_lunge_stretch', + '37': 'ribcage_breathing', + '38': 'roll_down', + '39': 'roll_up_with_weight_and_band', + '40': 'saw', + '41': 'scapular_stabilization', + '42': 'scissors_on_disc', + '43': 'seated_hip_stretchup', + '44': 'seated_twist', + '45': 'shaving_the_head_with_ball_band_and_weight', + '46': 'spinal_twist', + '47': 'spinal_twist_stretch', + '48': 'spine_stretch_forward', + '49': 'squat_open_arm_twist_pose', + '50': 'squats_with_ball', + '51': 'stand_and_hang', + '52': 'standing_side_stretch', + '53': 'standing_single_leg_forward_bend_with_it_band_opener', + '54': 'straight_leg_crunch_with_leg_lift', + '55': 'straight_leg_crunch_with_leg_lift_with_ball', + '56': 'straight_leg_crunch_with_legs_crossed', + '57': 'straight_leg_crunch_with_legs_crossed_with_ball', + '58': 'straight_leg_diagonal_crunch', + '59': 'straight_leg_diagonal_crunch_with_ball', + '60': 'tailbone_curl', + '61': 'throat_lock', + '62': 'tick_tock_side_roll', + '63': 'twist', + '64': 'v_leg_crunches', + '65': 'v_sit', + '66': 'forward_fold_wheelchair', + '67': 'forward_fold_plus_wheelchair', + '68': 'arm_circles_low_forward_wheelchair', + '69': 'arm_circles_mid_forward_wheelchair', + '70': 'arm_circles_high_forward_wheelchair', + '71': 'arm_circles_low_backward_wheelchair', + '72': 'arm_circles_mid_backward_wheelchair', + '73': 'arm_circles_high_backward_wheelchair', + '74': 'core_twists_wheelchair', + '75': 'arm_raise_wheelchair', + '76': 'chest_expand_wheelchair', + '77': 'arm_extend_wheelchair', + '78': 'forward_bend_wheelchair', + '79': 'toe_touch_wheelchair', + '80': 'extended_toe_touch_wheelchair', + '81': 'seated_arm_circles', + '82': 'trunk_rotations', + '83': 'seated_trunk_rotations', + '84': 'toe_touch', + }, + 'pose_exercise_name': { + '0': 'all_fours', + '1': 'ankle_to_knee', + '2': 'baby_cobra', + '3': 'boat', + '4': 'bound_angle', + '5': 'bound_seated_single_leg_forward_bend', + '6': 'bow', + '7': 'bowed_half_moon', + '8': 'bridge', + '9': 'cat', + '10': 'chair', + '11': 'childs', + '12': 'corpse', + '13': 'cow_face', + '14': 'cow', + '15': 'devotional_warrior', + '16': 'dolphin_plank', + '17': 'dolphin', + '18': 'down_dog_knee_to_nose', + '19': 'down_dog_split', + '20': 'down_dog_split_open_hip_bent_knee', + '21': 'downward_facing_dog', + '22': 'eagle', + '23': 'easy_seated', + '24': 'extended_puppy', + '25': 'extended_side_angle', + '26': 'fish', + '27': 'four_limbed_staff', + '28': 'full_split', + '29': 'gate', + '30': 'half_chair_half_ankle_to_knee', + '31': 'half_moon', + '32': 'head_to_knee', + '33': 'heron', + '34': 'heros', + '35': 'high_lunge', + '36': 'knees_chest_chin', + '37': 'lizard', + '38': 'locust', + '39': 'low_lunge', + '40': 'low_lunge_twist', + '41': 'low_lunge_with_knee_down', + '42': 'mermaid', + '43': 'mountain', + '44': 'one_legged_downward_facing_pose_open_hip_bent_knee', + '45': 'one_legged_pigeon', + '46': 'peaceful_warrior', + '47': 'plank', + '48': 'plow', + '49': 'reclined_hand_to_foot', + '50': 'revolved_half_moon', + '51': 'revolved_head_to_knee', + '52': 'revolved_triangle', + '53': 'runners_lunge', + '54': 'seated_easy_side_bend', + '55': 'seated_easy_twist', + '56': 'seated_long_leg_forward_bend', + '57': 'seated_wide_leg_forward_bend', + '58': 'shoulder_stand', + '59': 'side_boat', + '60': 'side_plank', + '61': 'sphinx', + '62': 'squat_open_arm_twist', + '63': 'squat_palm_press', + '64': 'staff', + '65': 'standing_arms_up', + '66': 'standing_forward_bend_halfway_up', + '67': 'standing_forward_bend', + '68': 'standing_side_opener', + '69': 'standing_single_leg_forward_bend', + '70': 'standing_split', + '71': 'standing_wide_leg_forward_bend', + '72': 'standing_wide_leg_forward_bend_with_twist', + '73': 'supine_spinal_twist', + '74': 'table_top', + '75': 'thread_the_needle', + '76': 'thunderbolt', + '77': 'thunderbolt_pose_both_sides_arm_stretch', + '78': 'tree', + '79': 'triangle', + '80': 'up_dog', + '81': 'upward_facing_plank', + '82': 'warrior_one', + '83': 'warrior_three', + '84': 'warrior_two', + '85': 'wheel', + '86': 'wide_side_lunge', + '87': 'deep_breathing_wheelchair', + '88': 'deep_breathing_low_wheelchair', + '89': 'deep_breathing_mid_wheelchair', + '90': 'deep_breathing_high_wheelchair', + '91': 'prayer_wheelchair', + '92': 'overhead_prayer_wheelchair', + '93': 'cactus_wheelchair', + '94': 'breathing_punches_wheelchair', + '95': 'breathing_punches_extended_wheelchair', + '96': 'breathing_punches_overhead_wheelchair', + '97': 'breathing_punches_overhead_and_down_wheelchair', + '98': 'breathing_punches_side_wheelchair', + '99': 'breathing_punches_extended_side_wheelchair', + '100': 'breathing_punches_overhead_side_wheelchair', + '101': 'breathing_punches_overhead_and_down_side_wheelchair', + '102': 'left_hand_back_wheelchair', + '103': 'triangle_wheelchair', + '104': 'thread_the_needle_wheelchair', + '105': 'neck_flexion_and_extension_wheelchair', + '106': 'neck_lateral_flexion_wheelchair', + '107': 'spine_flexion_and_extension_wheelchair', + '108': 'spine_rotation_wheelchair', + '109': 'spine_lateral_flexion_wheelchair', + '110': 'alternative_skiing_wheelchair', + '111': 'reach_forward_wheelchair', + '112': 'warrior_wheelchair', + '113': 'reverse_warrior_wheelchair', + '114': 'downward_facing_dog_to_cobra', + '115': 'seated_cat_cow', + }, + 'triceps_extension_exercise_name': { + '0': 'bench_dip', + '1': 'weighted_bench_dip', + '2': 'body_weight_dip', + '3': 'cable_kickback', + '4': 'cable_lying_triceps_extension', + '5': 'cable_overhead_triceps_extension', + '6': 'dumbbell_kickback', + '7': 'dumbbell_lying_triceps_extension', + '8': 'ez_bar_overhead_triceps_extension', + '9': 'incline_dip', + '10': 'weighted_incline_dip', + '11': 'incline_ez_bar_lying_triceps_extension', + '12': 'lying_dumbbell_pullover_to_extension', + '13': 'lying_ez_bar_triceps_extension', + '14': 'lying_triceps_extension_to_close_grip_bench_press', + '15': 'overhead_dumbbell_triceps_extension', + '16': 'reclining_triceps_press', + '17': 'reverse_grip_pressdown', + '18': 'reverse_grip_triceps_pressdown', + '19': 'rope_pressdown', + '20': 'seated_barbell_overhead_triceps_extension', + '21': 'seated_dumbbell_overhead_triceps_extension', + '22': 'seated_ez_bar_overhead_triceps_extension', + '23': 'seated_single_arm_overhead_dumbbell_extension', + '24': 'single_arm_dumbbell_overhead_triceps_extension', + '25': 'single_dumbbell_seated_overhead_triceps_extension', + '26': 'single_leg_bench_dip_and_kick', + '27': 'weighted_single_leg_bench_dip_and_kick', + '28': 'single_leg_dip', + '29': 'weighted_single_leg_dip', + '30': 'static_lying_triceps_extension', + '31': 'suspended_dip', + '32': 'weighted_suspended_dip', + '33': 'swiss_ball_dumbbell_lying_triceps_extension', + '34': 'swiss_ball_ez_bar_lying_triceps_extension', + '35': 'swiss_ball_ez_bar_overhead_triceps_extension', + '36': 'tabletop_dip', + '37': 'weighted_tabletop_dip', + '38': 'triceps_extension_on_floor', + '39': 'triceps_pressdown', + '40': 'weighted_dip', + '41': 'alternating_dumbbell_lying_triceps_extension', + '42': 'triceps_press', + '43': 'dumbbell_kickback_wheelchair', + '44': 'overhead_dumbbell_triceps_extension_wheelchair', + }, + 'warm_up_exercise_name': { + '0': 'quadruped_rocking', + '1': 'neck_tilts', + '2': 'ankle_circles', + '3': 'ankle_dorsiflexion_with_band', + '4': 'ankle_internal_rotation', + '5': 'arm_circles', + '6': 'bent_over_reach_to_sky', + '7': 'cat_camel', + '8': 'elbow_to_foot_lunge', + '9': 'forward_and_backward_leg_swings', + '10': 'groiners', + '11': 'inverted_hamstring_stretch', + '12': 'lateral_duck_under', + '13': 'neck_rotations', + '14': 'opposite_arm_and_leg_balance', + '15': 'reach_roll_and_lift', + '16': 'scorpion', # Deprecated do not use + '17': 'shoulder_circles', + '18': 'side_to_side_leg_swings', + '19': 'sleeper_stretch', + '20': 'slide_out', + '21': 'swiss_ball_hip_crossover', + '22': 'swiss_ball_reach_roll_and_lift', + '23': 'swiss_ball_windshield_wipers', + '24': 'thoracic_rotation', + '25': 'walking_high_kicks', + '26': 'walking_high_knees', + '27': 'walking_knee_hugs', + '28': 'walking_leg_cradles', + '29': 'walkout', + '30': 'walkout_from_push_up_position', + '31': 'biceps_stretch', + '32': 'glutes_stretch', + '33': 'standing_hamstring_stretch', + '34': 'stretch_90_90', + '35': 'stretch_abs', + '36': 'stretch_butterfly', + '37': 'stretch_calf', + '38': 'stretch_cat_cow', + '39': 'stretch_childs_pose', + '40': 'stretch_cobra', + '41': 'stretch_forearms', + '42': 'stretch_forward_glutes', + '43': 'stretch_front_split', + '44': 'stretch_hamstring', + '45': 'stretch_hip_flexor_and_quad', + '46': 'stretch_lat', + '47': 'stretch_levator_scapulae', + '48': 'stretch_lunge_with_spinal_twist', + '49': 'stretch_lunging_hip_flexor', + '50': 'stretch_lying_abduction', + '51': 'stretch_lying_it_band', + '52': 'stretch_lying_knee_to_chest', + '53': 'stretch_lying_piriformis', + '54': 'stretch_lying_spinal_twist', + '55': 'stretch_neck', + '56': 'stretch_obliques', + '57': 'stretch_over_under_shoulder', + '58': 'stretch_pectoral', + '59': 'stretch_pigeon_pose', + '60': 'stretch_piriformis', + '61': 'stretch_quad', + '62': 'stretch_scorpion', + '63': 'stretch_shoulder', + '64': 'stretch_side', + '65': 'stretch_side_lunge', + '66': 'stretch_side_split', + '67': 'stretch_standing_it_band', + '68': 'stretch_straddle', + '69': 'stretch_triceps', + '70': 'stretch_wall_chest_and_shoulder', + '71': 'neck_rotations_wheelchair', + '72': 'half_kneeling_arm_rotation', + '73': 'three_way_ankle_mobilization', + '74': 'ninety_ninety_hip_switch', # 90_90_hip_switch + '75': 'active_frog', + '76': 'shoulder_sweeps', + '77': 'ankle_lunges', + '78': 'back_roll_foam_roller', + '79': 'bear_crawl', + '80': 'latissimus_dorsi_foam_roll', + '81': 'reverse_t_hip_opener', + '82': 'shoulder_rolls', + '83': 'chest_openers', + '84': 'triceps_stretch', + '85': 'upper_back_stretch', + '86': 'hip_circles', + '87': 'ankle_stretch', + '88': 'marching_in_place', + '89': 'triceps_stretch_wheelchair', + '90': 'upper_back_stretch_wheelchair', + }, + 'run_exercise_name': { + '0': 'run', + '1': 'walk', + '2': 'jog', + '3': 'sprint', + '4': 'run_or_walk', + '5': 'speed_walk', + '6': 'warm_up', + }, + 'bike_exercise_name': { + '0': 'bike', + '1': 'ride', + '2': 'sprint', + }, + 'banded_exercises_exercise_name': { + '1': 'ab_twist', + '2': 'back_extension', + '3': 'bicycle_crunch', + '4': 'calf_raises', + '5': 'chest_press', + '6': 'clam_shells', + '7': 'curl', + '8': 'deadbug', + '9': 'deadlift', + '10': 'donkey_kick', + '11': 'external_rotation', + '12': 'external_rotation_at_90_degree_abduction', + '13': 'face_pull', + '14': 'fire_hydrant', + '15': 'fly', + '16': 'front_raise', + '17': 'glute_bridge', + '18': 'hamstring_curls', + '19': 'high_plank_leg_lifts', + '20': 'hip_extension', + '21': 'internal_rotation', + '22': 'jumping_jack', + '23': 'kneeling_crunch', + '24': 'lateral_band_walks', + '25': 'lateral_raise', + '26': 'latpull', + '27': 'leg_abduction', + '28': 'leg_adduction', + '29': 'leg_extension', + '30': 'lunge', + '31': 'plank', + '32': 'pull_apart', + '33': 'push_ups', + '34': 'reverse_crunch', + '35': 'row', + '36': 'shoulder_abduction', + '37': 'shoulder_extension', + '38': 'shoulder_external_rotation', + '39': 'shoulder_flexion_to_90_degrees', + '40': 'side_plank_leg_lifts', + '41': 'side_raise', + '42': 'squat', + '43': 'squat_to_press', + '44': 'tricep_extension', + '45': 'tricep_kickback', + '46': 'upright_row', + '47': 'wall_crawl_with_external_rotation', + '49': 'lateral_raise_wheelchair', + '50': 'triceps_extension_wheelchair', + '51': 'chest_fly_incline_wheelchair', + '52': 'chest_fly_decline_wheelchair', + '53': 'pull_down_wheelchair', + '54': 'straight_arm_pull_down_wheelchair', + '55': 'curl_wheelchair', + '56': 'overhead_curl_wheelchair', + '57': 'face_pull_wheelchair', + '58': 'around_the_world_wheelchair', + '59': 'pull_apart_wheelchair', + '60': 'side_curl_wheelchair', + '61': 'overhead_press_wheelchair', + }, + 'battle_rope_exercise_name': { + '0': 'alternating_figure_eight', + '1': 'alternating_jump_wave', + '2': 'alternating_kneeling_to_standing_wave', + '3': 'alternating_lunge_wave', + '4': 'alternating_squat_wave', + '5': 'alternating_wave', + '6': 'alternating_wave_with_lateral_shuffle', + '7': 'clap_wave', + '8': 'double_arm_figure_eight', + '9': 'double_arm_side_to_side_snake', + '10': 'double_arm_side_wave', + '11': 'double_arm_slam', + '12': 'double_arm_wave', + '13': 'grappler_toss', + '14': 'hip_toss', + '15': 'in_and_out_wave', + '16': 'inside_circle', + '17': 'jumping_jacks', + '18': 'outside_circle', + '19': 'rainbow', + '20': 'side_plank_wave', + '21': 'sidewinder', + '22': 'sitting_russian_twist', + '23': 'snake_wave', + '24': 'split_jack', + '25': 'stage_coach', + '26': 'ultimate_warrior', + '27': 'upper_cuts', + }, + 'elliptical_exercise_name': { + '0': 'elliptical', + }, + 'floor_climb_exercise_name': { + '0': 'floor_climb', + }, + 'indoor_bike_exercise_name': { + '0': 'air_bike', + '1': 'assault_bike', + '3': 'stationary_bike', + }, + 'indoor_row_exercise_name': { + '0': 'rowing_machine', + }, + 'ladder_exercise_name': { + '0': 'agility', + '1': 'speed', + }, + 'sandbag_exercise_name': { + '0': 'around_the_world', + '1': 'back_squat', + '2': 'bear_crawl_pull_through', + '3': 'bear_hug_squat', + '4': 'clean', + '5': 'clean_and_press', + '6': 'curl', + '7': 'front_carry', + '8': 'front_squat', + '9': 'lunge', + '10': 'overhead_press', + '11': 'plank_pull_through', + '12': 'rotational_lunge', + '13': 'row', + '14': 'russian_twist', + '15': 'shouldering', + '16': 'shoveling', + '17': 'side_lunge', + '18': 'sprint', + '19': 'zercher_squat', + }, + 'sled_exercise_name': { + '0': 'backward_drag', + '1': 'chest_press', + '2': 'forward_drag', + '3': 'low_push', + '4': 'push', + '5': 'row', + }, + 'sledge_hammer_exercise_name': { + '0': 'lateral_swing', + '1': 'hammer_slam', + }, + 'stair_stepper_exercise_name': { + '0': 'stair_stepper', + }, + 'suspension_exercise_name': { + '0': 'chest_fly', + '1': 'chest_press', + '2': 'crunch', + '3': 'curl', + '4': 'dip', + '5': 'face_pull', + '6': 'glute_bridge', + '7': 'hamstring_curl', + '8': 'hip_drop', + '9': 'inverted_row', + '10': 'knee_drive_jump', + '11': 'knee_to_chest', + '12': 'lat_pullover', + '13': 'lunge', + '14': 'mountain_climber', + '15': 'pendulum', + '16': 'pike', + '17': 'plank', + '18': 'power_pull', + '19': 'pull_up', + '20': 'push_up', + '21': 'reverse_mountain_climber', + '22': 'reverse_plank', + '23': 'rollout', + '24': 'row', + '25': 'side_lunge', + '26': 'side_plank', + '27': 'single_leg_deadlift', + '28': 'single_leg_squat', + '29': 'sit_up', + '30': 'split', + '31': 'squat', + '32': 'squat_jump', + '33': 'tricep_press', + '34': 'y_fly', + }, + 'tire_exercise_name': { + '0': 'flip', + }, + 'bike_outdoor_exercise_name': { + '0': 'bike', + }, + 'run_indoor_exercise_name': { + '0': 'indoor_track_run', + '1': 'treadmill', + }, + 'water_type': { + '0': 'fresh', + '1': 'salt', + '2': 'en13319', + '3': 'custom', + }, + 'tissue_model_type': { + '0': 'zhl_16c', # Buhlmann's decompression algorithm, version C + }, + 'dive_gas_status': { + '0': 'disabled', + '1': 'enabled', + '2': 'backup_only', + }, + 'dive_alert': { + '0': 'ndl_reached', + '1': 'gas_switch_prompted', + '2': 'near_surface', + '3': 'approaching_ndl', + '4': 'po2_warn', + '5': 'po2_crit_high', + '6': 'po2_crit_low', + '7': 'time_alert', + '8': 'depth_alert', + '9': 'deco_ceiling_broken', + '10': 'deco_complete', + '11': 'safety_stop_broken', + '12': 'safety_stop_complete', + '13': 'cns_warning', + '14': 'cns_critical', + '15': 'otu_warning', + '16': 'otu_critical', + '17': 'ascent_critical', + '18': 'alert_dismissed_by_key', + '19': 'alert_dismissed_by_timeout', + '20': 'battery_low', + '21': 'battery_critical', + '22': 'safety_stop_started', + '23': 'approaching_first_deco_stop', + '24': 'setpoint_switch_auto_low', + '25': 'setpoint_switch_auto_high', + '26': 'setpoint_switch_manual_low', + '27': 'setpoint_switch_manual_high', + '28': 'auto_setpoint_switch_ignored', + '29': 'switched_to_open_circuit', + '30': 'switched_to_closed_circuit', + '32': 'tank_battery_low', + '33': 'po2_ccr_dil_low', # ccr diluent has low po2 + '34': 'deco_stop_cleared', # a deco stop has been cleared + '35': 'apnea_neutral_buoyancy', # Target Depth Apnea Alarm triggered + '36': 'apnea_target_depth', # Neutral Buoyance Apnea Alarm triggered + '37': 'apnea_surface', # Surface Apnea Alarm triggered + '38': 'apnea_high_speed', # High Speed Apnea Alarm triggered + '39': 'apnea_low_speed', # Low Speed Apnea Alarm triggered + }, + 'dive_alarm_type': { + '0': 'depth', # Alarm when a certain depth is crossed + '1': 'time', # Alarm when a certain time has transpired + '2': 'speed', # Alarm when a certain ascent or descent rate is exceeded + }, + 'dive_backlight_mode': { + '0': 'at_depth', + '1': 'always_on', + }, + 'sleep_level': { + '0': 'unmeasurable', + '1': 'awake', + '2': 'light', + '3': 'deep', + '4': 'rem', + }, + 'spo2_measurement_type': { + '0': 'off_wrist', + '1': 'spot_check', + '2': 'continuous_check', + '3': 'periodic', + }, + 'ccr_setpoint_switch_mode': { + '0': 'manual', # User switches setpoints manually + '1': 'automatic', # Switch automatically based on depth + }, + 'dive_gas_mode': { + '0': 'open_circuit', + '1': 'closed_circuit_diluent', + }, + 'projectile_type': { + '0': 'arrow', # Arrow projectile type + '1': 'rifle_cartridge', # Rifle cartridge projectile type + '2': 'pistol_cartridge', # Pistol cartridge projectile type + '3': 'shotshell', # Shotshell projectile type + '4': 'air_rifle_pellet', # Air rifle pellet projectile type + '5': 'other', # Other projectile type + }, + 'favero_product': { + '10': 'assioma_uno', + '12': 'assioma_duo', + }, + 'split_type': { + '1': 'ascent_split', + '2': 'descent_split', + '3': 'interval_active', + '4': 'interval_rest', + '5': 'interval_warmup', + '6': 'interval_cooldown', + '7': 'interval_recovery', + '8': 'interval_other', + '9': 'climb_active', + '10': 'climb_rest', + '11': 'surf_active', + '12': 'run_active', + '13': 'run_rest', + '14': 'workout_round', + '17': 'rwd_run', # run/walk detection running + '18': 'rwd_walk', # run/walk detection walking + '21': 'windsurf_active', + '22': 'rwd_stand', # run/walk detection standing + '23': 'transition', # Marks the time going from ascent_split to descent_split/used in backcountry ski + '28': 'ski_lift_split', + '29': 'ski_run_split', + }, + 'climb_pro_event': { + '0': 'approach', + '1': 'start', + '2': 'complete', + }, + 'gas_consumption_rate_type': { + '0': 'pressure_sac', # Pressure-based Surface Air Consumption + '1': 'volume_sac', # Volumetric Surface Air Consumption + '2': 'rmv', # Respiratory Minute Volume + }, + 'tap_sensitivity': { + '0': 'high', + '1': 'medium', + '2': 'low', + }, + 'radar_threat_level_type': { + '0': 'threat_unknown', + '1': 'threat_none', + '2': 'threat_approaching', + '3': 'threat_approaching_fast', + }, + 'sleep_disruption_severity': { + '0': 'none', + '1': 'low', + '2': 'medium', + '3': 'high', + }, + 'max_met_speed_source': { + '0': 'onboard_gps', + '1': 'connected_gps', + '2': 'cadence', + }, + 'max_met_heart_rate_source': { + '0': 'whr', # Wrist Heart Rate Monitor + '1': 'hrm', # Chest Strap Heart Rate Monitor + }, + 'hrv_status': { + '0': 'none', + '1': 'poor', + '2': 'low', + '3': 'unbalanced', + '4': 'balanced', + }, + 'no_fly_time_mode': { + '0': 'standard', # Standard Diver Alert Network no-fly guidance + '1': 'flat_24_hours', # Flat 24 hour no-fly guidance + }, + }, + 'mesg_num' : { + 'FILE_ID': 0, + 'FILE_CREATOR': 49, + 'TIMESTAMP_CORRELATION': 162, + 'SOFTWARE': 35, + 'SLAVE_DEVICE': 106, + 'CAPABILITIES': 1, + 'FILE_CAPABILITIES': 37, + 'MESG_CAPABILITIES': 38, + 'FIELD_CAPABILITIES': 39, + 'DEVICE_SETTINGS': 2, + 'USER_PROFILE': 3, + 'HRM_PROFILE': 4, + 'SDM_PROFILE': 5, + 'BIKE_PROFILE': 6, + 'CONNECTIVITY': 127, + 'WATCHFACE_SETTINGS': 159, + 'OHR_SETTINGS': 188, + 'TIME_IN_ZONE': 216, + 'ZONES_TARGET': 7, + 'SPORT': 12, + 'HR_ZONE': 8, + 'SPEED_ZONE': 53, + 'CADENCE_ZONE': 131, + 'POWER_ZONE': 9, + 'MET_ZONE': 10, + 'TRAINING_SETTINGS': 13, + 'DIVE_SETTINGS': 258, + 'DIVE_ALARM': 262, + 'DIVE_APNEA_ALARM': 393, + 'DIVE_GAS': 259, + 'GOAL': 15, + 'ACTIVITY': 34, + 'SESSION': 18, + 'LAP': 19, + 'LENGTH': 101, + 'RECORD': 20, + 'EVENT': 21, + 'DEVICE_INFO': 23, + 'DEVICE_AUX_BATTERY_INFO': 375, + 'TRAINING_FILE': 72, + 'WEATHER_CONDITIONS': 128, + 'WEATHER_ALERT': 129, + 'GPS_METADATA': 160, + 'CAMERA_EVENT': 161, + 'GYROSCOPE_DATA': 164, + 'ACCELEROMETER_DATA': 165, + 'MAGNETOMETER_DATA': 208, + 'BAROMETER_DATA': 209, + 'THREE_D_SENSOR_CALIBRATION': 167, + 'ONE_D_SENSOR_CALIBRATION': 210, + 'VIDEO_FRAME': 169, + 'OBDII_DATA': 174, + 'NMEA_SENTENCE': 177, + 'AVIATION_ATTITUDE': 178, + 'VIDEO': 184, + 'VIDEO_TITLE': 185, + 'VIDEO_DESCRIPTION': 186, + 'VIDEO_CLIP': 187, + 'SET': 225, + 'JUMP': 285, + 'SPLIT': 312, + 'SPLIT_SUMMARY': 313, + 'CLIMB_PRO': 317, + 'FIELD_DESCRIPTION': 206, + 'DEVELOPER_DATA_ID': 207, + 'COURSE': 31, + 'COURSE_POINT': 32, + 'SEGMENT_ID': 148, + 'SEGMENT_LEADERBOARD_ENTRY': 149, + 'SEGMENT_POINT': 150, + 'SEGMENT_LAP': 142, + 'SEGMENT_FILE': 151, + 'WORKOUT': 26, + 'WORKOUT_SESSION': 158, + 'WORKOUT_STEP': 27, + 'EXERCISE_TITLE': 264, + 'SCHEDULE': 28, + 'TOTALS': 33, + 'WEIGHT_SCALE': 30, + 'BLOOD_PRESSURE': 51, + 'MONITORING_INFO': 103, + 'MONITORING': 55, + 'MONITORING_HR_DATA': 211, + 'SPO2_DATA': 269, + 'HR': 132, + 'STRESS_LEVEL': 227, + 'MAX_MET_DATA': 229, + 'HSA_BODY_BATTERY_DATA': 314, + 'HSA_EVENT': 315, + 'HSA_ACCELEROMETER_DATA': 302, + 'HSA_GYROSCOPE_DATA': 376, + 'HSA_STEP_DATA': 304, + 'HSA_SPO2_DATA': 305, + 'HSA_STRESS_DATA': 306, + 'HSA_RESPIRATION_DATA': 307, + 'HSA_HEART_RATE_DATA': 308, + 'HSA_CONFIGURATION_DATA': 389, + 'HSA_WRIST_TEMPERATURE_DATA': 409, + 'MEMO_GLOB': 145, + 'SLEEP_LEVEL': 275, + 'ANT_CHANNEL_ID': 82, + 'ANT_RX': 80, + 'ANT_TX': 81, + 'EXD_SCREEN_CONFIGURATION': 200, + 'EXD_DATA_FIELD_CONFIGURATION': 201, + 'EXD_DATA_CONCEPT_CONFIGURATION': 202, + 'DIVE_SUMMARY': 268, + 'AAD_ACCEL_FEATURES': 289, + 'HRV': 78, + 'BEAT_INTERVALS': 290, + 'HRV_STATUS_SUMMARY': 370, + 'HRV_VALUE': 371, + 'RAW_BBI': 372, + 'RESPIRATION_RATE': 297, + 'CHRONO_SHOT_SESSION': 387, + 'CHRONO_SHOT_DATA': 388, + 'TANK_UPDATE': 319, + 'TANK_SUMMARY': 323, + 'SLEEP_ASSESSMENT': 346, + 'SLEEP_DISRUPTION_SEVERITY_PERIOD': 470, + 'SLEEP_DISRUPTION_OVERNIGHT_SEVERITY': 471, + 'SKIN_TEMP_OVERNIGHT': 398, + 'PAD': 105, + } +} diff --git a/garmin_fit_sdk/stream.py b/garmin_fit_sdk/stream.py index 71afb55..58dbfd0 100644 --- a/garmin_fit_sdk/stream.py +++ b/garmin_fit_sdk/stream.py @@ -1,178 +1,178 @@ -'''stream.py: Contains stream class which handles reading streams of data in the following ways: - 1. From a binary .fit file - 2. From a Python bytearray - 3. From a Python BytesIO object - 4. From a Python BufferedReader''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### -# ****WARNING**** This file is auto-generated! Do NOT edit this file. -# Profile Version = 21.188.0Release -# Tag = production/release/21.188.0-0-g55050f8 -############################################################################################ - - -import os -from enum import Enum -from io import BufferedReader, BytesIO -from struct import unpack - - -class Endianness(str, Enum): - '''An enum class for denoting a bytes endinannes (LSB or MSB)''' - LITTLE = "little" - BIG = "big" - - -class Stream: - ''' - A class that represents a stream of data from a .fit file. - - Attributes: - _buffered_reader: The buffered reader that holds the stream data. - _stream_length: The calculated length of the stream. - _crc_calculator: The CRC calculator which calculates the CRC each time bytes are read. - ''' - @staticmethod - def from_file(filename): - '''Creates a stream object from a given .fit file''' - buffered_reader = open(filename, "rb") - return Stream.from_buffered_reader(buffered_reader, os.path.getsize(filename)) - - @staticmethod - def from_byte_array(byte_array: bytearray, stream_length = None): - '''Creates a stream object from a given byte array''' - bytes_io = BytesIO(byte_array) - if stream_length is None: - stream_length = len(byte_array) - - return Stream.from_bytes_io(bytes_io, stream_length) - - @staticmethod - def from_bytes_io(bytes_io: BytesIO, length = None): - '''Creates a stream object from a given BytesIO object''' - buffered_reader = BufferedReader(bytes_io) - if length is None: - length = bytes_io.getbuffer().nbytes - - return Stream.from_buffered_reader(buffered_reader, length) - - @staticmethod - def from_buffered_reader(buffered_reader: BufferedReader, length = None): - '''Creates a stream boject from a given BufferedReader object''' - if length is None: - length = Stream.__calc_stream_size(buffered_reader) - - stream = Stream(buffered_reader, length) - return stream - - @staticmethod - def __calc_stream_size(buffered_reader: BufferedReader): - starting_position = buffered_reader.tell() - buffered_reader.seek(0, os.SEEK_END) - size = buffered_reader.tell() - buffered_reader.seek(starting_position) - return size - - def __init__(self, buffered_reader: BufferedReader, stream_length): - self._buffered_reader = buffered_reader - self._stream_length = stream_length - - self._crc_calculator = None - - def __del__(self): - self.close() - - def __exit__(self, *_): - self.close() - - def close(self): - '''Closes the buffered reader in the stream.''' - self._buffered_reader.close() - - def get_buffered_reader(self): - '''Returns the buffered reader of the stream.''' - return self._buffered_reader - - def peek_byte(self): - '''Reads one byte from the stream without advancing stream position.''' - return self._buffered_reader.peek(1)[0] - - def peek_bytes(self, num_bytes: int): - '''Reads the given amount of bytes from the stream without advancing stream position ''' - return self._buffered_reader.peek(num_bytes)[0:num_bytes] - - def slice(self, start: int, end: int): - '''Returns all of the bytes from the stream between the given start and end.''' - starting_position = self.position() - self.seek(start) - slice = self.peek_bytes(end - start)[0: end - start] - self.seek(starting_position) - return slice - - def seek(self, position: int): - '''Moves the stream position of stream to the given position.''' - self._buffered_reader.seek(position) - - def read_byte(self): - '''Reads one byte from the stream.''' - if self.position() > self._stream_length - 1: - raise IndexError("FIT Runtime Error, end of file reached at byte pos: " + self.position()) - return self.read_bytes(1)[0] - - def read_bytes(self, num_bytes: int): - '''Reads the given amount of bytes from the stream.''' - if num_bytes > (self._stream_length - self.position()): - raise IndexError("FIT Runtime Error number of bytes provided is longer than the number of bytes remaining") - - read_bytes = self._buffered_reader.read(num_bytes)[0:num_bytes] - - if self._crc_calculator is not None: - self._crc_calculator.add_bytes(read_bytes, 0, num_bytes) - - return read_bytes - - def read_unint_16(self, endianness: Endianness = Endianness.LITTLE): - '''Reads a 16-bit unsigned integer from the stream with the given endianness''' - return int.from_bytes(self.read_bytes(2), endianness) - - def read_unint_32(self, endianness: Endianness = Endianness.LITTLE): - '''Reads a 32-bit unsigned integer from the stream with the given endianness''' - return int.from_bytes(self.read_bytes(4), endianness) - - def read_string(self, string_length): - '''Reads a string from the stream with the given string length''' - struct_string = "=" + str(string_length) + "s" - return self.read_and_unpack(string_length, struct_string) - - def reset(self): - '''Resets the stream position to the beginning of the stream.''' - self._buffered_reader.seek(0) - - def position(self): - '''Returns the current position in the stream.''' - return self._buffered_reader.tell() - - def get_length(self): - '''Returns the total length of the stream.''' - return self._stream_length - - def read_and_unpack(self, size: int, struct_format_string): - '''Reads a given number of bytes and unpacks the binary struct given a formatting string template''' - byte_array = self.read_bytes(size) - - values = list(unpack(struct_format_string, byte_array)) - - return values - - def get_crc_caclulator(self): - '''Returns the CRC calculator''' - return self._crc_calculator - - def set_crc_calculator(self, crc_calculator): - '''Sets the CRC calculator''' - self._crc_calculator = crc_calculator +'''stream.py: Contains stream class which handles reading streams of data in the following ways: + 1. From a binary .fit file + 2. From a Python bytearray + 3. From a Python BytesIO object + 4. From a Python BufferedReader''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### +# ****WARNING**** This file is auto-generated! Do NOT edit this file. +# Profile Version = 21.194.0Release +# Tag = production/release/21.194.0-0-g65135fc +############################################################################################ + + +import os +from enum import Enum +from io import BufferedReader, BytesIO +from struct import unpack + + +class Endianness(str, Enum): + '''An enum class for denoting a bytes endinannes (LSB or MSB)''' + LITTLE = "little" + BIG = "big" + + +class Stream: + ''' + A class that represents a stream of data from a .fit file. + + Attributes: + _buffered_reader: The buffered reader that holds the stream data. + _stream_length: The calculated length of the stream. + _crc_calculator: The CRC calculator which calculates the CRC each time bytes are read. + ''' + @staticmethod + def from_file(filename): + '''Creates a stream object from a given .fit file''' + buffered_reader = open(filename, "rb") + return Stream.from_buffered_reader(buffered_reader, os.path.getsize(filename)) + + @staticmethod + def from_byte_array(byte_array: bytearray, stream_length = None): + '''Creates a stream object from a given byte array''' + bytes_io = BytesIO(byte_array) + if stream_length is None: + stream_length = len(byte_array) + + return Stream.from_bytes_io(bytes_io, stream_length) + + @staticmethod + def from_bytes_io(bytes_io: BytesIO, length = None): + '''Creates a stream object from a given BytesIO object''' + buffered_reader = BufferedReader(bytes_io) + if length is None: + length = bytes_io.getbuffer().nbytes + + return Stream.from_buffered_reader(buffered_reader, length) + + @staticmethod + def from_buffered_reader(buffered_reader: BufferedReader, length = None): + '''Creates a stream boject from a given BufferedReader object''' + if length is None: + length = Stream.__calc_stream_size(buffered_reader) + + stream = Stream(buffered_reader, length) + return stream + + @staticmethod + def __calc_stream_size(buffered_reader: BufferedReader): + starting_position = buffered_reader.tell() + buffered_reader.seek(0, os.SEEK_END) + size = buffered_reader.tell() + buffered_reader.seek(starting_position) + return size + + def __init__(self, buffered_reader: BufferedReader, stream_length): + self._buffered_reader = buffered_reader + self._stream_length = stream_length + + self._crc_calculator = None + + def __del__(self): + self.close() + + def __exit__(self, *_): + self.close() + + def close(self): + '''Closes the buffered reader in the stream.''' + self._buffered_reader.close() + + def get_buffered_reader(self): + '''Returns the buffered reader of the stream.''' + return self._buffered_reader + + def peek_byte(self): + '''Reads one byte from the stream without advancing stream position.''' + return self._buffered_reader.peek(1)[0] + + def peek_bytes(self, num_bytes: int): + '''Reads the given amount of bytes from the stream without advancing stream position ''' + return self._buffered_reader.peek(num_bytes)[0:num_bytes] + + def slice(self, start: int, end: int): + '''Returns all of the bytes from the stream between the given start and end.''' + starting_position = self.position() + self.seek(start) + slice = self.peek_bytes(end - start)[0: end - start] + self.seek(starting_position) + return slice + + def seek(self, position: int): + '''Moves the stream position of stream to the given position.''' + self._buffered_reader.seek(position) + + def read_byte(self): + '''Reads one byte from the stream.''' + if self.position() > self._stream_length - 1: + raise IndexError("FIT Runtime Error, end of file reached at byte pos: " + self.position()) + return self.read_bytes(1)[0] + + def read_bytes(self, num_bytes: int): + '''Reads the given amount of bytes from the stream.''' + if num_bytes > (self._stream_length - self.position()): + raise IndexError("FIT Runtime Error number of bytes provided is longer than the number of bytes remaining") + + read_bytes = self._buffered_reader.read(num_bytes)[0:num_bytes] + + if self._crc_calculator is not None: + self._crc_calculator.add_bytes(read_bytes, 0, num_bytes) + + return read_bytes + + def read_unint_16(self, endianness: Endianness = Endianness.LITTLE): + '''Reads a 16-bit unsigned integer from the stream with the given endianness''' + return int.from_bytes(self.read_bytes(2), endianness) + + def read_unint_32(self, endianness: Endianness = Endianness.LITTLE): + '''Reads a 32-bit unsigned integer from the stream with the given endianness''' + return int.from_bytes(self.read_bytes(4), endianness) + + def read_string(self, string_length): + '''Reads a string from the stream with the given string length''' + struct_string = "=" + str(string_length) + "s" + return self.read_and_unpack(string_length, struct_string) + + def reset(self): + '''Resets the stream position to the beginning of the stream.''' + self._buffered_reader.seek(0) + + def position(self): + '''Returns the current position in the stream.''' + return self._buffered_reader.tell() + + def get_length(self): + '''Returns the total length of the stream.''' + return self._stream_length + + def read_and_unpack(self, size: int, struct_format_string): + '''Reads a given number of bytes and unpacks the binary struct given a formatting string template''' + byte_array = self.read_bytes(size) + + values = list(unpack(struct_format_string, byte_array)) + + return values + + def get_crc_caclulator(self): + '''Returns the CRC calculator''' + return self._crc_calculator + + def set_crc_calculator(self, crc_calculator): + '''Sets the CRC calculator''' + self._crc_calculator = crc_calculator diff --git a/garmin_fit_sdk/util.py b/garmin_fit_sdk/util.py index 5f79d63..90a0abc 100644 --- a/garmin_fit_sdk/util.py +++ b/garmin_fit_sdk/util.py @@ -1,55 +1,55 @@ -'''util.py: Contains utility functions used throughout the project.''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### -# ****WARNING**** This file is auto-generated! Do NOT edit this file. -# Profile Version = 21.188.0Release -# Tag = production/release/21.188.0-0-g55050f8 -############################################################################################ - - -from datetime import datetime, timezone - -FIT_EPOCH_S = 631065600 - -def convert_timestamp_to_datetime(timestamp): - '''Takes a FIT datetime timestamp and converts it to a python datetime in utc''' - utc_datetime = datetime.fromtimestamp((timestamp if timestamp else 0) + FIT_EPOCH_S, timezone.utc) - return utc_datetime.replace(tzinfo=timezone.utc) - -def _convert_string(string): - '''Takes a string and converts it according to the fit protocol standard.''' - string = string.decode("utf-8", errors="ignore") - strings = string.split(sep='\0') - - while strings[len(strings) - 1] == '': - strings.pop() - if len(strings) == 0: - return None - - if len(strings) == 1: - return strings[0] - else: - return strings - -def _only_invalid_values(raw_field_value, invalid_value): - '''Returns whether the given value(s) consist of only invalid values.''' - if isinstance(raw_field_value, list): - for value in raw_field_value: - if value != invalid_value: - return False - - return True - - return raw_field_value == invalid_value - -def _sanitize_values(values): - '''Reduces values if it is an array of length one.''' - if isinstance(values, list) and len(values) == 1: - return values[0] - +'''util.py: Contains utility functions used throughout the project.''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### +# ****WARNING**** This file is auto-generated! Do NOT edit this file. +# Profile Version = 21.194.0Release +# Tag = production/release/21.194.0-0-g65135fc +############################################################################################ + + +from datetime import datetime, timezone + +FIT_EPOCH_S = 631065600 + +def convert_timestamp_to_datetime(timestamp): + '''Takes a FIT datetime timestamp and converts it to a python datetime in utc''' + utc_datetime = datetime.fromtimestamp((timestamp if timestamp else 0) + FIT_EPOCH_S, timezone.utc) + return utc_datetime.replace(tzinfo=timezone.utc) + +def _convert_string(string): + '''Takes a string and converts it according to the fit protocol standard.''' + string = string.decode("utf-8", errors="ignore") + strings = string.split(sep='\0') + + while strings[len(strings) - 1] == '': + strings.pop() + if len(strings) == 0: + return None + + if len(strings) == 1: + return strings[0] + else: + return strings + +def _only_invalid_values(raw_field_value, invalid_value): + '''Returns whether the given value(s) consist of only invalid values.''' + if isinstance(raw_field_value, list): + for value in raw_field_value: + if value != invalid_value: + return False + + return True + + return raw_field_value == invalid_value + +def _sanitize_values(values): + '''Reduces values if it is an array of length one.''' + if isinstance(values, list) and len(values) == 1: + return values[0] + return values \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 5ee4bc9..68ac649 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,37 +1,37 @@ -[build-system] -requires = ["setuptools >= 64"] -build-backend = "setuptools.build_meta" - -[project] -version = "21.188.0" -name = "garmin-fit-sdk" -description = "Garmin FIT Python SDK" -authors = [{ name = "Garmin International, Inc." }] -readme = { file = "README.md", content-type = "text/markdown" } -license = { file = "LICENSE" } -keywords = ["garmin", "fit sdk", "fit"] -requires-python = ">=3.6" -classifiers = [ - "Development Status :: 5 - Production/Stable", - "Natural Language :: English", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3 :: Only", - "Operating System :: OS Independent", -] -urls = { "Homepage" = "https://github.com/garmin/fit-python-sdk" } -dependencies = [] - -[project.optional-dependencies] -dev = ["pytest~=7.0.1", "pytest-cov~=3.0.0", "pytest-mock~=3.6.1"] - -[tool.setuptools] -include-package-data = true - -[tool.setuptools.packages.find] -exclude = [".gitignore", ".vscode*", ".pytest_cache*", ".test.py"] +[build-system] +requires = ["setuptools >= 64"] +build-backend = "setuptools.build_meta" + +[project] +version = "21.194.0" +name = "garmin-fit-sdk" +description = "Garmin FIT Python SDK" +authors = [{ name = "Garmin International, Inc." }] +readme = { file = "README.md", content-type = "text/markdown" } +license = { file = "LICENSE" } +keywords = ["garmin", "fit sdk", "fit"] +requires-python = ">=3.6" +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Natural Language :: English", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3 :: Only", + "Operating System :: OS Independent", +] +urls = { "Homepage" = "https://github.com/garmin/fit-python-sdk" } +dependencies = [] + +[project.optional-dependencies] +dev = ["pytest~=7.0.1", "pytest-cov~=3.0.0", "pytest-mock~=3.6.1"] + +[tool.setuptools] +include-package-data = true + +[tool.setuptools.packages.find] +exclude = [".gitignore", ".vscode*", ".pytest_cache*", ".test.py"] diff --git a/tests/__init__.py b/tests/__init__.py index 3535a2f..2c73d32 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,11 +1,11 @@ -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### - - -# __init__.py for the fit sdk tests module - -__version__ = '21.188.0' \ No newline at end of file +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### + + +# __init__.py for the fit sdk tests module + +__version__ = '21.194.0' \ No newline at end of file diff --git a/tests/data.py b/tests/data.py index 66dd916..fe2138b 100644 --- a/tests/data.py +++ b/tests/data.py @@ -1,696 +1,696 @@ -'''data.py: Contains various byte arrays which are reused in testing the FIT SDK.''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### - - -class Data: - '''Helper class that holds example fit files and byte arrays to be used for testing.''' - - fit_file_invalid = bytearray([ - 0x0E, 0x20, 0x9F, 0x03, 0x64, 0x00, 0x00, 0x00, - 0x2E, 0x99, 0x49, 0x54, 0xB9, 0xE3, 0x00, 0x00 - ]) - - fit_file_minimum = bytearray([ - 0x0E, 0x20, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x2E, 0x46, 0x49, 0x54, 0x8D, 0x48, 0x00, 0x00, - ]) - - fit_file_incorrect_data_size = bytearray([ - 0x0E, 0x20, 0x8B, 0x08, 0xFF, 0x00, 0x00, 0x00, - 0x2E, 0x46, 0x49, 0x54, 0x8D, 0x48, 0x00, 0x00, - ]) - - fit_file_short = bytearray([ - 0x0E, 0x20, 0x9F, 0x03, 0x64, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, - 0xB9, 0xE3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x04, 0x8C, 0x04, - 0x04, 0x86, 0x08, 0x14, 0x07, 0x01, 0x02, 0x84, 0x02, 0x02, 0x84, 0x05, - 0x02, 0x84, 0x06, 0x02, 0x84, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x40, 0x00, - 0x00, 0xD3, 0x00, 0x05, 0xFD, 0x04, 0x86, 0x03, 0x02, 0x84, 0x04, 0x02, - 0x84, 0x00, 0x01, 0x02, 0x01, 0x01, 0x02, 0x00, 0x00, 0xCA, 0x9A, 0x3B, - 0x32, 0x00, 0x37, 0x00, 0x2C, 0x2E, 0x87, 0x4F - ]) - - fit_file_short_new = bytearray([ - 0x0E, 0x20, 0x8B, 0x08, 0x24, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x8E, 0xA3, # File Header - 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition - 0x00, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message - 0x5D, 0xF2 # CRC - ]) - - fit_file_short_compressed_timestamp = bytearray([ - 0x0E, 0x20, 0x8B, 0x08, 0x24, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x8E, 0xA3, # File Header - 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition - 0x80, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message - 0x5D, 0xF2 - ]) - - fit_file_short_new_invalid_crc = bytearray([ - 0x0E, 0x20, 0x8B, 0x08, 0x24, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x8E, 0xA3, # File Header - 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition - 0x00, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message - 0xFF, 0xFF # CRC - ]) - - fit_file_short_none_array = bytearray([ - 0x0E, 0x20, 0x8B, 0x08, 0x24, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x8E, 0xA3, # File Header - 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition - 0x00, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # Message - 0x6C, 0x15 # CRC - ]) - - fit_file_short_with_wrong_field_def_size = bytearray([ - 0x0E, 0x20, 0x8B, 0x08, 0x21, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x8E, 0xA3, # File Header - 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x01, 0x86, 0x08, 0x0A, 0x07, # Message Definition - 0x00, 0x04, 0x01, 0x00, 0x12, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message - 0x65, 0xFE # CRC - ]) - - fit_file_arrays = bytearray([ - 0x0E, 0x20, 0x9F, 0x03, 0x32, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, - 0x3C, 0xF5, 0x40, 0x00, 0x01, 0x00, 0x00, 0x03, 0x01, 0x02, 0x84, 0x00, - 0x01, 0x00, 0x03, 0x04, 0x8C, 0x00, 0x00, 0xFF, 0x04, 0x00, 0x00, 0x30, - 0x39, 0x40, 0x00, 0x01, 0x00, 0x0C, 0x03, 0x03, 0x05, 0x07, 0x0A, 0x04, - 0x02, 0x13, 0x02, 0x00, 0x00, 0x54, 0x65, 0x73, 0x74, 0x00, 0xFF, 0xFF, - 0xFF, 0xFF, 0x05, 0x01, 0x5C, 0x21 - ]) - - fit_file_chained = bytearray([ - 0x0E, 0x20, 0x9F, 0x03, 0x64, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, - 0xB9, 0xE3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x04, 0x8C, 0x04, - 0x04, 0x86, 0x08, 0x14, 0x07, 0x01, 0x02, 0x84, 0x02, 0x02, 0x84, 0x05, - 0x02, 0x84, 0x06, 0x02, 0x84, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x40, 0x00, - 0x00, 0xD3, 0x00, 0x05, 0xFD, 0x04, 0x86, 0x03, 0x02, 0x84, 0x04, 0x02, - 0x84, 0x00, 0x01, 0x02, 0x01, 0x01, 0x02, 0x00, 0x00, 0xCA, 0x9A, 0x3B, - 0x32, 0x00, 0x37, 0x00, 0x2C, 0x2E, 0x7C, 0xD5, - 0x0E, 0x20, 0x9F, 0x03, 0x64, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, - 0xB9, 0xE3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x04, 0x8C, 0x04, - 0x04, 0x86, 0x08, 0x14, 0x07, 0x01, 0x02, 0x84, 0x02, 0x02, 0x84, 0x05, - 0x02, 0x84, 0x06, 0x02, 0x84, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x40, 0x00, - 0x00, 0xD3, 0x00, 0x05, 0xFD, 0x04, 0x86, 0x03, 0x02, 0x84, 0x04, 0x02, - 0x84, 0x00, 0x01, 0x02, 0x01, 0x01, 0x02, 0x00, 0x00, 0xCA, 0x9A, 0x3B, - 0x32, 0x00, 0x37, 0x00, 0x2C, 0x2E, 0x7C, 0xD5 - ]) - - fit_file_800m_repeats_little_endian = bytearray([ - 0x0E, 0x10, 0x8D, 0x08, 0xDB, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, - 0xDE, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, - 0x02, 0x84, 0x02, 0x02, 0x84, 0x04, 0x04, 0x86, 0x03, 0x04, 0x8C, 0x00, - 0x05, 0xFF, 0x00, 0x00, 0x00, 0x12, 0xAD, 0x66, 0x3D, 0x38, 0xB6, 0xC1, - 0x0A, 0x40, 0x00, 0x00, 0x1A, 0x00, 0x04, 0x08, 0x15, 0x07, 0x04, 0x01, - 0x00, 0x0B, 0x01, 0x00, 0x06, 0x02, 0x84, 0x00, 0x52, 0x75, 0x6E, 0x6E, - 0x69, 0x6E, 0x67, 0x20, 0x38, 0x30, 0x30, 0x6D, 0x20, 0x52, 0x65, 0x70, - 0x65, 0x61, 0x74, 0x73, 0x00, 0x01, 0xFF, 0x05, 0x00, 0x40, 0x00, 0x00, - 0x1B, 0x00, 0x08, 0x02, 0x04, 0x86, 0xFE, 0x02, 0x84, 0x07, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x03, 0x01, 0x00, 0x04, 0x04, 0x86, 0x05, 0x04, 0x86, - 0x06, 0x04, 0x86, 0x00, 0x80, 0x1A, 0x06, 0x00, 0x00, 0x00, 0x02, 0x01, - 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x38, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x4E, 0x00, 0x00, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x03, 0x00, 0xFF, 0x06, 0x02, 0x05, 0x00, 0x00, 0x00, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xA0, 0x86, 0x01, 0x00, - 0x04, 0x00, 0x03, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xAE, 0xC4 - ]) - - fit_file_800m_repeats_big_endian = bytearray([ - 0x0E, 0x20, 0x9F, 0x03, 0xDB, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, - 0xF2, 0xD7, 0x40, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, - 0x02, 0x84, 0x02, 0x02, 0x84, 0x04, 0x04, 0x86, 0x03, 0x04, 0x8C, 0x00, - 0x05, 0x00, 0xFF, 0x00, 0x00, 0x3D, 0x66, 0xAD, 0x12, 0x0A, 0xC1, 0xB6, - 0x38, 0x40, 0x00, 0x01, 0x00, 0x1A, 0x04, 0x08, 0x15, 0x07, 0x04, 0x01, - 0x00, 0x0B, 0x01, 0x00, 0x06, 0x02, 0x84, 0x00, 0x52, 0x75, 0x6E, 0x6E, - 0x69, 0x6E, 0x67, 0x20, 0x38, 0x30, 0x30, 0x6D, 0x20, 0x52, 0x65, 0x70, - 0x65, 0x61, 0x74, 0x73, 0x00, 0x01, 0xFF, 0x00, 0x05, 0x40, 0x00, 0x01, - 0x00, 0x1B, 0x08, 0x02, 0x04, 0x86, 0xFE, 0x02, 0x84, 0x07, 0x01, 0x00, - 0x01, 0x01, 0x00, 0x03, 0x01, 0x00, 0x04, 0x04, 0x86, 0x05, 0x04, 0x86, - 0x06, 0x04, 0x86, 0x00, 0x00, 0x06, 0x1A, 0x80, 0x00, 0x00, 0x02, 0x01, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x38, 0x80, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x4E, 0x20, 0x00, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x03, 0xFF, 0x06, 0x02, 0x00, 0x00, 0x00, 0x05, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x86, 0xA0, - 0x00, 0x04, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x67 - ]) - - fit_file_dev_data_missing_field_description = bytearray([ - 0x0E, 0x20, 0x64, 0x00, 0xD1, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, - 0x12, 0x7E, 0x40, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, - 0x02, 0x84, 0x02, 0x02, 0x84, 0x04, 0x04, 0x86, 0x03, 0x04, 0x8C, 0x00, - 0x04, 0x00, 0xFF, 0x00, 0x00, 0x3D, 0x5D, 0x38, 0xBD, 0x1E, 0x29, 0x25, - 0x9B, 0x60, 0x00, 0x01, 0x00, 0x14, 0x09, 0xFD, 0x04, 0x86, 0x05, 0x04, - 0x86, 0x06, 0x02, 0x84, 0x03, 0x01, 0x02, 0x04, 0x01, 0x02, 0x07, 0x02, - 0x84, 0x02, 0x02, 0x84, 0x00, 0x04, 0x85, 0x01, 0x04, 0x85, 0x01, 0x01, - 0x01, 0x00, 0x00, 0x3D, 0x5D, 0x38, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x03, - 0xE8, 0x7E, 0x00, 0x00, 0x96, 0x07, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7E, 0x00, 0x3D, 0x5D, 0x38, 0xBE, 0x00, 0x00, 0x00, - 0x64, 0x03, 0xE8, 0x86, 0x01, 0x00, 0x96, 0x07, 0x4E, 0x7F, 0xFF, 0xFF, - 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x86, 0x00, 0x3D, 0x5D, 0x38, 0xBF, 0x00, - 0x00, 0x00, 0xC8, 0x03, 0xE8, 0x8E, 0x02, 0x00, 0x96, 0x07, 0x53, 0x7F, - 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x8E, 0x00, 0x3D, 0x5D, 0x38, - 0xC0, 0x00, 0x00, 0x01, 0x2C, 0x03, 0xE8, 0x96, 0x03, 0x00, 0x96, 0x07, - 0x58, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x96, 0x40, 0x00, - 0x01, 0x00, 0x22, 0x04, 0xFD, 0x04, 0x86, 0x01, 0x02, 0x84, 0x05, 0x04, - 0x86, 0x00, 0x04, 0x86, 0x00, 0x3D, 0x5D, 0x46, 0xCD, 0x00, 0x01, 0x3D, - 0x5C, 0xF2, 0x6D, 0x00, 0x36, 0xEE, 0x80, 0x78, 0x3B - ]) - - fit_file_short_multibyte_dev_data = bytearray([ - 0x0E, 0x20, 0xB9, 0x52, 0x3F, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, - 0xED, 0x8A, 0x40, 0x00, 0x01, 0x00, 0xCF, 0x01, 0x03, 0x01, 0x02, 0x00, - 0x00, 0x40, 0x00, 0x01, 0x00, 0xCE, 0x05, 0x00, 0x01, 0x02, 0x01, 0x01, - 0x02, 0x02, 0x01, 0x02, 0x08, 0x07, 0x07, 0x0E, 0x02, 0x84, 0x00, 0x00, - 0x00, 0x84, 0x70, 0x6F, 0x69, 0x6E, 0x74, 0x73, 0x00, 0x00, 0x12, 0x60, - 0x00, 0x01, 0x00, 0x12, 0x01, 0xFE, 0x02, 0x84, 0x01, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x04, 0xD2, 0x97, 0x59 - ]) - - fit_file_monitoring = bytearray([ - 0x0E, 0x10, 0x28, 0x23, 0x37, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, - 0x2C, 0xC6, 0x41, 0x00, 0x01, 0x00, 0x37, 0x03, 0xFD, 0x04, 0x86, 0x18, - 0x01, 0x0D, 0x03, 0x04, 0x86, 0x01, 0x3F, 0x2A, 0xE2, 0xFF, 0x61, 0x00, - 0x00, 0x00, 0x14, 0x01, 0x3F, 0x2A, 0xE2, 0xFF, 0x06, 0x00, 0x00, 0x00, - 0x3C, 0x01, 0x3F, 0x2A, 0xE2, 0xFF, 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x01, - 0x3F, 0x2A, 0xE2, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x1E, 0xED, 0xF9 - ]) - - fit_file_messages_with_no_fields = bytearray([ - 0x0E, 0x20, 0x84, 0x52, 0x44, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, - 0x3A, 0x18, 0x40, 0x00, 0x01, 0x00, 0x69, 0x00, 0x41, 0x00, 0x01, 0x00, - 0x00, 0x07, 0x03, 0x04, 0x8C, 0x04, 0x04, 0x86, 0x01, 0x02, 0x84, 0x02, - 0x02, 0x84, 0x05, 0x02, 0x84, 0x00, 0x01, 0x00, 0xFB, 0x01, 0x0D, 0x01, - 0xCD, 0xC3, 0x1F, 0xAE, 0x3F, 0x92, 0x50, 0x78, 0x00, 0x01, 0x10, 0x22, - 0x00, 0x00, 0x20, 0xFF, 0x00, 0x01, 0xCD, 0xC3, 0x1F, 0xAE, 0x3F, 0x92, - 0x50, 0x78, 0x00, 0x01, 0x10, 0x22, 0x00, 0x00, 0x20, 0xFF, 0x25, 0xFB - ]) - - fit_file_accumulated_components = bytearray([ - 0x0E, 0x20, 0xE8, 0x03, 0x0F, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, - 0x4D, 0x89, 0x40, 0x00, 0x00, 0x14, 0x00, 0x01, 0x12, 0x01, 0x02, 0x00, - 0xFE, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x7D - ]) - - fit_file_compressed_speed_distance = bytearray([ - 0x0E, 0x20, 0xE8, 0x03, 0x11, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, - 0xCD, 0x09, 0x40, 0x00, 0x00, 0x14, 0x00, 0x01, 0x08, 0x03, 0x0D, 0x00, - 0x8B, 0x00, 0x08, 0x00, 0xF9, 0x00, 0x14, 0x50, 0x0B - ]) - - fit_file_compressed_speed_distance_with_initial_distance = bytearray([ - 0x0E, 0x20, 0xE8, 0x03, 0x1F, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, - 0x4C, 0x85, 0x40, 0x00, 0x00, 0x14, 0x00, 0x01, 0x05, 0x04, 0x86, 0x00, - 0xC8, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x14, 0x00, 0x01, 0x08, 0x03, - 0x0D, 0x00, 0x8B, 0x00, 0x08, 0x00, 0xF9, 0x00, 0x14, 0x65, 0xB1 - ]) - - fit_file_short_invalid_header = bytearray([ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # File Header - 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition - 0x00, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message - 0x5D, 0xF2 - ]) # CRC - - fit_file_short_data_only = bytearray([ - 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition - 0x00, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message - 0x5D, 0xF2 - ]) # CRC - - fit_file_short_invalid_CRC = bytearray([ - 0x0E, 0x20, 0x8B, 0x08, 0x24, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x8E, 0xA3, # File Header - 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition - 0x00, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message - 0x00, 0x00 - ]) # CRC - - gear_change_data = [ - { - "timestamp": 1024873717, - "rear_gear_num": 5, - "rear_gear": 24, - "front_gear_num": 255, - "front_gear": 22, - "data": 385816581, - "gear_change_data": 385816581 - }, - { - "timestamp": 1024873760, - "rear_gear_num": 6, - "rear_gear": 21, - "front_gear_num": 255, - "front_gear": None, - "data": 16717062, - "gear_change_data": 16717062 - }, - { - "timestamp": 1024873819, - "rear_gear_num": 7, - "rear_gear": 19, - "front_gear_num": 255, - "front_gear": None, - "data": 16716551, - "gear_change_data": 16716551 - }, - { - "timestamp": 1024873850, - "rear_gear_num": 6, - "rear_gear": 21, - "front_gear_num": 255, - "front_gear": None, - "data": 16717062, - "gear_change_data": 16717062 - }, - { - "timestamp": 1024874601, - "rear_gear_num": 7, - "rear_gear": 19, - "front_gear_num": 255, - "front_gear": None, - "data": 16716551, - "gear_change_data": 16716551 - }, - { - "timestamp": 1024874624, - "rear_gear_num": 8, - "rear_gear": 17, - "front_gear_num": 255, - "front_gear": None, - "data": 16716040, - "gear_change_data": 16716040 - }, - { - "timestamp": 1024874694, - "rear_gear_num": 7, - "rear_gear": 19, - "front_gear_num": 255, - "front_gear": None, - "data": 16716551, - "gear_change_data": 16716551 - }, - { - "timestamp": 1024874698, - "rear_gear_num": 6, - "rear_gear": 21, - "front_gear_num": 255, - "front_gear": None, - "data": 16717062, - "gear_change_data": 16717062 - }, - { - "timestamp": 1024874727, - "rear_gear_num": 7, - "rear_gear": 19, - "front_gear_num": 255, - "front_gear": None, - "data": 16716551, - "gear_change_data": 16716551 - }, - { - "timestamp": 1024874755, - "rear_gear_num": 8, - "rear_gear": 17, - "front_gear_num": 255, - "front_gear": None, - "data": 16716040, - "gear_change_data": 16716040 - }, - { - "timestamp": 1024874824, - "rear_gear_num": 7, - "rear_gear": 19, - "front_gear_num": 255, - "front_gear": None, - "data": 16716551, - "gear_change_data": 16716551 - }, - { - "timestamp": 1024874829, - "rear_gear_num": 6, - "rear_gear": 21, - "front_gear_num": 255, - "front_gear": None, - "data": 16717062, - "gear_change_data": 16717062 - }, - { - "timestamp": 1024874864, - "rear_gear_num": 7, - "rear_gear": 19, - "front_gear_num": 255, - "front_gear": None, - "data": 16716551, - "gear_change_data": 16716551 - }, - { - "timestamp": 1024874913, - "rear_gear_num": 6, - "rear_gear": 21, - "front_gear_num": 255, - "front_gear": None, - "data": 16717062, - "gear_change_data": 16717062 - }, - { - "timestamp": 1024874927, - "rear_gear_num": 4, - "rear_gear": 27, - "front_gear_num": 255, - "front_gear": None, - "data": 16718596, - "gear_change_data": 16718596 - }, - { - "timestamp": 1024875097, - "rear_gear_num": 5, - "rear_gear": 24, - "front_gear_num": 255, - "front_gear": None, - "data": 16717829, - "gear_change_data": 16717829 - }, - { - "timestamp": 1024875097, - "rear_gear_num": 6, - "rear_gear": 21, - "front_gear_num": 255, - "front_gear": None, - "data": 16717062, - "gear_change_data": 16717062 - }, - { - "timestamp": 1024875111, - "rear_gear_num": 5, - "rear_gear": 24, - "front_gear_num": 255, - "front_gear": None, - "data": 16717829, - "gear_change_data": 16717829 - }, - { - "timestamp": 1024875126, - "rear_gear_num": 4, - "rear_gear": 27, - "front_gear_num": 255, - "front_gear": None, - "data": 16718596, - "gear_change_data": 16718596 - }, - { - "timestamp": 1024875251, - "rear_gear_num": 3, - "rear_gear": 31, - "front_gear_num": 255, - "front_gear": None, - "data": 16719619, - "gear_change_data": 16719619 - }, - { - "timestamp": 1024875265, - "rear_gear_num": 4, - "rear_gear": 27, - "front_gear_num": 255, - "front_gear": None, - "data": 16718596, - "gear_change_data": 16718596 - }, - { - "timestamp": 1024875271, - "rear_gear_num": 5, - "rear_gear": 24, - "front_gear_num": 255, - "front_gear": None, - "data": 16717829, - "gear_change_data": 16717829 - }, - { - "timestamp": 1024875291, - "rear_gear_num": 6, - "rear_gear": 21, - "front_gear_num": 255, - "front_gear": None, - "data": 16717062, - "gear_change_data": 16717062 - }, - { - "timestamp": 1024875364, - "rear_gear_num": 7, - "rear_gear": 19, - "front_gear_num": 255, - "front_gear": None, - "data": 16716551, - "gear_change_data": 16716551 - }, - { - "timestamp": 1024875388, - "rear_gear_num": 8, - "rear_gear": 17, - "front_gear_num": 255, - "front_gear": None, - "data": 16716040, - "gear_change_data": 16716040 - }, - { - "timestamp": 1024875423, - "rear_gear_num": 9, - "rear_gear": 15, - "front_gear_num": 255, - "front_gear": None, - "data": 16715529, - "gear_change_data": 16715529 - }, - { - "timestamp": 1024875515, - "rear_gear_num": 8, - "rear_gear": 17, - "front_gear_num": 255, - "front_gear": None, - "data": 16716040, - "gear_change_data": 16716040 - }, - { - "timestamp": 1024875589, - "rear_gear_num": 7, - "rear_gear": 19, - "front_gear_num": 255, - "front_gear": None, - "data": 16716551, - "gear_change_data": 16716551 - }, - { - "timestamp": 1024875615, - "rear_gear_num": 8, - "rear_gear": 17, - "front_gear_num": 255, - "front_gear": None, - "data": 16716040, - "gear_change_data": 16716040 - }, - { - "timestamp": 1024875616, - "rear_gear_num": 9, - "rear_gear": 15, - "front_gear_num": 255, - "front_gear": None, - "data": 16715529, - "gear_change_data": 16715529 - }, - { - "timestamp": 1024875621, - "rear_gear_num": 10, - "rear_gear": 13, - "front_gear_num": 255, - "front_gear": None, - "data": 16715018, - "gear_change_data": 16715018 - }, - { - "timestamp": 1024875622, - "rear_gear_num": 11, - "rear_gear": 11, - "front_gear_num": 255, - "front_gear": None, - "data": 16714507, - "gear_change_data": 16714507 - }, - { - "timestamp": 1024875651, - "rear_gear_num": 9, - "rear_gear": 15, - "front_gear_num": 255, - "front_gear": None, - "data": 16715529, - "gear_change_data": 16715529 - }, - { - "timestamp": 1024875658, - "rear_gear_num": 8, - "rear_gear": 17, - "front_gear_num": 255, - "front_gear": None, - "data": 16716040, - "gear_change_data": 16716040 - }, - { - "timestamp": 1024875658, - "rear_gear_num": 7, - "rear_gear": 19, - "front_gear_num": 255, - "front_gear": None, - "data": 16716551, - "gear_change_data": 16716551 - }, - { - "timestamp": 1024875665, - "rear_gear_num": 6, - "rear_gear": 21, - "front_gear_num": 255, - "front_gear": None, - "data": 16717062, - "gear_change_data": 16717062 - }, - { - "timestamp": 1024875695, - "rear_gear_num": 6, - "rear_gear": 21, - "front_gear_num": 255, - "front_gear": 22, - "data": 385815814, - "gear_change_data": 385815814 - } -] - - hrm_plugin_test_activity_expected = [ - 1242209, - 1242212.0, 1242213.7314453125, 1242215.5029296875, 1242215.865234375, 1242216.9541015625, 1242218.3369140625, 1242219.6220703125, 1242219.9853515625, - 1242220.71875, 1242221.2607421875, 1242221.83203125, 1242222.103515625, 1242222.970703125, 1242223.849609375, 1242224.234375, 1242225.193359375, - 1242225.537109375, 1242226.345703125, 1242226.9990234375, 1242227.599609375, 1242227.978515625, 1242228.5849609375, 1242228.962890625, 1242229.291015625, - 1242229.8154296875, 1242230.1708984375, 1242230.630859375, 1242230.9794921875, 1242231.3359375, 1242231.7421875, 1242232.041015625, 1242232.517578125, - 1242232.93359375, 1242233.2890625, 1242233.6767578125, 1242234.0703125, 1242234.4638671875, 1242234.9033203125, 1242235.23828125, 1242235.625, - 1242236.0126953125, 1242236.28125, 1242236.6396484375, 1242237.56640625, 1242239.478515625, 1242240.4189453125, 1242241.388671875, 1242242.35546875, - 1242244.2861328125, 1242245.2841796875, 1242246.279296875, 1242247.2900390625, 1242248.3251953125, 1242249.36328125, 1242250.736328125, 1242251.0703125, - 1242251.1640625, 1242251.921875, 1242252.546875, 1242253.5751953125, 1242254.6064453125, 1242255.6201171875, 1242256.626953125, 1242257.568359375, - 1242258.5009765625, 1242259.509765625, 1242260.5712890625, 1242261.142578125, 1242261.66796875, 1242262.72265625, 1242263.7890625, 1242264.869140625, - 1242265.951171875, 1242266.9794921875, 1242268.0087890625, 1242269.0380859375, 1242270.046875, 1242271.0712890625, 1242272.162109375, 1242273.3310546875, - 1242274.494140625, 1242275.6552734375, 1242276.802734375, 1242277.8896484375, 1242278.9677734375, 1242280.048828125, 1242281.115234375, 1242282.1796875, - 1242283.25, 1242284.296875, 1242285.30859375, 1242286.3388671875, 1242287.40625, 1242288.45703125, 1242289.4921875, 1242290.5458984375, - 1242291.5986328125, 1242292.62109375, 1242293.65625, 1242294.6943359375, 1242295.7236328125, 1242296.7744140625, 1242297.849609375, 1242298.5556640625, - 1242299.51953125, 1242300.2177734375, 1242301.1015625, 1242302.2080078125, 1242303.3037109375, 1242304.3857421875, 1242305.453125, 1242306.4921875, - 1242307.544921875, 1242308.609375, 1242309.6494140625, 1242310.6845703125, 1242311.732421875, 1242312.775390625, 1242313.8115234375, 1242314.8408203125, - 1242315.859375, 1242316.9033203125, 1242317.9716796875, 1242319.04296875, 1242320.0966796875, 1242321.1630859375, 1242322.1953125, 1242323.2197265625, - 1242324.2373046875, 1242325.2265625, 1242326.1767578125, 1242327.123046875, 1242328.013671875, 1242328.6884765625, 1242329.87109375, 1242330.8564453125, - 1242331.814453125, 1242332.830078125, 1242333.8212890625, 1242334.83203125, 1242335.818359375, 1242336.8076171875, 1242337.78515625, 1242338.7470703125, - 1242339.7216796875, 1242340.6982421875, 1242341.6806640625, 1242342.6708984375, 1242343.666015625, 1242344.6630859375, 1242345.685546875, 1242346.7275390625, - 1242347.77734375, 1242348.791015625, 1242349.7216796875, 1242350.5986328125, 1242351.5146484375, 1242352.513671875, 1242353.6279296875, 1242354.7880859375, - 1242355.931640625, 1242357.0771484375, 1242358.205078125, 1242359.259765625, 1242360.314453125, 1242361.353515625, 1242362.4091796875, 1242363.470703125, - 1242364.474609375, 1242365.4462890625, 1242366.568359375, 1242367.7119140625, 1242368.8740234375, 1242369.982421875, 1242369.982421875, 1242369.982421875, - 1242371, - 1242372.0, 1242373.0419921875, 1242374.0595703125, 1242375.05078125, 1242376.0244140625, 1242376.9765625, 1242378.0068359375, 1242379.0810546875, - 1242380.2138671875, 1242381.3935546875, 1242382.5712890625, 1242383.7431640625, 1242384.8720703125, 1242385.97265625, 1242387.052734375, 1242388.087890625, - 1242389.091796875, 1242390.1025390625, 1242391.1162109375, 1242392.1533203125, 1242393.1689453125, 1242394.20703125, 1242395.2685546875, 1242396.3369140625, - 1242397.40625, 1242398.4853515625, 1242399.5390625, 1242400.5693359375, 1242401.5380859375, 1242402.552734375, 1242403.6220703125, 1242404.7431640625, - 1242405.86328125, 1242407.0126953125, 1242408.162109375, 1242409.2705078125, 1242410.3994140625, 1242411.5, 1242412.537109375, 1242413.5380859375, - 1242414.4072265625, 1242415.48046875, 1242416.5419921875, 1242417.6337890625, 1242418.68359375, 1242419.787109375, 1242420.8564453125, 1242421.9287109375, - 1242423.005859375, 1242424.02734375, 1242425.076171875, 1242426.12109375, 1242427.1767578125, 1242428.25, 1242429.3076171875, 1242430.3662109375, - 1242431.41015625, 1242432.4521484375, 1242433.4482421875, 1242434.455078125, 1242435.5009765625, 1242436.58984375, 1242437.6796875, 1242438.79296875, - 1242439.8974609375, 1242441.0107421875, 1242442.1044921875, 1242443.228515625, 1242444.3642578125, 1242445.474609375, 1242446.5673828125, 1242447.328125, - 1242448.6318359375, 1242449.6572265625, 1242450.7001953125, 1242451.7587890625, 1242452.8447265625, 1242453.94140625, 1242455.126953125, 1242456.3349609375, - 1242457.541015625, 1242458.7265625, 1242459.9248046875, 1242461.1240234375, 1242462.2998046875, 1242463.4736328125, 1242464.650390625, 1242465.81640625, - 1242466.9931640625, 1242468.1953125, 1242469.3505859375, 1242470.5322265625, 1242471.7412109375, 1242472.94140625, 1242474.1318359375, 1242475.3251953125, - 1242476.5107421875, 1242477.6181640625, 1242478.712890625, 1242479.8349609375, 1242480.9765625, 1242482.10546875, 1242483.21875, 1242484.33984375, - 1242485.396484375, 1242486.486328125, 1242487.6201171875, 1242488.7890625, 1242489.9208984375, 1242491.0703125, 1242492.2373046875, 1242493.4111328125, - 1242494.5732421875, 1242495.7470703125, 1242496.919921875, 1242498.0927734375, 1242499.2978515625, 1242500.4833984375, 1242501.65234375, 1242502.84765625, - 1242504.0380859375, 1242505.185546875, 1242506.326171875, 1242507.306640625, 1242508.5546875, 1242509.6640625, 1242510.7578125, 1242511.8408203125, - 1242512.943359375, 1242514.0673828125, 1242515.19921875, 1242516.3330078125, 1242517.4306640625, 1242518.533203125, 1242519.6357421875, 1242520.7138671875, - 1242521.80859375, 1242522.91015625, 1242523.9892578125, 1242525.08984375, 1242526.20703125, 1242527.3232421875, 1242528.4365234375, 1242529.53515625, - 1242530.6279296875, 1242531.673828125, 1242532.7119140625, 1242533.759765625, 1242534.8017578125, 1242535.83203125, 1242536.8779296875, 1242537.9150390625, - 1242538.9453125, 1242539.982421875, 1242540.98828125, 1242542.01171875, 1242543.0478515625, 1242544.1103515625, 1242545.2109375, 1242546.3203125, - 1242547.4580078125, 1242548.6123046875, 1242549.7822265625, 1242550.9775390625, 1242552.1669921875, 1242553.3349609375, 1242554.5078125, 1242555.6220703125, - 1242556.63671875, 1242557.666015625, 1242558.77734375, 1242559.89453125, 1242561.0458984375, 1242562.2314453125, 1242563.38671875, 1242564.5478515625, - 1242565.7177734375, 1242566.87109375, 1242568.041015625, 1242569.2255859375, 1242570.392578125, 1242571.5810546875, 1242572.79296875, 1242573.93359375, - 1242575.0634765625, 1242576.2080078125, 1242577.33203125, 1242578.447265625, 1242579.5517578125, 1242580.6748046875, 1242581.8388671875, 1242582.9521484375, - 1242584.0771484375, 1242585.220703125, 1242586.34375, 1242587.474609375, 1242588.6162109375, 1242589.7529296875, 1242590.9287109375, 1242592.11328125, - 1242593.3251953125, 1242594.53515625, 1242595.7724609375, 1242596.9892578125, 1242598.1728515625, 1242599.3134765625, 1242600.4345703125, 1242601.4814453125, - 1242602.4345703125, 1242603.390625, 1242604.404296875, 1242605.4287109375, 1242606.44921875, 1242607.4765625, 1242608.5234375, 1242609.35546875, - 1242609.8701171875, 1242610.9150390625, 1242611.9345703125, 1242612.939453125, 1242613.8974609375, 1242614.3642578125, 1242615.4052734375, 1242616.30078125, - 1242617.1884765625, 1242618.3427734375, 1242619.396484375, 1242619.9580078125, 1242621.015625, 1242621.939453125, 1242622.609375, 1242623.1474609375, - 1242623.92578125, 1242624.7041015625, 1242625.482421875, 1242626.5693359375, 1242627.5361328125, 1242628.419921875, 1242629.4208984375, 1242630.4853515625, - 1242631.486328125, 1242632.6103515625, 1242633.177734375, 1242633.8720703125, 1242634.8076171875, 1242635.220703125, 1242636.041015625, 1242636.732421875, - 1242637.4638671875, 1242638.1318359375, 1242638.765625, 1242639.2099609375, 1242639.8291015625, 1242640.5673828125, 1242640.9833984375, 1242641.58203125, - 1242642.1806640625, 1242642.6279296875, 1242643.330078125, 1242643.92578125, 1242644.515625, 1242645.1103515625, 1242645.5888671875, 1242646.17578125, - 1242646.74609375, 1242647.3330078125, 1242647.9072265625, 1242648.5498046875, 1242649.166015625, 1242649.681640625, 1242650.4130859375, 1242651.2177734375, - 1242651.8798828125, 1242652.744140625, 1242653.45703125, 1242654.244140625, 1242654.9755859375, 1242655.544921875, 1242656.203125, 1242656.8857421875, - 1242657.6220703125, 1242658.3173828125, 1242659.0693359375, 1242659.779296875, 1242660.4892578125, 1242661.1982421875, 1242662.560546875, 1242662.869140625, - 1242663.185546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, - 1242959, - 1242960.0, 1242962.28515625, 1242963.3388671875, 1242964.3212890625, 1242965.3193359375, 1242966.2392578125, 1242967.150390625, 1242968.0263671875, - 1242969.041015625, 1242969.5400390625, 1242970.552734375, 1242971.1083984375, 1242972.1123046875, 1242973.158203125, 1242973.439453125, 1242973.9423828125, - 1242974.7841796875, 1242975.8095703125, 1242976.6220703125, 1242977.3203125, 1242978.3544921875, 1242979.2958984375, 1242980.1875, 1242981.12890625, - 1242982.130859375, 1242983.130859375, 1242984.1640625, 1242985.2080078125, 1242986.33203125, 1242987.5859375, 1242988.6240234375, 1242989.298828125, - 1242990.4794921875, 1242991.49609375, 1242992.0546875, 1242992.6044921875, 1242993.2138671875, 1242993.474609375, 1242994.2900390625, 1242994.9638671875, - 1242995.2333984375, 1242995.810546875, 1242996.0703125, 1242996.724609375, 1242997.26171875, 1242997.7607421875, 1242998.0234375, 1242998.400390625, - 1242998.8408203125, 1242999.455078125, 1242999.943359375, 1243000.59765625, 1243001.2041015625, 1243001.748046875, 1243002.2939453125, 1243002.8583984375, - 1243003.5771484375, 1243004.2158203125, 1243004.8154296875, 1243005.2958984375, 1243005.9736328125, 1243006.2998046875, 1243006.9052734375, 1243007.490234375, - 1243008.0478515625, 1243008.818359375, 1243009.2353515625, 1243009.9482421875, 1243010.71875, 1243011.47265625, 1243012.20703125, 1243012.9541015625, - 1243013.701171875, 1243014.4716796875, 1243015.236328125, 1243016.005859375, 1243016.6005859375, 1243017.5107421875, 1243018.248046875, 1243018.876953125, - 1243019.7783203125, 1243020.5439453125, 1243021.337890625, 1243022.1103515625, 1243022.931640625, 1243023.73046875, 1243024.5263671875, 1243025.3125, - 1243026.12890625, 1243026.6640625, 1243027.3427734375, 1243027.7578125, 1243028.578125, 1243029.4013671875, 1243030.1923828125, 1243031.0107421875, - 1243031.8251953125, 1243032.62890625, 1243033.40625, 1243034.197265625, 1243034.982421875, 1243035.8359375, 1243036.56640625, 1243037.3828125, - 1243038.197265625, 1243039.0830078125, 1243039.9013671875, 1243040.7587890625, 1243041.333984375, 1243042.330078125, 1243043.4169921875, 1243044.494140625, - 1243045.0302734375, 1243045.888671875, 1243046.4521484375, 1243047.0185546875, 1243047.5419921875, 1243048.1904296875, 1243048.619140625, 1243049.40234375, - 1243049.8798828125, 1243050.65625, 1243051.419921875, 1243052.0634765625, 1243052.9853515625, 1243053.783203125, 1243054.595703125, 1243055.4287109375, - 1243056.26171875, 1243057.1005859375, 1243057.92578125, 1243058.7275390625, 1243059.4921875, 1243060.2705078125, 1243061.0703125, 1243061.8583984375, - 1243062.6826171875, 1243063.5068359375, 1243064.3251953125, 1243065.146484375, 1243065.998046875, 1243066.880859375, 1243067.748046875, 1243068.626953125, - 1243069.509765625, 1243070.400390625, 1243071.251953125, 1243072.125, 1243072.984375, 1243073.86328125, 1243074.6982421875, 1243075.576171875, - 1243076.4404296875, 1243077.3369140625, 1243078.224609375, 1243079.2919921875, 1243079.97265625, 1243080.8681640625, 1243081.76953125, 1243082.71484375, - 1243083.6669921875, 1243084.6142578125, 1243085.5546875, 1243086.474609375, 1243087.390625, 1243088.2919921875, 1243089.197265625, 1243090.0693359375, - 1243090.9384765625, 1243091.8349609375, 1243092.751953125, 1243093.716796875, 1243094.640625, 1243095.576171875, 1243096.50390625, 1243097.400390625, - 1243098.2666015625, 1243099.16796875, 1243100.0771484375, 1243100.9423828125, 1243101.8251953125, 1243102.7099609375, 1243103.6357421875, 1243104.544921875, - 1243105.462890625, 1243106.357421875, 1243107.283203125, 1243108.162109375, 1243109.291015625, 1243109.92578125, 1243110.8173828125, 1243111.69921875, - 1243112.591796875, 1243113.484375, 1243114.3818359375, 1243115.3056640625, 1243116.1572265625, 1243117.0439453125, 1243117.9130859375, 1243118.759765625, - 1243119.619140625, 1243120.49609375, 1243121.3037109375, 1243122.15625, 1243122.9951171875, 1243123.8408203125, 1243124.6572265625, 1243125.5234375, - 1243126.4296875, 1243127.345703125, 1243128.24609375, 1243129.1162109375, 1243129.9873046875, 1243130.8427734375, 1243131.693359375, 1243132.537109375, - 1243133.392578125, 1243134.2099609375, 1243135.0498046875, 1243135.8857421875, 1243136.6962890625, 1243137.5595703125, 1243138.41015625, 1243139.1396484375, - 1243140.056640625, 1243141.23046875, 1243142.0625, 1243142.68359375, 1243143.3212890625, 1243144.1484375, 1243145.0078125, 1243145.8818359375, - 1243146.7666015625, 1243147.6484375, 1243148.5732421875, 1243149.482421875, 1243150.423828125, 1243151.373046875, 1243152.3349609375, 1243153.25, - 1243154.19140625, 1243155.1259765625, 1243156.0615234375, 1243157.0126953125, 1243157.9677734375, 1243158.9013671875, 1243159.8447265625, 1243160.779296875, - 1243161.6953125, 1243162.6357421875, 1243163.60546875, 1243164.5810546875, 1243165.5107421875, 1243166.4619140625, 1243167.3974609375, 1243168.33984375, - 1243169.1240234375, 1243170.2392578125, 1243171.1533203125, 1243172.0419921875, 1243172.9208984375, 1243173.6552734375, 1243174.66015625, 1243175.5439453125, - 1243176.466796875, 1243177.404296875, 1243178.35546875, 1243179.318359375, 1243180.25, 1243181.1796875, 1243182.0869140625, 1243183.0, - 1243183.9267578125, 1243184.849609375, 1243185.75, 1243186.6474609375, 1243187.546875, 1243188.4638671875, 1243189.3857421875, 1243190.2900390625, - 1243191.1982421875, 1243192.091796875, 1243192.978515625, 1243193.818359375, 1243194.638671875, 1243195.4541015625, 1243196.2802734375, 1243197.1318359375, - 1243198.0029296875, 1243198.8828125, 1243199.7529296875, 1243200.6591796875, 1243201.5380859375, 1243202.447265625, 1243203.3681640625, 1243204.236328125, - 1243205.1572265625, 1243206.103515625, 1243207.09765625, 1243208.09765625, 1243209.115234375, 1243210.1513671875, 1243211.1650390625, 1243212.1845703125, - 1243213.208984375, 1243214.201171875, 1243215.1787109375, 1243216.1171875, 1243217.0703125, 1243218.0224609375, 1243218.9775390625, 1243219.9580078125, - 1243220.9599609375, 1243221.953125, 1243222.8662109375, 1243223.7861328125, 1243224.69921875, 1243225.6396484375, 1243226.541015625, 1243227.4970703125, - 1243228.4462890625, 1243229.2880859375, 1243230.248046875, 1243231.1767578125, 1243232.1533203125, 1243233.0966796875, 1243234.033203125, 1243234.9755859375, - 1243235.919921875, 1243236.837890625, 1243237.71875, 1243238.6357421875, 1243239.5068359375, 1243240.43359375, 1243241.3515625, 1243242.26953125, - 1243243.107421875, 1243244.044921875, 1243244.9619140625, 1243245.94921875, 1243246.9560546875, 1243247.96484375, 1243249.080078125, 1243249.9404296875, - 1243250.89453125, 1243251.8291015625, 1243252.744140625, 1243253.6474609375, 1243254.55078125, 1243255.46484375, 1243256.3544921875, 1243257.2412109375, - 1243258.1591796875, 1243259.27734375, 1243260.03515625, 1243260.9609375, 1243261.9052734375, 1243262.791015625, 1243263.6513671875, 1243264.478515625, - 1243265.25, 1243266.01953125, 1243266.7841796875, 1243267.5302734375, 1243268.26953125, 1243269.0107421875, 1243269.751953125, 1243270.4755859375, - 1243271.1796875, 1243271.876953125, 1243272.5615234375, 1243273.2373046875, 1243273.9189453125, 1243274.591796875, 1243275.2490234375, 1243275.9033203125, - 1243276.595703125, 1243277.2861328125, 1243277.96484375, 1243278.626953125, 1243279.3115234375, 1243279.98046875, 1243280.6591796875, 1243281.3291015625, - 1243281.9873046875, 1243282.6435546875, 1243283.287109375, 1243283.9296875, 1243284.587890625, 1243285.2509765625, 1243285.904296875, 1243286.5712890625, - 1243287.228515625, 1243287.8857421875, 1243288.55859375, 1243289.1240234375, 1243289.76171875, 1243290.3994140625, 1243291.037109375, 1243291.6748046875, - 1243292.0361328125, 1243292.7470703125, 1243293.453125, 1243294.1689453125, 1243294.8798828125, 1243295.58203125, 1243296.2900390625, 1243296.9912109375, - 1243297.6904296875, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, -] +'''data.py: Contains various byte arrays which are reused in testing the FIT SDK.''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### + + +class Data: + '''Helper class that holds example fit files and byte arrays to be used for testing.''' + + fit_file_invalid = bytearray([ + 0x0E, 0x20, 0x9F, 0x03, 0x64, 0x00, 0x00, 0x00, + 0x2E, 0x99, 0x49, 0x54, 0xB9, 0xE3, 0x00, 0x00 + ]) + + fit_file_minimum = bytearray([ + 0x0E, 0x20, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x2E, 0x46, 0x49, 0x54, 0x8D, 0x48, 0x00, 0x00, + ]) + + fit_file_incorrect_data_size = bytearray([ + 0x0E, 0x20, 0x8B, 0x08, 0xFF, 0x00, 0x00, 0x00, + 0x2E, 0x46, 0x49, 0x54, 0x8D, 0x48, 0x00, 0x00, + ]) + + fit_file_short = bytearray([ + 0x0E, 0x20, 0x9F, 0x03, 0x64, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, + 0xB9, 0xE3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x04, 0x8C, 0x04, + 0x04, 0x86, 0x08, 0x14, 0x07, 0x01, 0x02, 0x84, 0x02, 0x02, 0x84, 0x05, + 0x02, 0x84, 0x06, 0x02, 0x84, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x40, 0x00, + 0x00, 0xD3, 0x00, 0x05, 0xFD, 0x04, 0x86, 0x03, 0x02, 0x84, 0x04, 0x02, + 0x84, 0x00, 0x01, 0x02, 0x01, 0x01, 0x02, 0x00, 0x00, 0xCA, 0x9A, 0x3B, + 0x32, 0x00, 0x37, 0x00, 0x2C, 0x2E, 0x87, 0x4F + ]) + + fit_file_short_new = bytearray([ + 0x0E, 0x20, 0x8B, 0x08, 0x24, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x8E, 0xA3, # File Header + 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition + 0x00, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message + 0x5D, 0xF2 # CRC + ]) + + fit_file_short_compressed_timestamp = bytearray([ + 0x0E, 0x20, 0x8B, 0x08, 0x24, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x8E, 0xA3, # File Header + 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition + 0x80, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message + 0x5D, 0xF2 + ]) + + fit_file_short_new_invalid_crc = bytearray([ + 0x0E, 0x20, 0x8B, 0x08, 0x24, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x8E, 0xA3, # File Header + 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition + 0x00, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message + 0xFF, 0xFF # CRC + ]) + + fit_file_short_none_array = bytearray([ + 0x0E, 0x20, 0x8B, 0x08, 0x24, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x8E, 0xA3, # File Header + 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition + 0x00, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # Message + 0x6C, 0x15 # CRC + ]) + + fit_file_short_with_wrong_field_def_size = bytearray([ + 0x0E, 0x20, 0x8B, 0x08, 0x21, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x8E, 0xA3, # File Header + 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x01, 0x86, 0x08, 0x0A, 0x07, # Message Definition + 0x00, 0x04, 0x01, 0x00, 0x12, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message + 0x65, 0xFE # CRC + ]) + + fit_file_arrays = bytearray([ + 0x0E, 0x20, 0x9F, 0x03, 0x32, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, + 0x3C, 0xF5, 0x40, 0x00, 0x01, 0x00, 0x00, 0x03, 0x01, 0x02, 0x84, 0x00, + 0x01, 0x00, 0x03, 0x04, 0x8C, 0x00, 0x00, 0xFF, 0x04, 0x00, 0x00, 0x30, + 0x39, 0x40, 0x00, 0x01, 0x00, 0x0C, 0x03, 0x03, 0x05, 0x07, 0x0A, 0x04, + 0x02, 0x13, 0x02, 0x00, 0x00, 0x54, 0x65, 0x73, 0x74, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0x05, 0x01, 0x5C, 0x21 + ]) + + fit_file_chained = bytearray([ + 0x0E, 0x20, 0x9F, 0x03, 0x64, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, + 0xB9, 0xE3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x04, 0x8C, 0x04, + 0x04, 0x86, 0x08, 0x14, 0x07, 0x01, 0x02, 0x84, 0x02, 0x02, 0x84, 0x05, + 0x02, 0x84, 0x06, 0x02, 0x84, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x40, 0x00, + 0x00, 0xD3, 0x00, 0x05, 0xFD, 0x04, 0x86, 0x03, 0x02, 0x84, 0x04, 0x02, + 0x84, 0x00, 0x01, 0x02, 0x01, 0x01, 0x02, 0x00, 0x00, 0xCA, 0x9A, 0x3B, + 0x32, 0x00, 0x37, 0x00, 0x2C, 0x2E, 0x7C, 0xD5, + 0x0E, 0x20, 0x9F, 0x03, 0x64, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, + 0xB9, 0xE3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x04, 0x8C, 0x04, + 0x04, 0x86, 0x08, 0x14, 0x07, 0x01, 0x02, 0x84, 0x02, 0x02, 0x84, 0x05, + 0x02, 0x84, 0x06, 0x02, 0x84, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x40, 0x00, + 0x00, 0xD3, 0x00, 0x05, 0xFD, 0x04, 0x86, 0x03, 0x02, 0x84, 0x04, 0x02, + 0x84, 0x00, 0x01, 0x02, 0x01, 0x01, 0x02, 0x00, 0x00, 0xCA, 0x9A, 0x3B, + 0x32, 0x00, 0x37, 0x00, 0x2C, 0x2E, 0x7C, 0xD5 + ]) + + fit_file_800m_repeats_little_endian = bytearray([ + 0x0E, 0x10, 0x8D, 0x08, 0xDB, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, + 0xDE, 0xB8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, + 0x02, 0x84, 0x02, 0x02, 0x84, 0x04, 0x04, 0x86, 0x03, 0x04, 0x8C, 0x00, + 0x05, 0xFF, 0x00, 0x00, 0x00, 0x12, 0xAD, 0x66, 0x3D, 0x38, 0xB6, 0xC1, + 0x0A, 0x40, 0x00, 0x00, 0x1A, 0x00, 0x04, 0x08, 0x15, 0x07, 0x04, 0x01, + 0x00, 0x0B, 0x01, 0x00, 0x06, 0x02, 0x84, 0x00, 0x52, 0x75, 0x6E, 0x6E, + 0x69, 0x6E, 0x67, 0x20, 0x38, 0x30, 0x30, 0x6D, 0x20, 0x52, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x73, 0x00, 0x01, 0xFF, 0x05, 0x00, 0x40, 0x00, 0x00, + 0x1B, 0x00, 0x08, 0x02, 0x04, 0x86, 0xFE, 0x02, 0x84, 0x07, 0x01, 0x00, + 0x01, 0x01, 0x00, 0x03, 0x01, 0x00, 0x04, 0x04, 0x86, 0x05, 0x04, 0x86, + 0x06, 0x04, 0x86, 0x00, 0x80, 0x1A, 0x06, 0x00, 0x00, 0x00, 0x02, 0x01, + 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x38, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x4E, 0x00, 0x00, 0x02, 0x00, 0x01, 0x01, 0x01, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x03, 0x00, 0xFF, 0x06, 0x02, 0x05, 0x00, 0x00, 0x00, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xA0, 0x86, 0x01, 0x00, + 0x04, 0x00, 0x03, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xAE, 0xC4 + ]) + + fit_file_800m_repeats_big_endian = bytearray([ + 0x0E, 0x20, 0x9F, 0x03, 0xDB, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, + 0xF2, 0xD7, 0x40, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, + 0x02, 0x84, 0x02, 0x02, 0x84, 0x04, 0x04, 0x86, 0x03, 0x04, 0x8C, 0x00, + 0x05, 0x00, 0xFF, 0x00, 0x00, 0x3D, 0x66, 0xAD, 0x12, 0x0A, 0xC1, 0xB6, + 0x38, 0x40, 0x00, 0x01, 0x00, 0x1A, 0x04, 0x08, 0x15, 0x07, 0x04, 0x01, + 0x00, 0x0B, 0x01, 0x00, 0x06, 0x02, 0x84, 0x00, 0x52, 0x75, 0x6E, 0x6E, + 0x69, 0x6E, 0x67, 0x20, 0x38, 0x30, 0x30, 0x6D, 0x20, 0x52, 0x65, 0x70, + 0x65, 0x61, 0x74, 0x73, 0x00, 0x01, 0xFF, 0x00, 0x05, 0x40, 0x00, 0x01, + 0x00, 0x1B, 0x08, 0x02, 0x04, 0x86, 0xFE, 0x02, 0x84, 0x07, 0x01, 0x00, + 0x01, 0x01, 0x00, 0x03, 0x01, 0x00, 0x04, 0x04, 0x86, 0x05, 0x04, 0x86, + 0x06, 0x04, 0x86, 0x00, 0x00, 0x06, 0x1A, 0x80, 0x00, 0x00, 0x02, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x38, 0x80, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4E, 0x20, 0x00, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x03, 0xFF, 0x06, 0x02, 0x00, 0x00, 0x00, 0x05, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x86, 0xA0, + 0x00, 0x04, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x67 + ]) + + fit_file_dev_data_missing_field_description = bytearray([ + 0x0E, 0x20, 0x64, 0x00, 0xD1, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, + 0x12, 0x7E, 0x40, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, + 0x02, 0x84, 0x02, 0x02, 0x84, 0x04, 0x04, 0x86, 0x03, 0x04, 0x8C, 0x00, + 0x04, 0x00, 0xFF, 0x00, 0x00, 0x3D, 0x5D, 0x38, 0xBD, 0x1E, 0x29, 0x25, + 0x9B, 0x60, 0x00, 0x01, 0x00, 0x14, 0x09, 0xFD, 0x04, 0x86, 0x05, 0x04, + 0x86, 0x06, 0x02, 0x84, 0x03, 0x01, 0x02, 0x04, 0x01, 0x02, 0x07, 0x02, + 0x84, 0x02, 0x02, 0x84, 0x00, 0x04, 0x85, 0x01, 0x04, 0x85, 0x01, 0x01, + 0x01, 0x00, 0x00, 0x3D, 0x5D, 0x38, 0xBD, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xE8, 0x7E, 0x00, 0x00, 0x96, 0x07, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7E, 0x00, 0x3D, 0x5D, 0x38, 0xBE, 0x00, 0x00, 0x00, + 0x64, 0x03, 0xE8, 0x86, 0x01, 0x00, 0x96, 0x07, 0x4E, 0x7F, 0xFF, 0xFF, + 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x86, 0x00, 0x3D, 0x5D, 0x38, 0xBF, 0x00, + 0x00, 0x00, 0xC8, 0x03, 0xE8, 0x8E, 0x02, 0x00, 0x96, 0x07, 0x53, 0x7F, + 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x8E, 0x00, 0x3D, 0x5D, 0x38, + 0xC0, 0x00, 0x00, 0x01, 0x2C, 0x03, 0xE8, 0x96, 0x03, 0x00, 0x96, 0x07, + 0x58, 0x7F, 0xFF, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0x96, 0x40, 0x00, + 0x01, 0x00, 0x22, 0x04, 0xFD, 0x04, 0x86, 0x01, 0x02, 0x84, 0x05, 0x04, + 0x86, 0x00, 0x04, 0x86, 0x00, 0x3D, 0x5D, 0x46, 0xCD, 0x00, 0x01, 0x3D, + 0x5C, 0xF2, 0x6D, 0x00, 0x36, 0xEE, 0x80, 0x78, 0x3B + ]) + + fit_file_short_multibyte_dev_data = bytearray([ + 0x0E, 0x20, 0xB9, 0x52, 0x3F, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, + 0xED, 0x8A, 0x40, 0x00, 0x01, 0x00, 0xCF, 0x01, 0x03, 0x01, 0x02, 0x00, + 0x00, 0x40, 0x00, 0x01, 0x00, 0xCE, 0x05, 0x00, 0x01, 0x02, 0x01, 0x01, + 0x02, 0x02, 0x01, 0x02, 0x08, 0x07, 0x07, 0x0E, 0x02, 0x84, 0x00, 0x00, + 0x00, 0x84, 0x70, 0x6F, 0x69, 0x6E, 0x74, 0x73, 0x00, 0x00, 0x12, 0x60, + 0x00, 0x01, 0x00, 0x12, 0x01, 0xFE, 0x02, 0x84, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x04, 0xD2, 0x97, 0x59 + ]) + + fit_file_monitoring = bytearray([ + 0x0E, 0x10, 0x28, 0x23, 0x37, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, + 0x2C, 0xC6, 0x41, 0x00, 0x01, 0x00, 0x37, 0x03, 0xFD, 0x04, 0x86, 0x18, + 0x01, 0x0D, 0x03, 0x04, 0x86, 0x01, 0x3F, 0x2A, 0xE2, 0xFF, 0x61, 0x00, + 0x00, 0x00, 0x14, 0x01, 0x3F, 0x2A, 0xE2, 0xFF, 0x06, 0x00, 0x00, 0x00, + 0x3C, 0x01, 0x3F, 0x2A, 0xE2, 0xFF, 0x1E, 0x00, 0x00, 0x00, 0x1E, 0x01, + 0x3F, 0x2A, 0xE2, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x1E, 0xED, 0xF9 + ]) + + fit_file_messages_with_no_fields = bytearray([ + 0x0E, 0x20, 0x84, 0x52, 0x44, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, + 0x3A, 0x18, 0x40, 0x00, 0x01, 0x00, 0x69, 0x00, 0x41, 0x00, 0x01, 0x00, + 0x00, 0x07, 0x03, 0x04, 0x8C, 0x04, 0x04, 0x86, 0x01, 0x02, 0x84, 0x02, + 0x02, 0x84, 0x05, 0x02, 0x84, 0x00, 0x01, 0x00, 0xFB, 0x01, 0x0D, 0x01, + 0xCD, 0xC3, 0x1F, 0xAE, 0x3F, 0x92, 0x50, 0x78, 0x00, 0x01, 0x10, 0x22, + 0x00, 0x00, 0x20, 0xFF, 0x00, 0x01, 0xCD, 0xC3, 0x1F, 0xAE, 0x3F, 0x92, + 0x50, 0x78, 0x00, 0x01, 0x10, 0x22, 0x00, 0x00, 0x20, 0xFF, 0x25, 0xFB + ]) + + fit_file_accumulated_components = bytearray([ + 0x0E, 0x20, 0xE8, 0x03, 0x0F, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, + 0x4D, 0x89, 0x40, 0x00, 0x00, 0x14, 0x00, 0x01, 0x12, 0x01, 0x02, 0x00, + 0xFE, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x7D + ]) + + fit_file_compressed_speed_distance = bytearray([ + 0x0E, 0x20, 0xE8, 0x03, 0x11, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, + 0xCD, 0x09, 0x40, 0x00, 0x00, 0x14, 0x00, 0x01, 0x08, 0x03, 0x0D, 0x00, + 0x8B, 0x00, 0x08, 0x00, 0xF9, 0x00, 0x14, 0x50, 0x0B + ]) + + fit_file_compressed_speed_distance_with_initial_distance = bytearray([ + 0x0E, 0x20, 0xE8, 0x03, 0x1F, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, + 0x4C, 0x85, 0x40, 0x00, 0x00, 0x14, 0x00, 0x01, 0x05, 0x04, 0x86, 0x00, + 0xC8, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x14, 0x00, 0x01, 0x08, 0x03, + 0x0D, 0x00, 0x8B, 0x00, 0x08, 0x00, 0xF9, 0x00, 0x14, 0x65, 0xB1 + ]) + + fit_file_short_invalid_header = bytearray([ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, # File Header + 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition + 0x00, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message + 0x5D, 0xF2 + ]) # CRC + + fit_file_short_data_only = bytearray([ + 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition + 0x00, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message + 0x5D, 0xF2 + ]) # CRC + + fit_file_short_invalid_CRC = bytearray([ + 0x0E, 0x20, 0x8B, 0x08, 0x24, 0x00, 0x00, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x8E, 0xA3, # File Header + 0x40, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x02, 0x84, 0x04, 0x04, 0x86, 0x08, 0x0A, 0x07, # Message Definition + 0x00, 0x04, 0x01, 0x00, 0x00, 0xCA, 0x9A, 0x3B, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x00, # Message + 0x00, 0x00 + ]) # CRC + + gear_change_data = [ + { + "timestamp": 1024873717, + "rear_gear_num": 5, + "rear_gear": 24, + "front_gear_num": 255, + "front_gear": 22, + "data": 385816581, + "gear_change_data": 385816581 + }, + { + "timestamp": 1024873760, + "rear_gear_num": 6, + "rear_gear": 21, + "front_gear_num": 255, + "front_gear": None, + "data": 16717062, + "gear_change_data": 16717062 + }, + { + "timestamp": 1024873819, + "rear_gear_num": 7, + "rear_gear": 19, + "front_gear_num": 255, + "front_gear": None, + "data": 16716551, + "gear_change_data": 16716551 + }, + { + "timestamp": 1024873850, + "rear_gear_num": 6, + "rear_gear": 21, + "front_gear_num": 255, + "front_gear": None, + "data": 16717062, + "gear_change_data": 16717062 + }, + { + "timestamp": 1024874601, + "rear_gear_num": 7, + "rear_gear": 19, + "front_gear_num": 255, + "front_gear": None, + "data": 16716551, + "gear_change_data": 16716551 + }, + { + "timestamp": 1024874624, + "rear_gear_num": 8, + "rear_gear": 17, + "front_gear_num": 255, + "front_gear": None, + "data": 16716040, + "gear_change_data": 16716040 + }, + { + "timestamp": 1024874694, + "rear_gear_num": 7, + "rear_gear": 19, + "front_gear_num": 255, + "front_gear": None, + "data": 16716551, + "gear_change_data": 16716551 + }, + { + "timestamp": 1024874698, + "rear_gear_num": 6, + "rear_gear": 21, + "front_gear_num": 255, + "front_gear": None, + "data": 16717062, + "gear_change_data": 16717062 + }, + { + "timestamp": 1024874727, + "rear_gear_num": 7, + "rear_gear": 19, + "front_gear_num": 255, + "front_gear": None, + "data": 16716551, + "gear_change_data": 16716551 + }, + { + "timestamp": 1024874755, + "rear_gear_num": 8, + "rear_gear": 17, + "front_gear_num": 255, + "front_gear": None, + "data": 16716040, + "gear_change_data": 16716040 + }, + { + "timestamp": 1024874824, + "rear_gear_num": 7, + "rear_gear": 19, + "front_gear_num": 255, + "front_gear": None, + "data": 16716551, + "gear_change_data": 16716551 + }, + { + "timestamp": 1024874829, + "rear_gear_num": 6, + "rear_gear": 21, + "front_gear_num": 255, + "front_gear": None, + "data": 16717062, + "gear_change_data": 16717062 + }, + { + "timestamp": 1024874864, + "rear_gear_num": 7, + "rear_gear": 19, + "front_gear_num": 255, + "front_gear": None, + "data": 16716551, + "gear_change_data": 16716551 + }, + { + "timestamp": 1024874913, + "rear_gear_num": 6, + "rear_gear": 21, + "front_gear_num": 255, + "front_gear": None, + "data": 16717062, + "gear_change_data": 16717062 + }, + { + "timestamp": 1024874927, + "rear_gear_num": 4, + "rear_gear": 27, + "front_gear_num": 255, + "front_gear": None, + "data": 16718596, + "gear_change_data": 16718596 + }, + { + "timestamp": 1024875097, + "rear_gear_num": 5, + "rear_gear": 24, + "front_gear_num": 255, + "front_gear": None, + "data": 16717829, + "gear_change_data": 16717829 + }, + { + "timestamp": 1024875097, + "rear_gear_num": 6, + "rear_gear": 21, + "front_gear_num": 255, + "front_gear": None, + "data": 16717062, + "gear_change_data": 16717062 + }, + { + "timestamp": 1024875111, + "rear_gear_num": 5, + "rear_gear": 24, + "front_gear_num": 255, + "front_gear": None, + "data": 16717829, + "gear_change_data": 16717829 + }, + { + "timestamp": 1024875126, + "rear_gear_num": 4, + "rear_gear": 27, + "front_gear_num": 255, + "front_gear": None, + "data": 16718596, + "gear_change_data": 16718596 + }, + { + "timestamp": 1024875251, + "rear_gear_num": 3, + "rear_gear": 31, + "front_gear_num": 255, + "front_gear": None, + "data": 16719619, + "gear_change_data": 16719619 + }, + { + "timestamp": 1024875265, + "rear_gear_num": 4, + "rear_gear": 27, + "front_gear_num": 255, + "front_gear": None, + "data": 16718596, + "gear_change_data": 16718596 + }, + { + "timestamp": 1024875271, + "rear_gear_num": 5, + "rear_gear": 24, + "front_gear_num": 255, + "front_gear": None, + "data": 16717829, + "gear_change_data": 16717829 + }, + { + "timestamp": 1024875291, + "rear_gear_num": 6, + "rear_gear": 21, + "front_gear_num": 255, + "front_gear": None, + "data": 16717062, + "gear_change_data": 16717062 + }, + { + "timestamp": 1024875364, + "rear_gear_num": 7, + "rear_gear": 19, + "front_gear_num": 255, + "front_gear": None, + "data": 16716551, + "gear_change_data": 16716551 + }, + { + "timestamp": 1024875388, + "rear_gear_num": 8, + "rear_gear": 17, + "front_gear_num": 255, + "front_gear": None, + "data": 16716040, + "gear_change_data": 16716040 + }, + { + "timestamp": 1024875423, + "rear_gear_num": 9, + "rear_gear": 15, + "front_gear_num": 255, + "front_gear": None, + "data": 16715529, + "gear_change_data": 16715529 + }, + { + "timestamp": 1024875515, + "rear_gear_num": 8, + "rear_gear": 17, + "front_gear_num": 255, + "front_gear": None, + "data": 16716040, + "gear_change_data": 16716040 + }, + { + "timestamp": 1024875589, + "rear_gear_num": 7, + "rear_gear": 19, + "front_gear_num": 255, + "front_gear": None, + "data": 16716551, + "gear_change_data": 16716551 + }, + { + "timestamp": 1024875615, + "rear_gear_num": 8, + "rear_gear": 17, + "front_gear_num": 255, + "front_gear": None, + "data": 16716040, + "gear_change_data": 16716040 + }, + { + "timestamp": 1024875616, + "rear_gear_num": 9, + "rear_gear": 15, + "front_gear_num": 255, + "front_gear": None, + "data": 16715529, + "gear_change_data": 16715529 + }, + { + "timestamp": 1024875621, + "rear_gear_num": 10, + "rear_gear": 13, + "front_gear_num": 255, + "front_gear": None, + "data": 16715018, + "gear_change_data": 16715018 + }, + { + "timestamp": 1024875622, + "rear_gear_num": 11, + "rear_gear": 11, + "front_gear_num": 255, + "front_gear": None, + "data": 16714507, + "gear_change_data": 16714507 + }, + { + "timestamp": 1024875651, + "rear_gear_num": 9, + "rear_gear": 15, + "front_gear_num": 255, + "front_gear": None, + "data": 16715529, + "gear_change_data": 16715529 + }, + { + "timestamp": 1024875658, + "rear_gear_num": 8, + "rear_gear": 17, + "front_gear_num": 255, + "front_gear": None, + "data": 16716040, + "gear_change_data": 16716040 + }, + { + "timestamp": 1024875658, + "rear_gear_num": 7, + "rear_gear": 19, + "front_gear_num": 255, + "front_gear": None, + "data": 16716551, + "gear_change_data": 16716551 + }, + { + "timestamp": 1024875665, + "rear_gear_num": 6, + "rear_gear": 21, + "front_gear_num": 255, + "front_gear": None, + "data": 16717062, + "gear_change_data": 16717062 + }, + { + "timestamp": 1024875695, + "rear_gear_num": 6, + "rear_gear": 21, + "front_gear_num": 255, + "front_gear": 22, + "data": 385815814, + "gear_change_data": 385815814 + } +] + + hrm_plugin_test_activity_expected = [ + 1242209, + 1242212.0, 1242213.7314453125, 1242215.5029296875, 1242215.865234375, 1242216.9541015625, 1242218.3369140625, 1242219.6220703125, 1242219.9853515625, + 1242220.71875, 1242221.2607421875, 1242221.83203125, 1242222.103515625, 1242222.970703125, 1242223.849609375, 1242224.234375, 1242225.193359375, + 1242225.537109375, 1242226.345703125, 1242226.9990234375, 1242227.599609375, 1242227.978515625, 1242228.5849609375, 1242228.962890625, 1242229.291015625, + 1242229.8154296875, 1242230.1708984375, 1242230.630859375, 1242230.9794921875, 1242231.3359375, 1242231.7421875, 1242232.041015625, 1242232.517578125, + 1242232.93359375, 1242233.2890625, 1242233.6767578125, 1242234.0703125, 1242234.4638671875, 1242234.9033203125, 1242235.23828125, 1242235.625, + 1242236.0126953125, 1242236.28125, 1242236.6396484375, 1242237.56640625, 1242239.478515625, 1242240.4189453125, 1242241.388671875, 1242242.35546875, + 1242244.2861328125, 1242245.2841796875, 1242246.279296875, 1242247.2900390625, 1242248.3251953125, 1242249.36328125, 1242250.736328125, 1242251.0703125, + 1242251.1640625, 1242251.921875, 1242252.546875, 1242253.5751953125, 1242254.6064453125, 1242255.6201171875, 1242256.626953125, 1242257.568359375, + 1242258.5009765625, 1242259.509765625, 1242260.5712890625, 1242261.142578125, 1242261.66796875, 1242262.72265625, 1242263.7890625, 1242264.869140625, + 1242265.951171875, 1242266.9794921875, 1242268.0087890625, 1242269.0380859375, 1242270.046875, 1242271.0712890625, 1242272.162109375, 1242273.3310546875, + 1242274.494140625, 1242275.6552734375, 1242276.802734375, 1242277.8896484375, 1242278.9677734375, 1242280.048828125, 1242281.115234375, 1242282.1796875, + 1242283.25, 1242284.296875, 1242285.30859375, 1242286.3388671875, 1242287.40625, 1242288.45703125, 1242289.4921875, 1242290.5458984375, + 1242291.5986328125, 1242292.62109375, 1242293.65625, 1242294.6943359375, 1242295.7236328125, 1242296.7744140625, 1242297.849609375, 1242298.5556640625, + 1242299.51953125, 1242300.2177734375, 1242301.1015625, 1242302.2080078125, 1242303.3037109375, 1242304.3857421875, 1242305.453125, 1242306.4921875, + 1242307.544921875, 1242308.609375, 1242309.6494140625, 1242310.6845703125, 1242311.732421875, 1242312.775390625, 1242313.8115234375, 1242314.8408203125, + 1242315.859375, 1242316.9033203125, 1242317.9716796875, 1242319.04296875, 1242320.0966796875, 1242321.1630859375, 1242322.1953125, 1242323.2197265625, + 1242324.2373046875, 1242325.2265625, 1242326.1767578125, 1242327.123046875, 1242328.013671875, 1242328.6884765625, 1242329.87109375, 1242330.8564453125, + 1242331.814453125, 1242332.830078125, 1242333.8212890625, 1242334.83203125, 1242335.818359375, 1242336.8076171875, 1242337.78515625, 1242338.7470703125, + 1242339.7216796875, 1242340.6982421875, 1242341.6806640625, 1242342.6708984375, 1242343.666015625, 1242344.6630859375, 1242345.685546875, 1242346.7275390625, + 1242347.77734375, 1242348.791015625, 1242349.7216796875, 1242350.5986328125, 1242351.5146484375, 1242352.513671875, 1242353.6279296875, 1242354.7880859375, + 1242355.931640625, 1242357.0771484375, 1242358.205078125, 1242359.259765625, 1242360.314453125, 1242361.353515625, 1242362.4091796875, 1242363.470703125, + 1242364.474609375, 1242365.4462890625, 1242366.568359375, 1242367.7119140625, 1242368.8740234375, 1242369.982421875, 1242369.982421875, 1242369.982421875, + 1242371, + 1242372.0, 1242373.0419921875, 1242374.0595703125, 1242375.05078125, 1242376.0244140625, 1242376.9765625, 1242378.0068359375, 1242379.0810546875, + 1242380.2138671875, 1242381.3935546875, 1242382.5712890625, 1242383.7431640625, 1242384.8720703125, 1242385.97265625, 1242387.052734375, 1242388.087890625, + 1242389.091796875, 1242390.1025390625, 1242391.1162109375, 1242392.1533203125, 1242393.1689453125, 1242394.20703125, 1242395.2685546875, 1242396.3369140625, + 1242397.40625, 1242398.4853515625, 1242399.5390625, 1242400.5693359375, 1242401.5380859375, 1242402.552734375, 1242403.6220703125, 1242404.7431640625, + 1242405.86328125, 1242407.0126953125, 1242408.162109375, 1242409.2705078125, 1242410.3994140625, 1242411.5, 1242412.537109375, 1242413.5380859375, + 1242414.4072265625, 1242415.48046875, 1242416.5419921875, 1242417.6337890625, 1242418.68359375, 1242419.787109375, 1242420.8564453125, 1242421.9287109375, + 1242423.005859375, 1242424.02734375, 1242425.076171875, 1242426.12109375, 1242427.1767578125, 1242428.25, 1242429.3076171875, 1242430.3662109375, + 1242431.41015625, 1242432.4521484375, 1242433.4482421875, 1242434.455078125, 1242435.5009765625, 1242436.58984375, 1242437.6796875, 1242438.79296875, + 1242439.8974609375, 1242441.0107421875, 1242442.1044921875, 1242443.228515625, 1242444.3642578125, 1242445.474609375, 1242446.5673828125, 1242447.328125, + 1242448.6318359375, 1242449.6572265625, 1242450.7001953125, 1242451.7587890625, 1242452.8447265625, 1242453.94140625, 1242455.126953125, 1242456.3349609375, + 1242457.541015625, 1242458.7265625, 1242459.9248046875, 1242461.1240234375, 1242462.2998046875, 1242463.4736328125, 1242464.650390625, 1242465.81640625, + 1242466.9931640625, 1242468.1953125, 1242469.3505859375, 1242470.5322265625, 1242471.7412109375, 1242472.94140625, 1242474.1318359375, 1242475.3251953125, + 1242476.5107421875, 1242477.6181640625, 1242478.712890625, 1242479.8349609375, 1242480.9765625, 1242482.10546875, 1242483.21875, 1242484.33984375, + 1242485.396484375, 1242486.486328125, 1242487.6201171875, 1242488.7890625, 1242489.9208984375, 1242491.0703125, 1242492.2373046875, 1242493.4111328125, + 1242494.5732421875, 1242495.7470703125, 1242496.919921875, 1242498.0927734375, 1242499.2978515625, 1242500.4833984375, 1242501.65234375, 1242502.84765625, + 1242504.0380859375, 1242505.185546875, 1242506.326171875, 1242507.306640625, 1242508.5546875, 1242509.6640625, 1242510.7578125, 1242511.8408203125, + 1242512.943359375, 1242514.0673828125, 1242515.19921875, 1242516.3330078125, 1242517.4306640625, 1242518.533203125, 1242519.6357421875, 1242520.7138671875, + 1242521.80859375, 1242522.91015625, 1242523.9892578125, 1242525.08984375, 1242526.20703125, 1242527.3232421875, 1242528.4365234375, 1242529.53515625, + 1242530.6279296875, 1242531.673828125, 1242532.7119140625, 1242533.759765625, 1242534.8017578125, 1242535.83203125, 1242536.8779296875, 1242537.9150390625, + 1242538.9453125, 1242539.982421875, 1242540.98828125, 1242542.01171875, 1242543.0478515625, 1242544.1103515625, 1242545.2109375, 1242546.3203125, + 1242547.4580078125, 1242548.6123046875, 1242549.7822265625, 1242550.9775390625, 1242552.1669921875, 1242553.3349609375, 1242554.5078125, 1242555.6220703125, + 1242556.63671875, 1242557.666015625, 1242558.77734375, 1242559.89453125, 1242561.0458984375, 1242562.2314453125, 1242563.38671875, 1242564.5478515625, + 1242565.7177734375, 1242566.87109375, 1242568.041015625, 1242569.2255859375, 1242570.392578125, 1242571.5810546875, 1242572.79296875, 1242573.93359375, + 1242575.0634765625, 1242576.2080078125, 1242577.33203125, 1242578.447265625, 1242579.5517578125, 1242580.6748046875, 1242581.8388671875, 1242582.9521484375, + 1242584.0771484375, 1242585.220703125, 1242586.34375, 1242587.474609375, 1242588.6162109375, 1242589.7529296875, 1242590.9287109375, 1242592.11328125, + 1242593.3251953125, 1242594.53515625, 1242595.7724609375, 1242596.9892578125, 1242598.1728515625, 1242599.3134765625, 1242600.4345703125, 1242601.4814453125, + 1242602.4345703125, 1242603.390625, 1242604.404296875, 1242605.4287109375, 1242606.44921875, 1242607.4765625, 1242608.5234375, 1242609.35546875, + 1242609.8701171875, 1242610.9150390625, 1242611.9345703125, 1242612.939453125, 1242613.8974609375, 1242614.3642578125, 1242615.4052734375, 1242616.30078125, + 1242617.1884765625, 1242618.3427734375, 1242619.396484375, 1242619.9580078125, 1242621.015625, 1242621.939453125, 1242622.609375, 1242623.1474609375, + 1242623.92578125, 1242624.7041015625, 1242625.482421875, 1242626.5693359375, 1242627.5361328125, 1242628.419921875, 1242629.4208984375, 1242630.4853515625, + 1242631.486328125, 1242632.6103515625, 1242633.177734375, 1242633.8720703125, 1242634.8076171875, 1242635.220703125, 1242636.041015625, 1242636.732421875, + 1242637.4638671875, 1242638.1318359375, 1242638.765625, 1242639.2099609375, 1242639.8291015625, 1242640.5673828125, 1242640.9833984375, 1242641.58203125, + 1242642.1806640625, 1242642.6279296875, 1242643.330078125, 1242643.92578125, 1242644.515625, 1242645.1103515625, 1242645.5888671875, 1242646.17578125, + 1242646.74609375, 1242647.3330078125, 1242647.9072265625, 1242648.5498046875, 1242649.166015625, 1242649.681640625, 1242650.4130859375, 1242651.2177734375, + 1242651.8798828125, 1242652.744140625, 1242653.45703125, 1242654.244140625, 1242654.9755859375, 1242655.544921875, 1242656.203125, 1242656.8857421875, + 1242657.6220703125, 1242658.3173828125, 1242659.0693359375, 1242659.779296875, 1242660.4892578125, 1242661.1982421875, 1242662.560546875, 1242662.869140625, + 1242663.185546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, + 1242959, + 1242960.0, 1242962.28515625, 1242963.3388671875, 1242964.3212890625, 1242965.3193359375, 1242966.2392578125, 1242967.150390625, 1242968.0263671875, + 1242969.041015625, 1242969.5400390625, 1242970.552734375, 1242971.1083984375, 1242972.1123046875, 1242973.158203125, 1242973.439453125, 1242973.9423828125, + 1242974.7841796875, 1242975.8095703125, 1242976.6220703125, 1242977.3203125, 1242978.3544921875, 1242979.2958984375, 1242980.1875, 1242981.12890625, + 1242982.130859375, 1242983.130859375, 1242984.1640625, 1242985.2080078125, 1242986.33203125, 1242987.5859375, 1242988.6240234375, 1242989.298828125, + 1242990.4794921875, 1242991.49609375, 1242992.0546875, 1242992.6044921875, 1242993.2138671875, 1242993.474609375, 1242994.2900390625, 1242994.9638671875, + 1242995.2333984375, 1242995.810546875, 1242996.0703125, 1242996.724609375, 1242997.26171875, 1242997.7607421875, 1242998.0234375, 1242998.400390625, + 1242998.8408203125, 1242999.455078125, 1242999.943359375, 1243000.59765625, 1243001.2041015625, 1243001.748046875, 1243002.2939453125, 1243002.8583984375, + 1243003.5771484375, 1243004.2158203125, 1243004.8154296875, 1243005.2958984375, 1243005.9736328125, 1243006.2998046875, 1243006.9052734375, 1243007.490234375, + 1243008.0478515625, 1243008.818359375, 1243009.2353515625, 1243009.9482421875, 1243010.71875, 1243011.47265625, 1243012.20703125, 1243012.9541015625, + 1243013.701171875, 1243014.4716796875, 1243015.236328125, 1243016.005859375, 1243016.6005859375, 1243017.5107421875, 1243018.248046875, 1243018.876953125, + 1243019.7783203125, 1243020.5439453125, 1243021.337890625, 1243022.1103515625, 1243022.931640625, 1243023.73046875, 1243024.5263671875, 1243025.3125, + 1243026.12890625, 1243026.6640625, 1243027.3427734375, 1243027.7578125, 1243028.578125, 1243029.4013671875, 1243030.1923828125, 1243031.0107421875, + 1243031.8251953125, 1243032.62890625, 1243033.40625, 1243034.197265625, 1243034.982421875, 1243035.8359375, 1243036.56640625, 1243037.3828125, + 1243038.197265625, 1243039.0830078125, 1243039.9013671875, 1243040.7587890625, 1243041.333984375, 1243042.330078125, 1243043.4169921875, 1243044.494140625, + 1243045.0302734375, 1243045.888671875, 1243046.4521484375, 1243047.0185546875, 1243047.5419921875, 1243048.1904296875, 1243048.619140625, 1243049.40234375, + 1243049.8798828125, 1243050.65625, 1243051.419921875, 1243052.0634765625, 1243052.9853515625, 1243053.783203125, 1243054.595703125, 1243055.4287109375, + 1243056.26171875, 1243057.1005859375, 1243057.92578125, 1243058.7275390625, 1243059.4921875, 1243060.2705078125, 1243061.0703125, 1243061.8583984375, + 1243062.6826171875, 1243063.5068359375, 1243064.3251953125, 1243065.146484375, 1243065.998046875, 1243066.880859375, 1243067.748046875, 1243068.626953125, + 1243069.509765625, 1243070.400390625, 1243071.251953125, 1243072.125, 1243072.984375, 1243073.86328125, 1243074.6982421875, 1243075.576171875, + 1243076.4404296875, 1243077.3369140625, 1243078.224609375, 1243079.2919921875, 1243079.97265625, 1243080.8681640625, 1243081.76953125, 1243082.71484375, + 1243083.6669921875, 1243084.6142578125, 1243085.5546875, 1243086.474609375, 1243087.390625, 1243088.2919921875, 1243089.197265625, 1243090.0693359375, + 1243090.9384765625, 1243091.8349609375, 1243092.751953125, 1243093.716796875, 1243094.640625, 1243095.576171875, 1243096.50390625, 1243097.400390625, + 1243098.2666015625, 1243099.16796875, 1243100.0771484375, 1243100.9423828125, 1243101.8251953125, 1243102.7099609375, 1243103.6357421875, 1243104.544921875, + 1243105.462890625, 1243106.357421875, 1243107.283203125, 1243108.162109375, 1243109.291015625, 1243109.92578125, 1243110.8173828125, 1243111.69921875, + 1243112.591796875, 1243113.484375, 1243114.3818359375, 1243115.3056640625, 1243116.1572265625, 1243117.0439453125, 1243117.9130859375, 1243118.759765625, + 1243119.619140625, 1243120.49609375, 1243121.3037109375, 1243122.15625, 1243122.9951171875, 1243123.8408203125, 1243124.6572265625, 1243125.5234375, + 1243126.4296875, 1243127.345703125, 1243128.24609375, 1243129.1162109375, 1243129.9873046875, 1243130.8427734375, 1243131.693359375, 1243132.537109375, + 1243133.392578125, 1243134.2099609375, 1243135.0498046875, 1243135.8857421875, 1243136.6962890625, 1243137.5595703125, 1243138.41015625, 1243139.1396484375, + 1243140.056640625, 1243141.23046875, 1243142.0625, 1243142.68359375, 1243143.3212890625, 1243144.1484375, 1243145.0078125, 1243145.8818359375, + 1243146.7666015625, 1243147.6484375, 1243148.5732421875, 1243149.482421875, 1243150.423828125, 1243151.373046875, 1243152.3349609375, 1243153.25, + 1243154.19140625, 1243155.1259765625, 1243156.0615234375, 1243157.0126953125, 1243157.9677734375, 1243158.9013671875, 1243159.8447265625, 1243160.779296875, + 1243161.6953125, 1243162.6357421875, 1243163.60546875, 1243164.5810546875, 1243165.5107421875, 1243166.4619140625, 1243167.3974609375, 1243168.33984375, + 1243169.1240234375, 1243170.2392578125, 1243171.1533203125, 1243172.0419921875, 1243172.9208984375, 1243173.6552734375, 1243174.66015625, 1243175.5439453125, + 1243176.466796875, 1243177.404296875, 1243178.35546875, 1243179.318359375, 1243180.25, 1243181.1796875, 1243182.0869140625, 1243183.0, + 1243183.9267578125, 1243184.849609375, 1243185.75, 1243186.6474609375, 1243187.546875, 1243188.4638671875, 1243189.3857421875, 1243190.2900390625, + 1243191.1982421875, 1243192.091796875, 1243192.978515625, 1243193.818359375, 1243194.638671875, 1243195.4541015625, 1243196.2802734375, 1243197.1318359375, + 1243198.0029296875, 1243198.8828125, 1243199.7529296875, 1243200.6591796875, 1243201.5380859375, 1243202.447265625, 1243203.3681640625, 1243204.236328125, + 1243205.1572265625, 1243206.103515625, 1243207.09765625, 1243208.09765625, 1243209.115234375, 1243210.1513671875, 1243211.1650390625, 1243212.1845703125, + 1243213.208984375, 1243214.201171875, 1243215.1787109375, 1243216.1171875, 1243217.0703125, 1243218.0224609375, 1243218.9775390625, 1243219.9580078125, + 1243220.9599609375, 1243221.953125, 1243222.8662109375, 1243223.7861328125, 1243224.69921875, 1243225.6396484375, 1243226.541015625, 1243227.4970703125, + 1243228.4462890625, 1243229.2880859375, 1243230.248046875, 1243231.1767578125, 1243232.1533203125, 1243233.0966796875, 1243234.033203125, 1243234.9755859375, + 1243235.919921875, 1243236.837890625, 1243237.71875, 1243238.6357421875, 1243239.5068359375, 1243240.43359375, 1243241.3515625, 1243242.26953125, + 1243243.107421875, 1243244.044921875, 1243244.9619140625, 1243245.94921875, 1243246.9560546875, 1243247.96484375, 1243249.080078125, 1243249.9404296875, + 1243250.89453125, 1243251.8291015625, 1243252.744140625, 1243253.6474609375, 1243254.55078125, 1243255.46484375, 1243256.3544921875, 1243257.2412109375, + 1243258.1591796875, 1243259.27734375, 1243260.03515625, 1243260.9609375, 1243261.9052734375, 1243262.791015625, 1243263.6513671875, 1243264.478515625, + 1243265.25, 1243266.01953125, 1243266.7841796875, 1243267.5302734375, 1243268.26953125, 1243269.0107421875, 1243269.751953125, 1243270.4755859375, + 1243271.1796875, 1243271.876953125, 1243272.5615234375, 1243273.2373046875, 1243273.9189453125, 1243274.591796875, 1243275.2490234375, 1243275.9033203125, + 1243276.595703125, 1243277.2861328125, 1243277.96484375, 1243278.626953125, 1243279.3115234375, 1243279.98046875, 1243280.6591796875, 1243281.3291015625, + 1243281.9873046875, 1243282.6435546875, 1243283.287109375, 1243283.9296875, 1243284.587890625, 1243285.2509765625, 1243285.904296875, 1243286.5712890625, + 1243287.228515625, 1243287.8857421875, 1243288.55859375, 1243289.1240234375, 1243289.76171875, 1243290.3994140625, 1243291.037109375, 1243291.6748046875, + 1243292.0361328125, 1243292.7470703125, 1243293.453125, 1243294.1689453125, 1243294.8798828125, 1243295.58203125, 1243296.2900390625, 1243296.9912109375, + 1243297.6904296875, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, +] diff --git a/tests/data_expand_hr_mesgs.py b/tests/data_expand_hr_mesgs.py index 6276672..2c94bd0 100644 --- a/tests/data_expand_hr_mesgs.py +++ b/tests/data_expand_hr_mesgs.py @@ -1,16012 +1,16012 @@ -'''data_expand_hr_mesgs.py: Contains the data for running the hr_mesgs_utils tests''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### - - -component_expansion_of_hr_messages = [ - 1242209, - 1242212.0, 1242213.7314453125, 1242215.5029296875, 1242215.865234375, 1242216.9541015625, 1242218.3369140625, 1242219.6220703125, 1242219.9853515625, - 1242220.71875, 1242221.2607421875, 1242221.83203125, 1242222.103515625, 1242222.970703125, 1242223.849609375, 1242224.234375, 1242225.193359375, - 1242225.537109375, 1242226.345703125, 1242226.9990234375, 1242227.599609375, 1242227.978515625, 1242228.5849609375, 1242228.962890625, 1242229.291015625, - 1242229.8154296875, 1242230.1708984375, 1242230.630859375, 1242230.9794921875, 1242231.3359375, 1242231.7421875, 1242232.041015625, 1242232.517578125, - 1242232.93359375, 1242233.2890625, 1242233.6767578125, 1242234.0703125, 1242234.4638671875, 1242234.9033203125, 1242235.23828125, 1242235.625, - 1242236.0126953125, 1242236.28125, 1242236.6396484375, 1242237.56640625, 1242239.478515625, 1242240.4189453125, 1242241.388671875, 1242242.35546875, - 1242244.2861328125, 1242245.2841796875, 1242246.279296875, 1242247.2900390625, 1242248.3251953125, 1242249.36328125, 1242250.736328125, 1242251.0703125, - 1242251.1640625, 1242251.921875, 1242252.546875, 1242253.5751953125, 1242254.6064453125, 1242255.6201171875, 1242256.626953125, 1242257.568359375, - 1242258.5009765625, 1242259.509765625, 1242260.5712890625, 1242261.142578125, 1242261.66796875, 1242262.72265625, 1242263.7890625, 1242264.869140625, - 1242265.951171875, 1242266.9794921875, 1242268.0087890625, 1242269.0380859375, 1242270.046875, 1242271.0712890625, 1242272.162109375, 1242273.3310546875, - 1242274.494140625, 1242275.6552734375, 1242276.802734375, 1242277.8896484375, 1242278.9677734375, 1242280.048828125, 1242281.115234375, 1242282.1796875, - 1242283.25, 1242284.296875, 1242285.30859375, 1242286.3388671875, 1242287.40625, 1242288.45703125, 1242289.4921875, 1242290.5458984375, - 1242291.5986328125, 1242292.62109375, 1242293.65625, 1242294.6943359375, 1242295.7236328125, 1242296.7744140625, 1242297.849609375, 1242298.5556640625, - 1242299.51953125, 1242300.2177734375, 1242301.1015625, 1242302.2080078125, 1242303.3037109375, 1242304.3857421875, 1242305.453125, 1242306.4921875, - 1242307.544921875, 1242308.609375, 1242309.6494140625, 1242310.6845703125, 1242311.732421875, 1242312.775390625, 1242313.8115234375, 1242314.8408203125, - 1242315.859375, 1242316.9033203125, 1242317.9716796875, 1242319.04296875, 1242320.0966796875, 1242321.1630859375, 1242322.1953125, 1242323.2197265625, - 1242324.2373046875, 1242325.2265625, 1242326.1767578125, 1242327.123046875, 1242328.013671875, 1242328.6884765625, 1242329.87109375, 1242330.8564453125, - 1242331.814453125, 1242332.830078125, 1242333.8212890625, 1242334.83203125, 1242335.818359375, 1242336.8076171875, 1242337.78515625, 1242338.7470703125, - 1242339.7216796875, 1242340.6982421875, 1242341.6806640625, 1242342.6708984375, 1242343.666015625, 1242344.6630859375, 1242345.685546875, 1242346.7275390625, - 1242347.77734375, 1242348.791015625, 1242349.7216796875, 1242350.5986328125, 1242351.5146484375, 1242352.513671875, 1242353.6279296875, 1242354.7880859375, - 1242355.931640625, 1242357.0771484375, 1242358.205078125, 1242359.259765625, 1242360.314453125, 1242361.353515625, 1242362.4091796875, 1242363.470703125, - 1242364.474609375, 1242365.4462890625, 1242366.568359375, 1242367.7119140625, 1242368.8740234375, 1242369.982421875, 1242369.982421875, 1242369.982421875, - 1242371, - 1242372.0, 1242373.0419921875, 1242374.0595703125, 1242375.05078125, 1242376.0244140625, 1242376.9765625, 1242378.0068359375, 1242379.0810546875, - 1242380.2138671875, 1242381.3935546875, 1242382.5712890625, 1242383.7431640625, 1242384.8720703125, 1242385.97265625, 1242387.052734375, 1242388.087890625, - 1242389.091796875, 1242390.1025390625, 1242391.1162109375, 1242392.1533203125, 1242393.1689453125, 1242394.20703125, 1242395.2685546875, 1242396.3369140625, - 1242397.40625, 1242398.4853515625, 1242399.5390625, 1242400.5693359375, 1242401.5380859375, 1242402.552734375, 1242403.6220703125, 1242404.7431640625, - 1242405.86328125, 1242407.0126953125, 1242408.162109375, 1242409.2705078125, 1242410.3994140625, 1242411.5, 1242412.537109375, 1242413.5380859375, - 1242414.4072265625, 1242415.48046875, 1242416.5419921875, 1242417.6337890625, 1242418.68359375, 1242419.787109375, 1242420.8564453125, 1242421.9287109375, - 1242423.005859375, 1242424.02734375, 1242425.076171875, 1242426.12109375, 1242427.1767578125, 1242428.25, 1242429.3076171875, 1242430.3662109375, - 1242431.41015625, 1242432.4521484375, 1242433.4482421875, 1242434.455078125, 1242435.5009765625, 1242436.58984375, 1242437.6796875, 1242438.79296875, - 1242439.8974609375, 1242441.0107421875, 1242442.1044921875, 1242443.228515625, 1242444.3642578125, 1242445.474609375, 1242446.5673828125, 1242447.328125, - 1242448.6318359375, 1242449.6572265625, 1242450.7001953125, 1242451.7587890625, 1242452.8447265625, 1242453.94140625, 1242455.126953125, 1242456.3349609375, - 1242457.541015625, 1242458.7265625, 1242459.9248046875, 1242461.1240234375, 1242462.2998046875, 1242463.4736328125, 1242464.650390625, 1242465.81640625, - 1242466.9931640625, 1242468.1953125, 1242469.3505859375, 1242470.5322265625, 1242471.7412109375, 1242472.94140625, 1242474.1318359375, 1242475.3251953125, - 1242476.5107421875, 1242477.6181640625, 1242478.712890625, 1242479.8349609375, 1242480.9765625, 1242482.10546875, 1242483.21875, 1242484.33984375, - 1242485.396484375, 1242486.486328125, 1242487.6201171875, 1242488.7890625, 1242489.9208984375, 1242491.0703125, 1242492.2373046875, 1242493.4111328125, - 1242494.5732421875, 1242495.7470703125, 1242496.919921875, 1242498.0927734375, 1242499.2978515625, 1242500.4833984375, 1242501.65234375, 1242502.84765625, - 1242504.0380859375, 1242505.185546875, 1242506.326171875, 1242507.306640625, 1242508.5546875, 1242509.6640625, 1242510.7578125, 1242511.8408203125, - 1242512.943359375, 1242514.0673828125, 1242515.19921875, 1242516.3330078125, 1242517.4306640625, 1242518.533203125, 1242519.6357421875, 1242520.7138671875, - 1242521.80859375, 1242522.91015625, 1242523.9892578125, 1242525.08984375, 1242526.20703125, 1242527.3232421875, 1242528.4365234375, 1242529.53515625, - 1242530.6279296875, 1242531.673828125, 1242532.7119140625, 1242533.759765625, 1242534.8017578125, 1242535.83203125, 1242536.8779296875, 1242537.9150390625, - 1242538.9453125, 1242539.982421875, 1242540.98828125, 1242542.01171875, 1242543.0478515625, 1242544.1103515625, 1242545.2109375, 1242546.3203125, - 1242547.4580078125, 1242548.6123046875, 1242549.7822265625, 1242550.9775390625, 1242552.1669921875, 1242553.3349609375, 1242554.5078125, 1242555.6220703125, - 1242556.63671875, 1242557.666015625, 1242558.77734375, 1242559.89453125, 1242561.0458984375, 1242562.2314453125, 1242563.38671875, 1242564.5478515625, - 1242565.7177734375, 1242566.87109375, 1242568.041015625, 1242569.2255859375, 1242570.392578125, 1242571.5810546875, 1242572.79296875, 1242573.93359375, - 1242575.0634765625, 1242576.2080078125, 1242577.33203125, 1242578.447265625, 1242579.5517578125, 1242580.6748046875, 1242581.8388671875, 1242582.9521484375, - 1242584.0771484375, 1242585.220703125, 1242586.34375, 1242587.474609375, 1242588.6162109375, 1242589.7529296875, 1242590.9287109375, 1242592.11328125, - 1242593.3251953125, 1242594.53515625, 1242595.7724609375, 1242596.9892578125, 1242598.1728515625, 1242599.3134765625, 1242600.4345703125, 1242601.4814453125, - 1242602.4345703125, 1242603.390625, 1242604.404296875, 1242605.4287109375, 1242606.44921875, 1242607.4765625, 1242608.5234375, 1242609.35546875, - 1242609.8701171875, 1242610.9150390625, 1242611.9345703125, 1242612.939453125, 1242613.8974609375, 1242614.3642578125, 1242615.4052734375, 1242616.30078125, - 1242617.1884765625, 1242618.3427734375, 1242619.396484375, 1242619.9580078125, 1242621.015625, 1242621.939453125, 1242622.609375, 1242623.1474609375, - 1242623.92578125, 1242624.7041015625, 1242625.482421875, 1242626.5693359375, 1242627.5361328125, 1242628.419921875, 1242629.4208984375, 1242630.4853515625, - 1242631.486328125, 1242632.6103515625, 1242633.177734375, 1242633.8720703125, 1242634.8076171875, 1242635.220703125, 1242636.041015625, 1242636.732421875, - 1242637.4638671875, 1242638.1318359375, 1242638.765625, 1242639.2099609375, 1242639.8291015625, 1242640.5673828125, 1242640.9833984375, 1242641.58203125, - 1242642.1806640625, 1242642.6279296875, 1242643.330078125, 1242643.92578125, 1242644.515625, 1242645.1103515625, 1242645.5888671875, 1242646.17578125, - 1242646.74609375, 1242647.3330078125, 1242647.9072265625, 1242648.5498046875, 1242649.166015625, 1242649.681640625, 1242650.4130859375, 1242651.2177734375, - 1242651.8798828125, 1242652.744140625, 1242653.45703125, 1242654.244140625, 1242654.9755859375, 1242655.544921875, 1242656.203125, 1242656.8857421875, - 1242657.6220703125, 1242658.3173828125, 1242659.0693359375, 1242659.779296875, 1242660.4892578125, 1242661.1982421875, 1242662.560546875, 1242662.869140625, - 1242663.185546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, - 1242959, - 1242960.0, 1242962.28515625, 1242963.3388671875, 1242964.3212890625, 1242965.3193359375, 1242966.2392578125, 1242967.150390625, 1242968.0263671875, - 1242969.041015625, 1242969.5400390625, 1242970.552734375, 1242971.1083984375, 1242972.1123046875, 1242973.158203125, 1242973.439453125, 1242973.9423828125, - 1242974.7841796875, 1242975.8095703125, 1242976.6220703125, 1242977.3203125, 1242978.3544921875, 1242979.2958984375, 1242980.1875, 1242981.12890625, - 1242982.130859375, 1242983.130859375, 1242984.1640625, 1242985.2080078125, 1242986.33203125, 1242987.5859375, 1242988.6240234375, 1242989.298828125, - 1242990.4794921875, 1242991.49609375, 1242992.0546875, 1242992.6044921875, 1242993.2138671875, 1242993.474609375, 1242994.2900390625, 1242994.9638671875, - 1242995.2333984375, 1242995.810546875, 1242996.0703125, 1242996.724609375, 1242997.26171875, 1242997.7607421875, 1242998.0234375, 1242998.400390625, - 1242998.8408203125, 1242999.455078125, 1242999.943359375, 1243000.59765625, 1243001.2041015625, 1243001.748046875, 1243002.2939453125, 1243002.8583984375, - 1243003.5771484375, 1243004.2158203125, 1243004.8154296875, 1243005.2958984375, 1243005.9736328125, 1243006.2998046875, 1243006.9052734375, 1243007.490234375, - 1243008.0478515625, 1243008.818359375, 1243009.2353515625, 1243009.9482421875, 1243010.71875, 1243011.47265625, 1243012.20703125, 1243012.9541015625, - 1243013.701171875, 1243014.4716796875, 1243015.236328125, 1243016.005859375, 1243016.6005859375, 1243017.5107421875, 1243018.248046875, 1243018.876953125, - 1243019.7783203125, 1243020.5439453125, 1243021.337890625, 1243022.1103515625, 1243022.931640625, 1243023.73046875, 1243024.5263671875, 1243025.3125, - 1243026.12890625, 1243026.6640625, 1243027.3427734375, 1243027.7578125, 1243028.578125, 1243029.4013671875, 1243030.1923828125, 1243031.0107421875, - 1243031.8251953125, 1243032.62890625, 1243033.40625, 1243034.197265625, 1243034.982421875, 1243035.8359375, 1243036.56640625, 1243037.3828125, - 1243038.197265625, 1243039.0830078125, 1243039.9013671875, 1243040.7587890625, 1243041.333984375, 1243042.330078125, 1243043.4169921875, 1243044.494140625, - 1243045.0302734375, 1243045.888671875, 1243046.4521484375, 1243047.0185546875, 1243047.5419921875, 1243048.1904296875, 1243048.619140625, 1243049.40234375, - 1243049.8798828125, 1243050.65625, 1243051.419921875, 1243052.0634765625, 1243052.9853515625, 1243053.783203125, 1243054.595703125, 1243055.4287109375, - 1243056.26171875, 1243057.1005859375, 1243057.92578125, 1243058.7275390625, 1243059.4921875, 1243060.2705078125, 1243061.0703125, 1243061.8583984375, - 1243062.6826171875, 1243063.5068359375, 1243064.3251953125, 1243065.146484375, 1243065.998046875, 1243066.880859375, 1243067.748046875, 1243068.626953125, - 1243069.509765625, 1243070.400390625, 1243071.251953125, 1243072.125, 1243072.984375, 1243073.86328125, 1243074.6982421875, 1243075.576171875, - 1243076.4404296875, 1243077.3369140625, 1243078.224609375, 1243079.2919921875, 1243079.97265625, 1243080.8681640625, 1243081.76953125, 1243082.71484375, - 1243083.6669921875, 1243084.6142578125, 1243085.5546875, 1243086.474609375, 1243087.390625, 1243088.2919921875, 1243089.197265625, 1243090.0693359375, - 1243090.9384765625, 1243091.8349609375, 1243092.751953125, 1243093.716796875, 1243094.640625, 1243095.576171875, 1243096.50390625, 1243097.400390625, - 1243098.2666015625, 1243099.16796875, 1243100.0771484375, 1243100.9423828125, 1243101.8251953125, 1243102.7099609375, 1243103.6357421875, 1243104.544921875, - 1243105.462890625, 1243106.357421875, 1243107.283203125, 1243108.162109375, 1243109.291015625, 1243109.92578125, 1243110.8173828125, 1243111.69921875, - 1243112.591796875, 1243113.484375, 1243114.3818359375, 1243115.3056640625, 1243116.1572265625, 1243117.0439453125, 1243117.9130859375, 1243118.759765625, - 1243119.619140625, 1243120.49609375, 1243121.3037109375, 1243122.15625, 1243122.9951171875, 1243123.8408203125, 1243124.6572265625, 1243125.5234375, - 1243126.4296875, 1243127.345703125, 1243128.24609375, 1243129.1162109375, 1243129.9873046875, 1243130.8427734375, 1243131.693359375, 1243132.537109375, - 1243133.392578125, 1243134.2099609375, 1243135.0498046875, 1243135.8857421875, 1243136.6962890625, 1243137.5595703125, 1243138.41015625, 1243139.1396484375, - 1243140.056640625, 1243141.23046875, 1243142.0625, 1243142.68359375, 1243143.3212890625, 1243144.1484375, 1243145.0078125, 1243145.8818359375, - 1243146.7666015625, 1243147.6484375, 1243148.5732421875, 1243149.482421875, 1243150.423828125, 1243151.373046875, 1243152.3349609375, 1243153.25, - 1243154.19140625, 1243155.1259765625, 1243156.0615234375, 1243157.0126953125, 1243157.9677734375, 1243158.9013671875, 1243159.8447265625, 1243160.779296875, - 1243161.6953125, 1243162.6357421875, 1243163.60546875, 1243164.5810546875, 1243165.5107421875, 1243166.4619140625, 1243167.3974609375, 1243168.33984375, - 1243169.1240234375, 1243170.2392578125, 1243171.1533203125, 1243172.0419921875, 1243172.9208984375, 1243173.6552734375, 1243174.66015625, 1243175.5439453125, - 1243176.466796875, 1243177.404296875, 1243178.35546875, 1243179.318359375, 1243180.25, 1243181.1796875, 1243182.0869140625, 1243183.0, - 1243183.9267578125, 1243184.849609375, 1243185.75, 1243186.6474609375, 1243187.546875, 1243188.4638671875, 1243189.3857421875, 1243190.2900390625, - 1243191.1982421875, 1243192.091796875, 1243192.978515625, 1243193.818359375, 1243194.638671875, 1243195.4541015625, 1243196.2802734375, 1243197.1318359375, - 1243198.0029296875, 1243198.8828125, 1243199.7529296875, 1243200.6591796875, 1243201.5380859375, 1243202.447265625, 1243203.3681640625, 1243204.236328125, - 1243205.1572265625, 1243206.103515625, 1243207.09765625, 1243208.09765625, 1243209.115234375, 1243210.1513671875, 1243211.1650390625, 1243212.1845703125, - 1243213.208984375, 1243214.201171875, 1243215.1787109375, 1243216.1171875, 1243217.0703125, 1243218.0224609375, 1243218.9775390625, 1243219.9580078125, - 1243220.9599609375, 1243221.953125, 1243222.8662109375, 1243223.7861328125, 1243224.69921875, 1243225.6396484375, 1243226.541015625, 1243227.4970703125, - 1243228.4462890625, 1243229.2880859375, 1243230.248046875, 1243231.1767578125, 1243232.1533203125, 1243233.0966796875, 1243234.033203125, 1243234.9755859375, - 1243235.919921875, 1243236.837890625, 1243237.71875, 1243238.6357421875, 1243239.5068359375, 1243240.43359375, 1243241.3515625, 1243242.26953125, - 1243243.107421875, 1243244.044921875, 1243244.9619140625, 1243245.94921875, 1243246.9560546875, 1243247.96484375, 1243249.080078125, 1243249.9404296875, - 1243250.89453125, 1243251.8291015625, 1243252.744140625, 1243253.6474609375, 1243254.55078125, 1243255.46484375, 1243256.3544921875, 1243257.2412109375, - 1243258.1591796875, 1243259.27734375, 1243260.03515625, 1243260.9609375, 1243261.9052734375, 1243262.791015625, 1243263.6513671875, 1243264.478515625, - 1243265.25, 1243266.01953125, 1243266.7841796875, 1243267.5302734375, 1243268.26953125, 1243269.0107421875, 1243269.751953125, 1243270.4755859375, - 1243271.1796875, 1243271.876953125, 1243272.5615234375, 1243273.2373046875, 1243273.9189453125, 1243274.591796875, 1243275.2490234375, 1243275.9033203125, - 1243276.595703125, 1243277.2861328125, 1243277.96484375, 1243278.626953125, 1243279.3115234375, 1243279.98046875, 1243280.6591796875, 1243281.3291015625, - 1243281.9873046875, 1243282.6435546875, 1243283.287109375, 1243283.9296875, 1243284.587890625, 1243285.2509765625, 1243285.904296875, 1243286.5712890625, - 1243287.228515625, 1243287.8857421875, 1243288.55859375, 1243289.1240234375, 1243289.76171875, 1243290.3994140625, 1243291.037109375, 1243291.6748046875, - 1243292.0361328125, 1243292.7470703125, 1243293.453125, 1243294.1689453125, 1243294.8798828125, 1243295.58203125, 1243296.2900390625, 1243296.9912109375, - 1243297.6904296875, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, -] - -expanded_hr_messages = [ - { - "timestamp": 1030731510, - "heart_rate": 71 - }, - { - "timestamp": 1030731510.25, - "heart_rate": 71 - }, - { - "timestamp": 1030731510.5, - "heart_rate": 71 - }, - { - "timestamp": 1030731510.75, - "heart_rate": 71 - }, - { - "timestamp": 1030731511, - "heart_rate": 71 - }, - { - "timestamp": 1030731511.25, - "heart_rate": 71 - }, - { - "timestamp": 1030731511.5, - "heart_rate": 71 - }, - { - "timestamp": 1030731511.75, - "heart_rate": 71 - }, - { - "timestamp": 1030731512, - "heart_rate": 71 - }, - { - "timestamp": 1030731512.25, - "heart_rate": 71 - }, - { - "timestamp": 1030731512.5, - "heart_rate": 71 - }, - { - "timestamp": 1030731512.75, - "heart_rate": 71 - }, - { - "timestamp": 1030731513, - "heart_rate": 71 - }, - { - "timestamp": 1030731513.25, - "heart_rate": 71 - }, - { - "timestamp": 1030731513.5, - "heart_rate": 71 - }, - { - "timestamp": 1030731513.75, - "heart_rate": 71 - }, - { - "timestamp": 1030731514, - "heart_rate": 71 - }, - { - "timestamp": 1030731514.25, - "heart_rate": 71 - }, - { - "timestamp": 1030731514.5, - "heart_rate": 71 - }, - { - "timestamp": 1030731514.7314453, - "heart_rate": 71 - }, - { - "timestamp": 1030731514.9814453, - "heart_rate": 71 - }, - { - "timestamp": 1030731515.2314453, - "heart_rate": 71 - }, - { - "timestamp": 1030731515.4814453, - "heart_rate": 71 - }, - { - "timestamp": 1030731515.7314453, - "heart_rate": 71 - }, - { - "timestamp": 1030731515.9814453, - "heart_rate": 71 - }, - { - "timestamp": 1030731516.2314453, - "heart_rate": 71 - }, - { - "timestamp": 1030731516.4814453, - "heart_rate": 71 - }, - { - "timestamp": 1030731516.5029297, - "heart_rate": 71 - }, - { - "timestamp": 1030731516.7529297, - "heart_rate": 71 - }, - { - "timestamp": 1030731516.8652344, - "heart_rate": 71 - }, - { - "timestamp": 1030731517.1152344, - "heart_rate": 71 - }, - { - "timestamp": 1030731517.3652344, - "heart_rate": 71 - }, - { - "timestamp": 1030731517.6152344, - "heart_rate": 71 - }, - { - "timestamp": 1030731517.8652344, - "heart_rate": 71 - }, - { - "timestamp": 1030731517.9541016, - "heart_rate": 71 - }, - { - "timestamp": 1030731518.2041016, - "heart_rate": 71 - }, - { - "timestamp": 1030731518.4541016, - "heart_rate": 71 - }, - { - "timestamp": 1030731518.7041016, - "heart_rate": 71 - }, - { - "timestamp": 1030731518.9541016, - "heart_rate": 71 - }, - { - "timestamp": 1030731519.2041016, - "heart_rate": 71 - }, - { - "timestamp": 1030731519.3369141, - "heart_rate": 71 - }, - { - "timestamp": 1030731519.5869141, - "heart_rate": 71 - }, - { - "timestamp": 1030731519.8369141, - "heart_rate": 71 - }, - { - "timestamp": 1030731520.0869141, - "heart_rate": 71 - }, - { - "timestamp": 1030731520.3369141, - "heart_rate": 71 - }, - { - "timestamp": 1030731520.5869141, - "heart_rate": 71 - }, - { - "timestamp": 1030731520.6220703, - "heart_rate": 71 - }, - { - "timestamp": 1030731520.8720703, - "heart_rate": 71 - }, - { - "timestamp": 1030731520.9853516, - "heart_rate": 71 - }, - { - "timestamp": 1030731521.2353516, - "heart_rate": 71 - }, - { - "timestamp": 1030731521.4853516, - "heart_rate": 71 - }, - { - "timestamp": 1030731521.71875, - "heart_rate": 71 - }, - { - "timestamp": 1030731521.96875, - "heart_rate": 71 - }, - { - "timestamp": 1030731522.21875, - "heart_rate": 71 - }, - { - "timestamp": 1030731522.2607422, - "heart_rate": 71 - }, - { - "timestamp": 1030731522.5107422, - "heart_rate": 71 - }, - { - "timestamp": 1030731522.7607422, - "heart_rate": 71 - }, - { - "timestamp": 1030731522.8320312, - "heart_rate": 71 - }, - { - "timestamp": 1030731523.0820312, - "heart_rate": 71 - }, - { - "timestamp": 1030731523.1035156, - "heart_rate": 71 - }, - { - "timestamp": 1030731523.3535156, - "heart_rate": 71 - }, - { - "timestamp": 1030731523.6035156, - "heart_rate": 71 - }, - { - "timestamp": 1030731523.8535156, - "heart_rate": 71 - }, - { - "timestamp": 1030731523.9707031, - "heart_rate": 71 - }, - { - "timestamp": 1030731524.2207031, - "heart_rate": 71 - }, - { - "timestamp": 1030731524.4707031, - "heart_rate": 71 - }, - { - "timestamp": 1030731524.7207031, - "heart_rate": 71 - }, - { - "timestamp": 1030731524.8496094, - "heart_rate": 71 - }, - { - "timestamp": 1030731525.0996094, - "heart_rate": 71 - }, - { - "timestamp": 1030731525.234375, - "heart_rate": 71 - }, - { - "timestamp": 1030731525.484375, - "heart_rate": 71 - }, - { - "timestamp": 1030731525.734375, - "heart_rate": 71 - }, - { - "timestamp": 1030731525.984375, - "heart_rate": 71 - }, - { - "timestamp": 1030731526.1933594, - "heart_rate": 71 - }, - { - "timestamp": 1030731526.4433594, - "heart_rate": 71 - }, - { - "timestamp": 1030731526.5371094, - "heart_rate": 71 - }, - { - "timestamp": 1030731526.7871094, - "heart_rate": 71 - }, - { - "timestamp": 1030731527.0371094, - "heart_rate": 71 - }, - { - "timestamp": 1030731527.2871094, - "heart_rate": 71 - }, - { - "timestamp": 1030731527.3457031, - "heart_rate": 71 - }, - { - "timestamp": 1030731527.5957031, - "heart_rate": 71 - }, - { - "timestamp": 1030731527.8457031, - "heart_rate": 71 - }, - { - "timestamp": 1030731527.9990234, - "heart_rate": 71 - }, - { - "timestamp": 1030731528.2490234, - "heart_rate": 71 - }, - { - "timestamp": 1030731528.4990234, - "heart_rate": 71 - }, - { - "timestamp": 1030731528.5996094, - "heart_rate": 71 - }, - { - "timestamp": 1030731528.8496094, - "heart_rate": 71 - }, - { - "timestamp": 1030731528.9785156, - "heart_rate": 71 - }, - { - "timestamp": 1030731529.2285156, - "heart_rate": 71 - }, - { - "timestamp": 1030731529.4785156, - "heart_rate": 71 - }, - { - "timestamp": 1030731529.5849609, - "heart_rate": 71 - }, - { - "timestamp": 1030731529.8349609, - "heart_rate": 71 - }, - { - "timestamp": 1030731529.9628906, - "heart_rate": 71 - }, - { - "timestamp": 1030731530.2128906, - "heart_rate": 71 - }, - { - "timestamp": 1030731530.2910156, - "heart_rate": 72 - }, - { - "timestamp": 1030731530.5410156, - "heart_rate": 72 - }, - { - "timestamp": 1030731530.7910156, - "heart_rate": 72 - }, - { - "timestamp": 1030731530.8154297, - "heart_rate": 72 - }, - { - "timestamp": 1030731531.0654297, - "heart_rate": 72 - }, - { - "timestamp": 1030731531.1708984, - "heart_rate": 72 - }, - { - "timestamp": 1030731531.4208984, - "heart_rate": 72 - }, - { - "timestamp": 1030731531.6308594, - "heart_rate": 72 - }, - { - "timestamp": 1030731531.8808594, - "heart_rate": 72 - }, - { - "timestamp": 1030731531.9794922, - "heart_rate": 72 - }, - { - "timestamp": 1030731532.2294922, - "heart_rate": 72 - }, - { - "timestamp": 1030731532.3359375, - "heart_rate": 73 - }, - { - "timestamp": 1030731532.5859375, - "heart_rate": 73 - }, - { - "timestamp": 1030731532.7421875, - "heart_rate": 73 - }, - { - "timestamp": 1030731532.9921875, - "heart_rate": 73 - }, - { - "timestamp": 1030731533.0410156, - "heart_rate": 74 - }, - { - "timestamp": 1030731533.2910156, - "heart_rate": 74 - }, - { - "timestamp": 1030731533.5175781, - "heart_rate": 74 - }, - { - "timestamp": 1030731533.7675781, - "heart_rate": 74 - }, - { - "timestamp": 1030731533.9335938, - "heart_rate": 75 - }, - { - "timestamp": 1030731534.1835938, - "heart_rate": 75 - }, - { - "timestamp": 1030731534.2890625, - "heart_rate": 76 - }, - { - "timestamp": 1030731534.5390625, - "heart_rate": 76 - }, - { - "timestamp": 1030731534.6767578, - "heart_rate": 77 - }, - { - "timestamp": 1030731534.9267578, - "heart_rate": 77 - }, - { - "timestamp": 1030731535.0703125, - "heart_rate": 79 - }, - { - "timestamp": 1030731535.3203125, - "heart_rate": 79 - }, - { - "timestamp": 1030731535.4638672, - "heart_rate": 81 - }, - { - "timestamp": 1030731535.7138672, - "heart_rate": 81 - }, - { - "timestamp": 1030731535.9033203, - "heart_rate": 81 - }, - { - "timestamp": 1030731536.1533203, - "heart_rate": 81 - }, - { - "timestamp": 1030731536.2382812, - "heart_rate": 81 - }, - { - "timestamp": 1030731536.4882812, - "heart_rate": 81 - }, - { - "timestamp": 1030731536.625, - "heart_rate": 81 - }, - { - "timestamp": 1030731536.875, - "heart_rate": 81 - }, - { - "timestamp": 1030731537.0126953, - "heart_rate": 81 - }, - { - "timestamp": 1030731537.2626953, - "heart_rate": 81 - }, - { - "timestamp": 1030731537.28125, - "heart_rate": 81 - }, - { - "timestamp": 1030731537.53125, - "heart_rate": 81 - }, - { - "timestamp": 1030731537.6396484, - "heart_rate": 82 - }, - { - "timestamp": 1030731537.8896484, - "heart_rate": 82 - }, - { - "timestamp": 1030731538.1396484, - "heart_rate": 82 - }, - { - "timestamp": 1030731538.3896484, - "heart_rate": 82 - }, - { - "timestamp": 1030731538.5664062, - "heart_rate": 82 - }, - { - "timestamp": 1030731538.8164062, - "heart_rate": 82 - }, - { - "timestamp": 1030731539.0664062, - "heart_rate": 82 - }, - { - "timestamp": 1030731539.3164062, - "heart_rate": 82 - }, - { - "timestamp": 1030731539.5664062, - "heart_rate": 82 - }, - { - "timestamp": 1030731539.8164062, - "heart_rate": 82 - }, - { - "timestamp": 1030731540.0664062, - "heart_rate": 82 - }, - { - "timestamp": 1030731540.3164062, - "heart_rate": 82 - }, - { - "timestamp": 1030731540.4785156, - "heart_rate": 82 - }, - { - "timestamp": 1030731540.7285156, - "heart_rate": 82 - }, - { - "timestamp": 1030731540.9785156, - "heart_rate": 82 - }, - { - "timestamp": 1030731541.2285156, - "heart_rate": 82 - }, - { - "timestamp": 1030731541.4189453, - "heart_rate": 82 - }, - { - "timestamp": 1030731541.6689453, - "heart_rate": 82 - }, - { - "timestamp": 1030731541.9189453, - "heart_rate": 82 - }, - { - "timestamp": 1030731542.1689453, - "heart_rate": 82 - }, - { - "timestamp": 1030731542.3886719, - "heart_rate": 82 - }, - { - "timestamp": 1030731542.6386719, - "heart_rate": 82 - }, - { - "timestamp": 1030731542.8886719, - "heart_rate": 82 - }, - { - "timestamp": 1030731543.1386719, - "heart_rate": 82 - }, - { - "timestamp": 1030731543.3554688, - "heart_rate": 83 - }, - { - "timestamp": 1030731543.6054688, - "heart_rate": 83 - }, - { - "timestamp": 1030731543.8554688, - "heart_rate": 83 - }, - { - "timestamp": 1030731544.1054688, - "heart_rate": 83 - }, - { - "timestamp": 1030731544.3554688, - "heart_rate": 83 - }, - { - "timestamp": 1030731544.6054688, - "heart_rate": 83 - }, - { - "timestamp": 1030731544.8554688, - "heart_rate": 83 - }, - { - "timestamp": 1030731545.1054688, - "heart_rate": 83 - }, - { - "timestamp": 1030731545.2861328, - "heart_rate": 83 - }, - { - "timestamp": 1030731545.5361328, - "heart_rate": 83 - }, - { - "timestamp": 1030731545.7861328, - "heart_rate": 83 - }, - { - "timestamp": 1030731546.0361328, - "heart_rate": 83 - }, - { - "timestamp": 1030731546.2841797, - "heart_rate": 83 - }, - { - "timestamp": 1030731546.5341797, - "heart_rate": 83 - }, - { - "timestamp": 1030731546.7841797, - "heart_rate": 83 - }, - { - "timestamp": 1030731547.0341797, - "heart_rate": 83 - }, - { - "timestamp": 1030731547.2792969, - "heart_rate": 83 - }, - { - "timestamp": 1030731547.5292969, - "heart_rate": 83 - }, - { - "timestamp": 1030731547.7792969, - "heart_rate": 83 - }, - { - "timestamp": 1030731548.0292969, - "heart_rate": 83 - }, - { - "timestamp": 1030731548.2792969, - "heart_rate": 83 - }, - { - "timestamp": 1030731548.2900391, - "heart_rate": 83 - }, - { - "timestamp": 1030731548.5400391, - "heart_rate": 83 - }, - { - "timestamp": 1030731548.7900391, - "heart_rate": 83 - }, - { - "timestamp": 1030731549.0400391, - "heart_rate": 83 - }, - { - "timestamp": 1030731549.2900391, - "heart_rate": 83 - }, - { - "timestamp": 1030731549.3251953, - "heart_rate": 84 - }, - { - "timestamp": 1030731549.5751953, - "heart_rate": 84 - }, - { - "timestamp": 1030731549.8251953, - "heart_rate": 84 - }, - { - "timestamp": 1030731550.0751953, - "heart_rate": 84 - }, - { - "timestamp": 1030731550.3251953, - "heart_rate": 84 - }, - { - "timestamp": 1030731550.3632812, - "heart_rate": 85 - }, - { - "timestamp": 1030731550.6132812, - "heart_rate": 85 - }, - { - "timestamp": 1030731550.8632812, - "heart_rate": 85 - }, - { - "timestamp": 1030731551.1132812, - "heart_rate": 85 - }, - { - "timestamp": 1030731551.3632812, - "heart_rate": 85 - }, - { - "timestamp": 1030731551.6132812, - "heart_rate": 85 - }, - { - "timestamp": 1030731551.7363281, - "heart_rate": 85 - }, - { - "timestamp": 1030731551.9863281, - "heart_rate": 85 - }, - { - "timestamp": 1030731552.0703125, - "heart_rate": 85 - }, - { - "timestamp": 1030731552.1640625, - "heart_rate": 85 - }, - { - "timestamp": 1030731552.4140625, - "heart_rate": 85 - }, - { - "timestamp": 1030731552.6640625, - "heart_rate": 85 - }, - { - "timestamp": 1030731552.9140625, - "heart_rate": 85 - }, - { - "timestamp": 1030731552.921875, - "heart_rate": 85 - }, - { - "timestamp": 1030731553.171875, - "heart_rate": 85 - }, - { - "timestamp": 1030731553.421875, - "heart_rate": 85 - }, - { - "timestamp": 1030731553.546875, - "heart_rate": 85 - }, - { - "timestamp": 1030731553.796875, - "heart_rate": 85 - }, - { - "timestamp": 1030731554.046875, - "heart_rate": 85 - }, - { - "timestamp": 1030731554.296875, - "heart_rate": 85 - }, - { - "timestamp": 1030731554.546875, - "heart_rate": 85 - }, - { - "timestamp": 1030731554.5751953, - "heart_rate": 85 - }, - { - "timestamp": 1030731554.8251953, - "heart_rate": 85 - }, - { - "timestamp": 1030731555.0751953, - "heart_rate": 85 - }, - { - "timestamp": 1030731555.3251953, - "heart_rate": 85 - }, - { - "timestamp": 1030731555.5751953, - "heart_rate": 85 - }, - { - "timestamp": 1030731555.6064453, - "heart_rate": 85 - }, - { - "timestamp": 1030731555.8564453, - "heart_rate": 85 - }, - { - "timestamp": 1030731556.1064453, - "heart_rate": 85 - }, - { - "timestamp": 1030731556.3564453, - "heart_rate": 85 - }, - { - "timestamp": 1030731556.6064453, - "heart_rate": 85 - }, - { - "timestamp": 1030731556.6201172, - "heart_rate": 85 - }, - { - "timestamp": 1030731556.8701172, - "heart_rate": 85 - }, - { - "timestamp": 1030731557.1201172, - "heart_rate": 85 - }, - { - "timestamp": 1030731557.3701172, - "heart_rate": 85 - }, - { - "timestamp": 1030731557.6201172, - "heart_rate": 85 - }, - { - "timestamp": 1030731557.6269531, - "heart_rate": 85 - }, - { - "timestamp": 1030731557.8769531, - "heart_rate": 85 - }, - { - "timestamp": 1030731558.1269531, - "heart_rate": 85 - }, - { - "timestamp": 1030731558.3769531, - "heart_rate": 85 - }, - { - "timestamp": 1030731558.5683594, - "heart_rate": 85 - }, - { - "timestamp": 1030731558.8183594, - "heart_rate": 85 - }, - { - "timestamp": 1030731559.0683594, - "heart_rate": 85 - }, - { - "timestamp": 1030731559.3183594, - "heart_rate": 85 - }, - { - "timestamp": 1030731559.5009766, - "heart_rate": 85 - }, - { - "timestamp": 1030731559.7509766, - "heart_rate": 85 - }, - { - "timestamp": 1030731560.0009766, - "heart_rate": 85 - }, - { - "timestamp": 1030731560.2509766, - "heart_rate": 85 - }, - { - "timestamp": 1030731560.5009766, - "heart_rate": 85 - }, - { - "timestamp": 1030731560.5097656, - "heart_rate": 86 - }, - { - "timestamp": 1030731560.7597656, - "heart_rate": 86 - }, - { - "timestamp": 1030731561.0097656, - "heart_rate": 86 - }, - { - "timestamp": 1030731561.2597656, - "heart_rate": 86 - }, - { - "timestamp": 1030731561.5097656, - "heart_rate": 86 - }, - { - "timestamp": 1030731561.5712891, - "heart_rate": 83 - }, - { - "timestamp": 1030731561.8212891, - "heart_rate": 83 - }, - { - "timestamp": 1030731562.0712891, - "heart_rate": 83 - }, - { - "timestamp": 1030731562.1425781, - "heart_rate": 83 - }, - { - "timestamp": 1030731562.3925781, - "heart_rate": 83 - }, - { - "timestamp": 1030731562.6425781, - "heart_rate": 83 - }, - { - "timestamp": 1030731562.6679688, - "heart_rate": 83 - }, - { - "timestamp": 1030731562.9179688, - "heart_rate": 83 - }, - { - "timestamp": 1030731563.1679688, - "heart_rate": 83 - }, - { - "timestamp": 1030731563.4179688, - "heart_rate": 83 - }, - { - "timestamp": 1030731563.6679688, - "heart_rate": 83 - }, - { - "timestamp": 1030731563.7226562, - "heart_rate": 83 - }, - { - "timestamp": 1030731563.9726562, - "heart_rate": 83 - }, - { - "timestamp": 1030731564.2226562, - "heart_rate": 83 - }, - { - "timestamp": 1030731564.4726562, - "heart_rate": 83 - }, - { - "timestamp": 1030731564.7226562, - "heart_rate": 83 - }, - { - "timestamp": 1030731564.7890625, - "heart_rate": 83 - }, - { - "timestamp": 1030731565.0390625, - "heart_rate": 83 - }, - { - "timestamp": 1030731565.2890625, - "heart_rate": 83 - }, - { - "timestamp": 1030731565.5390625, - "heart_rate": 83 - }, - { - "timestamp": 1030731565.7890625, - "heart_rate": 83 - }, - { - "timestamp": 1030731565.8691406, - "heart_rate": 82 - }, - { - "timestamp": 1030731566.1191406, - "heart_rate": 82 - }, - { - "timestamp": 1030731566.3691406, - "heart_rate": 82 - }, - { - "timestamp": 1030731566.6191406, - "heart_rate": 82 - }, - { - "timestamp": 1030731566.8691406, - "heart_rate": 82 - }, - { - "timestamp": 1030731566.9511719, - "heart_rate": 82 - }, - { - "timestamp": 1030731567.2011719, - "heart_rate": 82 - }, - { - "timestamp": 1030731567.4511719, - "heart_rate": 82 - }, - { - "timestamp": 1030731567.7011719, - "heart_rate": 82 - }, - { - "timestamp": 1030731567.9511719, - "heart_rate": 82 - }, - { - "timestamp": 1030731567.9794922, - "heart_rate": 81 - }, - { - "timestamp": 1030731568.2294922, - "heart_rate": 81 - }, - { - "timestamp": 1030731568.4794922, - "heart_rate": 81 - }, - { - "timestamp": 1030731568.7294922, - "heart_rate": 81 - }, - { - "timestamp": 1030731568.9794922, - "heart_rate": 81 - }, - { - "timestamp": 1030731569.0087891, - "heart_rate": 80 - }, - { - "timestamp": 1030731569.2587891, - "heart_rate": 80 - }, - { - "timestamp": 1030731569.5087891, - "heart_rate": 80 - }, - { - "timestamp": 1030731569.7587891, - "heart_rate": 80 - }, - { - "timestamp": 1030731570.0087891, - "heart_rate": 80 - }, - { - "timestamp": 1030731570.0380859, - "heart_rate": 79 - }, - { - "timestamp": 1030731570.2880859, - "heart_rate": 79 - }, - { - "timestamp": 1030731570.5380859, - "heart_rate": 79 - }, - { - "timestamp": 1030731570.7880859, - "heart_rate": 79 - }, - { - "timestamp": 1030731571.0380859, - "heart_rate": 79 - }, - { - "timestamp": 1030731571.046875, - "heart_rate": 79 - }, - { - "timestamp": 1030731571.296875, - "heart_rate": 79 - }, - { - "timestamp": 1030731571.546875, - "heart_rate": 79 - }, - { - "timestamp": 1030731571.796875, - "heart_rate": 79 - }, - { - "timestamp": 1030731572.046875, - "heart_rate": 79 - }, - { - "timestamp": 1030731572.0712891, - "heart_rate": 79 - }, - { - "timestamp": 1030731572.3212891, - "heart_rate": 79 - }, - { - "timestamp": 1030731572.5712891, - "heart_rate": 79 - }, - { - "timestamp": 1030731572.8212891, - "heart_rate": 79 - }, - { - "timestamp": 1030731573.0712891, - "heart_rate": 79 - }, - { - "timestamp": 1030731573.1621094, - "heart_rate": 77 - }, - { - "timestamp": 1030731573.4121094, - "heart_rate": 77 - }, - { - "timestamp": 1030731573.6621094, - "heart_rate": 77 - }, - { - "timestamp": 1030731573.9121094, - "heart_rate": 77 - }, - { - "timestamp": 1030731574.1621094, - "heart_rate": 77 - }, - { - "timestamp": 1030731574.3310547, - "heart_rate": 76 - }, - { - "timestamp": 1030731574.5810547, - "heart_rate": 76 - }, - { - "timestamp": 1030731574.8310547, - "heart_rate": 76 - }, - { - "timestamp": 1030731575.0810547, - "heart_rate": 76 - }, - { - "timestamp": 1030731575.3310547, - "heart_rate": 76 - }, - { - "timestamp": 1030731575.4941406, - "heart_rate": 74 - }, - { - "timestamp": 1030731575.7441406, - "heart_rate": 74 - }, - { - "timestamp": 1030731575.9941406, - "heart_rate": 74 - }, - { - "timestamp": 1030731576.2441406, - "heart_rate": 74 - }, - { - "timestamp": 1030731576.4941406, - "heart_rate": 74 - }, - { - "timestamp": 1030731576.6552734, - "heart_rate": 72 - }, - { - "timestamp": 1030731576.9052734, - "heart_rate": 72 - }, - { - "timestamp": 1030731577.1552734, - "heart_rate": 72 - }, - { - "timestamp": 1030731577.4052734, - "heart_rate": 72 - }, - { - "timestamp": 1030731577.6552734, - "heart_rate": 72 - }, - { - "timestamp": 1030731577.8027344, - "heart_rate": 70 - }, - { - "timestamp": 1030731578.0527344, - "heart_rate": 70 - }, - { - "timestamp": 1030731578.3027344, - "heart_rate": 70 - }, - { - "timestamp": 1030731578.5527344, - "heart_rate": 70 - }, - { - "timestamp": 1030731578.8027344, - "heart_rate": 70 - }, - { - "timestamp": 1030731578.8896484, - "heart_rate": 69 - }, - { - "timestamp": 1030731579.1396484, - "heart_rate": 69 - }, - { - "timestamp": 1030731579.3896484, - "heart_rate": 69 - }, - { - "timestamp": 1030731579.6396484, - "heart_rate": 69 - }, - { - "timestamp": 1030731579.8896484, - "heart_rate": 69 - }, - { - "timestamp": 1030731579.9677734, - "heart_rate": 68 - }, - { - "timestamp": 1030731580.2177734, - "heart_rate": 68 - }, - { - "timestamp": 1030731580.4677734, - "heart_rate": 68 - }, - { - "timestamp": 1030731580.7177734, - "heart_rate": 68 - }, - { - "timestamp": 1030731580.9677734, - "heart_rate": 68 - }, - { - "timestamp": 1030731581.0488281, - "heart_rate": 64 - }, - { - "timestamp": 1030731581.2988281, - "heart_rate": 64 - }, - { - "timestamp": 1030731581.5488281, - "heart_rate": 64 - }, - { - "timestamp": 1030731581.7988281, - "heart_rate": 64 - }, - { - "timestamp": 1030731582.0488281, - "heart_rate": 64 - }, - { - "timestamp": 1030731582.1152344, - "heart_rate": 61 - }, - { - "timestamp": 1030731582.3652344, - "heart_rate": 61 - }, - { - "timestamp": 1030731582.6152344, - "heart_rate": 61 - }, - { - "timestamp": 1030731582.8652344, - "heart_rate": 61 - }, - { - "timestamp": 1030731583.1152344, - "heart_rate": 61 - }, - { - "timestamp": 1030731583.1796875, - "heart_rate": 60 - }, - { - "timestamp": 1030731583.4296875, - "heart_rate": 60 - }, - { - "timestamp": 1030731583.6796875, - "heart_rate": 60 - }, - { - "timestamp": 1030731583.9296875, - "heart_rate": 60 - }, - { - "timestamp": 1030731584.1796875, - "heart_rate": 60 - }, - { - "timestamp": 1030731584.25, - "heart_rate": 58 - }, - { - "timestamp": 1030731584.5, - "heart_rate": 58 - }, - { - "timestamp": 1030731584.75, - "heart_rate": 58 - }, - { - "timestamp": 1030731585, - "heart_rate": 58 - }, - { - "timestamp": 1030731585.25, - "heart_rate": 58 - }, - { - "timestamp": 1030731585.296875, - "heart_rate": 58 - }, - { - "timestamp": 1030731585.546875, - "heart_rate": 58 - }, - { - "timestamp": 1030731585.796875, - "heart_rate": 58 - }, - { - "timestamp": 1030731586.046875, - "heart_rate": 58 - }, - { - "timestamp": 1030731586.296875, - "heart_rate": 58 - }, - { - "timestamp": 1030731586.3085938, - "heart_rate": 58 - }, - { - "timestamp": 1030731586.5585938, - "heart_rate": 58 - }, - { - "timestamp": 1030731586.8085938, - "heart_rate": 58 - }, - { - "timestamp": 1030731587.0585938, - "heart_rate": 58 - }, - { - "timestamp": 1030731587.3085938, - "heart_rate": 58 - }, - { - "timestamp": 1030731587.3388672, - "heart_rate": 59 - }, - { - "timestamp": 1030731587.5888672, - "heart_rate": 59 - }, - { - "timestamp": 1030731587.8388672, - "heart_rate": 59 - }, - { - "timestamp": 1030731588.0888672, - "heart_rate": 59 - }, - { - "timestamp": 1030731588.3388672, - "heart_rate": 59 - }, - { - "timestamp": 1030731588.40625, - "heart_rate": 59 - }, - { - "timestamp": 1030731588.65625, - "heart_rate": 59 - }, - { - "timestamp": 1030731588.90625, - "heart_rate": 59 - }, - { - "timestamp": 1030731589.15625, - "heart_rate": 59 - }, - { - "timestamp": 1030731589.40625, - "heart_rate": 59 - }, - { - "timestamp": 1030731589.4570312, - "heart_rate": 59 - }, - { - "timestamp": 1030731589.7070312, - "heart_rate": 59 - }, - { - "timestamp": 1030731589.9570312, - "heart_rate": 59 - }, - { - "timestamp": 1030731590.2070312, - "heart_rate": 59 - }, - { - "timestamp": 1030731590.4570312, - "heart_rate": 59 - }, - { - "timestamp": 1030731590.4921875, - "heart_rate": 59 - }, - { - "timestamp": 1030731590.7421875, - "heart_rate": 59 - }, - { - "timestamp": 1030731590.9921875, - "heart_rate": 59 - }, - { - "timestamp": 1030731591.2421875, - "heart_rate": 59 - }, - { - "timestamp": 1030731591.4921875, - "heart_rate": 59 - }, - { - "timestamp": 1030731591.5458984, - "heart_rate": 59 - }, - { - "timestamp": 1030731591.7958984, - "heart_rate": 59 - }, - { - "timestamp": 1030731592.0458984, - "heart_rate": 59 - }, - { - "timestamp": 1030731592.2958984, - "heart_rate": 59 - }, - { - "timestamp": 1030731592.5458984, - "heart_rate": 59 - }, - { - "timestamp": 1030731592.5986328, - "heart_rate": 59 - }, - { - "timestamp": 1030731592.8486328, - "heart_rate": 59 - }, - { - "timestamp": 1030731593.0986328, - "heart_rate": 59 - }, - { - "timestamp": 1030731593.3486328, - "heart_rate": 59 - }, - { - "timestamp": 1030731593.5986328, - "heart_rate": 59 - }, - { - "timestamp": 1030731593.6210938, - "heart_rate": 58 - }, - { - "timestamp": 1030731593.8710938, - "heart_rate": 58 - }, - { - "timestamp": 1030731594.1210938, - "heart_rate": 58 - }, - { - "timestamp": 1030731594.3710938, - "heart_rate": 58 - }, - { - "timestamp": 1030731594.6210938, - "heart_rate": 58 - }, - { - "timestamp": 1030731594.65625, - "heart_rate": 59 - }, - { - "timestamp": 1030731594.90625, - "heart_rate": 59 - }, - { - "timestamp": 1030731595.15625, - "heart_rate": 59 - }, - { - "timestamp": 1030731595.40625, - "heart_rate": 59 - }, - { - "timestamp": 1030731595.65625, - "heart_rate": 59 - }, - { - "timestamp": 1030731595.6943359, - "heart_rate": 59 - }, - { - "timestamp": 1030731595.9443359, - "heart_rate": 59 - }, - { - "timestamp": 1030731596.1943359, - "heart_rate": 59 - }, - { - "timestamp": 1030731596.4443359, - "heart_rate": 59 - }, - { - "timestamp": 1030731596.6943359, - "heart_rate": 59 - }, - { - "timestamp": 1030731596.7236328, - "heart_rate": 59 - }, - { - "timestamp": 1030731596.9736328, - "heart_rate": 59 - }, - { - "timestamp": 1030731597.2236328, - "heart_rate": 59 - }, - { - "timestamp": 1030731597.4736328, - "heart_rate": 59 - }, - { - "timestamp": 1030731597.7236328, - "heart_rate": 59 - }, - { - "timestamp": 1030731597.7744141, - "heart_rate": 59 - }, - { - "timestamp": 1030731598.0244141, - "heart_rate": 59 - }, - { - "timestamp": 1030731598.2744141, - "heart_rate": 59 - }, - { - "timestamp": 1030731598.5244141, - "heart_rate": 59 - }, - { - "timestamp": 1030731598.7744141, - "heart_rate": 59 - }, - { - "timestamp": 1030731598.8496094, - "heart_rate": 59 - }, - { - "timestamp": 1030731599.0996094, - "heart_rate": 59 - }, - { - "timestamp": 1030731599.3496094, - "heart_rate": 59 - }, - { - "timestamp": 1030731599.5556641, - "heart_rate": 59 - }, - { - "timestamp": 1030731599.8056641, - "heart_rate": 59 - }, - { - "timestamp": 1030731600.0556641, - "heart_rate": 59 - }, - { - "timestamp": 1030731600.3056641, - "heart_rate": 59 - }, - { - "timestamp": 1030731600.5195312, - "heart_rate": 59 - }, - { - "timestamp": 1030731600.7695312, - "heart_rate": 59 - }, - { - "timestamp": 1030731601.0195312, - "heart_rate": 59 - }, - { - "timestamp": 1030731601.2177734, - "heart_rate": 59 - }, - { - "timestamp": 1030731601.4677734, - "heart_rate": 59 - }, - { - "timestamp": 1030731601.7177734, - "heart_rate": 59 - }, - { - "timestamp": 1030731601.9677734, - "heart_rate": 59 - }, - { - "timestamp": 1030731602.1015625, - "heart_rate": 59 - }, - { - "timestamp": 1030731602.3515625, - "heart_rate": 59 - }, - { - "timestamp": 1030731602.6015625, - "heart_rate": 59 - }, - { - "timestamp": 1030731602.8515625, - "heart_rate": 59 - }, - { - "timestamp": 1030731603.1015625, - "heart_rate": 59 - }, - { - "timestamp": 1030731603.2080078, - "heart_rate": 59 - }, - { - "timestamp": 1030731603.4580078, - "heart_rate": 59 - }, - { - "timestamp": 1030731603.7080078, - "heart_rate": 59 - }, - { - "timestamp": 1030731603.9580078, - "heart_rate": 59 - }, - { - "timestamp": 1030731604.2080078, - "heart_rate": 59 - }, - { - "timestamp": 1030731604.3037109, - "heart_rate": 59 - }, - { - "timestamp": 1030731604.5537109, - "heart_rate": 59 - }, - { - "timestamp": 1030731604.8037109, - "heart_rate": 59 - }, - { - "timestamp": 1030731605.0537109, - "heart_rate": 59 - }, - { - "timestamp": 1030731605.3037109, - "heart_rate": 59 - }, - { - "timestamp": 1030731605.3857422, - "heart_rate": 59 - }, - { - "timestamp": 1030731605.6357422, - "heart_rate": 59 - }, - { - "timestamp": 1030731605.8857422, - "heart_rate": 59 - }, - { - "timestamp": 1030731606.1357422, - "heart_rate": 59 - }, - { - "timestamp": 1030731606.3857422, - "heart_rate": 59 - }, - { - "timestamp": 1030731606.453125, - "heart_rate": 59 - }, - { - "timestamp": 1030731606.703125, - "heart_rate": 59 - }, - { - "timestamp": 1030731606.953125, - "heart_rate": 59 - }, - { - "timestamp": 1030731607.203125, - "heart_rate": 59 - }, - { - "timestamp": 1030731607.453125, - "heart_rate": 59 - }, - { - "timestamp": 1030731607.4921875, - "heart_rate": 59 - }, - { - "timestamp": 1030731607.7421875, - "heart_rate": 59 - }, - { - "timestamp": 1030731607.9921875, - "heart_rate": 59 - }, - { - "timestamp": 1030731608.2421875, - "heart_rate": 59 - }, - { - "timestamp": 1030731608.4921875, - "heart_rate": 59 - }, - { - "timestamp": 1030731608.5449219, - "heart_rate": 59 - }, - { - "timestamp": 1030731608.7949219, - "heart_rate": 59 - }, - { - "timestamp": 1030731609.0449219, - "heart_rate": 59 - }, - { - "timestamp": 1030731609.2949219, - "heart_rate": 59 - }, - { - "timestamp": 1030731609.5449219, - "heart_rate": 59 - }, - { - "timestamp": 1030731609.609375, - "heart_rate": 59 - }, - { - "timestamp": 1030731609.859375, - "heart_rate": 59 - }, - { - "timestamp": 1030731610.109375, - "heart_rate": 59 - }, - { - "timestamp": 1030731610.359375, - "heart_rate": 59 - }, - { - "timestamp": 1030731610.609375, - "heart_rate": 59 - }, - { - "timestamp": 1030731610.6494141, - "heart_rate": 59 - }, - { - "timestamp": 1030731610.8994141, - "heart_rate": 59 - }, - { - "timestamp": 1030731611.1494141, - "heart_rate": 59 - }, - { - "timestamp": 1030731611.3994141, - "heart_rate": 59 - }, - { - "timestamp": 1030731611.6494141, - "heart_rate": 59 - }, - { - "timestamp": 1030731611.6845703, - "heart_rate": 59 - }, - { - "timestamp": 1030731611.9345703, - "heart_rate": 59 - }, - { - "timestamp": 1030731612.1845703, - "heart_rate": 59 - }, - { - "timestamp": 1030731612.4345703, - "heart_rate": 59 - }, - { - "timestamp": 1030731612.6845703, - "heart_rate": 59 - }, - { - "timestamp": 1030731612.7324219, - "heart_rate": 60 - }, - { - "timestamp": 1030731612.9824219, - "heart_rate": 60 - }, - { - "timestamp": 1030731613.2324219, - "heart_rate": 60 - }, - { - "timestamp": 1030731613.4824219, - "heart_rate": 60 - }, - { - "timestamp": 1030731613.7324219, - "heart_rate": 60 - }, - { - "timestamp": 1030731613.7753906, - "heart_rate": 60 - }, - { - "timestamp": 1030731614.0253906, - "heart_rate": 60 - }, - { - "timestamp": 1030731614.2753906, - "heart_rate": 60 - }, - { - "timestamp": 1030731614.5253906, - "heart_rate": 60 - }, - { - "timestamp": 1030731614.7753906, - "heart_rate": 60 - }, - { - "timestamp": 1030731614.8115234, - "heart_rate": 60 - }, - { - "timestamp": 1030731615.0615234, - "heart_rate": 60 - }, - { - "timestamp": 1030731615.3115234, - "heart_rate": 60 - }, - { - "timestamp": 1030731615.5615234, - "heart_rate": 60 - }, - { - "timestamp": 1030731615.8115234, - "heart_rate": 60 - }, - { - "timestamp": 1030731615.8408203, - "heart_rate": 59 - }, - { - "timestamp": 1030731616.0908203, - "heart_rate": 59 - }, - { - "timestamp": 1030731616.3408203, - "heart_rate": 59 - }, - { - "timestamp": 1030731616.5908203, - "heart_rate": 59 - }, - { - "timestamp": 1030731616.8408203, - "heart_rate": 59 - }, - { - "timestamp": 1030731616.859375, - "heart_rate": 60 - }, - { - "timestamp": 1030731617.109375, - "heart_rate": 60 - }, - { - "timestamp": 1030731617.359375, - "heart_rate": 60 - }, - { - "timestamp": 1030731617.609375, - "heart_rate": 60 - }, - { - "timestamp": 1030731617.859375, - "heart_rate": 60 - }, - { - "timestamp": 1030731617.9033203, - "heart_rate": 60 - }, - { - "timestamp": 1030731618.1533203, - "heart_rate": 60 - }, - { - "timestamp": 1030731618.4033203, - "heart_rate": 60 - }, - { - "timestamp": 1030731618.6533203, - "heart_rate": 60 - }, - { - "timestamp": 1030731618.9033203, - "heart_rate": 60 - }, - { - "timestamp": 1030731618.9716797, - "heart_rate": 59 - }, - { - "timestamp": 1030731619.2216797, - "heart_rate": 59 - }, - { - "timestamp": 1030731619.4716797, - "heart_rate": 59 - }, - { - "timestamp": 1030731619.7216797, - "heart_rate": 59 - }, - { - "timestamp": 1030731619.9716797, - "heart_rate": 59 - }, - { - "timestamp": 1030731620.0429688, - "heart_rate": 58 - }, - { - "timestamp": 1030731620.2929688, - "heart_rate": 58 - }, - { - "timestamp": 1030731620.5429688, - "heart_rate": 58 - }, - { - "timestamp": 1030731620.7929688, - "heart_rate": 58 - }, - { - "timestamp": 1030731621.0429688, - "heart_rate": 58 - }, - { - "timestamp": 1030731621.0966797, - "heart_rate": 57 - }, - { - "timestamp": 1030731621.3466797, - "heart_rate": 57 - }, - { - "timestamp": 1030731621.5966797, - "heart_rate": 57 - }, - { - "timestamp": 1030731621.8466797, - "heart_rate": 57 - }, - { - "timestamp": 1030731622.0966797, - "heart_rate": 57 - }, - { - "timestamp": 1030731622.1630859, - "heart_rate": 57 - }, - { - "timestamp": 1030731622.4130859, - "heart_rate": 57 - }, - { - "timestamp": 1030731622.6630859, - "heart_rate": 57 - }, - { - "timestamp": 1030731622.9130859, - "heart_rate": 57 - }, - { - "timestamp": 1030731623.1630859, - "heart_rate": 57 - }, - { - "timestamp": 1030731623.1953125, - "heart_rate": 57 - }, - { - "timestamp": 1030731623.4453125, - "heart_rate": 57 - }, - { - "timestamp": 1030731623.6953125, - "heart_rate": 57 - }, - { - "timestamp": 1030731623.9453125, - "heart_rate": 57 - }, - { - "timestamp": 1030731624.1953125, - "heart_rate": 57 - }, - { - "timestamp": 1030731624.2197266, - "heart_rate": 58 - }, - { - "timestamp": 1030731624.4697266, - "heart_rate": 58 - }, - { - "timestamp": 1030731624.7197266, - "heart_rate": 58 - }, - { - "timestamp": 1030731624.9697266, - "heart_rate": 58 - }, - { - "timestamp": 1030731625.2197266, - "heart_rate": 58 - }, - { - "timestamp": 1030731625.2373047, - "heart_rate": 58 - }, - { - "timestamp": 1030731625.4873047, - "heart_rate": 58 - }, - { - "timestamp": 1030731625.7373047, - "heart_rate": 58 - }, - { - "timestamp": 1030731625.9873047, - "heart_rate": 58 - }, - { - "timestamp": 1030731626.2265625, - "heart_rate": 58 - }, - { - "timestamp": 1030731626.4765625, - "heart_rate": 58 - }, - { - "timestamp": 1030731626.7265625, - "heart_rate": 58 - }, - { - "timestamp": 1030731626.9765625, - "heart_rate": 58 - }, - { - "timestamp": 1030731627.1767578, - "heart_rate": 60 - }, - { - "timestamp": 1030731627.4267578, - "heart_rate": 60 - }, - { - "timestamp": 1030731627.6767578, - "heart_rate": 60 - }, - { - "timestamp": 1030731627.9267578, - "heart_rate": 60 - }, - { - "timestamp": 1030731628.1230469, - "heart_rate": 61 - }, - { - "timestamp": 1030731628.3730469, - "heart_rate": 61 - }, - { - "timestamp": 1030731628.6230469, - "heart_rate": 61 - }, - { - "timestamp": 1030731628.8730469, - "heart_rate": 61 - }, - { - "timestamp": 1030731629.0136719, - "heart_rate": 62 - }, - { - "timestamp": 1030731629.2636719, - "heart_rate": 62 - }, - { - "timestamp": 1030731629.5136719, - "heart_rate": 62 - }, - { - "timestamp": 1030731629.6884766, - "heart_rate": 62 - }, - { - "timestamp": 1030731629.9384766, - "heart_rate": 62 - }, - { - "timestamp": 1030731630.1884766, - "heart_rate": 62 - }, - { - "timestamp": 1030731630.4384766, - "heart_rate": 62 - }, - { - "timestamp": 1030731630.6884766, - "heart_rate": 62 - }, - { - "timestamp": 1030731630.8710938, - "heart_rate": 62 - }, - { - "timestamp": 1030731631.1210938, - "heart_rate": 62 - }, - { - "timestamp": 1030731631.3710938, - "heart_rate": 62 - }, - { - "timestamp": 1030731631.6210938, - "heart_rate": 62 - }, - { - "timestamp": 1030731631.8564453, - "heart_rate": 62 - }, - { - "timestamp": 1030731632.1064453, - "heart_rate": 62 - }, - { - "timestamp": 1030731632.3564453, - "heart_rate": 62 - }, - { - "timestamp": 1030731632.6064453, - "heart_rate": 62 - }, - { - "timestamp": 1030731632.8144531, - "heart_rate": 62 - }, - { - "timestamp": 1030731633.0644531, - "heart_rate": 62 - }, - { - "timestamp": 1030731633.3144531, - "heart_rate": 62 - }, - { - "timestamp": 1030731633.5644531, - "heart_rate": 62 - }, - { - "timestamp": 1030731633.8144531, - "heart_rate": 62 - }, - { - "timestamp": 1030731633.8300781, - "heart_rate": 62 - }, - { - "timestamp": 1030731634.0800781, - "heart_rate": 62 - }, - { - "timestamp": 1030731634.3300781, - "heart_rate": 62 - }, - { - "timestamp": 1030731634.5800781, - "heart_rate": 62 - }, - { - "timestamp": 1030731634.8212891, - "heart_rate": 62 - }, - { - "timestamp": 1030731635.0712891, - "heart_rate": 62 - }, - { - "timestamp": 1030731635.3212891, - "heart_rate": 62 - }, - { - "timestamp": 1030731635.5712891, - "heart_rate": 62 - }, - { - "timestamp": 1030731635.8212891, - "heart_rate": 62 - }, - { - "timestamp": 1030731635.8320312, - "heart_rate": 60 - }, - { - "timestamp": 1030731636.0820312, - "heart_rate": 60 - }, - { - "timestamp": 1030731636.3320312, - "heart_rate": 60 - }, - { - "timestamp": 1030731636.5820312, - "heart_rate": 60 - }, - { - "timestamp": 1030731636.8183594, - "heart_rate": 60 - }, - { - "timestamp": 1030731637.0683594, - "heart_rate": 60 - }, - { - "timestamp": 1030731637.3183594, - "heart_rate": 60 - }, - { - "timestamp": 1030731637.5683594, - "heart_rate": 60 - }, - { - "timestamp": 1030731637.8076172, - "heart_rate": 61 - }, - { - "timestamp": 1030731638.0576172, - "heart_rate": 61 - }, - { - "timestamp": 1030731638.3076172, - "heart_rate": 61 - }, - { - "timestamp": 1030731638.5576172, - "heart_rate": 61 - }, - { - "timestamp": 1030731638.7851562, - "heart_rate": 61 - }, - { - "timestamp": 1030731639.0351562, - "heart_rate": 61 - }, - { - "timestamp": 1030731639.2851562, - "heart_rate": 61 - }, - { - "timestamp": 1030731639.5351562, - "heart_rate": 61 - }, - { - "timestamp": 1030731639.7470703, - "heart_rate": 61 - }, - { - "timestamp": 1030731639.9970703, - "heart_rate": 61 - }, - { - "timestamp": 1030731640.2470703, - "heart_rate": 61 - }, - { - "timestamp": 1030731640.4970703, - "heart_rate": 61 - }, - { - "timestamp": 1030731640.7216797, - "heart_rate": 61 - }, - { - "timestamp": 1030731640.9716797, - "heart_rate": 61 - }, - { - "timestamp": 1030731641.2216797, - "heart_rate": 61 - }, - { - "timestamp": 1030731641.4716797, - "heart_rate": 61 - }, - { - "timestamp": 1030731641.6982422, - "heart_rate": 61 - }, - { - "timestamp": 1030731641.9482422, - "heart_rate": 61 - }, - { - "timestamp": 1030731642.1982422, - "heart_rate": 61 - }, - { - "timestamp": 1030731642.4482422, - "heart_rate": 61 - }, - { - "timestamp": 1030731642.6806641, - "heart_rate": 61 - }, - { - "timestamp": 1030731642.9306641, - "heart_rate": 61 - }, - { - "timestamp": 1030731643.1806641, - "heart_rate": 61 - }, - { - "timestamp": 1030731643.4306641, - "heart_rate": 61 - }, - { - "timestamp": 1030731643.6708984, - "heart_rate": 61 - }, - { - "timestamp": 1030731643.9208984, - "heart_rate": 61 - }, - { - "timestamp": 1030731644.1708984, - "heart_rate": 61 - }, - { - "timestamp": 1030731644.4208984, - "heart_rate": 61 - }, - { - "timestamp": 1030731644.6660156, - "heart_rate": 61 - }, - { - "timestamp": 1030731644.9160156, - "heart_rate": 61 - }, - { - "timestamp": 1030731645.1660156, - "heart_rate": 61 - }, - { - "timestamp": 1030731645.4160156, - "heart_rate": 61 - }, - { - "timestamp": 1030731645.6630859, - "heart_rate": 61 - }, - { - "timestamp": 1030731645.9130859, - "heart_rate": 61 - }, - { - "timestamp": 1030731646.1630859, - "heart_rate": 61 - }, - { - "timestamp": 1030731646.4130859, - "heart_rate": 61 - }, - { - "timestamp": 1030731646.6630859, - "heart_rate": 61 - }, - { - "timestamp": 1030731646.6855469, - "heart_rate": 60 - }, - { - "timestamp": 1030731646.9355469, - "heart_rate": 60 - }, - { - "timestamp": 1030731647.1855469, - "heart_rate": 60 - }, - { - "timestamp": 1030731647.4355469, - "heart_rate": 60 - }, - { - "timestamp": 1030731647.6855469, - "heart_rate": 60 - }, - { - "timestamp": 1030731647.7275391, - "heart_rate": 60 - }, - { - "timestamp": 1030731647.9775391, - "heart_rate": 60 - }, - { - "timestamp": 1030731648.2275391, - "heart_rate": 60 - }, - { - "timestamp": 1030731648.4775391, - "heart_rate": 60 - }, - { - "timestamp": 1030731648.7275391, - "heart_rate": 60 - }, - { - "timestamp": 1030731648.7773438, - "heart_rate": 59 - }, - { - "timestamp": 1030731649.0273438, - "heart_rate": 59 - }, - { - "timestamp": 1030731649.2773438, - "heart_rate": 59 - }, - { - "timestamp": 1030731649.5273438, - "heart_rate": 59 - }, - { - "timestamp": 1030731649.7773438, - "heart_rate": 59 - }, - { - "timestamp": 1030731649.7910156, - "heart_rate": 58 - }, - { - "timestamp": 1030731650.0410156, - "heart_rate": 58 - }, - { - "timestamp": 1030731650.2910156, - "heart_rate": 58 - }, - { - "timestamp": 1030731650.5410156, - "heart_rate": 58 - }, - { - "timestamp": 1030731650.7216797, - "heart_rate": 59 - }, - { - "timestamp": 1030731650.9716797, - "heart_rate": 59 - }, - { - "timestamp": 1030731651.2216797, - "heart_rate": 59 - }, - { - "timestamp": 1030731651.4716797, - "heart_rate": 59 - }, - { - "timestamp": 1030731651.5986328, - "heart_rate": 61 - }, - { - "timestamp": 1030731651.8486328, - "heart_rate": 61 - }, - { - "timestamp": 1030731652.0986328, - "heart_rate": 61 - }, - { - "timestamp": 1030731652.3486328, - "heart_rate": 61 - }, - { - "timestamp": 1030731652.5146484, - "heart_rate": 63 - }, - { - "timestamp": 1030731652.7646484, - "heart_rate": 63 - }, - { - "timestamp": 1030731653.0146484, - "heart_rate": 63 - }, - { - "timestamp": 1030731653.2646484, - "heart_rate": 63 - }, - { - "timestamp": 1030731653.5136719, - "heart_rate": 64 - }, - { - "timestamp": 1030731653.7636719, - "heart_rate": 64 - }, - { - "timestamp": 1030731654.0136719, - "heart_rate": 64 - }, - { - "timestamp": 1030731654.2636719, - "heart_rate": 64 - }, - { - "timestamp": 1030731654.5136719, - "heart_rate": 64 - }, - { - "timestamp": 1030731654.6279297, - "heart_rate": 62 - }, - { - "timestamp": 1030731654.8779297, - "heart_rate": 62 - }, - { - "timestamp": 1030731655.1279297, - "heart_rate": 62 - }, - { - "timestamp": 1030731655.3779297, - "heart_rate": 62 - }, - { - "timestamp": 1030731655.6279297, - "heart_rate": 62 - }, - { - "timestamp": 1030731655.7880859, - "heart_rate": 58 - }, - { - "timestamp": 1030731656.0380859, - "heart_rate": 58 - }, - { - "timestamp": 1030731656.2880859, - "heart_rate": 58 - }, - { - "timestamp": 1030731656.5380859, - "heart_rate": 58 - }, - { - "timestamp": 1030731656.7880859, - "heart_rate": 58 - }, - { - "timestamp": 1030731656.9316406, - "heart_rate": 56 - }, - { - "timestamp": 1030731657.1816406, - "heart_rate": 56 - }, - { - "timestamp": 1030731657.4316406, - "heart_rate": 56 - }, - { - "timestamp": 1030731657.6816406, - "heart_rate": 56 - }, - { - "timestamp": 1030731657.9316406, - "heart_rate": 56 - }, - { - "timestamp": 1030731658.0771484, - "heart_rate": 54 - }, - { - "timestamp": 1030731658.3271484, - "heart_rate": 54 - }, - { - "timestamp": 1030731658.5771484, - "heart_rate": 54 - }, - { - "timestamp": 1030731658.8271484, - "heart_rate": 54 - }, - { - "timestamp": 1030731659.0771484, - "heart_rate": 54 - }, - { - "timestamp": 1030731659.2050781, - "heart_rate": 53 - }, - { - "timestamp": 1030731659.4550781, - "heart_rate": 53 - }, - { - "timestamp": 1030731659.7050781, - "heart_rate": 53 - }, - { - "timestamp": 1030731659.9550781, - "heart_rate": 53 - }, - { - "timestamp": 1030731660.2050781, - "heart_rate": 53 - }, - { - "timestamp": 1030731660.2597656, - "heart_rate": 53 - }, - { - "timestamp": 1030731660.5097656, - "heart_rate": 53 - }, - { - "timestamp": 1030731660.7597656, - "heart_rate": 53 - }, - { - "timestamp": 1030731661.0097656, - "heart_rate": 53 - }, - { - "timestamp": 1030731661.2597656, - "heart_rate": 53 - }, - { - "timestamp": 1030731661.3144531, - "heart_rate": 55 - }, - { - "timestamp": 1030731661.5644531, - "heart_rate": 55 - }, - { - "timestamp": 1030731661.8144531, - "heart_rate": 55 - }, - { - "timestamp": 1030731662.0644531, - "heart_rate": 55 - }, - { - "timestamp": 1030731662.3144531, - "heart_rate": 55 - }, - { - "timestamp": 1030731662.3535156, - "heart_rate": 56 - }, - { - "timestamp": 1030731662.6035156, - "heart_rate": 56 - }, - { - "timestamp": 1030731662.8535156, - "heart_rate": 56 - }, - { - "timestamp": 1030731663.1035156, - "heart_rate": 56 - }, - { - "timestamp": 1030731663.3535156, - "heart_rate": 56 - }, - { - "timestamp": 1030731663.4091797, - "heart_rate": 56 - }, - { - "timestamp": 1030731663.6591797, - "heart_rate": 56 - }, - { - "timestamp": 1030731663.9091797, - "heart_rate": 56 - }, - { - "timestamp": 1030731664.1591797, - "heart_rate": 56 - }, - { - "timestamp": 1030731664.4091797, - "heart_rate": 56 - }, - { - "timestamp": 1030731664.4707031, - "heart_rate": 57 - }, - { - "timestamp": 1030731664.7207031, - "heart_rate": 57 - }, - { - "timestamp": 1030731664.9707031, - "heart_rate": 57 - }, - { - "timestamp": 1030731665.2207031, - "heart_rate": 57 - }, - { - "timestamp": 1030731665.4707031, - "heart_rate": 57 - }, - { - "timestamp": 1030731665.4746094, - "heart_rate": 57 - }, - { - "timestamp": 1030731665.7246094, - "heart_rate": 57 - }, - { - "timestamp": 1030731665.9746094, - "heart_rate": 57 - }, - { - "timestamp": 1030731666.2246094, - "heart_rate": 57 - }, - { - "timestamp": 1030731666.4462891, - "heart_rate": 58 - }, - { - "timestamp": 1030731666.6962891, - "heart_rate": 58 - }, - { - "timestamp": 1030731666.9462891, - "heart_rate": 58 - }, - { - "timestamp": 1030731667.1962891, - "heart_rate": 58 - }, - { - "timestamp": 1030731667.4462891, - "heart_rate": 58 - }, - { - "timestamp": 1030731667.5683594, - "heart_rate": 59 - }, - { - "timestamp": 1030731667.8183594, - "heart_rate": 59 - }, - { - "timestamp": 1030731668.0683594, - "heart_rate": 59 - }, - { - "timestamp": 1030731668.3183594, - "heart_rate": 59 - }, - { - "timestamp": 1030731668.5683594, - "heart_rate": 59 - }, - { - "timestamp": 1030731668.7119141, - "heart_rate": 57 - }, - { - "timestamp": 1030731668.9619141, - "heart_rate": 57 - }, - { - "timestamp": 1030731669.2119141, - "heart_rate": 57 - }, - { - "timestamp": 1030731669.4619141, - "heart_rate": 57 - }, - { - "timestamp": 1030731669.7119141, - "heart_rate": 57 - }, - { - "timestamp": 1030731669.8740234, - "heart_rate": 54 - }, - { - "timestamp": 1030731670.1240234, - "heart_rate": 54 - }, - { - "timestamp": 1030731670.3740234, - "heart_rate": 54 - }, - { - "timestamp": 1030731670.6240234, - "heart_rate": 54 - }, - { - "timestamp": 1030731670.8740234, - "heart_rate": 54 - }, - { - "timestamp": 1030731670.9824219, - "heart_rate": 53 - }, - { - "timestamp": 1030731670.9824219, - "heart_rate": 53 - }, - { - "timestamp": 1030731670.9824219, - "heart_rate": 53 - }, - { - "timestamp": 1030731671.2324219, - "heart_rate": 53 - }, - { - "timestamp": 1030731671.4824219, - "heart_rate": 53 - }, - { - "timestamp": 1030731671.7324219, - "heart_rate": 53 - }, - { - "timestamp": 1030731671.9824219, - "heart_rate": 53 - }, - { - "timestamp": 1030731672, - "heart_rate": 55 - }, - { - "timestamp": 1030731672.25, - "heart_rate": 55 - }, - { - "timestamp": 1030731672.5, - "heart_rate": 55 - }, - { - "timestamp": 1030731672.75, - "heart_rate": 55 - }, - { - "timestamp": 1030731673, - "heart_rate": 55 - }, - { - "timestamp": 1030731673.25, - "heart_rate": 55 - }, - { - "timestamp": 1030731673.5, - "heart_rate": 55 - }, - { - "timestamp": 1030731673.75, - "heart_rate": 55 - }, - { - "timestamp": 1030731674, - "heart_rate": 55 - }, - { - "timestamp": 1030731674.0419922, - "heart_rate": 56 - }, - { - "timestamp": 1030731674.2919922, - "heart_rate": 56 - }, - { - "timestamp": 1030731674.5419922, - "heart_rate": 56 - }, - { - "timestamp": 1030731674.7919922, - "heart_rate": 56 - }, - { - "timestamp": 1030731675.0419922, - "heart_rate": 56 - }, - { - "timestamp": 1030731675.0595703, - "heart_rate": 57 - }, - { - "timestamp": 1030731675.3095703, - "heart_rate": 57 - }, - { - "timestamp": 1030731675.5595703, - "heart_rate": 57 - }, - { - "timestamp": 1030731675.8095703, - "heart_rate": 57 - }, - { - "timestamp": 1030731676.0507812, - "heart_rate": 58 - }, - { - "timestamp": 1030731676.3007812, - "heart_rate": 58 - }, - { - "timestamp": 1030731676.5507812, - "heart_rate": 58 - }, - { - "timestamp": 1030731676.8007812, - "heart_rate": 58 - }, - { - "timestamp": 1030731677.0244141, - "heart_rate": 59 - }, - { - "timestamp": 1030731677.2744141, - "heart_rate": 59 - }, - { - "timestamp": 1030731677.5244141, - "heart_rate": 59 - }, - { - "timestamp": 1030731677.7744141, - "heart_rate": 59 - }, - { - "timestamp": 1030731677.9765625, - "heart_rate": 60 - }, - { - "timestamp": 1030731678.2265625, - "heart_rate": 60 - }, - { - "timestamp": 1030731678.4765625, - "heart_rate": 60 - }, - { - "timestamp": 1030731678.7265625, - "heart_rate": 60 - }, - { - "timestamp": 1030731678.9765625, - "heart_rate": 60 - }, - { - "timestamp": 1030731679.0068359, - "heart_rate": 61 - }, - { - "timestamp": 1030731679.2568359, - "heart_rate": 61 - }, - { - "timestamp": 1030731679.5068359, - "heart_rate": 61 - }, - { - "timestamp": 1030731679.7568359, - "heart_rate": 61 - }, - { - "timestamp": 1030731680.0068359, - "heart_rate": 61 - }, - { - "timestamp": 1030731680.0810547, - "heart_rate": 60 - }, - { - "timestamp": 1030731680.3310547, - "heart_rate": 60 - }, - { - "timestamp": 1030731680.5810547, - "heart_rate": 60 - }, - { - "timestamp": 1030731680.8310547, - "heart_rate": 60 - }, - { - "timestamp": 1030731681.0810547, - "heart_rate": 60 - }, - { - "timestamp": 1030731681.2138672, - "heart_rate": 58 - }, - { - "timestamp": 1030731681.4638672, - "heart_rate": 58 - }, - { - "timestamp": 1030731681.7138672, - "heart_rate": 58 - }, - { - "timestamp": 1030731681.9638672, - "heart_rate": 58 - }, - { - "timestamp": 1030731682.2138672, - "heart_rate": 58 - }, - { - "timestamp": 1030731682.3935547, - "heart_rate": 55 - }, - { - "timestamp": 1030731682.6435547, - "heart_rate": 55 - }, - { - "timestamp": 1030731682.8935547, - "heart_rate": 55 - }, - { - "timestamp": 1030731683.1435547, - "heart_rate": 55 - }, - { - "timestamp": 1030731683.3935547, - "heart_rate": 55 - }, - { - "timestamp": 1030731683.5712891, - "heart_rate": 53 - }, - { - "timestamp": 1030731683.8212891, - "heart_rate": 53 - }, - { - "timestamp": 1030731684.0712891, - "heart_rate": 53 - }, - { - "timestamp": 1030731684.3212891, - "heart_rate": 53 - }, - { - "timestamp": 1030731684.5712891, - "heart_rate": 53 - }, - { - "timestamp": 1030731684.7431641, - "heart_rate": 52 - }, - { - "timestamp": 1030731684.9931641, - "heart_rate": 52 - }, - { - "timestamp": 1030731685.2431641, - "heart_rate": 52 - }, - { - "timestamp": 1030731685.4931641, - "heart_rate": 52 - }, - { - "timestamp": 1030731685.7431641, - "heart_rate": 52 - }, - { - "timestamp": 1030731685.8720703, - "heart_rate": 52 - }, - { - "timestamp": 1030731686.1220703, - "heart_rate": 52 - }, - { - "timestamp": 1030731686.3720703, - "heart_rate": 52 - }, - { - "timestamp": 1030731686.6220703, - "heart_rate": 52 - }, - { - "timestamp": 1030731686.8720703, - "heart_rate": 52 - }, - { - "timestamp": 1030731686.9726562, - "heart_rate": 52 - }, - { - "timestamp": 1030731687.2226562, - "heart_rate": 52 - }, - { - "timestamp": 1030731687.4726562, - "heart_rate": 52 - }, - { - "timestamp": 1030731687.7226562, - "heart_rate": 52 - }, - { - "timestamp": 1030731687.9726562, - "heart_rate": 52 - }, - { - "timestamp": 1030731688.0527344, - "heart_rate": 53 - }, - { - "timestamp": 1030731688.3027344, - "heart_rate": 53 - }, - { - "timestamp": 1030731688.5527344, - "heart_rate": 53 - }, - { - "timestamp": 1030731688.8027344, - "heart_rate": 53 - }, - { - "timestamp": 1030731689.0527344, - "heart_rate": 53 - }, - { - "timestamp": 1030731689.0878906, - "heart_rate": 54 - }, - { - "timestamp": 1030731689.3378906, - "heart_rate": 54 - }, - { - "timestamp": 1030731689.5878906, - "heart_rate": 54 - }, - { - "timestamp": 1030731689.8378906, - "heart_rate": 54 - }, - { - "timestamp": 1030731690.0878906, - "heart_rate": 54 - }, - { - "timestamp": 1030731690.0917969, - "heart_rate": 56 - }, - { - "timestamp": 1030731690.3417969, - "heart_rate": 56 - }, - { - "timestamp": 1030731690.5917969, - "heart_rate": 56 - }, - { - "timestamp": 1030731690.8417969, - "heart_rate": 56 - }, - { - "timestamp": 1030731691.0917969, - "heart_rate": 56 - }, - { - "timestamp": 1030731691.1025391, - "heart_rate": 58 - }, - { - "timestamp": 1030731691.3525391, - "heart_rate": 58 - }, - { - "timestamp": 1030731691.6025391, - "heart_rate": 58 - }, - { - "timestamp": 1030731691.8525391, - "heart_rate": 58 - }, - { - "timestamp": 1030731692.1025391, - "heart_rate": 58 - }, - { - "timestamp": 1030731692.1162109, - "heart_rate": 59 - }, - { - "timestamp": 1030731692.3662109, - "heart_rate": 59 - }, - { - "timestamp": 1030731692.6162109, - "heart_rate": 59 - }, - { - "timestamp": 1030731692.8662109, - "heart_rate": 59 - }, - { - "timestamp": 1030731693.1162109, - "heart_rate": 59 - }, - { - "timestamp": 1030731693.1533203, - "heart_rate": 59 - }, - { - "timestamp": 1030731693.4033203, - "heart_rate": 59 - }, - { - "timestamp": 1030731693.6533203, - "heart_rate": 59 - }, - { - "timestamp": 1030731693.9033203, - "heart_rate": 59 - }, - { - "timestamp": 1030731694.1533203, - "heart_rate": 59 - }, - { - "timestamp": 1030731694.1689453, - "heart_rate": 59 - }, - { - "timestamp": 1030731694.4189453, - "heart_rate": 59 - }, - { - "timestamp": 1030731694.6689453, - "heart_rate": 59 - }, - { - "timestamp": 1030731694.9189453, - "heart_rate": 59 - }, - { - "timestamp": 1030731695.1689453, - "heart_rate": 59 - }, - { - "timestamp": 1030731695.2070312, - "heart_rate": 58 - }, - { - "timestamp": 1030731695.4570312, - "heart_rate": 58 - }, - { - "timestamp": 1030731695.7070312, - "heart_rate": 58 - }, - { - "timestamp": 1030731695.9570312, - "heart_rate": 58 - }, - { - "timestamp": 1030731696.2070312, - "heart_rate": 58 - }, - { - "timestamp": 1030731696.2685547, - "heart_rate": 58 - }, - { - "timestamp": 1030731696.5185547, - "heart_rate": 58 - }, - { - "timestamp": 1030731696.7685547, - "heart_rate": 58 - }, - { - "timestamp": 1030731697.0185547, - "heart_rate": 58 - }, - { - "timestamp": 1030731697.2685547, - "heart_rate": 58 - }, - { - "timestamp": 1030731697.3369141, - "heart_rate": 57 - }, - { - "timestamp": 1030731697.5869141, - "heart_rate": 57 - }, - { - "timestamp": 1030731697.8369141, - "heart_rate": 57 - }, - { - "timestamp": 1030731698.0869141, - "heart_rate": 57 - }, - { - "timestamp": 1030731698.3369141, - "heart_rate": 57 - }, - { - "timestamp": 1030731698.40625, - "heart_rate": 57 - }, - { - "timestamp": 1030731698.65625, - "heart_rate": 57 - }, - { - "timestamp": 1030731698.90625, - "heart_rate": 57 - }, - { - "timestamp": 1030731699.15625, - "heart_rate": 57 - }, - { - "timestamp": 1030731699.40625, - "heart_rate": 57 - }, - { - "timestamp": 1030731699.4853516, - "heart_rate": 56 - }, - { - "timestamp": 1030731699.7353516, - "heart_rate": 56 - }, - { - "timestamp": 1030731699.9853516, - "heart_rate": 56 - }, - { - "timestamp": 1030731700.2353516, - "heart_rate": 56 - }, - { - "timestamp": 1030731700.4853516, - "heart_rate": 56 - }, - { - "timestamp": 1030731700.5390625, - "heart_rate": 56 - }, - { - "timestamp": 1030731700.7890625, - "heart_rate": 56 - }, - { - "timestamp": 1030731701.0390625, - "heart_rate": 56 - }, - { - "timestamp": 1030731701.2890625, - "heart_rate": 56 - }, - { - "timestamp": 1030731701.5390625, - "heart_rate": 56 - }, - { - "timestamp": 1030731701.5693359, - "heart_rate": 57 - }, - { - "timestamp": 1030731701.8193359, - "heart_rate": 57 - }, - { - "timestamp": 1030731702.0693359, - "heart_rate": 57 - }, - { - "timestamp": 1030731702.3193359, - "heart_rate": 57 - }, - { - "timestamp": 1030731702.5380859, - "heart_rate": 57 - }, - { - "timestamp": 1030731702.7880859, - "heart_rate": 57 - }, - { - "timestamp": 1030731703.0380859, - "heart_rate": 57 - }, - { - "timestamp": 1030731703.2880859, - "heart_rate": 57 - }, - { - "timestamp": 1030731703.5380859, - "heart_rate": 57 - }, - { - "timestamp": 1030731703.5527344, - "heart_rate": 58 - }, - { - "timestamp": 1030731703.8027344, - "heart_rate": 58 - }, - { - "timestamp": 1030731704.0527344, - "heart_rate": 58 - }, - { - "timestamp": 1030731704.3027344, - "heart_rate": 58 - }, - { - "timestamp": 1030731704.5527344, - "heart_rate": 58 - }, - { - "timestamp": 1030731704.6220703, - "heart_rate": 59 - }, - { - "timestamp": 1030731704.8720703, - "heart_rate": 59 - }, - { - "timestamp": 1030731705.1220703, - "heart_rate": 59 - }, - { - "timestamp": 1030731705.3720703, - "heart_rate": 59 - }, - { - "timestamp": 1030731705.6220703, - "heart_rate": 59 - }, - { - "timestamp": 1030731705.7431641, - "heart_rate": 57 - }, - { - "timestamp": 1030731705.9931641, - "heart_rate": 57 - }, - { - "timestamp": 1030731706.2431641, - "heart_rate": 57 - }, - { - "timestamp": 1030731706.4931641, - "heart_rate": 57 - }, - { - "timestamp": 1030731706.7431641, - "heart_rate": 57 - }, - { - "timestamp": 1030731706.8632812, - "heart_rate": 55 - }, - { - "timestamp": 1030731707.1132812, - "heart_rate": 55 - }, - { - "timestamp": 1030731707.3632812, - "heart_rate": 55 - }, - { - "timestamp": 1030731707.6132812, - "heart_rate": 55 - }, - { - "timestamp": 1030731707.8632812, - "heart_rate": 55 - }, - { - "timestamp": 1030731708.0126953, - "heart_rate": 55 - }, - { - "timestamp": 1030731708.2626953, - "heart_rate": 55 - }, - { - "timestamp": 1030731708.5126953, - "heart_rate": 55 - }, - { - "timestamp": 1030731708.7626953, - "heart_rate": 55 - }, - { - "timestamp": 1030731709.0126953, - "heart_rate": 55 - }, - { - "timestamp": 1030731709.1621094, - "heart_rate": 53 - }, - { - "timestamp": 1030731709.4121094, - "heart_rate": 53 - }, - { - "timestamp": 1030731709.6621094, - "heart_rate": 53 - }, - { - "timestamp": 1030731709.9121094, - "heart_rate": 53 - }, - { - "timestamp": 1030731710.1621094, - "heart_rate": 53 - }, - { - "timestamp": 1030731710.2705078, - "heart_rate": 53 - }, - { - "timestamp": 1030731710.5205078, - "heart_rate": 53 - }, - { - "timestamp": 1030731710.7705078, - "heart_rate": 53 - }, - { - "timestamp": 1030731711.0205078, - "heart_rate": 53 - }, - { - "timestamp": 1030731711.2705078, - "heart_rate": 53 - }, - { - "timestamp": 1030731711.3994141, - "heart_rate": 53 - }, - { - "timestamp": 1030731711.6494141, - "heart_rate": 53 - }, - { - "timestamp": 1030731711.8994141, - "heart_rate": 53 - }, - { - "timestamp": 1030731712.1494141, - "heart_rate": 53 - }, - { - "timestamp": 1030731712.3994141, - "heart_rate": 53 - }, - { - "timestamp": 1030731712.5, - "heart_rate": 54 - }, - { - "timestamp": 1030731712.75, - "heart_rate": 54 - }, - { - "timestamp": 1030731713, - "heart_rate": 54 - }, - { - "timestamp": 1030731713.25, - "heart_rate": 54 - }, - { - "timestamp": 1030731713.5, - "heart_rate": 54 - }, - { - "timestamp": 1030731713.5371094, - "heart_rate": 54 - }, - { - "timestamp": 1030731713.7871094, - "heart_rate": 54 - }, - { - "timestamp": 1030731714.0371094, - "heart_rate": 54 - }, - { - "timestamp": 1030731714.2871094, - "heart_rate": 54 - }, - { - "timestamp": 1030731714.5371094, - "heart_rate": 54 - }, - { - "timestamp": 1030731714.5380859, - "heart_rate": 56 - }, - { - "timestamp": 1030731714.7880859, - "heart_rate": 56 - }, - { - "timestamp": 1030731715.0380859, - "heart_rate": 56 - }, - { - "timestamp": 1030731715.2880859, - "heart_rate": 56 - }, - { - "timestamp": 1030731715.4072266, - "heart_rate": 58 - }, - { - "timestamp": 1030731715.6572266, - "heart_rate": 58 - }, - { - "timestamp": 1030731715.9072266, - "heart_rate": 58 - }, - { - "timestamp": 1030731716.1572266, - "heart_rate": 58 - }, - { - "timestamp": 1030731716.4072266, - "heart_rate": 58 - }, - { - "timestamp": 1030731716.4804688, - "heart_rate": 58 - }, - { - "timestamp": 1030731716.7304688, - "heart_rate": 58 - }, - { - "timestamp": 1030731716.9804688, - "heart_rate": 58 - }, - { - "timestamp": 1030731717.2304688, - "heart_rate": 58 - }, - { - "timestamp": 1030731717.4804688, - "heart_rate": 58 - }, - { - "timestamp": 1030731717.5419922, - "heart_rate": 58 - }, - { - "timestamp": 1030731717.7919922, - "heart_rate": 58 - }, - { - "timestamp": 1030731718.0419922, - "heart_rate": 58 - }, - { - "timestamp": 1030731718.2919922, - "heart_rate": 58 - }, - { - "timestamp": 1030731718.5419922, - "heart_rate": 58 - }, - { - "timestamp": 1030731718.6337891, - "heart_rate": 57 - }, - { - "timestamp": 1030731718.8837891, - "heart_rate": 57 - }, - { - "timestamp": 1030731719.1337891, - "heart_rate": 57 - }, - { - "timestamp": 1030731719.3837891, - "heart_rate": 57 - }, - { - "timestamp": 1030731719.6337891, - "heart_rate": 57 - }, - { - "timestamp": 1030731719.6835938, - "heart_rate": 57 - }, - { - "timestamp": 1030731719.9335938, - "heart_rate": 57 - }, - { - "timestamp": 1030731720.1835938, - "heart_rate": 57 - }, - { - "timestamp": 1030731720.4335938, - "heart_rate": 57 - }, - { - "timestamp": 1030731720.6835938, - "heart_rate": 57 - }, - { - "timestamp": 1030731720.7871094, - "heart_rate": 56 - }, - { - "timestamp": 1030731721.0371094, - "heart_rate": 56 - }, - { - "timestamp": 1030731721.2871094, - "heart_rate": 56 - }, - { - "timestamp": 1030731721.5371094, - "heart_rate": 56 - }, - { - "timestamp": 1030731721.7871094, - "heart_rate": 56 - }, - { - "timestamp": 1030731721.8564453, - "heart_rate": 56 - }, - { - "timestamp": 1030731722.1064453, - "heart_rate": 56 - }, - { - "timestamp": 1030731722.3564453, - "heart_rate": 56 - }, - { - "timestamp": 1030731722.6064453, - "heart_rate": 56 - }, - { - "timestamp": 1030731722.8564453, - "heart_rate": 56 - }, - { - "timestamp": 1030731722.9287109, - "heart_rate": 56 - }, - { - "timestamp": 1030731723.1787109, - "heart_rate": 56 - }, - { - "timestamp": 1030731723.4287109, - "heart_rate": 56 - }, - { - "timestamp": 1030731723.6787109, - "heart_rate": 56 - }, - { - "timestamp": 1030731723.9287109, - "heart_rate": 56 - }, - { - "timestamp": 1030731724.0058594, - "heart_rate": 56 - }, - { - "timestamp": 1030731724.2558594, - "heart_rate": 56 - }, - { - "timestamp": 1030731724.5058594, - "heart_rate": 56 - }, - { - "timestamp": 1030731724.7558594, - "heart_rate": 56 - }, - { - "timestamp": 1030731725.0058594, - "heart_rate": 56 - }, - { - "timestamp": 1030731725.0273438, - "heart_rate": 56 - }, - { - "timestamp": 1030731725.2773438, - "heart_rate": 56 - }, - { - "timestamp": 1030731725.5273438, - "heart_rate": 56 - }, - { - "timestamp": 1030731725.7773438, - "heart_rate": 56 - }, - { - "timestamp": 1030731726.0273438, - "heart_rate": 56 - }, - { - "timestamp": 1030731726.0761719, - "heart_rate": 57 - }, - { - "timestamp": 1030731726.3261719, - "heart_rate": 57 - }, - { - "timestamp": 1030731726.5761719, - "heart_rate": 57 - }, - { - "timestamp": 1030731726.8261719, - "heart_rate": 57 - }, - { - "timestamp": 1030731727.0761719, - "heart_rate": 57 - }, - { - "timestamp": 1030731727.1210938, - "heart_rate": 57 - }, - { - "timestamp": 1030731727.3710938, - "heart_rate": 57 - }, - { - "timestamp": 1030731727.6210938, - "heart_rate": 57 - }, - { - "timestamp": 1030731727.8710938, - "heart_rate": 57 - }, - { - "timestamp": 1030731728.1210938, - "heart_rate": 57 - }, - { - "timestamp": 1030731728.1767578, - "heart_rate": 57 - }, - { - "timestamp": 1030731728.4267578, - "heart_rate": 57 - }, - { - "timestamp": 1030731728.6767578, - "heart_rate": 57 - }, - { - "timestamp": 1030731728.9267578, - "heart_rate": 57 - }, - { - "timestamp": 1030731729.1767578, - "heart_rate": 57 - }, - { - "timestamp": 1030731729.25, - "heart_rate": 57 - }, - { - "timestamp": 1030731729.5, - "heart_rate": 57 - }, - { - "timestamp": 1030731729.75, - "heart_rate": 57 - }, - { - "timestamp": 1030731730, - "heart_rate": 57 - }, - { - "timestamp": 1030731730.25, - "heart_rate": 57 - }, - { - "timestamp": 1030731730.3076172, - "heart_rate": 57 - }, - { - "timestamp": 1030731730.5576172, - "heart_rate": 57 - }, - { - "timestamp": 1030731730.8076172, - "heart_rate": 57 - }, - { - "timestamp": 1030731731.0576172, - "heart_rate": 57 - }, - { - "timestamp": 1030731731.3076172, - "heart_rate": 57 - }, - { - "timestamp": 1030731731.3662109, - "heart_rate": 57 - }, - { - "timestamp": 1030731731.6162109, - "heart_rate": 57 - }, - { - "timestamp": 1030731731.8662109, - "heart_rate": 57 - }, - { - "timestamp": 1030731732.1162109, - "heart_rate": 57 - }, - { - "timestamp": 1030731732.3662109, - "heart_rate": 57 - }, - { - "timestamp": 1030731732.4101562, - "heart_rate": 57 - }, - { - "timestamp": 1030731732.6601562, - "heart_rate": 57 - }, - { - "timestamp": 1030731732.9101562, - "heart_rate": 57 - }, - { - "timestamp": 1030731733.1601562, - "heart_rate": 57 - }, - { - "timestamp": 1030731733.4101562, - "heart_rate": 57 - }, - { - "timestamp": 1030731733.4521484, - "heart_rate": 57 - }, - { - "timestamp": 1030731733.7021484, - "heart_rate": 57 - }, - { - "timestamp": 1030731733.9521484, - "heart_rate": 57 - }, - { - "timestamp": 1030731734.2021484, - "heart_rate": 57 - }, - { - "timestamp": 1030731734.4482422, - "heart_rate": 57 - }, - { - "timestamp": 1030731734.6982422, - "heart_rate": 57 - }, - { - "timestamp": 1030731734.9482422, - "heart_rate": 57 - }, - { - "timestamp": 1030731735.1982422, - "heart_rate": 57 - }, - { - "timestamp": 1030731735.4482422, - "heart_rate": 57 - }, - { - "timestamp": 1030731735.4550781, - "heart_rate": 58 - }, - { - "timestamp": 1030731735.7050781, - "heart_rate": 58 - }, - { - "timestamp": 1030731735.9550781, - "heart_rate": 58 - }, - { - "timestamp": 1030731736.2050781, - "heart_rate": 58 - }, - { - "timestamp": 1030731736.4550781, - "heart_rate": 58 - }, - { - "timestamp": 1030731736.5009766, - "heart_rate": 59 - }, - { - "timestamp": 1030731736.7509766, - "heart_rate": 59 - }, - { - "timestamp": 1030731737.0009766, - "heart_rate": 59 - }, - { - "timestamp": 1030731737.2509766, - "heart_rate": 59 - }, - { - "timestamp": 1030731737.5009766, - "heart_rate": 59 - }, - { - "timestamp": 1030731737.5898438, - "heart_rate": 58 - }, - { - "timestamp": 1030731737.8398438, - "heart_rate": 58 - }, - { - "timestamp": 1030731738.0898438, - "heart_rate": 58 - }, - { - "timestamp": 1030731738.3398438, - "heart_rate": 58 - }, - { - "timestamp": 1030731738.5898438, - "heart_rate": 58 - }, - { - "timestamp": 1030731738.6796875, - "heart_rate": 57 - }, - { - "timestamp": 1030731738.9296875, - "heart_rate": 57 - }, - { - "timestamp": 1030731739.1796875, - "heart_rate": 57 - }, - { - "timestamp": 1030731739.4296875, - "heart_rate": 57 - }, - { - "timestamp": 1030731739.6796875, - "heart_rate": 57 - }, - { - "timestamp": 1030731739.7929688, - "heart_rate": 56 - }, - { - "timestamp": 1030731740.0429688, - "heart_rate": 56 - }, - { - "timestamp": 1030731740.2929688, - "heart_rate": 56 - }, - { - "timestamp": 1030731740.5429688, - "heart_rate": 56 - }, - { - "timestamp": 1030731740.7929688, - "heart_rate": 56 - }, - { - "timestamp": 1030731740.8974609, - "heart_rate": 55 - }, - { - "timestamp": 1030731741.1474609, - "heart_rate": 55 - }, - { - "timestamp": 1030731741.3974609, - "heart_rate": 55 - }, - { - "timestamp": 1030731741.6474609, - "heart_rate": 55 - }, - { - "timestamp": 1030731741.8974609, - "heart_rate": 55 - }, - { - "timestamp": 1030731742.0107422, - "heart_rate": 55 - }, - { - "timestamp": 1030731742.2607422, - "heart_rate": 55 - }, - { - "timestamp": 1030731742.5107422, - "heart_rate": 55 - }, - { - "timestamp": 1030731742.7607422, - "heart_rate": 55 - }, - { - "timestamp": 1030731743.0107422, - "heart_rate": 55 - }, - { - "timestamp": 1030731743.1044922, - "heart_rate": 54 - }, - { - "timestamp": 1030731743.3544922, - "heart_rate": 54 - }, - { - "timestamp": 1030731743.6044922, - "heart_rate": 54 - }, - { - "timestamp": 1030731743.8544922, - "heart_rate": 54 - }, - { - "timestamp": 1030731744.1044922, - "heart_rate": 54 - }, - { - "timestamp": 1030731744.2285156, - "heart_rate": 54 - }, - { - "timestamp": 1030731744.4785156, - "heart_rate": 54 - }, - { - "timestamp": 1030731744.7285156, - "heart_rate": 54 - }, - { - "timestamp": 1030731744.9785156, - "heart_rate": 54 - }, - { - "timestamp": 1030731745.2285156, - "heart_rate": 54 - }, - { - "timestamp": 1030731745.3642578, - "heart_rate": 54 - }, - { - "timestamp": 1030731745.6142578, - "heart_rate": 54 - }, - { - "timestamp": 1030731745.8642578, - "heart_rate": 54 - }, - { - "timestamp": 1030731746.1142578, - "heart_rate": 54 - }, - { - "timestamp": 1030731746.3642578, - "heart_rate": 54 - }, - { - "timestamp": 1030731746.4746094, - "heart_rate": 54 - }, - { - "timestamp": 1030731746.7246094, - "heart_rate": 54 - }, - { - "timestamp": 1030731746.9746094, - "heart_rate": 54 - }, - { - "timestamp": 1030731747.2246094, - "heart_rate": 54 - }, - { - "timestamp": 1030731747.4746094, - "heart_rate": 54 - }, - { - "timestamp": 1030731747.5673828, - "heart_rate": 54 - }, - { - "timestamp": 1030731747.8173828, - "heart_rate": 54 - }, - { - "timestamp": 1030731748.0673828, - "heart_rate": 54 - }, - { - "timestamp": 1030731748.3173828, - "heart_rate": 54 - }, - { - "timestamp": 1030731748.328125, - "heart_rate": 54 - }, - { - "timestamp": 1030731748.578125, - "heart_rate": 54 - }, - { - "timestamp": 1030731748.828125, - "heart_rate": 54 - }, - { - "timestamp": 1030731749.078125, - "heart_rate": 54 - }, - { - "timestamp": 1030731749.328125, - "heart_rate": 54 - }, - { - "timestamp": 1030731749.578125, - "heart_rate": 54 - }, - { - "timestamp": 1030731749.6318359, - "heart_rate": 54 - }, - { - "timestamp": 1030731749.8818359, - "heart_rate": 54 - }, - { - "timestamp": 1030731750.1318359, - "heart_rate": 54 - }, - { - "timestamp": 1030731750.3818359, - "heart_rate": 54 - }, - { - "timestamp": 1030731750.6318359, - "heart_rate": 54 - }, - { - "timestamp": 1030731750.6572266, - "heart_rate": 54 - }, - { - "timestamp": 1030731750.9072266, - "heart_rate": 54 - }, - { - "timestamp": 1030731751.1572266, - "heart_rate": 54 - }, - { - "timestamp": 1030731751.4072266, - "heart_rate": 54 - }, - { - "timestamp": 1030731751.6572266, - "heart_rate": 54 - }, - { - "timestamp": 1030731751.7001953, - "heart_rate": 54 - }, - { - "timestamp": 1030731751.9501953, - "heart_rate": 54 - }, - { - "timestamp": 1030731752.2001953, - "heart_rate": 54 - }, - { - "timestamp": 1030731752.4501953, - "heart_rate": 54 - }, - { - "timestamp": 1030731752.7001953, - "heart_rate": 54 - }, - { - "timestamp": 1030731752.7587891, - "heart_rate": 54 - }, - { - "timestamp": 1030731753.0087891, - "heart_rate": 54 - }, - { - "timestamp": 1030731753.2587891, - "heart_rate": 54 - }, - { - "timestamp": 1030731753.5087891, - "heart_rate": 54 - }, - { - "timestamp": 1030731753.7587891, - "heart_rate": 54 - }, - { - "timestamp": 1030731753.8447266, - "heart_rate": 55 - }, - { - "timestamp": 1030731754.0947266, - "heart_rate": 55 - }, - { - "timestamp": 1030731754.3447266, - "heart_rate": 55 - }, - { - "timestamp": 1030731754.5947266, - "heart_rate": 55 - }, - { - "timestamp": 1030731754.8447266, - "heart_rate": 55 - }, - { - "timestamp": 1030731754.9414062, - "heart_rate": 55 - }, - { - "timestamp": 1030731755.1914062, - "heart_rate": 55 - }, - { - "timestamp": 1030731755.4414062, - "heart_rate": 55 - }, - { - "timestamp": 1030731755.6914062, - "heart_rate": 55 - }, - { - "timestamp": 1030731755.9414062, - "heart_rate": 55 - }, - { - "timestamp": 1030731756.1269531, - "heart_rate": 55 - }, - { - "timestamp": 1030731756.3769531, - "heart_rate": 55 - }, - { - "timestamp": 1030731756.6269531, - "heart_rate": 55 - }, - { - "timestamp": 1030731756.8769531, - "heart_rate": 55 - }, - { - "timestamp": 1030731757.1269531, - "heart_rate": 55 - }, - { - "timestamp": 1030731757.3349609, - "heart_rate": 53 - }, - { - "timestamp": 1030731757.5849609, - "heart_rate": 53 - }, - { - "timestamp": 1030731757.8349609, - "heart_rate": 53 - }, - { - "timestamp": 1030731758.0849609, - "heart_rate": 53 - }, - { - "timestamp": 1030731758.3349609, - "heart_rate": 53 - }, - { - "timestamp": 1030731758.5410156, - "heart_rate": 51 - }, - { - "timestamp": 1030731758.7910156, - "heart_rate": 51 - }, - { - "timestamp": 1030731759.0410156, - "heart_rate": 51 - }, - { - "timestamp": 1030731759.2910156, - "heart_rate": 51 - }, - { - "timestamp": 1030731759.5410156, - "heart_rate": 51 - }, - { - "timestamp": 1030731759.7265625, - "heart_rate": 51 - }, - { - "timestamp": 1030731759.9765625, - "heart_rate": 51 - }, - { - "timestamp": 1030731760.2265625, - "heart_rate": 51 - }, - { - "timestamp": 1030731760.4765625, - "heart_rate": 51 - }, - { - "timestamp": 1030731760.7265625, - "heart_rate": 51 - }, - { - "timestamp": 1030731760.9248047, - "heart_rate": 50 - }, - { - "timestamp": 1030731761.1748047, - "heart_rate": 50 - }, - { - "timestamp": 1030731761.4248047, - "heart_rate": 50 - }, - { - "timestamp": 1030731761.6748047, - "heart_rate": 50 - }, - { - "timestamp": 1030731761.9248047, - "heart_rate": 50 - }, - { - "timestamp": 1030731762.1240234, - "heart_rate": 50 - }, - { - "timestamp": 1030731762.3740234, - "heart_rate": 50 - }, - { - "timestamp": 1030731762.6240234, - "heart_rate": 50 - }, - { - "timestamp": 1030731762.8740234, - "heart_rate": 50 - }, - { - "timestamp": 1030731763.1240234, - "heart_rate": 50 - }, - { - "timestamp": 1030731763.2998047, - "heart_rate": 50 - }, - { - "timestamp": 1030731763.5498047, - "heart_rate": 50 - }, - { - "timestamp": 1030731763.7998047, - "heart_rate": 50 - }, - { - "timestamp": 1030731764.0498047, - "heart_rate": 50 - }, - { - "timestamp": 1030731764.2998047, - "heart_rate": 50 - }, - { - "timestamp": 1030731764.4736328, - "heart_rate": 51 - }, - { - "timestamp": 1030731764.7236328, - "heart_rate": 51 - }, - { - "timestamp": 1030731764.9736328, - "heart_rate": 51 - }, - { - "timestamp": 1030731765.2236328, - "heart_rate": 51 - }, - { - "timestamp": 1030731765.4736328, - "heart_rate": 51 - }, - { - "timestamp": 1030731765.6503906, - "heart_rate": 51 - }, - { - "timestamp": 1030731765.9003906, - "heart_rate": 51 - }, - { - "timestamp": 1030731766.1503906, - "heart_rate": 51 - }, - { - "timestamp": 1030731766.4003906, - "heart_rate": 51 - }, - { - "timestamp": 1030731766.6503906, - "heart_rate": 51 - }, - { - "timestamp": 1030731766.8164062, - "heart_rate": 51 - }, - { - "timestamp": 1030731767.0664062, - "heart_rate": 51 - }, - { - "timestamp": 1030731767.3164062, - "heart_rate": 51 - }, - { - "timestamp": 1030731767.5664062, - "heart_rate": 51 - }, - { - "timestamp": 1030731767.8164062, - "heart_rate": 51 - }, - { - "timestamp": 1030731767.9931641, - "heart_rate": 51 - }, - { - "timestamp": 1030731768.2431641, - "heart_rate": 51 - }, - { - "timestamp": 1030731768.4931641, - "heart_rate": 51 - }, - { - "timestamp": 1030731768.7431641, - "heart_rate": 51 - }, - { - "timestamp": 1030731768.9931641, - "heart_rate": 51 - }, - { - "timestamp": 1030731769.1953125, - "heart_rate": 51 - }, - { - "timestamp": 1030731769.4453125, - "heart_rate": 51 - }, - { - "timestamp": 1030731769.6953125, - "heart_rate": 51 - }, - { - "timestamp": 1030731769.9453125, - "heart_rate": 51 - }, - { - "timestamp": 1030731770.1953125, - "heart_rate": 51 - }, - { - "timestamp": 1030731770.3505859, - "heart_rate": 51 - }, - { - "timestamp": 1030731770.6005859, - "heart_rate": 51 - }, - { - "timestamp": 1030731770.8505859, - "heart_rate": 51 - }, - { - "timestamp": 1030731771.1005859, - "heart_rate": 51 - }, - { - "timestamp": 1030731771.3505859, - "heart_rate": 51 - }, - { - "timestamp": 1030731771.5322266, - "heart_rate": 51 - }, - { - "timestamp": 1030731771.7822266, - "heart_rate": 51 - }, - { - "timestamp": 1030731772.0322266, - "heart_rate": 51 - }, - { - "timestamp": 1030731772.2822266, - "heart_rate": 51 - }, - { - "timestamp": 1030731772.5322266, - "heart_rate": 51 - }, - { - "timestamp": 1030731772.7412109, - "heart_rate": 51 - }, - { - "timestamp": 1030731772.9912109, - "heart_rate": 51 - }, - { - "timestamp": 1030731773.2412109, - "heart_rate": 51 - }, - { - "timestamp": 1030731773.4912109, - "heart_rate": 51 - }, - { - "timestamp": 1030731773.7412109, - "heart_rate": 51 - }, - { - "timestamp": 1030731773.9414062, - "heart_rate": 50 - }, - { - "timestamp": 1030731774.1914062, - "heart_rate": 50 - }, - { - "timestamp": 1030731774.4414062, - "heart_rate": 50 - }, - { - "timestamp": 1030731774.6914062, - "heart_rate": 50 - }, - { - "timestamp": 1030731774.9414062, - "heart_rate": 50 - }, - { - "timestamp": 1030731775.1318359, - "heart_rate": 50 - }, - { - "timestamp": 1030731775.3818359, - "heart_rate": 50 - }, - { - "timestamp": 1030731775.6318359, - "heart_rate": 50 - }, - { - "timestamp": 1030731775.8818359, - "heart_rate": 50 - }, - { - "timestamp": 1030731776.1318359, - "heart_rate": 50 - }, - { - "timestamp": 1030731776.3251953, - "heart_rate": 50 - }, - { - "timestamp": 1030731776.5751953, - "heart_rate": 50 - }, - { - "timestamp": 1030731776.8251953, - "heart_rate": 50 - }, - { - "timestamp": 1030731777.0751953, - "heart_rate": 50 - }, - { - "timestamp": 1030731777.3251953, - "heart_rate": 50 - }, - { - "timestamp": 1030731777.5107422, - "heart_rate": 50 - }, - { - "timestamp": 1030731777.7607422, - "heart_rate": 50 - }, - { - "timestamp": 1030731778.0107422, - "heart_rate": 50 - }, - { - "timestamp": 1030731778.2607422, - "heart_rate": 50 - }, - { - "timestamp": 1030731778.5107422, - "heart_rate": 50 - }, - { - "timestamp": 1030731778.6181641, - "heart_rate": 50 - }, - { - "timestamp": 1030731778.8681641, - "heart_rate": 50 - }, - { - "timestamp": 1030731779.1181641, - "heart_rate": 50 - }, - { - "timestamp": 1030731779.3681641, - "heart_rate": 50 - }, - { - "timestamp": 1030731779.6181641, - "heart_rate": 50 - }, - { - "timestamp": 1030731779.7128906, - "heart_rate": 52 - }, - { - "timestamp": 1030731779.9628906, - "heart_rate": 52 - }, - { - "timestamp": 1030731780.2128906, - "heart_rate": 52 - }, - { - "timestamp": 1030731780.4628906, - "heart_rate": 52 - }, - { - "timestamp": 1030731780.7128906, - "heart_rate": 52 - }, - { - "timestamp": 1030731780.8349609, - "heart_rate": 53 - }, - { - "timestamp": 1030731781.0849609, - "heart_rate": 53 - }, - { - "timestamp": 1030731781.3349609, - "heart_rate": 53 - }, - { - "timestamp": 1030731781.5849609, - "heart_rate": 53 - }, - { - "timestamp": 1030731781.8349609, - "heart_rate": 53 - }, - { - "timestamp": 1030731781.9765625, - "heart_rate": 53 - }, - { - "timestamp": 1030731782.2265625, - "heart_rate": 53 - }, - { - "timestamp": 1030731782.4765625, - "heart_rate": 53 - }, - { - "timestamp": 1030731782.7265625, - "heart_rate": 53 - }, - { - "timestamp": 1030731782.9765625, - "heart_rate": 53 - }, - { - "timestamp": 1030731783.1054688, - "heart_rate": 53 - }, - { - "timestamp": 1030731783.3554688, - "heart_rate": 53 - }, - { - "timestamp": 1030731783.6054688, - "heart_rate": 53 - }, - { - "timestamp": 1030731783.8554688, - "heart_rate": 53 - }, - { - "timestamp": 1030731784.1054688, - "heart_rate": 53 - }, - { - "timestamp": 1030731784.21875, - "heart_rate": 53 - }, - { - "timestamp": 1030731784.46875, - "heart_rate": 53 - }, - { - "timestamp": 1030731784.71875, - "heart_rate": 53 - }, - { - "timestamp": 1030731784.96875, - "heart_rate": 53 - }, - { - "timestamp": 1030731785.21875, - "heart_rate": 53 - }, - { - "timestamp": 1030731785.3398438, - "heart_rate": 53 - }, - { - "timestamp": 1030731785.5898438, - "heart_rate": 53 - }, - { - "timestamp": 1030731785.8398438, - "heart_rate": 53 - }, - { - "timestamp": 1030731786.0898438, - "heart_rate": 53 - }, - { - "timestamp": 1030731786.3398438, - "heart_rate": 53 - }, - { - "timestamp": 1030731786.3964844, - "heart_rate": 54 - }, - { - "timestamp": 1030731786.6464844, - "heart_rate": 54 - }, - { - "timestamp": 1030731786.8964844, - "heart_rate": 54 - }, - { - "timestamp": 1030731787.1464844, - "heart_rate": 54 - }, - { - "timestamp": 1030731787.3964844, - "heart_rate": 54 - }, - { - "timestamp": 1030731787.4863281, - "heart_rate": 54 - }, - { - "timestamp": 1030731787.7363281, - "heart_rate": 54 - }, - { - "timestamp": 1030731787.9863281, - "heart_rate": 54 - }, - { - "timestamp": 1030731788.2363281, - "heart_rate": 54 - }, - { - "timestamp": 1030731788.4863281, - "heart_rate": 54 - }, - { - "timestamp": 1030731788.6201172, - "heart_rate": 55 - }, - { - "timestamp": 1030731788.8701172, - "heart_rate": 55 - }, - { - "timestamp": 1030731789.1201172, - "heart_rate": 55 - }, - { - "timestamp": 1030731789.3701172, - "heart_rate": 55 - }, - { - "timestamp": 1030731789.6201172, - "heart_rate": 55 - }, - { - "timestamp": 1030731789.7890625, - "heart_rate": 54 - }, - { - "timestamp": 1030731790.0390625, - "heart_rate": 54 - }, - { - "timestamp": 1030731790.2890625, - "heart_rate": 54 - }, - { - "timestamp": 1030731790.5390625, - "heart_rate": 54 - }, - { - "timestamp": 1030731790.7890625, - "heart_rate": 54 - }, - { - "timestamp": 1030731790.9208984, - "heart_rate": 53 - }, - { - "timestamp": 1030731791.1708984, - "heart_rate": 53 - }, - { - "timestamp": 1030731791.4208984, - "heart_rate": 53 - }, - { - "timestamp": 1030731791.6708984, - "heart_rate": 53 - }, - { - "timestamp": 1030731791.9208984, - "heart_rate": 53 - }, - { - "timestamp": 1030731792.0703125, - "heart_rate": 53 - }, - { - "timestamp": 1030731792.3203125, - "heart_rate": 53 - }, - { - "timestamp": 1030731792.5703125, - "heart_rate": 53 - }, - { - "timestamp": 1030731792.8203125, - "heart_rate": 53 - }, - { - "timestamp": 1030731793.0703125, - "heart_rate": 53 - }, - { - "timestamp": 1030731793.2373047, - "heart_rate": 53 - }, - { - "timestamp": 1030731793.4873047, - "heart_rate": 53 - }, - { - "timestamp": 1030731793.7373047, - "heart_rate": 53 - }, - { - "timestamp": 1030731793.9873047, - "heart_rate": 53 - }, - { - "timestamp": 1030731794.2373047, - "heart_rate": 53 - }, - { - "timestamp": 1030731794.4111328, - "heart_rate": 52 - }, - { - "timestamp": 1030731794.6611328, - "heart_rate": 52 - }, - { - "timestamp": 1030731794.9111328, - "heart_rate": 52 - }, - { - "timestamp": 1030731795.1611328, - "heart_rate": 52 - }, - { - "timestamp": 1030731795.4111328, - "heart_rate": 52 - }, - { - "timestamp": 1030731795.5732422, - "heart_rate": 52 - }, - { - "timestamp": 1030731795.8232422, - "heart_rate": 52 - }, - { - "timestamp": 1030731796.0732422, - "heart_rate": 52 - }, - { - "timestamp": 1030731796.3232422, - "heart_rate": 52 - }, - { - "timestamp": 1030731796.5732422, - "heart_rate": 52 - }, - { - "timestamp": 1030731796.7470703, - "heart_rate": 51 - }, - { - "timestamp": 1030731796.9970703, - "heart_rate": 51 - }, - { - "timestamp": 1030731797.2470703, - "heart_rate": 51 - }, - { - "timestamp": 1030731797.4970703, - "heart_rate": 51 - }, - { - "timestamp": 1030731797.7470703, - "heart_rate": 51 - }, - { - "timestamp": 1030731797.9199219, - "heart_rate": 51 - }, - { - "timestamp": 1030731798.1699219, - "heart_rate": 51 - }, - { - "timestamp": 1030731798.4199219, - "heart_rate": 51 - }, - { - "timestamp": 1030731798.6699219, - "heart_rate": 51 - }, - { - "timestamp": 1030731798.9199219, - "heart_rate": 51 - }, - { - "timestamp": 1030731799.0927734, - "heart_rate": 51 - }, - { - "timestamp": 1030731799.3427734, - "heart_rate": 51 - }, - { - "timestamp": 1030731799.5927734, - "heart_rate": 51 - }, - { - "timestamp": 1030731799.8427734, - "heart_rate": 51 - }, - { - "timestamp": 1030731800.0927734, - "heart_rate": 51 - }, - { - "timestamp": 1030731800.2978516, - "heart_rate": 51 - }, - { - "timestamp": 1030731800.5478516, - "heart_rate": 51 - }, - { - "timestamp": 1030731800.7978516, - "heart_rate": 51 - }, - { - "timestamp": 1030731801.0478516, - "heart_rate": 51 - }, - { - "timestamp": 1030731801.2978516, - "heart_rate": 51 - }, - { - "timestamp": 1030731801.4833984, - "heart_rate": 51 - }, - { - "timestamp": 1030731801.7333984, - "heart_rate": 51 - }, - { - "timestamp": 1030731801.9833984, - "heart_rate": 51 - }, - { - "timestamp": 1030731802.2333984, - "heart_rate": 51 - }, - { - "timestamp": 1030731802.4833984, - "heart_rate": 51 - }, - { - "timestamp": 1030731802.6523438, - "heart_rate": 51 - }, - { - "timestamp": 1030731802.9023438, - "heart_rate": 51 - }, - { - "timestamp": 1030731803.1523438, - "heart_rate": 51 - }, - { - "timestamp": 1030731803.4023438, - "heart_rate": 51 - }, - { - "timestamp": 1030731803.6523438, - "heart_rate": 51 - }, - { - "timestamp": 1030731803.8476562, - "heart_rate": 51 - }, - { - "timestamp": 1030731804.0976562, - "heart_rate": 51 - }, - { - "timestamp": 1030731804.3476562, - "heart_rate": 51 - }, - { - "timestamp": 1030731804.5976562, - "heart_rate": 51 - }, - { - "timestamp": 1030731804.8476562, - "heart_rate": 51 - }, - { - "timestamp": 1030731805.0380859, - "heart_rate": 51 - }, - { - "timestamp": 1030731805.2880859, - "heart_rate": 51 - }, - { - "timestamp": 1030731805.5380859, - "heart_rate": 51 - }, - { - "timestamp": 1030731805.7880859, - "heart_rate": 51 - }, - { - "timestamp": 1030731806.0380859, - "heart_rate": 51 - }, - { - "timestamp": 1030731806.1855469, - "heart_rate": 50 - }, - { - "timestamp": 1030731806.4355469, - "heart_rate": 50 - }, - { - "timestamp": 1030731806.6855469, - "heart_rate": 50 - }, - { - "timestamp": 1030731806.9355469, - "heart_rate": 50 - }, - { - "timestamp": 1030731807.1855469, - "heart_rate": 50 - }, - { - "timestamp": 1030731807.3261719, - "heart_rate": 51 - }, - { - "timestamp": 1030731807.5761719, - "heart_rate": 51 - }, - { - "timestamp": 1030731807.8261719, - "heart_rate": 51 - }, - { - "timestamp": 1030731808.0761719, - "heart_rate": 51 - }, - { - "timestamp": 1030731808.3066406, - "heart_rate": 52 - }, - { - "timestamp": 1030731808.5566406, - "heart_rate": 52 - }, - { - "timestamp": 1030731808.8066406, - "heart_rate": 52 - }, - { - "timestamp": 1030731809.0566406, - "heart_rate": 52 - }, - { - "timestamp": 1030731809.3066406, - "heart_rate": 52 - }, - { - "timestamp": 1030731809.5546875, - "heart_rate": 52 - }, - { - "timestamp": 1030731809.8046875, - "heart_rate": 52 - }, - { - "timestamp": 1030731810.0546875, - "heart_rate": 52 - }, - { - "timestamp": 1030731810.3046875, - "heart_rate": 52 - }, - { - "timestamp": 1030731810.5546875, - "heart_rate": 52 - }, - { - "timestamp": 1030731810.6640625, - "heart_rate": 52 - }, - { - "timestamp": 1030731810.9140625, - "heart_rate": 52 - }, - { - "timestamp": 1030731811.1640625, - "heart_rate": 52 - }, - { - "timestamp": 1030731811.4140625, - "heart_rate": 52 - }, - { - "timestamp": 1030731811.6640625, - "heart_rate": 52 - }, - { - "timestamp": 1030731811.7578125, - "heart_rate": 52 - }, - { - "timestamp": 1030731812.0078125, - "heart_rate": 52 - }, - { - "timestamp": 1030731812.2578125, - "heart_rate": 52 - }, - { - "timestamp": 1030731812.5078125, - "heart_rate": 52 - }, - { - "timestamp": 1030731812.7578125, - "heart_rate": 52 - }, - { - "timestamp": 1030731812.8408203, - "heart_rate": 53 - }, - { - "timestamp": 1030731813.0908203, - "heart_rate": 53 - }, - { - "timestamp": 1030731813.3408203, - "heart_rate": 53 - }, - { - "timestamp": 1030731813.5908203, - "heart_rate": 53 - }, - { - "timestamp": 1030731813.8408203, - "heart_rate": 53 - }, - { - "timestamp": 1030731813.9433594, - "heart_rate": 54 - }, - { - "timestamp": 1030731814.1933594, - "heart_rate": 54 - }, - { - "timestamp": 1030731814.4433594, - "heart_rate": 54 - }, - { - "timestamp": 1030731814.6933594, - "heart_rate": 54 - }, - { - "timestamp": 1030731814.9433594, - "heart_rate": 54 - }, - { - "timestamp": 1030731815.0673828, - "heart_rate": 54 - }, - { - "timestamp": 1030731815.3173828, - "heart_rate": 54 - }, - { - "timestamp": 1030731815.5673828, - "heart_rate": 54 - }, - { - "timestamp": 1030731815.8173828, - "heart_rate": 54 - }, - { - "timestamp": 1030731816.0673828, - "heart_rate": 54 - }, - { - "timestamp": 1030731816.1992188, - "heart_rate": 54 - }, - { - "timestamp": 1030731816.4492188, - "heart_rate": 54 - }, - { - "timestamp": 1030731816.6992188, - "heart_rate": 54 - }, - { - "timestamp": 1030731816.9492188, - "heart_rate": 54 - }, - { - "timestamp": 1030731817.1992188, - "heart_rate": 54 - }, - { - "timestamp": 1030731817.3330078, - "heart_rate": 53 - }, - { - "timestamp": 1030731817.5830078, - "heart_rate": 53 - }, - { - "timestamp": 1030731817.8330078, - "heart_rate": 53 - }, - { - "timestamp": 1030731818.0830078, - "heart_rate": 53 - }, - { - "timestamp": 1030731818.3330078, - "heart_rate": 53 - }, - { - "timestamp": 1030731818.4306641, - "heart_rate": 53 - }, - { - "timestamp": 1030731818.6806641, - "heart_rate": 53 - }, - { - "timestamp": 1030731818.9306641, - "heart_rate": 53 - }, - { - "timestamp": 1030731819.1806641, - "heart_rate": 53 - }, - { - "timestamp": 1030731819.4306641, - "heart_rate": 53 - }, - { - "timestamp": 1030731819.5332031, - "heart_rate": 54 - }, - { - "timestamp": 1030731819.7832031, - "heart_rate": 54 - }, - { - "timestamp": 1030731820.0332031, - "heart_rate": 54 - }, - { - "timestamp": 1030731820.2832031, - "heart_rate": 54 - }, - { - "timestamp": 1030731820.5332031, - "heart_rate": 54 - }, - { - "timestamp": 1030731820.6357422, - "heart_rate": 54 - }, - { - "timestamp": 1030731820.8857422, - "heart_rate": 54 - }, - { - "timestamp": 1030731821.1357422, - "heart_rate": 54 - }, - { - "timestamp": 1030731821.3857422, - "heart_rate": 54 - }, - { - "timestamp": 1030731821.6357422, - "heart_rate": 54 - }, - { - "timestamp": 1030731821.7138672, - "heart_rate": 54 - }, - { - "timestamp": 1030731821.9638672, - "heart_rate": 54 - }, - { - "timestamp": 1030731822.2138672, - "heart_rate": 54 - }, - { - "timestamp": 1030731822.4638672, - "heart_rate": 54 - }, - { - "timestamp": 1030731822.7138672, - "heart_rate": 54 - }, - { - "timestamp": 1030731822.8085938, - "heart_rate": 55 - }, - { - "timestamp": 1030731823.0585938, - "heart_rate": 55 - }, - { - "timestamp": 1030731823.3085938, - "heart_rate": 55 - }, - { - "timestamp": 1030731823.5585938, - "heart_rate": 55 - }, - { - "timestamp": 1030731823.8085938, - "heart_rate": 55 - }, - { - "timestamp": 1030731823.9101562, - "heart_rate": 55 - }, - { - "timestamp": 1030731824.1601562, - "heart_rate": 55 - }, - { - "timestamp": 1030731824.4101562, - "heart_rate": 55 - }, - { - "timestamp": 1030731824.6601562, - "heart_rate": 55 - }, - { - "timestamp": 1030731824.9101562, - "heart_rate": 55 - }, - { - "timestamp": 1030731824.9892578, - "heart_rate": 55 - }, - { - "timestamp": 1030731825.2392578, - "heart_rate": 55 - }, - { - "timestamp": 1030731825.4892578, - "heart_rate": 55 - }, - { - "timestamp": 1030731825.7392578, - "heart_rate": 55 - }, - { - "timestamp": 1030731825.9892578, - "heart_rate": 55 - }, - { - "timestamp": 1030731826.0898438, - "heart_rate": 55 - }, - { - "timestamp": 1030731826.3398438, - "heart_rate": 55 - }, - { - "timestamp": 1030731826.5898438, - "heart_rate": 55 - }, - { - "timestamp": 1030731826.8398438, - "heart_rate": 55 - }, - { - "timestamp": 1030731827.0898438, - "heart_rate": 55 - }, - { - "timestamp": 1030731827.2070312, - "heart_rate": 55 - }, - { - "timestamp": 1030731827.4570312, - "heart_rate": 55 - }, - { - "timestamp": 1030731827.7070312, - "heart_rate": 55 - }, - { - "timestamp": 1030731827.9570312, - "heart_rate": 55 - }, - { - "timestamp": 1030731828.2070312, - "heart_rate": 55 - }, - { - "timestamp": 1030731828.3232422, - "heart_rate": 54 - }, - { - "timestamp": 1030731828.5732422, - "heart_rate": 54 - }, - { - "timestamp": 1030731828.8232422, - "heart_rate": 54 - }, - { - "timestamp": 1030731829.0732422, - "heart_rate": 54 - }, - { - "timestamp": 1030731829.3232422, - "heart_rate": 54 - }, - { - "timestamp": 1030731829.4365234, - "heart_rate": 54 - }, - { - "timestamp": 1030731829.6865234, - "heart_rate": 54 - }, - { - "timestamp": 1030731829.9365234, - "heart_rate": 54 - }, - { - "timestamp": 1030731830.1865234, - "heart_rate": 54 - }, - { - "timestamp": 1030731830.4365234, - "heart_rate": 54 - }, - { - "timestamp": 1030731830.5351562, - "heart_rate": 54 - }, - { - "timestamp": 1030731830.7851562, - "heart_rate": 54 - }, - { - "timestamp": 1030731831.0351562, - "heart_rate": 54 - }, - { - "timestamp": 1030731831.2851562, - "heart_rate": 54 - }, - { - "timestamp": 1030731831.5351562, - "heart_rate": 54 - }, - { - "timestamp": 1030731831.6279297, - "heart_rate": 54 - }, - { - "timestamp": 1030731831.8779297, - "heart_rate": 54 - }, - { - "timestamp": 1030731832.1279297, - "heart_rate": 54 - }, - { - "timestamp": 1030731832.3779297, - "heart_rate": 54 - }, - { - "timestamp": 1030731832.6279297, - "heart_rate": 54 - }, - { - "timestamp": 1030731832.6738281, - "heart_rate": 55 - }, - { - "timestamp": 1030731832.9238281, - "heart_rate": 55 - }, - { - "timestamp": 1030731833.1738281, - "heart_rate": 55 - }, - { - "timestamp": 1030731833.4238281, - "heart_rate": 55 - }, - { - "timestamp": 1030731833.6738281, - "heart_rate": 55 - }, - { - "timestamp": 1030731833.7119141, - "heart_rate": 56 - }, - { - "timestamp": 1030731833.9619141, - "heart_rate": 56 - }, - { - "timestamp": 1030731834.2119141, - "heart_rate": 56 - }, - { - "timestamp": 1030731834.4619141, - "heart_rate": 56 - }, - { - "timestamp": 1030731834.7119141, - "heart_rate": 56 - }, - { - "timestamp": 1030731834.7597656, - "heart_rate": 57 - }, - { - "timestamp": 1030731835.0097656, - "heart_rate": 57 - }, - { - "timestamp": 1030731835.2597656, - "heart_rate": 57 - }, - { - "timestamp": 1030731835.5097656, - "heart_rate": 57 - }, - { - "timestamp": 1030731835.7597656, - "heart_rate": 57 - }, - { - "timestamp": 1030731835.8017578, - "heart_rate": 57 - }, - { - "timestamp": 1030731836.0517578, - "heart_rate": 57 - }, - { - "timestamp": 1030731836.3017578, - "heart_rate": 57 - }, - { - "timestamp": 1030731836.5517578, - "heart_rate": 57 - }, - { - "timestamp": 1030731836.8017578, - "heart_rate": 57 - }, - { - "timestamp": 1030731836.8320312, - "heart_rate": 57 - }, - { - "timestamp": 1030731837.0820312, - "heart_rate": 57 - }, - { - "timestamp": 1030731837.3320312, - "heart_rate": 57 - }, - { - "timestamp": 1030731837.5820312, - "heart_rate": 57 - }, - { - "timestamp": 1030731837.8320312, - "heart_rate": 57 - }, - { - "timestamp": 1030731837.8779297, - "heart_rate": 57 - }, - { - "timestamp": 1030731838.1279297, - "heart_rate": 57 - }, - { - "timestamp": 1030731838.3779297, - "heart_rate": 57 - }, - { - "timestamp": 1030731838.6279297, - "heart_rate": 57 - }, - { - "timestamp": 1030731838.8779297, - "heart_rate": 57 - }, - { - "timestamp": 1030731838.9150391, - "heart_rate": 58 - }, - { - "timestamp": 1030731839.1650391, - "heart_rate": 58 - }, - { - "timestamp": 1030731839.4150391, - "heart_rate": 58 - }, - { - "timestamp": 1030731839.6650391, - "heart_rate": 58 - }, - { - "timestamp": 1030731839.9150391, - "heart_rate": 58 - }, - { - "timestamp": 1030731839.9453125, - "heart_rate": 58 - }, - { - "timestamp": 1030731840.1953125, - "heart_rate": 58 - }, - { - "timestamp": 1030731840.4453125, - "heart_rate": 58 - }, - { - "timestamp": 1030731840.6953125, - "heart_rate": 58 - }, - { - "timestamp": 1030731840.9453125, - "heart_rate": 58 - }, - { - "timestamp": 1030731840.9824219, - "heart_rate": 58 - }, - { - "timestamp": 1030731841.2324219, - "heart_rate": 58 - }, - { - "timestamp": 1030731841.4824219, - "heart_rate": 58 - }, - { - "timestamp": 1030731841.7324219, - "heart_rate": 58 - }, - { - "timestamp": 1030731841.9824219, - "heart_rate": 58 - }, - { - "timestamp": 1030731841.9882812, - "heart_rate": 58 - }, - { - "timestamp": 1030731842.2382812, - "heart_rate": 58 - }, - { - "timestamp": 1030731842.4882812, - "heart_rate": 58 - }, - { - "timestamp": 1030731842.7382812, - "heart_rate": 58 - }, - { - "timestamp": 1030731842.9882812, - "heart_rate": 58 - }, - { - "timestamp": 1030731843.0117188, - "heart_rate": 58 - }, - { - "timestamp": 1030731843.2617188, - "heart_rate": 58 - }, - { - "timestamp": 1030731843.5117188, - "heart_rate": 58 - }, - { - "timestamp": 1030731843.7617188, - "heart_rate": 58 - }, - { - "timestamp": 1030731844.0117188, - "heart_rate": 58 - }, - { - "timestamp": 1030731844.0478516, - "heart_rate": 58 - }, - { - "timestamp": 1030731844.2978516, - "heart_rate": 58 - }, - { - "timestamp": 1030731844.5478516, - "heart_rate": 58 - }, - { - "timestamp": 1030731844.7978516, - "heart_rate": 58 - }, - { - "timestamp": 1030731845.0478516, - "heart_rate": 58 - }, - { - "timestamp": 1030731845.1103516, - "heart_rate": 58 - }, - { - "timestamp": 1030731845.3603516, - "heart_rate": 58 - }, - { - "timestamp": 1030731845.6103516, - "heart_rate": 58 - }, - { - "timestamp": 1030731845.8603516, - "heart_rate": 58 - }, - { - "timestamp": 1030731846.1103516, - "heart_rate": 58 - }, - { - "timestamp": 1030731846.2109375, - "heart_rate": 57 - }, - { - "timestamp": 1030731846.4609375, - "heart_rate": 57 - }, - { - "timestamp": 1030731846.7109375, - "heart_rate": 57 - }, - { - "timestamp": 1030731846.9609375, - "heart_rate": 57 - }, - { - "timestamp": 1030731847.2109375, - "heart_rate": 57 - }, - { - "timestamp": 1030731847.3203125, - "heart_rate": 56 - }, - { - "timestamp": 1030731847.5703125, - "heart_rate": 56 - }, - { - "timestamp": 1030731847.8203125, - "heart_rate": 56 - }, - { - "timestamp": 1030731848.0703125, - "heart_rate": 56 - }, - { - "timestamp": 1030731848.3203125, - "heart_rate": 56 - }, - { - "timestamp": 1030731848.4580078, - "heart_rate": 55 - }, - { - "timestamp": 1030731848.7080078, - "heart_rate": 55 - }, - { - "timestamp": 1030731848.9580078, - "heart_rate": 55 - }, - { - "timestamp": 1030731849.2080078, - "heart_rate": 55 - }, - { - "timestamp": 1030731849.4580078, - "heart_rate": 55 - }, - { - "timestamp": 1030731849.6123047, - "heart_rate": 54 - }, - { - "timestamp": 1030731849.8623047, - "heart_rate": 54 - }, - { - "timestamp": 1030731850.1123047, - "heart_rate": 54 - }, - { - "timestamp": 1030731850.3623047, - "heart_rate": 54 - }, - { - "timestamp": 1030731850.6123047, - "heart_rate": 54 - }, - { - "timestamp": 1030731850.7822266, - "heart_rate": 53 - }, - { - "timestamp": 1030731851.0322266, - "heart_rate": 53 - }, - { - "timestamp": 1030731851.2822266, - "heart_rate": 53 - }, - { - "timestamp": 1030731851.5322266, - "heart_rate": 53 - }, - { - "timestamp": 1030731851.7822266, - "heart_rate": 53 - }, - { - "timestamp": 1030731851.9775391, - "heart_rate": 52 - }, - { - "timestamp": 1030731852.2275391, - "heart_rate": 52 - }, - { - "timestamp": 1030731852.4775391, - "heart_rate": 52 - }, - { - "timestamp": 1030731852.7275391, - "heart_rate": 52 - }, - { - "timestamp": 1030731852.9775391, - "heart_rate": 52 - }, - { - "timestamp": 1030731853.1669922, - "heart_rate": 51 - }, - { - "timestamp": 1030731853.4169922, - "heart_rate": 51 - }, - { - "timestamp": 1030731853.6669922, - "heart_rate": 51 - }, - { - "timestamp": 1030731853.9169922, - "heart_rate": 51 - }, - { - "timestamp": 1030731854.1669922, - "heart_rate": 51 - }, - { - "timestamp": 1030731854.3349609, - "heart_rate": 51 - }, - { - "timestamp": 1030731854.5849609, - "heart_rate": 51 - }, - { - "timestamp": 1030731854.8349609, - "heart_rate": 51 - }, - { - "timestamp": 1030731855.0849609, - "heart_rate": 51 - }, - { - "timestamp": 1030731855.3349609, - "heart_rate": 51 - }, - { - "timestamp": 1030731855.5078125, - "heart_rate": 51 - }, - { - "timestamp": 1030731855.7578125, - "heart_rate": 51 - }, - { - "timestamp": 1030731856.0078125, - "heart_rate": 51 - }, - { - "timestamp": 1030731856.2578125, - "heart_rate": 51 - }, - { - "timestamp": 1030731856.5078125, - "heart_rate": 51 - }, - { - "timestamp": 1030731856.6220703, - "heart_rate": 51 - }, - { - "timestamp": 1030731856.8720703, - "heart_rate": 51 - }, - { - "timestamp": 1030731857.1220703, - "heart_rate": 51 - }, - { - "timestamp": 1030731857.3720703, - "heart_rate": 51 - }, - { - "timestamp": 1030731857.6220703, - "heart_rate": 51 - }, - { - "timestamp": 1030731857.6367188, - "heart_rate": 53 - }, - { - "timestamp": 1030731857.8867188, - "heart_rate": 53 - }, - { - "timestamp": 1030731858.1367188, - "heart_rate": 53 - }, - { - "timestamp": 1030731858.3867188, - "heart_rate": 53 - }, - { - "timestamp": 1030731858.6367188, - "heart_rate": 53 - }, - { - "timestamp": 1030731858.6660156, - "heart_rate": 55 - }, - { - "timestamp": 1030731858.9160156, - "heart_rate": 55 - }, - { - "timestamp": 1030731859.1660156, - "heart_rate": 55 - }, - { - "timestamp": 1030731859.4160156, - "heart_rate": 55 - }, - { - "timestamp": 1030731859.6660156, - "heart_rate": 55 - }, - { - "timestamp": 1030731859.7773438, - "heart_rate": 57 - }, - { - "timestamp": 1030731860.0273438, - "heart_rate": 57 - }, - { - "timestamp": 1030731860.2773438, - "heart_rate": 57 - }, - { - "timestamp": 1030731860.5273438, - "heart_rate": 57 - }, - { - "timestamp": 1030731860.7773438, - "heart_rate": 57 - }, - { - "timestamp": 1030731860.8945312, - "heart_rate": 55 - }, - { - "timestamp": 1030731861.1445312, - "heart_rate": 55 - }, - { - "timestamp": 1030731861.3945312, - "heart_rate": 55 - }, - { - "timestamp": 1030731861.6445312, - "heart_rate": 55 - }, - { - "timestamp": 1030731861.8945312, - "heart_rate": 55 - }, - { - "timestamp": 1030731862.0458984, - "heart_rate": 55 - }, - { - "timestamp": 1030731862.2958984, - "heart_rate": 55 - }, - { - "timestamp": 1030731862.5458984, - "heart_rate": 55 - }, - { - "timestamp": 1030731862.7958984, - "heart_rate": 55 - }, - { - "timestamp": 1030731863.0458984, - "heart_rate": 55 - }, - { - "timestamp": 1030731863.2314453, - "heart_rate": 53 - }, - { - "timestamp": 1030731863.4814453, - "heart_rate": 53 - }, - { - "timestamp": 1030731863.7314453, - "heart_rate": 53 - }, - { - "timestamp": 1030731863.9814453, - "heart_rate": 53 - }, - { - "timestamp": 1030731864.2314453, - "heart_rate": 53 - }, - { - "timestamp": 1030731864.3867188, - "heart_rate": 53 - }, - { - "timestamp": 1030731864.6367188, - "heart_rate": 53 - }, - { - "timestamp": 1030731864.8867188, - "heart_rate": 53 - }, - { - "timestamp": 1030731865.1367188, - "heart_rate": 53 - }, - { - "timestamp": 1030731865.3867188, - "heart_rate": 53 - }, - { - "timestamp": 1030731865.5478516, - "heart_rate": 52 - }, - { - "timestamp": 1030731865.7978516, - "heart_rate": 52 - }, - { - "timestamp": 1030731866.0478516, - "heart_rate": 52 - }, - { - "timestamp": 1030731866.2978516, - "heart_rate": 52 - }, - { - "timestamp": 1030731866.5478516, - "heart_rate": 52 - }, - { - "timestamp": 1030731866.7177734, - "heart_rate": 52 - }, - { - "timestamp": 1030731866.9677734, - "heart_rate": 52 - }, - { - "timestamp": 1030731867.2177734, - "heart_rate": 52 - }, - { - "timestamp": 1030731867.4677734, - "heart_rate": 52 - }, - { - "timestamp": 1030731867.7177734, - "heart_rate": 52 - }, - { - "timestamp": 1030731867.8710938, - "heart_rate": 52 - }, - { - "timestamp": 1030731868.1210938, - "heart_rate": 52 - }, - { - "timestamp": 1030731868.3710938, - "heart_rate": 52 - }, - { - "timestamp": 1030731868.6210938, - "heart_rate": 52 - }, - { - "timestamp": 1030731868.8710938, - "heart_rate": 52 - }, - { - "timestamp": 1030731869.0410156, - "heart_rate": 52 - }, - { - "timestamp": 1030731869.2910156, - "heart_rate": 52 - }, - { - "timestamp": 1030731869.5410156, - "heart_rate": 52 - }, - { - "timestamp": 1030731869.7910156, - "heart_rate": 52 - }, - { - "timestamp": 1030731870.0410156, - "heart_rate": 52 - }, - { - "timestamp": 1030731870.2255859, - "heart_rate": 51 - }, - { - "timestamp": 1030731870.4755859, - "heart_rate": 51 - }, - { - "timestamp": 1030731870.7255859, - "heart_rate": 51 - }, - { - "timestamp": 1030731870.9755859, - "heart_rate": 51 - }, - { - "timestamp": 1030731871.2255859, - "heart_rate": 51 - }, - { - "timestamp": 1030731871.3925781, - "heart_rate": 51 - }, - { - "timestamp": 1030731871.6425781, - "heart_rate": 51 - }, - { - "timestamp": 1030731871.8925781, - "heart_rate": 51 - }, - { - "timestamp": 1030731872.1425781, - "heart_rate": 51 - }, - { - "timestamp": 1030731872.3925781, - "heart_rate": 51 - }, - { - "timestamp": 1030731872.5810547, - "heart_rate": 51 - }, - { - "timestamp": 1030731872.8310547, - "heart_rate": 51 - }, - { - "timestamp": 1030731873.0810547, - "heart_rate": 51 - }, - { - "timestamp": 1030731873.3310547, - "heart_rate": 51 - }, - { - "timestamp": 1030731873.5810547, - "heart_rate": 51 - }, - { - "timestamp": 1030731873.7929688, - "heart_rate": 51 - }, - { - "timestamp": 1030731874.0429688, - "heart_rate": 51 - }, - { - "timestamp": 1030731874.2929688, - "heart_rate": 51 - }, - { - "timestamp": 1030731874.5429688, - "heart_rate": 51 - }, - { - "timestamp": 1030731874.7929688, - "heart_rate": 51 - }, - { - "timestamp": 1030731874.9335938, - "heart_rate": 51 - }, - { - "timestamp": 1030731875.1835938, - "heart_rate": 51 - }, - { - "timestamp": 1030731875.4335938, - "heart_rate": 51 - }, - { - "timestamp": 1030731875.6835938, - "heart_rate": 51 - }, - { - "timestamp": 1030731875.9335938, - "heart_rate": 51 - }, - { - "timestamp": 1030731876.0634766, - "heart_rate": 52 - }, - { - "timestamp": 1030731876.3134766, - "heart_rate": 52 - }, - { - "timestamp": 1030731876.5634766, - "heart_rate": 52 - }, - { - "timestamp": 1030731876.8134766, - "heart_rate": 52 - }, - { - "timestamp": 1030731877.0634766, - "heart_rate": 52 - }, - { - "timestamp": 1030731877.2080078, - "heart_rate": 52 - }, - { - "timestamp": 1030731877.4580078, - "heart_rate": 52 - }, - { - "timestamp": 1030731877.7080078, - "heart_rate": 52 - }, - { - "timestamp": 1030731877.9580078, - "heart_rate": 52 - }, - { - "timestamp": 1030731878.2080078, - "heart_rate": 52 - }, - { - "timestamp": 1030731878.3320312, - "heart_rate": 53 - }, - { - "timestamp": 1030731878.5820312, - "heart_rate": 53 - }, - { - "timestamp": 1030731878.8320312, - "heart_rate": 53 - }, - { - "timestamp": 1030731879.0820312, - "heart_rate": 53 - }, - { - "timestamp": 1030731879.3320312, - "heart_rate": 53 - }, - { - "timestamp": 1030731879.4472656, - "heart_rate": 53 - }, - { - "timestamp": 1030731879.6972656, - "heart_rate": 53 - }, - { - "timestamp": 1030731879.9472656, - "heart_rate": 53 - }, - { - "timestamp": 1030731880.1972656, - "heart_rate": 53 - }, - { - "timestamp": 1030731880.4472656, - "heart_rate": 53 - }, - { - "timestamp": 1030731880.5517578, - "heart_rate": 53 - }, - { - "timestamp": 1030731880.8017578, - "heart_rate": 53 - }, - { - "timestamp": 1030731881.0517578, - "heart_rate": 53 - }, - { - "timestamp": 1030731881.3017578, - "heart_rate": 53 - }, - { - "timestamp": 1030731881.5517578, - "heart_rate": 53 - }, - { - "timestamp": 1030731881.6748047, - "heart_rate": 54 - }, - { - "timestamp": 1030731881.9248047, - "heart_rate": 54 - }, - { - "timestamp": 1030731882.1748047, - "heart_rate": 54 - }, - { - "timestamp": 1030731882.4248047, - "heart_rate": 54 - }, - { - "timestamp": 1030731882.6748047, - "heart_rate": 54 - }, - { - "timestamp": 1030731882.8388672, - "heart_rate": 54 - }, - { - "timestamp": 1030731883.0888672, - "heart_rate": 54 - }, - { - "timestamp": 1030731883.3388672, - "heart_rate": 54 - }, - { - "timestamp": 1030731883.5888672, - "heart_rate": 54 - }, - { - "timestamp": 1030731883.8388672, - "heart_rate": 54 - }, - { - "timestamp": 1030731883.9521484, - "heart_rate": 53 - }, - { - "timestamp": 1030731884.2021484, - "heart_rate": 53 - }, - { - "timestamp": 1030731884.4521484, - "heart_rate": 53 - }, - { - "timestamp": 1030731884.7021484, - "heart_rate": 53 - }, - { - "timestamp": 1030731884.9521484, - "heart_rate": 53 - }, - { - "timestamp": 1030731885.0771484, - "heart_rate": 53 - }, - { - "timestamp": 1030731885.3271484, - "heart_rate": 53 - }, - { - "timestamp": 1030731885.5771484, - "heart_rate": 53 - }, - { - "timestamp": 1030731885.8271484, - "heart_rate": 53 - }, - { - "timestamp": 1030731886.0771484, - "heart_rate": 53 - }, - { - "timestamp": 1030731886.2207031, - "heart_rate": 53 - }, - { - "timestamp": 1030731886.4707031, - "heart_rate": 53 - }, - { - "timestamp": 1030731886.7207031, - "heart_rate": 53 - }, - { - "timestamp": 1030731886.9707031, - "heart_rate": 53 - }, - { - "timestamp": 1030731887.2207031, - "heart_rate": 53 - }, - { - "timestamp": 1030731887.34375, - "heart_rate": 53 - }, - { - "timestamp": 1030731887.59375, - "heart_rate": 53 - }, - { - "timestamp": 1030731887.84375, - "heart_rate": 53 - }, - { - "timestamp": 1030731888.09375, - "heart_rate": 53 - }, - { - "timestamp": 1030731888.34375, - "heart_rate": 53 - }, - { - "timestamp": 1030731888.4746094, - "heart_rate": 53 - }, - { - "timestamp": 1030731888.7246094, - "heart_rate": 53 - }, - { - "timestamp": 1030731888.9746094, - "heart_rate": 53 - }, - { - "timestamp": 1030731889.2246094, - "heart_rate": 53 - }, - { - "timestamp": 1030731889.4746094, - "heart_rate": 53 - }, - { - "timestamp": 1030731889.6162109, - "heart_rate": 53 - }, - { - "timestamp": 1030731889.8662109, - "heart_rate": 53 - }, - { - "timestamp": 1030731890.1162109, - "heart_rate": 53 - }, - { - "timestamp": 1030731890.3662109, - "heart_rate": 53 - }, - { - "timestamp": 1030731890.6162109, - "heart_rate": 53 - }, - { - "timestamp": 1030731890.7529297, - "heart_rate": 53 - }, - { - "timestamp": 1030731891.0029297, - "heart_rate": 53 - }, - { - "timestamp": 1030731891.2529297, - "heart_rate": 53 - }, - { - "timestamp": 1030731891.5029297, - "heart_rate": 53 - }, - { - "timestamp": 1030731891.7529297, - "heart_rate": 53 - }, - { - "timestamp": 1030731891.9287109, - "heart_rate": 53 - }, - { - "timestamp": 1030731892.1787109, - "heart_rate": 53 - }, - { - "timestamp": 1030731892.4287109, - "heart_rate": 53 - }, - { - "timestamp": 1030731892.6787109, - "heart_rate": 53 - }, - { - "timestamp": 1030731892.9287109, - "heart_rate": 53 - }, - { - "timestamp": 1030731893.1132812, - "heart_rate": 52 - }, - { - "timestamp": 1030731893.3632812, - "heart_rate": 52 - }, - { - "timestamp": 1030731893.6132812, - "heart_rate": 52 - }, - { - "timestamp": 1030731893.8632812, - "heart_rate": 52 - }, - { - "timestamp": 1030731894.1132812, - "heart_rate": 52 - }, - { - "timestamp": 1030731894.3251953, - "heart_rate": 51 - }, - { - "timestamp": 1030731894.5751953, - "heart_rate": 51 - }, - { - "timestamp": 1030731894.8251953, - "heart_rate": 51 - }, - { - "timestamp": 1030731895.0751953, - "heart_rate": 51 - }, - { - "timestamp": 1030731895.3251953, - "heart_rate": 51 - }, - { - "timestamp": 1030731895.5351562, - "heart_rate": 50 - }, - { - "timestamp": 1030731895.7851562, - "heart_rate": 50 - }, - { - "timestamp": 1030731896.0351562, - "heart_rate": 50 - }, - { - "timestamp": 1030731896.2851562, - "heart_rate": 50 - }, - { - "timestamp": 1030731896.5351562, - "heart_rate": 50 - }, - { - "timestamp": 1030731896.7724609, - "heart_rate": 50 - }, - { - "timestamp": 1030731897.0224609, - "heart_rate": 50 - }, - { - "timestamp": 1030731897.2724609, - "heart_rate": 50 - }, - { - "timestamp": 1030731897.5224609, - "heart_rate": 50 - }, - { - "timestamp": 1030731897.7724609, - "heart_rate": 50 - }, - { - "timestamp": 1030731897.9892578, - "heart_rate": 50 - }, - { - "timestamp": 1030731898.2392578, - "heart_rate": 50 - }, - { - "timestamp": 1030731898.4892578, - "heart_rate": 50 - }, - { - "timestamp": 1030731898.7392578, - "heart_rate": 50 - }, - { - "timestamp": 1030731898.9892578, - "heart_rate": 50 - }, - { - "timestamp": 1030731899.1728516, - "heart_rate": 49 - }, - { - "timestamp": 1030731899.4228516, - "heart_rate": 49 - }, - { - "timestamp": 1030731899.6728516, - "heart_rate": 49 - }, - { - "timestamp": 1030731899.9228516, - "heart_rate": 49 - }, - { - "timestamp": 1030731900.1728516, - "heart_rate": 49 - }, - { - "timestamp": 1030731900.3134766, - "heart_rate": 50 - }, - { - "timestamp": 1030731900.5634766, - "heart_rate": 50 - }, - { - "timestamp": 1030731900.8134766, - "heart_rate": 50 - }, - { - "timestamp": 1030731901.0634766, - "heart_rate": 50 - }, - { - "timestamp": 1030731901.3134766, - "heart_rate": 50 - }, - { - "timestamp": 1030731901.4345703, - "heart_rate": 51 - }, - { - "timestamp": 1030731901.6845703, - "heart_rate": 51 - }, - { - "timestamp": 1030731901.9345703, - "heart_rate": 51 - }, - { - "timestamp": 1030731902.1845703, - "heart_rate": 51 - }, - { - "timestamp": 1030731902.4345703, - "heart_rate": 51 - }, - { - "timestamp": 1030731902.4814453, - "heart_rate": 52 - }, - { - "timestamp": 1030731902.7314453, - "heart_rate": 52 - }, - { - "timestamp": 1030731902.9814453, - "heart_rate": 52 - }, - { - "timestamp": 1030731903.2314453, - "heart_rate": 52 - }, - { - "timestamp": 1030731903.4345703, - "heart_rate": 55 - }, - { - "timestamp": 1030731903.6845703, - "heart_rate": 55 - }, - { - "timestamp": 1030731903.9345703, - "heart_rate": 55 - }, - { - "timestamp": 1030731904.1845703, - "heart_rate": 55 - }, - { - "timestamp": 1030731904.390625, - "heart_rate": 58 - }, - { - "timestamp": 1030731904.640625, - "heart_rate": 58 - }, - { - "timestamp": 1030731904.890625, - "heart_rate": 58 - }, - { - "timestamp": 1030731905.140625, - "heart_rate": 58 - }, - { - "timestamp": 1030731905.390625, - "heart_rate": 58 - }, - { - "timestamp": 1030731905.4042969, - "heart_rate": 60 - }, - { - "timestamp": 1030731905.6542969, - "heart_rate": 60 - }, - { - "timestamp": 1030731905.9042969, - "heart_rate": 60 - }, - { - "timestamp": 1030731906.1542969, - "heart_rate": 60 - }, - { - "timestamp": 1030731906.4042969, - "heart_rate": 60 - }, - { - "timestamp": 1030731906.4287109, - "heart_rate": 60 - }, - { - "timestamp": 1030731906.6787109, - "heart_rate": 60 - }, - { - "timestamp": 1030731906.9287109, - "heart_rate": 60 - }, - { - "timestamp": 1030731907.1787109, - "heart_rate": 60 - }, - { - "timestamp": 1030731907.4287109, - "heart_rate": 60 - }, - { - "timestamp": 1030731907.4492188, - "heart_rate": 59 - }, - { - "timestamp": 1030731907.6992188, - "heart_rate": 59 - }, - { - "timestamp": 1030731907.9492188, - "heart_rate": 59 - }, - { - "timestamp": 1030731908.1992188, - "heart_rate": 59 - }, - { - "timestamp": 1030731908.4492188, - "heart_rate": 59 - }, - { - "timestamp": 1030731908.4765625, - "heart_rate": 59 - }, - { - "timestamp": 1030731908.7265625, - "heart_rate": 59 - }, - { - "timestamp": 1030731908.9765625, - "heart_rate": 59 - }, - { - "timestamp": 1030731909.2265625, - "heart_rate": 59 - }, - { - "timestamp": 1030731909.4765625, - "heart_rate": 59 - }, - { - "timestamp": 1030731909.5234375, - "heart_rate": 59 - }, - { - "timestamp": 1030731909.7734375, - "heart_rate": 59 - }, - { - "timestamp": 1030731910.0234375, - "heart_rate": 59 - }, - { - "timestamp": 1030731910.2734375, - "heart_rate": 59 - }, - { - "timestamp": 1030731910.3554688, - "heart_rate": 59 - }, - { - "timestamp": 1030731910.6054688, - "heart_rate": 59 - }, - { - "timestamp": 1030731910.8554688, - "heart_rate": 59 - }, - { - "timestamp": 1030731910.8701172, - "heart_rate": 59 - }, - { - "timestamp": 1030731911.1201172, - "heart_rate": 59 - }, - { - "timestamp": 1030731911.3701172, - "heart_rate": 59 - }, - { - "timestamp": 1030731911.6201172, - "heart_rate": 59 - }, - { - "timestamp": 1030731911.8701172, - "heart_rate": 59 - }, - { - "timestamp": 1030731911.9150391, - "heart_rate": 59 - }, - { - "timestamp": 1030731912.1650391, - "heart_rate": 59 - }, - { - "timestamp": 1030731912.4150391, - "heart_rate": 59 - }, - { - "timestamp": 1030731912.6650391, - "heart_rate": 59 - }, - { - "timestamp": 1030731912.9150391, - "heart_rate": 59 - }, - { - "timestamp": 1030731912.9345703, - "heart_rate": 59 - }, - { - "timestamp": 1030731913.1845703, - "heart_rate": 59 - }, - { - "timestamp": 1030731913.4345703, - "heart_rate": 59 - }, - { - "timestamp": 1030731913.6845703, - "heart_rate": 59 - }, - { - "timestamp": 1030731913.9345703, - "heart_rate": 59 - }, - { - "timestamp": 1030731913.9394531, - "heart_rate": 59 - }, - { - "timestamp": 1030731914.1894531, - "heart_rate": 59 - }, - { - "timestamp": 1030731914.4394531, - "heart_rate": 59 - }, - { - "timestamp": 1030731914.6894531, - "heart_rate": 59 - }, - { - "timestamp": 1030731914.8974609, - "heart_rate": 59 - }, - { - "timestamp": 1030731915.1474609, - "heart_rate": 59 - }, - { - "timestamp": 1030731915.3642578, - "heart_rate": 59 - }, - { - "timestamp": 1030731915.6142578, - "heart_rate": 59 - }, - { - "timestamp": 1030731915.8642578, - "heart_rate": 59 - }, - { - "timestamp": 1030731916.1142578, - "heart_rate": 59 - }, - { - "timestamp": 1030731916.3642578, - "heart_rate": 59 - }, - { - "timestamp": 1030731916.4052734, - "heart_rate": 59 - }, - { - "timestamp": 1030731916.6552734, - "heart_rate": 59 - }, - { - "timestamp": 1030731916.9052734, - "heart_rate": 59 - }, - { - "timestamp": 1030731917.1552734, - "heart_rate": 59 - }, - { - "timestamp": 1030731917.3007812, - "heart_rate": 59 - }, - { - "timestamp": 1030731917.5507812, - "heart_rate": 59 - }, - { - "timestamp": 1030731917.8007812, - "heart_rate": 59 - }, - { - "timestamp": 1030731918.0507812, - "heart_rate": 59 - }, - { - "timestamp": 1030731918.1884766, - "heart_rate": 59 - }, - { - "timestamp": 1030731918.4384766, - "heart_rate": 59 - }, - { - "timestamp": 1030731918.6884766, - "heart_rate": 59 - }, - { - "timestamp": 1030731918.9384766, - "heart_rate": 59 - }, - { - "timestamp": 1030731919.1884766, - "heart_rate": 59 - }, - { - "timestamp": 1030731919.3427734, - "heart_rate": 59 - }, - { - "timestamp": 1030731919.5927734, - "heart_rate": 59 - }, - { - "timestamp": 1030731919.8427734, - "heart_rate": 59 - }, - { - "timestamp": 1030731920.0927734, - "heart_rate": 59 - }, - { - "timestamp": 1030731920.3427734, - "heart_rate": 59 - }, - { - "timestamp": 1030731920.3964844, - "heart_rate": 59 - }, - { - "timestamp": 1030731920.6464844, - "heart_rate": 59 - }, - { - "timestamp": 1030731920.8964844, - "heart_rate": 59 - }, - { - "timestamp": 1030731920.9580078, - "heart_rate": 59 - }, - { - "timestamp": 1030731921.2080078, - "heart_rate": 59 - }, - { - "timestamp": 1030731921.4580078, - "heart_rate": 59 - }, - { - "timestamp": 1030731921.7080078, - "heart_rate": 59 - }, - { - "timestamp": 1030731921.9580078, - "heart_rate": 59 - }, - { - "timestamp": 1030731922.015625, - "heart_rate": 59 - }, - { - "timestamp": 1030731922.265625, - "heart_rate": 59 - }, - { - "timestamp": 1030731922.515625, - "heart_rate": 59 - }, - { - "timestamp": 1030731922.765625, - "heart_rate": 59 - }, - { - "timestamp": 1030731922.9394531, - "heart_rate": 59 - }, - { - "timestamp": 1030731923.1894531, - "heart_rate": 59 - }, - { - "timestamp": 1030731923.4394531, - "heart_rate": 59 - }, - { - "timestamp": 1030731923.609375, - "heart_rate": 59 - }, - { - "timestamp": 1030731923.859375, - "heart_rate": 59 - }, - { - "timestamp": 1030731924.109375, - "heart_rate": 59 - }, - { - "timestamp": 1030731924.1474609, - "heart_rate": 59 - }, - { - "timestamp": 1030731924.3974609, - "heart_rate": 59 - }, - { - "timestamp": 1030731924.6474609, - "heart_rate": 59 - }, - { - "timestamp": 1030731924.8974609, - "heart_rate": 59 - }, - { - "timestamp": 1030731924.9257812, - "heart_rate": 60 - }, - { - "timestamp": 1030731925.1757812, - "heart_rate": 60 - }, - { - "timestamp": 1030731925.4257812, - "heart_rate": 60 - }, - { - "timestamp": 1030731925.6757812, - "heart_rate": 60 - }, - { - "timestamp": 1030731925.7041016, - "heart_rate": 60 - }, - { - "timestamp": 1030731925.9541016, - "heart_rate": 60 - }, - { - "timestamp": 1030731926.2041016, - "heart_rate": 60 - }, - { - "timestamp": 1030731926.4541016, - "heart_rate": 60 - }, - { - "timestamp": 1030731926.4824219, - "heart_rate": 60 - }, - { - "timestamp": 1030731926.7324219, - "heart_rate": 60 - }, - { - "timestamp": 1030731926.9824219, - "heart_rate": 60 - }, - { - "timestamp": 1030731927.2324219, - "heart_rate": 60 - }, - { - "timestamp": 1030731927.4824219, - "heart_rate": 60 - }, - { - "timestamp": 1030731927.5693359, - "heart_rate": 59 - }, - { - "timestamp": 1030731927.8193359, - "heart_rate": 59 - }, - { - "timestamp": 1030731928.0693359, - "heart_rate": 59 - }, - { - "timestamp": 1030731928.3193359, - "heart_rate": 59 - }, - { - "timestamp": 1030731928.5361328, - "heart_rate": 59 - }, - { - "timestamp": 1030731928.7861328, - "heart_rate": 59 - }, - { - "timestamp": 1030731929.0361328, - "heart_rate": 59 - }, - { - "timestamp": 1030731929.2861328, - "heart_rate": 59 - }, - { - "timestamp": 1030731929.4199219, - "heart_rate": 59 - }, - { - "timestamp": 1030731929.6699219, - "heart_rate": 59 - }, - { - "timestamp": 1030731929.9199219, - "heart_rate": 59 - }, - { - "timestamp": 1030731930.1699219, - "heart_rate": 59 - }, - { - "timestamp": 1030731930.4199219, - "heart_rate": 59 - }, - { - "timestamp": 1030731930.4208984, - "heart_rate": 59 - }, - { - "timestamp": 1030731930.6708984, - "heart_rate": 59 - }, - { - "timestamp": 1030731930.9208984, - "heart_rate": 59 - }, - { - "timestamp": 1030731931.1708984, - "heart_rate": 59 - }, - { - "timestamp": 1030731931.4208984, - "heart_rate": 59 - }, - { - "timestamp": 1030731931.4853516, - "heart_rate": 58 - }, - { - "timestamp": 1030731931.7353516, - "heart_rate": 58 - }, - { - "timestamp": 1030731931.9853516, - "heart_rate": 58 - }, - { - "timestamp": 1030731932.2353516, - "heart_rate": 58 - }, - { - "timestamp": 1030731932.4853516, - "heart_rate": 58 - }, - { - "timestamp": 1030731932.4863281, - "heart_rate": 58 - }, - { - "timestamp": 1030731932.7363281, - "heart_rate": 58 - }, - { - "timestamp": 1030731932.9863281, - "heart_rate": 58 - }, - { - "timestamp": 1030731933.2363281, - "heart_rate": 58 - }, - { - "timestamp": 1030731933.4863281, - "heart_rate": 58 - }, - { - "timestamp": 1030731933.6103516, - "heart_rate": 58 - }, - { - "timestamp": 1030731933.8603516, - "heart_rate": 58 - }, - { - "timestamp": 1030731934.1103516, - "heart_rate": 58 - }, - { - "timestamp": 1030731934.1777344, - "heart_rate": 58 - }, - { - "timestamp": 1030731934.4277344, - "heart_rate": 58 - }, - { - "timestamp": 1030731934.6777344, - "heart_rate": 58 - }, - { - "timestamp": 1030731934.8720703, - "heart_rate": 58 - }, - { - "timestamp": 1030731935.1220703, - "heart_rate": 58 - }, - { - "timestamp": 1030731935.3720703, - "heart_rate": 58 - }, - { - "timestamp": 1030731935.6220703, - "heart_rate": 58 - }, - { - "timestamp": 1030731935.8076172, - "heart_rate": 58 - }, - { - "timestamp": 1030731936.0576172, - "heart_rate": 58 - }, - { - "timestamp": 1030731936.2207031, - "heart_rate": 58 - }, - { - "timestamp": 1030731936.4707031, - "heart_rate": 58 - }, - { - "timestamp": 1030731936.7207031, - "heart_rate": 58 - }, - { - "timestamp": 1030731936.9707031, - "heart_rate": 58 - }, - { - "timestamp": 1030731937.0410156, - "heart_rate": 58 - }, - { - "timestamp": 1030731937.2910156, - "heart_rate": 58 - }, - { - "timestamp": 1030731937.5410156, - "heart_rate": 58 - }, - { - "timestamp": 1030731937.7324219, - "heart_rate": 58 - }, - { - "timestamp": 1030731937.9824219, - "heart_rate": 58 - }, - { - "timestamp": 1030731938.2324219, - "heart_rate": 58 - }, - { - "timestamp": 1030731938.4638672, - "heart_rate": 58 - }, - { - "timestamp": 1030731938.7138672, - "heart_rate": 58 - }, - { - "timestamp": 1030731938.9638672, - "heart_rate": 58 - }, - { - "timestamp": 1030731939.1318359, - "heart_rate": 58 - }, - { - "timestamp": 1030731939.3818359, - "heart_rate": 58 - }, - { - "timestamp": 1030731939.6318359, - "heart_rate": 58 - }, - { - "timestamp": 1030731939.765625, - "heart_rate": 58 - }, - { - "timestamp": 1030731940.015625, - "heart_rate": 58 - }, - { - "timestamp": 1030731940.2099609, - "heart_rate": 58 - }, - { - "timestamp": 1030731940.4599609, - "heart_rate": 58 - }, - { - "timestamp": 1030731940.7099609, - "heart_rate": 58 - }, - { - "timestamp": 1030731940.8291016, - "heart_rate": 59 - }, - { - "timestamp": 1030731941.0791016, - "heart_rate": 59 - }, - { - "timestamp": 1030731941.3291016, - "heart_rate": 59 - }, - { - "timestamp": 1030731941.5673828, - "heart_rate": 59 - }, - { - "timestamp": 1030731941.8173828, - "heart_rate": 59 - }, - { - "timestamp": 1030731941.9833984, - "heart_rate": 59 - }, - { - "timestamp": 1030731942.2333984, - "heart_rate": 59 - }, - { - "timestamp": 1030731942.4833984, - "heart_rate": 59 - }, - { - "timestamp": 1030731942.5820312, - "heart_rate": 59 - }, - { - "timestamp": 1030731942.8320312, - "heart_rate": 59 - }, - { - "timestamp": 1030731943.0820312, - "heart_rate": 59 - }, - { - "timestamp": 1030731943.1806641, - "heart_rate": 60 - }, - { - "timestamp": 1030731943.4306641, - "heart_rate": 60 - }, - { - "timestamp": 1030731943.6279297, - "heart_rate": 60 - }, - { - "timestamp": 1030731943.8779297, - "heart_rate": 60 - }, - { - "timestamp": 1030731944.1279297, - "heart_rate": 60 - }, - { - "timestamp": 1030731944.3300781, - "heart_rate": 60 - }, - { - "timestamp": 1030731944.5800781, - "heart_rate": 60 - }, - { - "timestamp": 1030731944.8300781, - "heart_rate": 60 - }, - { - "timestamp": 1030731944.9257812, - "heart_rate": 60 - }, - { - "timestamp": 1030731945.1757812, - "heart_rate": 60 - }, - { - "timestamp": 1030731945.4257812, - "heart_rate": 60 - }, - { - "timestamp": 1030731945.515625, - "heart_rate": 61 - }, - { - "timestamp": 1030731945.765625, - "heart_rate": 61 - }, - { - "timestamp": 1030731946.015625, - "heart_rate": 61 - }, - { - "timestamp": 1030731946.1103516, - "heart_rate": 63 - }, - { - "timestamp": 1030731946.3603516, - "heart_rate": 63 - }, - { - "timestamp": 1030731946.5888672, - "heart_rate": 63 - }, - { - "timestamp": 1030731946.8388672, - "heart_rate": 63 - }, - { - "timestamp": 1030731947.0888672, - "heart_rate": 63 - }, - { - "timestamp": 1030731947.1757812, - "heart_rate": 63 - }, - { - "timestamp": 1030731947.4257812, - "heart_rate": 63 - }, - { - "timestamp": 1030731947.6757812, - "heart_rate": 63 - }, - { - "timestamp": 1030731947.7460938, - "heart_rate": 63 - }, - { - "timestamp": 1030731947.9960938, - "heart_rate": 63 - }, - { - "timestamp": 1030731948.2460938, - "heart_rate": 63 - }, - { - "timestamp": 1030731948.3330078, - "heart_rate": 62 - }, - { - "timestamp": 1030731948.5830078, - "heart_rate": 62 - }, - { - "timestamp": 1030731948.8330078, - "heart_rate": 62 - }, - { - "timestamp": 1030731948.9072266, - "heart_rate": 62 - }, - { - "timestamp": 1030731949.1572266, - "heart_rate": 62 - }, - { - "timestamp": 1030731949.4072266, - "heart_rate": 62 - }, - { - "timestamp": 1030731949.5498047, - "heart_rate": 62 - }, - { - "timestamp": 1030731949.7998047, - "heart_rate": 62 - }, - { - "timestamp": 1030731950.0498047, - "heart_rate": 62 - }, - { - "timestamp": 1030731950.1660156, - "heart_rate": 62 - }, - { - "timestamp": 1030731950.4160156, - "heart_rate": 62 - }, - { - "timestamp": 1030731950.6660156, - "heart_rate": 62 - }, - { - "timestamp": 1030731950.6816406, - "heart_rate": 62 - }, - { - "timestamp": 1030731950.9316406, - "heart_rate": 62 - }, - { - "timestamp": 1030731951.1816406, - "heart_rate": 62 - }, - { - "timestamp": 1030731951.4130859, - "heart_rate": 62 - }, - { - "timestamp": 1030731951.6630859, - "heart_rate": 62 - }, - { - "timestamp": 1030731951.9130859, - "heart_rate": 62 - }, - { - "timestamp": 1030731952.1630859, - "heart_rate": 62 - }, - { - "timestamp": 1030731952.2177734, - "heart_rate": 62 - }, - { - "timestamp": 1030731952.4677734, - "heart_rate": 62 - }, - { - "timestamp": 1030731952.7177734, - "heart_rate": 62 - }, - { - "timestamp": 1030731952.8798828, - "heart_rate": 62 - }, - { - "timestamp": 1030731953.1298828, - "heart_rate": 62 - }, - { - "timestamp": 1030731953.3798828, - "heart_rate": 62 - }, - { - "timestamp": 1030731953.6298828, - "heart_rate": 62 - }, - { - "timestamp": 1030731953.7441406, - "heart_rate": 62 - }, - { - "timestamp": 1030731953.9941406, - "heart_rate": 62 - }, - { - "timestamp": 1030731954.2441406, - "heart_rate": 62 - }, - { - "timestamp": 1030731954.4570312, - "heart_rate": 62 - }, - { - "timestamp": 1030731954.7070312, - "heart_rate": 62 - }, - { - "timestamp": 1030731954.9570312, - "heart_rate": 62 - }, - { - "timestamp": 1030731955.2070312, - "heart_rate": 62 - }, - { - "timestamp": 1030731955.2441406, - "heart_rate": 62 - }, - { - "timestamp": 1030731955.4941406, - "heart_rate": 62 - }, - { - "timestamp": 1030731955.7441406, - "heart_rate": 62 - }, - { - "timestamp": 1030731955.9755859, - "heart_rate": 62 - }, - { - "timestamp": 1030731956.2255859, - "heart_rate": 62 - }, - { - "timestamp": 1030731956.4755859, - "heart_rate": 62 - }, - { - "timestamp": 1030731956.5449219, - "heart_rate": 62 - }, - { - "timestamp": 1030731956.7949219, - "heart_rate": 62 - }, - { - "timestamp": 1030731957.0449219, - "heart_rate": 62 - }, - { - "timestamp": 1030731957.203125, - "heart_rate": 62 - }, - { - "timestamp": 1030731957.453125, - "heart_rate": 62 - }, - { - "timestamp": 1030731957.703125, - "heart_rate": 62 - }, - { - "timestamp": 1030731957.8857422, - "heart_rate": 62 - }, - { - "timestamp": 1030731958.1357422, - "heart_rate": 62 - }, - { - "timestamp": 1030731958.3857422, - "heart_rate": 62 - }, - { - "timestamp": 1030731958.6220703, - "heart_rate": 62 - }, - { - "timestamp": 1030731958.8720703, - "heart_rate": 62 - }, - { - "timestamp": 1030731959.1220703, - "heart_rate": 62 - }, - { - "timestamp": 1030731959.3173828, - "heart_rate": 62 - }, - { - "timestamp": 1030731959.5673828, - "heart_rate": 62 - }, - { - "timestamp": 1030731959.8173828, - "heart_rate": 62 - }, - { - "timestamp": 1030731960.0673828, - "heart_rate": 62 - }, - { - "timestamp": 1030731960.0693359, - "heart_rate": 62 - }, - { - "timestamp": 1030731960.3193359, - "heart_rate": 62 - }, - { - "timestamp": 1030731960.5693359, - "heart_rate": 62 - }, - { - "timestamp": 1030731960.7792969, - "heart_rate": 61 - }, - { - "timestamp": 1030731961.0292969, - "heart_rate": 61 - }, - { - "timestamp": 1030731961.2792969, - "heart_rate": 61 - }, - { - "timestamp": 1030731961.4892578, - "heart_rate": 61 - }, - { - "timestamp": 1030731961.7392578, - "heart_rate": 61 - }, - { - "timestamp": 1030731961.9892578, - "heart_rate": 61 - }, - { - "timestamp": 1030731962.1982422, - "heart_rate": 61 - }, - { - "timestamp": 1030731962.4482422, - "heart_rate": 61 - }, - { - "timestamp": 1030731962.6982422, - "heart_rate": 61 - }, - { - "timestamp": 1030731962.9482422, - "heart_rate": 61 - }, - { - "timestamp": 1030731963.1982422, - "heart_rate": 61 - }, - { - "timestamp": 1030731963.4482422, - "heart_rate": 61 - }, - { - "timestamp": 1030731963.5605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731963.8105469, - "heart_rate": 71 - }, - { - "timestamp": 1030731963.8691406, - "heart_rate": 71 - }, - { - "timestamp": 1030731964.1191406, - "heart_rate": 71 - }, - { - "timestamp": 1030731964.1855469, - "heart_rate": 71 - }, - { - "timestamp": 1030731964.4355469, - "heart_rate": 71 - }, - { - "timestamp": 1030731964.5605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731964.5605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731964.5605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731964.5605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731964.5605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731964.5605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731964.5605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731964.8105469, - "heart_rate": 71 - }, - { - "timestamp": 1030731965.0605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731965.3105469, - "heart_rate": 71 - }, - { - "timestamp": 1030731965.5605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731965.8105469, - "heart_rate": 71 - }, - { - "timestamp": 1030731966.0605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731966.3105469, - "heart_rate": 71 - }, - { - "timestamp": 1030731966.5605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731966.8105469, - "heart_rate": 71 - }, - { - "timestamp": 1030731967.0605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731967.3105469, - "heart_rate": 71 - }, - { - "timestamp": 1030731967.5605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731967.8105469, - "heart_rate": 71 - }, - { - "timestamp": 1030731968.0605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731968.3105469, - "heart_rate": 71 - }, - { - "timestamp": 1030731968.5605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731968.8105469, - "heart_rate": 71 - }, - { - "timestamp": 1030731969.0605469, - "heart_rate": 71 - }, - { - "timestamp": 1030731969.3105469, - "heart_rate": 71 - }, - { - "timestamp": 1030731969.5605469, - "heart_rate": 71 - }, - { - "timestamp": 1030732260, - "heart_rate": 71 - }, - { - "timestamp": 1030732260.25, - "heart_rate": 71 - }, - { - "timestamp": 1030732260.5, - "heart_rate": 71 - }, - { - "timestamp": 1030732260.75, - "heart_rate": 71 - }, - { - "timestamp": 1030732261, - "heart_rate": 71 - }, - { - "timestamp": 1030732261.25, - "heart_rate": 71 - }, - { - "timestamp": 1030732261.5, - "heart_rate": 71 - }, - { - "timestamp": 1030732261.75, - "heart_rate": 71 - }, - { - "timestamp": 1030732262, - "heart_rate": 71 - }, - { - "timestamp": 1030732262.25, - "heart_rate": 71 - }, - { - "timestamp": 1030732262.5, - "heart_rate": 71 - }, - { - "timestamp": 1030732262.75, - "heart_rate": 71 - }, - { - "timestamp": 1030732263, - "heart_rate": 71 - }, - { - "timestamp": 1030732263.25, - "heart_rate": 71 - }, - { - "timestamp": 1030732263.2851562, - "heart_rate": 71 - }, - { - "timestamp": 1030732263.5351562, - "heart_rate": 71 - }, - { - "timestamp": 1030732263.7851562, - "heart_rate": 71 - }, - { - "timestamp": 1030732264.0351562, - "heart_rate": 71 - }, - { - "timestamp": 1030732264.2851562, - "heart_rate": 71 - }, - { - "timestamp": 1030732264.3388672, - "heart_rate": 71 - }, - { - "timestamp": 1030732264.5888672, - "heart_rate": 71 - }, - { - "timestamp": 1030732264.8388672, - "heart_rate": 71 - }, - { - "timestamp": 1030732265.0888672, - "heart_rate": 71 - }, - { - "timestamp": 1030732265.3212891, - "heart_rate": 71 - }, - { - "timestamp": 1030732265.5712891, - "heart_rate": 71 - }, - { - "timestamp": 1030732265.8212891, - "heart_rate": 71 - }, - { - "timestamp": 1030732266.0712891, - "heart_rate": 71 - }, - { - "timestamp": 1030732266.3193359, - "heart_rate": 71 - }, - { - "timestamp": 1030732266.5693359, - "heart_rate": 71 - }, - { - "timestamp": 1030732266.8193359, - "heart_rate": 71 - }, - { - "timestamp": 1030732267.0693359, - "heart_rate": 71 - }, - { - "timestamp": 1030732267.2392578, - "heart_rate": 71 - }, - { - "timestamp": 1030732267.4892578, - "heart_rate": 71 - }, - { - "timestamp": 1030732267.7392578, - "heart_rate": 71 - }, - { - "timestamp": 1030732267.9892578, - "heart_rate": 71 - }, - { - "timestamp": 1030732268.1503906, - "heart_rate": 71 - }, - { - "timestamp": 1030732268.4003906, - "heart_rate": 71 - }, - { - "timestamp": 1030732268.6503906, - "heart_rate": 71 - }, - { - "timestamp": 1030732268.9003906, - "heart_rate": 71 - }, - { - "timestamp": 1030732269.0263672, - "heart_rate": 69 - }, - { - "timestamp": 1030732269.2763672, - "heart_rate": 69 - }, - { - "timestamp": 1030732269.5263672, - "heart_rate": 69 - }, - { - "timestamp": 1030732269.7763672, - "heart_rate": 69 - }, - { - "timestamp": 1030732270.0263672, - "heart_rate": 69 - }, - { - "timestamp": 1030732270.0410156, - "heart_rate": 68 - }, - { - "timestamp": 1030732270.2910156, - "heart_rate": 68 - }, - { - "timestamp": 1030732270.5400391, - "heart_rate": 68 - }, - { - "timestamp": 1030732270.7900391, - "heart_rate": 68 - }, - { - "timestamp": 1030732271.0400391, - "heart_rate": 68 - }, - { - "timestamp": 1030732271.2900391, - "heart_rate": 68 - }, - { - "timestamp": 1030732271.5400391, - "heart_rate": 68 - }, - { - "timestamp": 1030732271.5527344, - "heart_rate": 68 - }, - { - "timestamp": 1030732271.8027344, - "heart_rate": 68 - }, - { - "timestamp": 1030732272.0527344, - "heart_rate": 68 - }, - { - "timestamp": 1030732272.1083984, - "heart_rate": 68 - }, - { - "timestamp": 1030732272.3583984, - "heart_rate": 68 - }, - { - "timestamp": 1030732272.6083984, - "heart_rate": 68 - }, - { - "timestamp": 1030732272.8583984, - "heart_rate": 68 - }, - { - "timestamp": 1030732273.1083984, - "heart_rate": 68 - }, - { - "timestamp": 1030732273.1123047, - "heart_rate": 68 - }, - { - "timestamp": 1030732273.3623047, - "heart_rate": 68 - }, - { - "timestamp": 1030732273.6123047, - "heart_rate": 68 - }, - { - "timestamp": 1030732273.8623047, - "heart_rate": 68 - }, - { - "timestamp": 1030732274.1123047, - "heart_rate": 68 - }, - { - "timestamp": 1030732274.1582031, - "heart_rate": 68 - }, - { - "timestamp": 1030732274.4082031, - "heart_rate": 68 - }, - { - "timestamp": 1030732274.4394531, - "heart_rate": 68 - }, - { - "timestamp": 1030732274.6894531, - "heart_rate": 68 - }, - { - "timestamp": 1030732274.9394531, - "heart_rate": 68 - }, - { - "timestamp": 1030732274.9423828, - "heart_rate": 68 - }, - { - "timestamp": 1030732275.1923828, - "heart_rate": 68 - }, - { - "timestamp": 1030732275.4423828, - "heart_rate": 68 - }, - { - "timestamp": 1030732275.6923828, - "heart_rate": 68 - }, - { - "timestamp": 1030732275.7841797, - "heart_rate": 68 - }, - { - "timestamp": 1030732276.0341797, - "heart_rate": 68 - }, - { - "timestamp": 1030732276.2841797, - "heart_rate": 68 - }, - { - "timestamp": 1030732276.5341797, - "heart_rate": 68 - }, - { - "timestamp": 1030732276.7841797, - "heart_rate": 68 - }, - { - "timestamp": 1030732276.8095703, - "heart_rate": 68 - }, - { - "timestamp": 1030732277.0595703, - "heart_rate": 68 - }, - { - "timestamp": 1030732277.3095703, - "heart_rate": 68 - }, - { - "timestamp": 1030732277.5595703, - "heart_rate": 68 - }, - { - "timestamp": 1030732277.6220703, - "heart_rate": 68 - }, - { - "timestamp": 1030732277.8720703, - "heart_rate": 68 - }, - { - "timestamp": 1030732278.1220703, - "heart_rate": 68 - }, - { - "timestamp": 1030732278.3203125, - "heart_rate": 68 - }, - { - "timestamp": 1030732278.5703125, - "heart_rate": 68 - }, - { - "timestamp": 1030732278.8203125, - "heart_rate": 68 - }, - { - "timestamp": 1030732279.0703125, - "heart_rate": 68 - }, - { - "timestamp": 1030732279.3203125, - "heart_rate": 68 - }, - { - "timestamp": 1030732279.3544922, - "heart_rate": 68 - }, - { - "timestamp": 1030732279.6044922, - "heart_rate": 68 - }, - { - "timestamp": 1030732279.8544922, - "heart_rate": 68 - }, - { - "timestamp": 1030732280.1044922, - "heart_rate": 68 - }, - { - "timestamp": 1030732280.2958984, - "heart_rate": 68 - }, - { - "timestamp": 1030732280.5458984, - "heart_rate": 68 - }, - { - "timestamp": 1030732280.7958984, - "heart_rate": 68 - }, - { - "timestamp": 1030732281.0458984, - "heart_rate": 68 - }, - { - "timestamp": 1030732281.1875, - "heart_rate": 69 - }, - { - "timestamp": 1030732281.4375, - "heart_rate": 69 - }, - { - "timestamp": 1030732281.6875, - "heart_rate": 69 - }, - { - "timestamp": 1030732281.9375, - "heart_rate": 69 - }, - { - "timestamp": 1030732282.1289062, - "heart_rate": 69 - }, - { - "timestamp": 1030732282.3789062, - "heart_rate": 69 - }, - { - "timestamp": 1030732282.6289062, - "heart_rate": 69 - }, - { - "timestamp": 1030732282.8789062, - "heart_rate": 69 - }, - { - "timestamp": 1030732283.1289062, - "heart_rate": 69 - }, - { - "timestamp": 1030732283.1308594, - "heart_rate": 69 - }, - { - "timestamp": 1030732283.3808594, - "heart_rate": 69 - }, - { - "timestamp": 1030732283.6308594, - "heart_rate": 69 - }, - { - "timestamp": 1030732283.8808594, - "heart_rate": 69 - }, - { - "timestamp": 1030732284.1308594, - "heart_rate": 70 - }, - { - "timestamp": 1030732284.3808594, - "heart_rate": 70 - }, - { - "timestamp": 1030732284.6308594, - "heart_rate": 70 - }, - { - "timestamp": 1030732284.8808594, - "heart_rate": 70 - }, - { - "timestamp": 1030732285.1308594, - "heart_rate": 70 - }, - { - "timestamp": 1030732285.1640625, - "heart_rate": 70 - }, - { - "timestamp": 1030732285.4140625, - "heart_rate": 70 - }, - { - "timestamp": 1030732285.6640625, - "heart_rate": 70 - }, - { - "timestamp": 1030732285.9140625, - "heart_rate": 70 - }, - { - "timestamp": 1030732286.1640625, - "heart_rate": 70 - }, - { - "timestamp": 1030732286.2080078, - "heart_rate": 69 - }, - { - "timestamp": 1030732286.4580078, - "heart_rate": 69 - }, - { - "timestamp": 1030732286.7080078, - "heart_rate": 69 - }, - { - "timestamp": 1030732286.9580078, - "heart_rate": 69 - }, - { - "timestamp": 1030732287.2080078, - "heart_rate": 69 - }, - { - "timestamp": 1030732287.3320312, - "heart_rate": 68 - }, - { - "timestamp": 1030732287.5820312, - "heart_rate": 68 - }, - { - "timestamp": 1030732287.8320312, - "heart_rate": 68 - }, - { - "timestamp": 1030732288.0820312, - "heart_rate": 68 - }, - { - "timestamp": 1030732288.3320312, - "heart_rate": 68 - }, - { - "timestamp": 1030732288.5820312, - "heart_rate": 68 - }, - { - "timestamp": 1030732288.5859375, - "heart_rate": 66 - }, - { - "timestamp": 1030732288.8359375, - "heart_rate": 66 - }, - { - "timestamp": 1030732289.0859375, - "heart_rate": 66 - }, - { - "timestamp": 1030732289.3359375, - "heart_rate": 66 - }, - { - "timestamp": 1030732289.5859375, - "heart_rate": 66 - }, - { - "timestamp": 1030732289.6240234, - "heart_rate": 65 - }, - { - "timestamp": 1030732289.8740234, - "heart_rate": 65 - }, - { - "timestamp": 1030732290.1240234, - "heart_rate": 65 - }, - { - "timestamp": 1030732290.2988281, - "heart_rate": 65 - }, - { - "timestamp": 1030732290.5488281, - "heart_rate": 65 - }, - { - "timestamp": 1030732290.7988281, - "heart_rate": 65 - }, - { - "timestamp": 1030732291.0488281, - "heart_rate": 65 - }, - { - "timestamp": 1030732291.2988281, - "heart_rate": 65 - }, - { - "timestamp": 1030732291.4794922, - "heart_rate": 65 - }, - { - "timestamp": 1030732291.7294922, - "heart_rate": 65 - }, - { - "timestamp": 1030732291.9794922, - "heart_rate": 65 - }, - { - "timestamp": 1030732292.2294922, - "heart_rate": 65 - }, - { - "timestamp": 1030732292.4794922, - "heart_rate": 65 - }, - { - "timestamp": 1030732292.4960938, - "heart_rate": 65 - }, - { - "timestamp": 1030732292.7460938, - "heart_rate": 65 - }, - { - "timestamp": 1030732292.9960938, - "heart_rate": 65 - }, - { - "timestamp": 1030732293.0546875, - "heart_rate": 65 - }, - { - "timestamp": 1030732293.3046875, - "heart_rate": 65 - }, - { - "timestamp": 1030732293.5546875, - "heart_rate": 65 - }, - { - "timestamp": 1030732293.6044922, - "heart_rate": 65 - }, - { - "timestamp": 1030732293.8544922, - "heart_rate": 65 - }, - { - "timestamp": 1030732294.1044922, - "heart_rate": 65 - }, - { - "timestamp": 1030732294.2138672, - "heart_rate": 65 - }, - { - "timestamp": 1030732294.4638672, - "heart_rate": 65 - }, - { - "timestamp": 1030732294.4746094, - "heart_rate": 65 - }, - { - "timestamp": 1030732294.7246094, - "heart_rate": 65 - }, - { - "timestamp": 1030732294.9746094, - "heart_rate": 65 - }, - { - "timestamp": 1030732295.2246094, - "heart_rate": 65 - }, - { - "timestamp": 1030732295.2900391, - "heart_rate": 65 - }, - { - "timestamp": 1030732295.5400391, - "heart_rate": 65 - }, - { - "timestamp": 1030732295.7900391, - "heart_rate": 65 - }, - { - "timestamp": 1030732295.9638672, - "heart_rate": 65 - }, - { - "timestamp": 1030732296.2138672, - "heart_rate": 65 - }, - { - "timestamp": 1030732296.2333984, - "heart_rate": 65 - }, - { - "timestamp": 1030732296.4833984, - "heart_rate": 65 - }, - { - "timestamp": 1030732296.7333984, - "heart_rate": 65 - }, - { - "timestamp": 1030732296.8105469, - "heart_rate": 65 - }, - { - "timestamp": 1030732297.0605469, - "heart_rate": 65 - }, - { - "timestamp": 1030732297.0703125, - "heart_rate": 65 - }, - { - "timestamp": 1030732297.3203125, - "heart_rate": 65 - }, - { - "timestamp": 1030732297.5703125, - "heart_rate": 65 - }, - { - "timestamp": 1030732297.7246094, - "heart_rate": 65 - }, - { - "timestamp": 1030732297.9746094, - "heart_rate": 65 - }, - { - "timestamp": 1030732298.2246094, - "heart_rate": 65 - }, - { - "timestamp": 1030732298.2617188, - "heart_rate": 65 - }, - { - "timestamp": 1030732298.5117188, - "heart_rate": 65 - }, - { - "timestamp": 1030732298.7607422, - "heart_rate": 66 - }, - { - "timestamp": 1030732299.0107422, - "heart_rate": 66 - }, - { - "timestamp": 1030732299.0234375, - "heart_rate": 66 - }, - { - "timestamp": 1030732299.2734375, - "heart_rate": 66 - }, - { - "timestamp": 1030732299.4003906, - "heart_rate": 66 - }, - { - "timestamp": 1030732299.6503906, - "heart_rate": 66 - }, - { - "timestamp": 1030732299.8408203, - "heart_rate": 66 - }, - { - "timestamp": 1030732300.0908203, - "heart_rate": 66 - }, - { - "timestamp": 1030732300.3408203, - "heart_rate": 66 - }, - { - "timestamp": 1030732300.4550781, - "heart_rate": 66 - }, - { - "timestamp": 1030732300.7050781, - "heart_rate": 66 - }, - { - "timestamp": 1030732300.9433594, - "heart_rate": 66 - }, - { - "timestamp": 1030732301.1933594, - "heart_rate": 66 - }, - { - "timestamp": 1030732301.4433594, - "heart_rate": 66 - }, - { - "timestamp": 1030732301.5976562, - "heart_rate": 65 - }, - { - "timestamp": 1030732301.8476562, - "heart_rate": 65 - }, - { - "timestamp": 1030732302.0976562, - "heart_rate": 65 - }, - { - "timestamp": 1030732302.2041016, - "heart_rate": 65 - }, - { - "timestamp": 1030732302.4541016, - "heart_rate": 65 - }, - { - "timestamp": 1030732302.7041016, - "heart_rate": 65 - }, - { - "timestamp": 1030732302.7480469, - "heart_rate": 66 - }, - { - "timestamp": 1030732302.9980469, - "heart_rate": 66 - }, - { - "timestamp": 1030732303.2480469, - "heart_rate": 66 - }, - { - "timestamp": 1030732303.2939453, - "heart_rate": 66 - }, - { - "timestamp": 1030732303.5439453, - "heart_rate": 66 - }, - { - "timestamp": 1030732303.7939453, - "heart_rate": 66 - }, - { - "timestamp": 1030732303.8583984, - "heart_rate": 66 - }, - { - "timestamp": 1030732304.1083984, - "heart_rate": 66 - }, - { - "timestamp": 1030732304.3583984, - "heart_rate": 66 - }, - { - "timestamp": 1030732304.5771484, - "heart_rate": 67 - }, - { - "timestamp": 1030732304.8271484, - "heart_rate": 67 - }, - { - "timestamp": 1030732305.0771484, - "heart_rate": 67 - }, - { - "timestamp": 1030732305.2158203, - "heart_rate": 68 - }, - { - "timestamp": 1030732305.4658203, - "heart_rate": 68 - }, - { - "timestamp": 1030732305.7158203, - "heart_rate": 68 - }, - { - "timestamp": 1030732305.8154297, - "heart_rate": 69 - }, - { - "timestamp": 1030732306.0654297, - "heart_rate": 69 - }, - { - "timestamp": 1030732306.2958984, - "heart_rate": 69 - }, - { - "timestamp": 1030732306.5458984, - "heart_rate": 69 - }, - { - "timestamp": 1030732306.7958984, - "heart_rate": 69 - }, - { - "timestamp": 1030732306.9736328, - "heart_rate": 69 - }, - { - "timestamp": 1030732307.2236328, - "heart_rate": 69 - }, - { - "timestamp": 1030732307.2998047, - "heart_rate": 69 - }, - { - "timestamp": 1030732307.5498047, - "heart_rate": 69 - }, - { - "timestamp": 1030732307.7998047, - "heart_rate": 69 - }, - { - "timestamp": 1030732307.9052734, - "heart_rate": 70 - }, - { - "timestamp": 1030732308.1552734, - "heart_rate": 70 - }, - { - "timestamp": 1030732308.4052734, - "heart_rate": 70 - }, - { - "timestamp": 1030732308.4902344, - "heart_rate": 70 - }, - { - "timestamp": 1030732308.7402344, - "heart_rate": 70 - }, - { - "timestamp": 1030732308.9902344, - "heart_rate": 70 - }, - { - "timestamp": 1030732309.0478516, - "heart_rate": 71 - }, - { - "timestamp": 1030732309.2978516, - "heart_rate": 71 - }, - { - "timestamp": 1030732309.5478516, - "heart_rate": 71 - }, - { - "timestamp": 1030732309.7978516, - "heart_rate": 71 - }, - { - "timestamp": 1030732309.8183594, - "heart_rate": 72 - }, - { - "timestamp": 1030732310.0683594, - "heart_rate": 72 - }, - { - "timestamp": 1030732310.2353516, - "heart_rate": 73 - }, - { - "timestamp": 1030732310.4853516, - "heart_rate": 73 - }, - { - "timestamp": 1030732310.7353516, - "heart_rate": 73 - }, - { - "timestamp": 1030732310.9482422, - "heart_rate": 74 - }, - { - "timestamp": 1030732311.1982422, - "heart_rate": 74 - }, - { - "timestamp": 1030732311.4482422, - "heart_rate": 74 - }, - { - "timestamp": 1030732311.6982422, - "heart_rate": 74 - }, - { - "timestamp": 1030732311.71875, - "heart_rate": 74 - }, - { - "timestamp": 1030732311.96875, - "heart_rate": 74 - }, - { - "timestamp": 1030732312.21875, - "heart_rate": 74 - }, - { - "timestamp": 1030732312.46875, - "heart_rate": 74 - }, - { - "timestamp": 1030732312.4726562, - "heart_rate": 74 - }, - { - "timestamp": 1030732312.7226562, - "heart_rate": 74 - }, - { - "timestamp": 1030732312.9726562, - "heart_rate": 74 - }, - { - "timestamp": 1030732313.2070312, - "heart_rate": 74 - }, - { - "timestamp": 1030732313.4570312, - "heart_rate": 74 - }, - { - "timestamp": 1030732313.7070312, - "heart_rate": 74 - }, - { - "timestamp": 1030732313.9541016, - "heart_rate": 74 - }, - { - "timestamp": 1030732314.2041016, - "heart_rate": 74 - }, - { - "timestamp": 1030732314.4541016, - "heart_rate": 74 - }, - { - "timestamp": 1030732314.7011719, - "heart_rate": 76 - }, - { - "timestamp": 1030732314.9511719, - "heart_rate": 76 - }, - { - "timestamp": 1030732315.2011719, - "heart_rate": 76 - }, - { - "timestamp": 1030732315.4511719, - "heart_rate": 76 - }, - { - "timestamp": 1030732315.4716797, - "heart_rate": 77 - }, - { - "timestamp": 1030732315.7216797, - "heart_rate": 77 - }, - { - "timestamp": 1030732315.9716797, - "heart_rate": 77 - }, - { - "timestamp": 1030732316.2216797, - "heart_rate": 77 - }, - { - "timestamp": 1030732316.2363281, - "heart_rate": 78 - }, - { - "timestamp": 1030732316.4863281, - "heart_rate": 78 - }, - { - "timestamp": 1030732316.7363281, - "heart_rate": 78 - }, - { - "timestamp": 1030732316.9863281, - "heart_rate": 78 - }, - { - "timestamp": 1030732317.0058594, - "heart_rate": 80 - }, - { - "timestamp": 1030732317.2558594, - "heart_rate": 80 - }, - { - "timestamp": 1030732317.5058594, - "heart_rate": 80 - }, - { - "timestamp": 1030732317.6005859, - "heart_rate": 80 - }, - { - "timestamp": 1030732317.8505859, - "heart_rate": 80 - }, - { - "timestamp": 1030732318.1005859, - "heart_rate": 80 - }, - { - "timestamp": 1030732318.3505859, - "heart_rate": 80 - }, - { - "timestamp": 1030732318.5107422, - "heart_rate": 80 - }, - { - "timestamp": 1030732318.7607422, - "heart_rate": 80 - }, - { - "timestamp": 1030732319.0107422, - "heart_rate": 80 - }, - { - "timestamp": 1030732319.2480469, - "heart_rate": 80 - }, - { - "timestamp": 1030732319.4980469, - "heart_rate": 80 - }, - { - "timestamp": 1030732319.7480469, - "heart_rate": 80 - }, - { - "timestamp": 1030732319.8769531, - "heart_rate": 81 - }, - { - "timestamp": 1030732320.1269531, - "heart_rate": 81 - }, - { - "timestamp": 1030732320.3769531, - "heart_rate": 81 - }, - { - "timestamp": 1030732320.6269531, - "heart_rate": 81 - }, - { - "timestamp": 1030732320.7783203, - "heart_rate": 81 - }, - { - "timestamp": 1030732321.0283203, - "heart_rate": 81 - }, - { - "timestamp": 1030732321.2783203, - "heart_rate": 81 - }, - { - "timestamp": 1030732321.5283203, - "heart_rate": 81 - }, - { - "timestamp": 1030732321.5439453, - "heart_rate": 82 - }, - { - "timestamp": 1030732321.7939453, - "heart_rate": 82 - }, - { - "timestamp": 1030732322.0439453, - "heart_rate": 82 - }, - { - "timestamp": 1030732322.2939453, - "heart_rate": 82 - }, - { - "timestamp": 1030732322.3378906, - "heart_rate": 82 - }, - { - "timestamp": 1030732322.5878906, - "heart_rate": 82 - }, - { - "timestamp": 1030732322.8378906, - "heart_rate": 82 - }, - { - "timestamp": 1030732323.0878906, - "heart_rate": 82 - }, - { - "timestamp": 1030732323.1103516, - "heart_rate": 83 - }, - { - "timestamp": 1030732323.3603516, - "heart_rate": 83 - }, - { - "timestamp": 1030732323.6103516, - "heart_rate": 83 - }, - { - "timestamp": 1030732323.8603516, - "heart_rate": 83 - }, - { - "timestamp": 1030732323.9316406, - "heart_rate": 84 - }, - { - "timestamp": 1030732324.1816406, - "heart_rate": 84 - }, - { - "timestamp": 1030732324.4316406, - "heart_rate": 84 - }, - { - "timestamp": 1030732324.6816406, - "heart_rate": 84 - }, - { - "timestamp": 1030732324.7304688, - "heart_rate": 86 - }, - { - "timestamp": 1030732324.9804688, - "heart_rate": 86 - }, - { - "timestamp": 1030732325.2304688, - "heart_rate": 86 - }, - { - "timestamp": 1030732325.4804688, - "heart_rate": 86 - }, - { - "timestamp": 1030732325.5263672, - "heart_rate": 85 - }, - { - "timestamp": 1030732325.7763672, - "heart_rate": 85 - }, - { - "timestamp": 1030732326.0263672, - "heart_rate": 85 - }, - { - "timestamp": 1030732326.2763672, - "heart_rate": 85 - }, - { - "timestamp": 1030732326.3125, - "heart_rate": 85 - }, - { - "timestamp": 1030732326.5625, - "heart_rate": 85 - }, - { - "timestamp": 1030732326.8125, - "heart_rate": 85 - }, - { - "timestamp": 1030732327.0625, - "heart_rate": 85 - }, - { - "timestamp": 1030732327.1289062, - "heart_rate": 85 - }, - { - "timestamp": 1030732327.3789062, - "heart_rate": 85 - }, - { - "timestamp": 1030732327.6289062, - "heart_rate": 85 - }, - { - "timestamp": 1030732327.6640625, - "heart_rate": 85 - }, - { - "timestamp": 1030732327.9140625, - "heart_rate": 85 - }, - { - "timestamp": 1030732328.1640625, - "heart_rate": 85 - }, - { - "timestamp": 1030732328.3427734, - "heart_rate": 85 - }, - { - "timestamp": 1030732328.5927734, - "heart_rate": 85 - }, - { - "timestamp": 1030732328.7578125, - "heart_rate": 85 - }, - { - "timestamp": 1030732329.0078125, - "heart_rate": 85 - }, - { - "timestamp": 1030732329.2578125, - "heart_rate": 85 - }, - { - "timestamp": 1030732329.5078125, - "heart_rate": 85 - }, - { - "timestamp": 1030732329.578125, - "heart_rate": 85 - }, - { - "timestamp": 1030732329.828125, - "heart_rate": 85 - }, - { - "timestamp": 1030732330.078125, - "heart_rate": 85 - }, - { - "timestamp": 1030732330.328125, - "heart_rate": 85 - }, - { - "timestamp": 1030732330.4013672, - "heart_rate": 86 - }, - { - "timestamp": 1030732330.6513672, - "heart_rate": 86 - }, - { - "timestamp": 1030732330.9013672, - "heart_rate": 86 - }, - { - "timestamp": 1030732331.1513672, - "heart_rate": 86 - }, - { - "timestamp": 1030732331.1923828, - "heart_rate": 86 - }, - { - "timestamp": 1030732331.4423828, - "heart_rate": 86 - }, - { - "timestamp": 1030732331.6923828, - "heart_rate": 86 - }, - { - "timestamp": 1030732331.9423828, - "heart_rate": 86 - }, - { - "timestamp": 1030732332.0107422, - "heart_rate": 87 - }, - { - "timestamp": 1030732332.2607422, - "heart_rate": 87 - }, - { - "timestamp": 1030732332.5107422, - "heart_rate": 87 - }, - { - "timestamp": 1030732332.7607422, - "heart_rate": 87 - }, - { - "timestamp": 1030732332.8251953, - "heart_rate": 89 - }, - { - "timestamp": 1030732333.0751953, - "heart_rate": 89 - }, - { - "timestamp": 1030732333.3251953, - "heart_rate": 89 - }, - { - "timestamp": 1030732333.5751953, - "heart_rate": 89 - }, - { - "timestamp": 1030732333.6289062, - "heart_rate": 90 - }, - { - "timestamp": 1030732333.8789062, - "heart_rate": 90 - }, - { - "timestamp": 1030732334.1289062, - "heart_rate": 90 - }, - { - "timestamp": 1030732334.3789062, - "heart_rate": 90 - }, - { - "timestamp": 1030732334.40625, - "heart_rate": 89 - }, - { - "timestamp": 1030732334.65625, - "heart_rate": 89 - }, - { - "timestamp": 1030732334.90625, - "heart_rate": 89 - }, - { - "timestamp": 1030732335.15625, - "heart_rate": 89 - }, - { - "timestamp": 1030732335.1972656, - "heart_rate": 89 - }, - { - "timestamp": 1030732335.4472656, - "heart_rate": 89 - }, - { - "timestamp": 1030732335.6972656, - "heart_rate": 89 - }, - { - "timestamp": 1030732335.9472656, - "heart_rate": 89 - }, - { - "timestamp": 1030732335.9824219, - "heart_rate": 89 - }, - { - "timestamp": 1030732336.2324219, - "heart_rate": 89 - }, - { - "timestamp": 1030732336.4824219, - "heart_rate": 89 - }, - { - "timestamp": 1030732336.7324219, - "heart_rate": 89 - }, - { - "timestamp": 1030732336.8359375, - "heart_rate": 88 - }, - { - "timestamp": 1030732337.0859375, - "heart_rate": 88 - }, - { - "timestamp": 1030732337.3359375, - "heart_rate": 88 - }, - { - "timestamp": 1030732337.5664062, - "heart_rate": 88 - }, - { - "timestamp": 1030732337.8164062, - "heart_rate": 88 - }, - { - "timestamp": 1030732338.0664062, - "heart_rate": 88 - }, - { - "timestamp": 1030732338.3164062, - "heart_rate": 88 - }, - { - "timestamp": 1030732338.3828125, - "heart_rate": 88 - }, - { - "timestamp": 1030732338.6328125, - "heart_rate": 88 - }, - { - "timestamp": 1030732338.8828125, - "heart_rate": 88 - }, - { - "timestamp": 1030732339.1328125, - "heart_rate": 88 - }, - { - "timestamp": 1030732339.1972656, - "heart_rate": 88 - }, - { - "timestamp": 1030732339.4472656, - "heart_rate": 88 - }, - { - "timestamp": 1030732339.6972656, - "heart_rate": 88 - }, - { - "timestamp": 1030732339.9472656, - "heart_rate": 88 - }, - { - "timestamp": 1030732340.0830078, - "heart_rate": 88 - }, - { - "timestamp": 1030732340.3330078, - "heart_rate": 88 - }, - { - "timestamp": 1030732340.5830078, - "heart_rate": 88 - }, - { - "timestamp": 1030732340.8330078, - "heart_rate": 88 - }, - { - "timestamp": 1030732340.9013672, - "heart_rate": 89 - }, - { - "timestamp": 1030732341.1513672, - "heart_rate": 89 - }, - { - "timestamp": 1030732341.4013672, - "heart_rate": 89 - }, - { - "timestamp": 1030732341.6513672, - "heart_rate": 89 - }, - { - "timestamp": 1030732341.7587891, - "heart_rate": 89 - }, - { - "timestamp": 1030732342.0087891, - "heart_rate": 89 - }, - { - "timestamp": 1030732342.2587891, - "heart_rate": 89 - }, - { - "timestamp": 1030732342.3339844, - "heart_rate": 89 - }, - { - "timestamp": 1030732342.5839844, - "heart_rate": 89 - }, - { - "timestamp": 1030732342.8339844, - "heart_rate": 89 - }, - { - "timestamp": 1030732343.0839844, - "heart_rate": 89 - }, - { - "timestamp": 1030732343.3300781, - "heart_rate": 89 - }, - { - "timestamp": 1030732343.5800781, - "heart_rate": 89 - }, - { - "timestamp": 1030732343.8300781, - "heart_rate": 89 - }, - { - "timestamp": 1030732344.0800781, - "heart_rate": 89 - }, - { - "timestamp": 1030732344.3300781, - "heart_rate": 89 - }, - { - "timestamp": 1030732344.4169922, - "heart_rate": 89 - }, - { - "timestamp": 1030732344.6669922, - "heart_rate": 89 - }, - { - "timestamp": 1030732344.9169922, - "heart_rate": 89 - }, - { - "timestamp": 1030732345.1669922, - "heart_rate": 89 - }, - { - "timestamp": 1030732345.4169922, - "heart_rate": 89 - }, - { - "timestamp": 1030732345.4941406, - "heart_rate": 89 - }, - { - "timestamp": 1030732345.7441406, - "heart_rate": 89 - }, - { - "timestamp": 1030732345.9941406, - "heart_rate": 89 - }, - { - "timestamp": 1030732346.0302734, - "heart_rate": 89 - }, - { - "timestamp": 1030732346.2802734, - "heart_rate": 89 - }, - { - "timestamp": 1030732346.5302734, - "heart_rate": 89 - }, - { - "timestamp": 1030732346.7802734, - "heart_rate": 89 - }, - { - "timestamp": 1030732346.8886719, - "heart_rate": 89 - }, - { - "timestamp": 1030732347.1386719, - "heart_rate": 89 - }, - { - "timestamp": 1030732347.3886719, - "heart_rate": 89 - }, - { - "timestamp": 1030732347.4521484, - "heart_rate": 89 - }, - { - "timestamp": 1030732347.7021484, - "heart_rate": 89 - }, - { - "timestamp": 1030732347.9521484, - "heart_rate": 89 - }, - { - "timestamp": 1030732348.0185547, - "heart_rate": 89 - }, - { - "timestamp": 1030732348.2685547, - "heart_rate": 89 - }, - { - "timestamp": 1030732348.5185547, - "heart_rate": 89 - }, - { - "timestamp": 1030732348.5419922, - "heart_rate": 88 - }, - { - "timestamp": 1030732348.7919922, - "heart_rate": 88 - }, - { - "timestamp": 1030732349.0419922, - "heart_rate": 88 - }, - { - "timestamp": 1030732349.1904297, - "heart_rate": 88 - }, - { - "timestamp": 1030732349.4404297, - "heart_rate": 88 - }, - { - "timestamp": 1030732349.6191406, - "heart_rate": 88 - }, - { - "timestamp": 1030732349.8691406, - "heart_rate": 88 - }, - { - "timestamp": 1030732350.1191406, - "heart_rate": 88 - }, - { - "timestamp": 1030732350.3691406, - "heart_rate": 88 - }, - { - "timestamp": 1030732350.4023438, - "heart_rate": 88 - }, - { - "timestamp": 1030732350.6523438, - "heart_rate": 88 - }, - { - "timestamp": 1030732350.8798828, - "heart_rate": 88 - }, - { - "timestamp": 1030732351.1298828, - "heart_rate": 88 - }, - { - "timestamp": 1030732351.3798828, - "heart_rate": 88 - }, - { - "timestamp": 1030732351.6298828, - "heart_rate": 88 - }, - { - "timestamp": 1030732351.65625, - "heart_rate": 88 - }, - { - "timestamp": 1030732351.90625, - "heart_rate": 88 - }, - { - "timestamp": 1030732352.15625, - "heart_rate": 88 - }, - { - "timestamp": 1030732352.40625, - "heart_rate": 88 - }, - { - "timestamp": 1030732352.4199219, - "heart_rate": 87 - }, - { - "timestamp": 1030732352.6699219, - "heart_rate": 87 - }, - { - "timestamp": 1030732352.9199219, - "heart_rate": 87 - }, - { - "timestamp": 1030732353.0634766, - "heart_rate": 87 - }, - { - "timestamp": 1030732353.3134766, - "heart_rate": 87 - }, - { - "timestamp": 1030732353.5634766, - "heart_rate": 87 - }, - { - "timestamp": 1030732353.8134766, - "heart_rate": 87 - }, - { - "timestamp": 1030732353.9853516, - "heart_rate": 87 - }, - { - "timestamp": 1030732354.2353516, - "heart_rate": 87 - }, - { - "timestamp": 1030732354.4853516, - "heart_rate": 87 - }, - { - "timestamp": 1030732354.7353516, - "heart_rate": 87 - }, - { - "timestamp": 1030732354.7832031, - "heart_rate": 87 - }, - { - "timestamp": 1030732355.0332031, - "heart_rate": 87 - }, - { - "timestamp": 1030732355.2832031, - "heart_rate": 87 - }, - { - "timestamp": 1030732355.5332031, - "heart_rate": 87 - }, - { - "timestamp": 1030732355.5957031, - "heart_rate": 87 - }, - { - "timestamp": 1030732355.8457031, - "heart_rate": 87 - }, - { - "timestamp": 1030732356.0957031, - "heart_rate": 87 - }, - { - "timestamp": 1030732356.3457031, - "heart_rate": 87 - }, - { - "timestamp": 1030732356.4287109, - "heart_rate": 87 - }, - { - "timestamp": 1030732356.6787109, - "heart_rate": 87 - }, - { - "timestamp": 1030732356.9287109, - "heart_rate": 87 - }, - { - "timestamp": 1030732357.1787109, - "heart_rate": 87 - }, - { - "timestamp": 1030732357.2617188, - "heart_rate": 87 - }, - { - "timestamp": 1030732357.5117188, - "heart_rate": 87 - }, - { - "timestamp": 1030732357.7617188, - "heart_rate": 87 - }, - { - "timestamp": 1030732358.0117188, - "heart_rate": 87 - }, - { - "timestamp": 1030732358.1005859, - "heart_rate": 87 - }, - { - "timestamp": 1030732358.3505859, - "heart_rate": 87 - }, - { - "timestamp": 1030732358.6005859, - "heart_rate": 87 - }, - { - "timestamp": 1030732358.8505859, - "heart_rate": 87 - }, - { - "timestamp": 1030732358.9257812, - "heart_rate": 86 - }, - { - "timestamp": 1030732359.1757812, - "heart_rate": 86 - }, - { - "timestamp": 1030732359.4257812, - "heart_rate": 86 - }, - { - "timestamp": 1030732359.6757812, - "heart_rate": 86 - }, - { - "timestamp": 1030732359.7275391, - "heart_rate": 87 - }, - { - "timestamp": 1030732359.9775391, - "heart_rate": 87 - }, - { - "timestamp": 1030732360.2275391, - "heart_rate": 87 - }, - { - "timestamp": 1030732360.4775391, - "heart_rate": 87 - }, - { - "timestamp": 1030732360.4921875, - "heart_rate": 87 - }, - { - "timestamp": 1030732360.7421875, - "heart_rate": 87 - }, - { - "timestamp": 1030732360.9921875, - "heart_rate": 87 - }, - { - "timestamp": 1030732361.2421875, - "heart_rate": 87 - }, - { - "timestamp": 1030732361.2705078, - "heart_rate": 87 - }, - { - "timestamp": 1030732361.5205078, - "heart_rate": 87 - }, - { - "timestamp": 1030732361.7705078, - "heart_rate": 87 - }, - { - "timestamp": 1030732362.0205078, - "heart_rate": 87 - }, - { - "timestamp": 1030732362.0703125, - "heart_rate": 87 - }, - { - "timestamp": 1030732362.3203125, - "heart_rate": 87 - }, - { - "timestamp": 1030732362.5703125, - "heart_rate": 87 - }, - { - "timestamp": 1030732362.8203125, - "heart_rate": 87 - }, - { - "timestamp": 1030732362.8583984, - "heart_rate": 86 - }, - { - "timestamp": 1030732363.1083984, - "heart_rate": 86 - }, - { - "timestamp": 1030732363.3583984, - "heart_rate": 86 - }, - { - "timestamp": 1030732363.6083984, - "heart_rate": 86 - }, - { - "timestamp": 1030732363.6826172, - "heart_rate": 86 - }, - { - "timestamp": 1030732363.9326172, - "heart_rate": 86 - }, - { - "timestamp": 1030732364.1826172, - "heart_rate": 86 - }, - { - "timestamp": 1030732364.4326172, - "heart_rate": 86 - }, - { - "timestamp": 1030732364.5068359, - "heart_rate": 85 - }, - { - "timestamp": 1030732364.7568359, - "heart_rate": 85 - }, - { - "timestamp": 1030732365.0068359, - "heart_rate": 85 - }, - { - "timestamp": 1030732365.2568359, - "heart_rate": 85 - }, - { - "timestamp": 1030732365.3251953, - "heart_rate": 85 - }, - { - "timestamp": 1030732365.5751953, - "heart_rate": 85 - }, - { - "timestamp": 1030732365.8251953, - "heart_rate": 85 - }, - { - "timestamp": 1030732366.0751953, - "heart_rate": 85 - }, - { - "timestamp": 1030732366.1464844, - "heart_rate": 86 - }, - { - "timestamp": 1030732366.3964844, - "heart_rate": 86 - }, - { - "timestamp": 1030732366.6464844, - "heart_rate": 86 - }, - { - "timestamp": 1030732366.8964844, - "heart_rate": 86 - }, - { - "timestamp": 1030732366.9980469, - "heart_rate": 86 - }, - { - "timestamp": 1030732367.2480469, - "heart_rate": 86 - }, - { - "timestamp": 1030732367.4980469, - "heart_rate": 86 - }, - { - "timestamp": 1030732367.7480469, - "heart_rate": 86 - }, - { - "timestamp": 1030732367.8808594, - "heart_rate": 85 - }, - { - "timestamp": 1030732368.1308594, - "heart_rate": 85 - }, - { - "timestamp": 1030732368.3808594, - "heart_rate": 85 - }, - { - "timestamp": 1030732368.6308594, - "heart_rate": 85 - }, - { - "timestamp": 1030732368.7480469, - "heart_rate": 85 - }, - { - "timestamp": 1030732368.9980469, - "heart_rate": 85 - }, - { - "timestamp": 1030732369.2480469, - "heart_rate": 85 - }, - { - "timestamp": 1030732369.4980469, - "heart_rate": 85 - }, - { - "timestamp": 1030732369.6269531, - "heart_rate": 85 - }, - { - "timestamp": 1030732369.8769531, - "heart_rate": 85 - }, - { - "timestamp": 1030732370.1269531, - "heart_rate": 85 - }, - { - "timestamp": 1030732370.3769531, - "heart_rate": 85 - }, - { - "timestamp": 1030732370.5097656, - "heart_rate": 85 - }, - { - "timestamp": 1030732370.7597656, - "heart_rate": 85 - }, - { - "timestamp": 1030732371.0097656, - "heart_rate": 85 - }, - { - "timestamp": 1030732371.2597656, - "heart_rate": 85 - }, - { - "timestamp": 1030732371.4003906, - "heart_rate": 85 - }, - { - "timestamp": 1030732371.6503906, - "heart_rate": 85 - }, - { - "timestamp": 1030732371.9003906, - "heart_rate": 85 - }, - { - "timestamp": 1030732372.1503906, - "heart_rate": 85 - }, - { - "timestamp": 1030732372.2519531, - "heart_rate": 84 - }, - { - "timestamp": 1030732372.5019531, - "heart_rate": 84 - }, - { - "timestamp": 1030732372.7519531, - "heart_rate": 84 - }, - { - "timestamp": 1030732373.0019531, - "heart_rate": 84 - }, - { - "timestamp": 1030732373.125, - "heart_rate": 85 - }, - { - "timestamp": 1030732373.375, - "heart_rate": 85 - }, - { - "timestamp": 1030732373.625, - "heart_rate": 85 - }, - { - "timestamp": 1030732373.875, - "heart_rate": 85 - }, - { - "timestamp": 1030732373.984375, - "heart_rate": 85 - }, - { - "timestamp": 1030732374.234375, - "heart_rate": 85 - }, - { - "timestamp": 1030732374.484375, - "heart_rate": 85 - }, - { - "timestamp": 1030732374.734375, - "heart_rate": 85 - }, - { - "timestamp": 1030732374.8632812, - "heart_rate": 84 - }, - { - "timestamp": 1030732375.1132812, - "heart_rate": 84 - }, - { - "timestamp": 1030732375.3632812, - "heart_rate": 84 - }, - { - "timestamp": 1030732375.6132812, - "heart_rate": 84 - }, - { - "timestamp": 1030732375.6982422, - "heart_rate": 85 - }, - { - "timestamp": 1030732375.9482422, - "heart_rate": 85 - }, - { - "timestamp": 1030732376.1982422, - "heart_rate": 85 - }, - { - "timestamp": 1030732376.4482422, - "heart_rate": 85 - }, - { - "timestamp": 1030732376.5761719, - "heart_rate": 84 - }, - { - "timestamp": 1030732376.8261719, - "heart_rate": 84 - }, - { - "timestamp": 1030732377.0761719, - "heart_rate": 84 - }, - { - "timestamp": 1030732377.3261719, - "heart_rate": 84 - }, - { - "timestamp": 1030732377.4404297, - "heart_rate": 84 - }, - { - "timestamp": 1030732377.6904297, - "heart_rate": 84 - }, - { - "timestamp": 1030732377.9404297, - "heart_rate": 84 - }, - { - "timestamp": 1030732378.1904297, - "heart_rate": 84 - }, - { - "timestamp": 1030732378.3369141, - "heart_rate": 84 - }, - { - "timestamp": 1030732378.5869141, - "heart_rate": 84 - }, - { - "timestamp": 1030732378.8369141, - "heart_rate": 84 - }, - { - "timestamp": 1030732379.0869141, - "heart_rate": 84 - }, - { - "timestamp": 1030732379.2246094, - "heart_rate": 83 - }, - { - "timestamp": 1030732379.4746094, - "heart_rate": 83 - }, - { - "timestamp": 1030732379.7246094, - "heart_rate": 83 - }, - { - "timestamp": 1030732379.9746094, - "heart_rate": 83 - }, - { - "timestamp": 1030732380.2246094, - "heart_rate": 83 - }, - { - "timestamp": 1030732380.2919922, - "heart_rate": 83 - }, - { - "timestamp": 1030732380.5419922, - "heart_rate": 83 - }, - { - "timestamp": 1030732380.7919922, - "heart_rate": 83 - }, - { - "timestamp": 1030732380.9726562, - "heart_rate": 83 - }, - { - "timestamp": 1030732381.2226562, - "heart_rate": 83 - }, - { - "timestamp": 1030732381.4726562, - "heart_rate": 83 - }, - { - "timestamp": 1030732381.7226562, - "heart_rate": 83 - }, - { - "timestamp": 1030732381.8681641, - "heart_rate": 83 - }, - { - "timestamp": 1030732382.1181641, - "heart_rate": 83 - }, - { - "timestamp": 1030732382.3681641, - "heart_rate": 83 - }, - { - "timestamp": 1030732382.6181641, - "heart_rate": 83 - }, - { - "timestamp": 1030732382.7695312, - "heart_rate": 83 - }, - { - "timestamp": 1030732383.0195312, - "heart_rate": 83 - }, - { - "timestamp": 1030732383.2695312, - "heart_rate": 83 - }, - { - "timestamp": 1030732383.5195312, - "heart_rate": 83 - }, - { - "timestamp": 1030732383.7148438, - "heart_rate": 84 - }, - { - "timestamp": 1030732383.9648438, - "heart_rate": 84 - }, - { - "timestamp": 1030732384.2148438, - "heart_rate": 84 - }, - { - "timestamp": 1030732384.4648438, - "heart_rate": 84 - }, - { - "timestamp": 1030732384.6669922, - "heart_rate": 85 - }, - { - "timestamp": 1030732384.9169922, - "heart_rate": 85 - }, - { - "timestamp": 1030732385.1669922, - "heart_rate": 85 - }, - { - "timestamp": 1030732385.4169922, - "heart_rate": 85 - }, - { - "timestamp": 1030732385.6142578, - "heart_rate": 86 - }, - { - "timestamp": 1030732385.8642578, - "heart_rate": 86 - }, - { - "timestamp": 1030732386.1142578, - "heart_rate": 86 - }, - { - "timestamp": 1030732386.3642578, - "heart_rate": 86 - }, - { - "timestamp": 1030732386.5546875, - "heart_rate": 86 - }, - { - "timestamp": 1030732386.8046875, - "heart_rate": 86 - }, - { - "timestamp": 1030732387.0546875, - "heart_rate": 86 - }, - { - "timestamp": 1030732387.3046875, - "heart_rate": 86 - }, - { - "timestamp": 1030732387.4746094, - "heart_rate": 86 - }, - { - "timestamp": 1030732387.7246094, - "heart_rate": 86 - }, - { - "timestamp": 1030732387.9746094, - "heart_rate": 86 - }, - { - "timestamp": 1030732388.2246094, - "heart_rate": 86 - }, - { - "timestamp": 1030732388.390625, - "heart_rate": 84 - }, - { - "timestamp": 1030732388.640625, - "heart_rate": 84 - }, - { - "timestamp": 1030732388.890625, - "heart_rate": 84 - }, - { - "timestamp": 1030732389.140625, - "heart_rate": 84 - }, - { - "timestamp": 1030732389.2919922, - "heart_rate": 83 - }, - { - "timestamp": 1030732389.5419922, - "heart_rate": 83 - }, - { - "timestamp": 1030732389.7919922, - "heart_rate": 83 - }, - { - "timestamp": 1030732390.0419922, - "heart_rate": 83 - }, - { - "timestamp": 1030732390.1972656, - "heart_rate": 81 - }, - { - "timestamp": 1030732390.4472656, - "heart_rate": 81 - }, - { - "timestamp": 1030732390.6972656, - "heart_rate": 81 - }, - { - "timestamp": 1030732390.9472656, - "heart_rate": 81 - }, - { - "timestamp": 1030732391.0693359, - "heart_rate": 79 - }, - { - "timestamp": 1030732391.3193359, - "heart_rate": 79 - }, - { - "timestamp": 1030732391.5693359, - "heart_rate": 79 - }, - { - "timestamp": 1030732391.8193359, - "heart_rate": 79 - }, - { - "timestamp": 1030732391.9384766, - "heart_rate": 75 - }, - { - "timestamp": 1030732392.1884766, - "heart_rate": 75 - }, - { - "timestamp": 1030732392.4384766, - "heart_rate": 75 - }, - { - "timestamp": 1030732392.6884766, - "heart_rate": 75 - }, - { - "timestamp": 1030732392.8349609, - "heart_rate": 73 - }, - { - "timestamp": 1030732393.0849609, - "heart_rate": 73 - }, - { - "timestamp": 1030732393.3349609, - "heart_rate": 73 - }, - { - "timestamp": 1030732393.5849609, - "heart_rate": 73 - }, - { - "timestamp": 1030732393.7519531, - "heart_rate": 71 - }, - { - "timestamp": 1030732394.0019531, - "heart_rate": 71 - }, - { - "timestamp": 1030732394.2519531, - "heart_rate": 71 - }, - { - "timestamp": 1030732394.5019531, - "heart_rate": 71 - }, - { - "timestamp": 1030732394.7167969, - "heart_rate": 69 - }, - { - "timestamp": 1030732394.9667969, - "heart_rate": 69 - }, - { - "timestamp": 1030732395.2167969, - "heart_rate": 69 - }, - { - "timestamp": 1030732395.4667969, - "heart_rate": 69 - }, - { - "timestamp": 1030732395.640625, - "heart_rate": 68 - }, - { - "timestamp": 1030732395.890625, - "heart_rate": 68 - }, - { - "timestamp": 1030732396.140625, - "heart_rate": 68 - }, - { - "timestamp": 1030732396.390625, - "heart_rate": 68 - }, - { - "timestamp": 1030732396.5761719, - "heart_rate": 66 - }, - { - "timestamp": 1030732396.8261719, - "heart_rate": 66 - }, - { - "timestamp": 1030732397.0761719, - "heart_rate": 66 - }, - { - "timestamp": 1030732397.3261719, - "heart_rate": 66 - }, - { - "timestamp": 1030732397.5039062, - "heart_rate": 66 - }, - { - "timestamp": 1030732397.7539062, - "heart_rate": 66 - }, - { - "timestamp": 1030732398.0039062, - "heart_rate": 66 - }, - { - "timestamp": 1030732398.2539062, - "heart_rate": 66 - }, - { - "timestamp": 1030732398.4003906, - "heart_rate": 66 - }, - { - "timestamp": 1030732398.6503906, - "heart_rate": 66 - }, - { - "timestamp": 1030732398.9003906, - "heart_rate": 66 - }, - { - "timestamp": 1030732399.1503906, - "heart_rate": 66 - }, - { - "timestamp": 1030732399.2666016, - "heart_rate": 67 - }, - { - "timestamp": 1030732399.5166016, - "heart_rate": 67 - }, - { - "timestamp": 1030732399.7666016, - "heart_rate": 67 - }, - { - "timestamp": 1030732400.0166016, - "heart_rate": 67 - }, - { - "timestamp": 1030732400.1679688, - "heart_rate": 68 - }, - { - "timestamp": 1030732400.4179688, - "heart_rate": 68 - }, - { - "timestamp": 1030732400.6679688, - "heart_rate": 68 - }, - { - "timestamp": 1030732400.9179688, - "heart_rate": 68 - }, - { - "timestamp": 1030732401.0771484, - "heart_rate": 68 - }, - { - "timestamp": 1030732401.3271484, - "heart_rate": 68 - }, - { - "timestamp": 1030732401.5771484, - "heart_rate": 68 - }, - { - "timestamp": 1030732401.8271484, - "heart_rate": 68 - }, - { - "timestamp": 1030732401.9423828, - "heart_rate": 68 - }, - { - "timestamp": 1030732402.1923828, - "heart_rate": 68 - }, - { - "timestamp": 1030732402.4423828, - "heart_rate": 68 - }, - { - "timestamp": 1030732402.6923828, - "heart_rate": 68 - }, - { - "timestamp": 1030732402.8251953, - "heart_rate": 69 - }, - { - "timestamp": 1030732403.0751953, - "heart_rate": 69 - }, - { - "timestamp": 1030732403.3251953, - "heart_rate": 69 - }, - { - "timestamp": 1030732403.5751953, - "heart_rate": 69 - }, - { - "timestamp": 1030732403.7099609, - "heart_rate": 70 - }, - { - "timestamp": 1030732403.9599609, - "heart_rate": 70 - }, - { - "timestamp": 1030732404.2099609, - "heart_rate": 70 - }, - { - "timestamp": 1030732404.4599609, - "heart_rate": 70 - }, - { - "timestamp": 1030732404.6357422, - "heart_rate": 70 - }, - { - "timestamp": 1030732404.8857422, - "heart_rate": 70 - }, - { - "timestamp": 1030732405.1357422, - "heart_rate": 70 - }, - { - "timestamp": 1030732405.3857422, - "heart_rate": 70 - }, - { - "timestamp": 1030732405.5449219, - "heart_rate": 68 - }, - { - "timestamp": 1030732405.7949219, - "heart_rate": 68 - }, - { - "timestamp": 1030732406.0449219, - "heart_rate": 68 - }, - { - "timestamp": 1030732406.2949219, - "heart_rate": 68 - }, - { - "timestamp": 1030732406.4628906, - "heart_rate": 67 - }, - { - "timestamp": 1030732406.7128906, - "heart_rate": 67 - }, - { - "timestamp": 1030732406.9628906, - "heart_rate": 67 - }, - { - "timestamp": 1030732407.2128906, - "heart_rate": 67 - }, - { - "timestamp": 1030732407.3574219, - "heart_rate": 67 - }, - { - "timestamp": 1030732407.6074219, - "heart_rate": 67 - }, - { - "timestamp": 1030732407.8574219, - "heart_rate": 67 - }, - { - "timestamp": 1030732408.1074219, - "heart_rate": 67 - }, - { - "timestamp": 1030732408.2832031, - "heart_rate": 67 - }, - { - "timestamp": 1030732408.5332031, - "heart_rate": 67 - }, - { - "timestamp": 1030732408.7832031, - "heart_rate": 67 - }, - { - "timestamp": 1030732409.0332031, - "heart_rate": 67 - }, - { - "timestamp": 1030732409.1621094, - "heart_rate": 67 - }, - { - "timestamp": 1030732409.4121094, - "heart_rate": 67 - }, - { - "timestamp": 1030732409.6621094, - "heart_rate": 67 - }, - { - "timestamp": 1030732409.9121094, - "heart_rate": 67 - }, - { - "timestamp": 1030732410.1621094, - "heart_rate": 67 - }, - { - "timestamp": 1030732410.2910156, - "heart_rate": 67 - }, - { - "timestamp": 1030732410.5410156, - "heart_rate": 67 - }, - { - "timestamp": 1030732410.7910156, - "heart_rate": 67 - }, - { - "timestamp": 1030732410.9257812, - "heart_rate": 68 - }, - { - "timestamp": 1030732411.1757812, - "heart_rate": 68 - }, - { - "timestamp": 1030732411.4257812, - "heart_rate": 68 - }, - { - "timestamp": 1030732411.6757812, - "heart_rate": 68 - }, - { - "timestamp": 1030732411.8173828, - "heart_rate": 68 - }, - { - "timestamp": 1030732412.0673828, - "heart_rate": 68 - }, - { - "timestamp": 1030732412.3173828, - "heart_rate": 68 - }, - { - "timestamp": 1030732412.5673828, - "heart_rate": 68 - }, - { - "timestamp": 1030732412.6992188, - "heart_rate": 68 - }, - { - "timestamp": 1030732412.9492188, - "heart_rate": 68 - }, - { - "timestamp": 1030732413.1992188, - "heart_rate": 68 - }, - { - "timestamp": 1030732413.4492188, - "heart_rate": 68 - }, - { - "timestamp": 1030732413.5917969, - "heart_rate": 69 - }, - { - "timestamp": 1030732413.8417969, - "heart_rate": 69 - }, - { - "timestamp": 1030732414.0917969, - "heart_rate": 69 - }, - { - "timestamp": 1030732414.3417969, - "heart_rate": 69 - }, - { - "timestamp": 1030732414.484375, - "heart_rate": 69 - }, - { - "timestamp": 1030732414.734375, - "heart_rate": 69 - }, - { - "timestamp": 1030732414.984375, - "heart_rate": 69 - }, - { - "timestamp": 1030732415.234375, - "heart_rate": 69 - }, - { - "timestamp": 1030732415.3818359, - "heart_rate": 69 - }, - { - "timestamp": 1030732415.6318359, - "heart_rate": 69 - }, - { - "timestamp": 1030732415.8818359, - "heart_rate": 69 - }, - { - "timestamp": 1030732416.1318359, - "heart_rate": 69 - }, - { - "timestamp": 1030732416.3056641, - "heart_rate": 69 - }, - { - "timestamp": 1030732416.5556641, - "heart_rate": 69 - }, - { - "timestamp": 1030732416.8056641, - "heart_rate": 69 - }, - { - "timestamp": 1030732417.0556641, - "heart_rate": 69 - }, - { - "timestamp": 1030732417.1572266, - "heart_rate": 68 - }, - { - "timestamp": 1030732417.4072266, - "heart_rate": 68 - }, - { - "timestamp": 1030732417.6572266, - "heart_rate": 68 - }, - { - "timestamp": 1030732417.9072266, - "heart_rate": 68 - }, - { - "timestamp": 1030732418.0439453, - "heart_rate": 68 - }, - { - "timestamp": 1030732418.2939453, - "heart_rate": 68 - }, - { - "timestamp": 1030732418.5439453, - "heart_rate": 68 - }, - { - "timestamp": 1030732418.7939453, - "heart_rate": 68 - }, - { - "timestamp": 1030732418.9130859, - "heart_rate": 69 - }, - { - "timestamp": 1030732419.1630859, - "heart_rate": 69 - }, - { - "timestamp": 1030732419.4130859, - "heart_rate": 69 - }, - { - "timestamp": 1030732419.6630859, - "heart_rate": 69 - }, - { - "timestamp": 1030732419.7597656, - "heart_rate": 70 - }, - { - "timestamp": 1030732420.0097656, - "heart_rate": 70 - }, - { - "timestamp": 1030732420.2597656, - "heart_rate": 70 - }, - { - "timestamp": 1030732420.5097656, - "heart_rate": 70 - }, - { - "timestamp": 1030732420.6191406, - "heart_rate": 71 - }, - { - "timestamp": 1030732420.8691406, - "heart_rate": 71 - }, - { - "timestamp": 1030732421.1191406, - "heart_rate": 71 - }, - { - "timestamp": 1030732421.3691406, - "heart_rate": 71 - }, - { - "timestamp": 1030732421.4960938, - "heart_rate": 71 - }, - { - "timestamp": 1030732421.7460938, - "heart_rate": 71 - }, - { - "timestamp": 1030732421.9960938, - "heart_rate": 71 - }, - { - "timestamp": 1030732422.2460938, - "heart_rate": 71 - }, - { - "timestamp": 1030732422.3037109, - "heart_rate": 70 - }, - { - "timestamp": 1030732422.5537109, - "heart_rate": 70 - }, - { - "timestamp": 1030732422.8037109, - "heart_rate": 70 - }, - { - "timestamp": 1030732423.0537109, - "heart_rate": 70 - }, - { - "timestamp": 1030732423.15625, - "heart_rate": 71 - }, - { - "timestamp": 1030732423.40625, - "heart_rate": 71 - }, - { - "timestamp": 1030732423.65625, - "heart_rate": 71 - }, - { - "timestamp": 1030732423.90625, - "heart_rate": 71 - }, - { - "timestamp": 1030732423.9951172, - "heart_rate": 71 - }, - { - "timestamp": 1030732424.2451172, - "heart_rate": 71 - }, - { - "timestamp": 1030732424.4951172, - "heart_rate": 71 - }, - { - "timestamp": 1030732424.7451172, - "heart_rate": 71 - }, - { - "timestamp": 1030732424.8408203, - "heart_rate": 71 - }, - { - "timestamp": 1030732425.0908203, - "heart_rate": 71 - }, - { - "timestamp": 1030732425.3408203, - "heart_rate": 71 - }, - { - "timestamp": 1030732425.5908203, - "heart_rate": 71 - }, - { - "timestamp": 1030732425.6572266, - "heart_rate": 72 - }, - { - "timestamp": 1030732425.9072266, - "heart_rate": 72 - }, - { - "timestamp": 1030732426.1572266, - "heart_rate": 72 - }, - { - "timestamp": 1030732426.4072266, - "heart_rate": 72 - }, - { - "timestamp": 1030732426.5234375, - "heart_rate": 72 - }, - { - "timestamp": 1030732426.7734375, - "heart_rate": 72 - }, - { - "timestamp": 1030732427.0234375, - "heart_rate": 72 - }, - { - "timestamp": 1030732427.2734375, - "heart_rate": 72 - }, - { - "timestamp": 1030732427.4296875, - "heart_rate": 71 - }, - { - "timestamp": 1030732427.6796875, - "heart_rate": 71 - }, - { - "timestamp": 1030732427.9296875, - "heart_rate": 71 - }, - { - "timestamp": 1030732428.1796875, - "heart_rate": 71 - }, - { - "timestamp": 1030732428.3457031, - "heart_rate": 69 - }, - { - "timestamp": 1030732428.5957031, - "heart_rate": 69 - }, - { - "timestamp": 1030732428.8457031, - "heart_rate": 69 - }, - { - "timestamp": 1030732429.0957031, - "heart_rate": 69 - }, - { - "timestamp": 1030732429.2460938, - "heart_rate": 68 - }, - { - "timestamp": 1030732429.4960938, - "heart_rate": 68 - }, - { - "timestamp": 1030732429.7460938, - "heart_rate": 68 - }, - { - "timestamp": 1030732429.9960938, - "heart_rate": 68 - }, - { - "timestamp": 1030732430.1162109, - "heart_rate": 67 - }, - { - "timestamp": 1030732430.3662109, - "heart_rate": 67 - }, - { - "timestamp": 1030732430.6162109, - "heart_rate": 67 - }, - { - "timestamp": 1030732430.8662109, - "heart_rate": 67 - }, - { - "timestamp": 1030732430.9873047, - "heart_rate": 68 - }, - { - "timestamp": 1030732431.2373047, - "heart_rate": 68 - }, - { - "timestamp": 1030732431.4873047, - "heart_rate": 68 - }, - { - "timestamp": 1030732431.7373047, - "heart_rate": 68 - }, - { - "timestamp": 1030732431.8427734, - "heart_rate": 68 - }, - { - "timestamp": 1030732432.0927734, - "heart_rate": 68 - }, - { - "timestamp": 1030732432.3427734, - "heart_rate": 68 - }, - { - "timestamp": 1030732432.5927734, - "heart_rate": 68 - }, - { - "timestamp": 1030732432.6933594, - "heart_rate": 69 - }, - { - "timestamp": 1030732432.9433594, - "heart_rate": 69 - }, - { - "timestamp": 1030732433.1933594, - "heart_rate": 69 - }, - { - "timestamp": 1030732433.4433594, - "heart_rate": 69 - }, - { - "timestamp": 1030732433.5371094, - "heart_rate": 70 - }, - { - "timestamp": 1030732433.7871094, - "heart_rate": 70 - }, - { - "timestamp": 1030732434.0371094, - "heart_rate": 70 - }, - { - "timestamp": 1030732434.2871094, - "heart_rate": 70 - }, - { - "timestamp": 1030732434.3925781, - "heart_rate": 70 - }, - { - "timestamp": 1030732434.6425781, - "heart_rate": 70 - }, - { - "timestamp": 1030732434.8925781, - "heart_rate": 70 - }, - { - "timestamp": 1030732435.1425781, - "heart_rate": 70 - }, - { - "timestamp": 1030732435.2099609, - "heart_rate": 71 - }, - { - "timestamp": 1030732435.4599609, - "heart_rate": 71 - }, - { - "timestamp": 1030732435.7099609, - "heart_rate": 71 - }, - { - "timestamp": 1030732435.9599609, - "heart_rate": 71 - }, - { - "timestamp": 1030732436.0498047, - "heart_rate": 71 - }, - { - "timestamp": 1030732436.2998047, - "heart_rate": 71 - }, - { - "timestamp": 1030732436.5498047, - "heart_rate": 71 - }, - { - "timestamp": 1030732436.7998047, - "heart_rate": 71 - }, - { - "timestamp": 1030732436.8857422, - "heart_rate": 71 - }, - { - "timestamp": 1030732437.1357422, - "heart_rate": 71 - }, - { - "timestamp": 1030732437.3857422, - "heart_rate": 71 - }, - { - "timestamp": 1030732437.6357422, - "heart_rate": 71 - }, - { - "timestamp": 1030732437.6962891, - "heart_rate": 72 - }, - { - "timestamp": 1030732437.9462891, - "heart_rate": 72 - }, - { - "timestamp": 1030732438.1962891, - "heart_rate": 72 - }, - { - "timestamp": 1030732438.4462891, - "heart_rate": 72 - }, - { - "timestamp": 1030732438.5595703, - "heart_rate": 72 - }, - { - "timestamp": 1030732438.8095703, - "heart_rate": 72 - }, - { - "timestamp": 1030732439.0595703, - "heart_rate": 72 - }, - { - "timestamp": 1030732439.3095703, - "heart_rate": 72 - }, - { - "timestamp": 1030732439.4101562, - "heart_rate": 71 - }, - { - "timestamp": 1030732439.6601562, - "heart_rate": 71 - }, - { - "timestamp": 1030732439.9101562, - "heart_rate": 71 - }, - { - "timestamp": 1030732440.1396484, - "heart_rate": 71 - }, - { - "timestamp": 1030732440.3896484, - "heart_rate": 71 - }, - { - "timestamp": 1030732440.6396484, - "heart_rate": 71 - }, - { - "timestamp": 1030732440.8896484, - "heart_rate": 71 - }, - { - "timestamp": 1030732441.0566406, - "heart_rate": 71 - }, - { - "timestamp": 1030732441.3066406, - "heart_rate": 71 - }, - { - "timestamp": 1030732441.5566406, - "heart_rate": 71 - }, - { - "timestamp": 1030732441.8066406, - "heart_rate": 71 - }, - { - "timestamp": 1030732442.0566406, - "heart_rate": 71 - }, - { - "timestamp": 1030732442.2304688, - "heart_rate": 71 - }, - { - "timestamp": 1030732442.4804688, - "heart_rate": 71 - }, - { - "timestamp": 1030732442.7304688, - "heart_rate": 71 - }, - { - "timestamp": 1030732442.9804688, - "heart_rate": 71 - }, - { - "timestamp": 1030732443.0625, - "heart_rate": 72 - }, - { - "timestamp": 1030732443.3125, - "heart_rate": 72 - }, - { - "timestamp": 1030732443.5625, - "heart_rate": 72 - }, - { - "timestamp": 1030732443.6835938, - "heart_rate": 72 - }, - { - "timestamp": 1030732443.9335938, - "heart_rate": 72 - }, - { - "timestamp": 1030732444.1835938, - "heart_rate": 72 - }, - { - "timestamp": 1030732444.3212891, - "heart_rate": 72 - }, - { - "timestamp": 1030732444.5712891, - "heart_rate": 72 - }, - { - "timestamp": 1030732444.8212891, - "heart_rate": 72 - }, - { - "timestamp": 1030732445.0712891, - "heart_rate": 72 - }, - { - "timestamp": 1030732445.1484375, - "heart_rate": 73 - }, - { - "timestamp": 1030732445.3984375, - "heart_rate": 73 - }, - { - "timestamp": 1030732445.6484375, - "heart_rate": 73 - }, - { - "timestamp": 1030732445.8984375, - "heart_rate": 73 - }, - { - "timestamp": 1030732446.0078125, - "heart_rate": 74 - }, - { - "timestamp": 1030732446.2578125, - "heart_rate": 74 - }, - { - "timestamp": 1030732446.5078125, - "heart_rate": 74 - }, - { - "timestamp": 1030732446.7578125, - "heart_rate": 74 - }, - { - "timestamp": 1030732446.8818359, - "heart_rate": 75 - }, - { - "timestamp": 1030732447.1318359, - "heart_rate": 75 - }, - { - "timestamp": 1030732447.3818359, - "heart_rate": 75 - }, - { - "timestamp": 1030732447.6318359, - "heart_rate": 75 - }, - { - "timestamp": 1030732447.7666016, - "heart_rate": 74 - }, - { - "timestamp": 1030732448.0166016, - "heart_rate": 74 - }, - { - "timestamp": 1030732448.2666016, - "heart_rate": 74 - }, - { - "timestamp": 1030732448.5166016, - "heart_rate": 74 - }, - { - "timestamp": 1030732448.6484375, - "heart_rate": 70 - }, - { - "timestamp": 1030732448.8984375, - "heart_rate": 70 - }, - { - "timestamp": 1030732449.1484375, - "heart_rate": 70 - }, - { - "timestamp": 1030732449.3984375, - "heart_rate": 70 - }, - { - "timestamp": 1030732449.5732422, - "heart_rate": 69 - }, - { - "timestamp": 1030732449.8232422, - "heart_rate": 69 - }, - { - "timestamp": 1030732450.0732422, - "heart_rate": 69 - }, - { - "timestamp": 1030732450.3232422, - "heart_rate": 69 - }, - { - "timestamp": 1030732450.4824219, - "heart_rate": 68 - }, - { - "timestamp": 1030732450.7324219, - "heart_rate": 68 - }, - { - "timestamp": 1030732450.9824219, - "heart_rate": 68 - }, - { - "timestamp": 1030732451.2324219, - "heart_rate": 68 - }, - { - "timestamp": 1030732451.4238281, - "heart_rate": 66 - }, - { - "timestamp": 1030732451.6738281, - "heart_rate": 66 - }, - { - "timestamp": 1030732451.9238281, - "heart_rate": 66 - }, - { - "timestamp": 1030732452.1738281, - "heart_rate": 66 - }, - { - "timestamp": 1030732452.3730469, - "heart_rate": 65 - }, - { - "timestamp": 1030732452.6230469, - "heart_rate": 65 - }, - { - "timestamp": 1030732452.8730469, - "heart_rate": 65 - }, - { - "timestamp": 1030732453.1230469, - "heart_rate": 65 - }, - { - "timestamp": 1030732453.3349609, - "heart_rate": 64 - }, - { - "timestamp": 1030732453.5849609, - "heart_rate": 64 - }, - { - "timestamp": 1030732453.8349609, - "heart_rate": 64 - }, - { - "timestamp": 1030732454.0849609, - "heart_rate": 64 - }, - { - "timestamp": 1030732454.25, - "heart_rate": 64 - }, - { - "timestamp": 1030732454.5, - "heart_rate": 64 - }, - { - "timestamp": 1030732454.75, - "heart_rate": 64 - }, - { - "timestamp": 1030732455, - "heart_rate": 64 - }, - { - "timestamp": 1030732455.1914062, - "heart_rate": 64 - }, - { - "timestamp": 1030732455.4414062, - "heart_rate": 64 - }, - { - "timestamp": 1030732455.6914062, - "heart_rate": 64 - }, - { - "timestamp": 1030732455.9414062, - "heart_rate": 64 - }, - { - "timestamp": 1030732456.1259766, - "heart_rate": 64 - }, - { - "timestamp": 1030732456.3759766, - "heart_rate": 64 - }, - { - "timestamp": 1030732456.6259766, - "heart_rate": 64 - }, - { - "timestamp": 1030732456.8759766, - "heart_rate": 64 - }, - { - "timestamp": 1030732457.0615234, - "heart_rate": 64 - }, - { - "timestamp": 1030732457.3115234, - "heart_rate": 64 - }, - { - "timestamp": 1030732457.5615234, - "heart_rate": 64 - }, - { - "timestamp": 1030732457.8115234, - "heart_rate": 64 - }, - { - "timestamp": 1030732458.0126953, - "heart_rate": 64 - }, - { - "timestamp": 1030732458.2626953, - "heart_rate": 64 - }, - { - "timestamp": 1030732458.5126953, - "heart_rate": 64 - }, - { - "timestamp": 1030732458.7626953, - "heart_rate": 64 - }, - { - "timestamp": 1030732458.9677734, - "heart_rate": 64 - }, - { - "timestamp": 1030732459.2177734, - "heart_rate": 64 - }, - { - "timestamp": 1030732459.4677734, - "heart_rate": 64 - }, - { - "timestamp": 1030732459.7177734, - "heart_rate": 64 - }, - { - "timestamp": 1030732459.9013672, - "heart_rate": 63 - }, - { - "timestamp": 1030732460.1513672, - "heart_rate": 63 - }, - { - "timestamp": 1030732460.4013672, - "heart_rate": 63 - }, - { - "timestamp": 1030732460.6513672, - "heart_rate": 63 - }, - { - "timestamp": 1030732460.8447266, - "heart_rate": 63 - }, - { - "timestamp": 1030732461.0947266, - "heart_rate": 63 - }, - { - "timestamp": 1030732461.3447266, - "heart_rate": 63 - }, - { - "timestamp": 1030732461.5947266, - "heart_rate": 63 - }, - { - "timestamp": 1030732461.7792969, - "heart_rate": 64 - }, - { - "timestamp": 1030732462.0292969, - "heart_rate": 64 - }, - { - "timestamp": 1030732462.2792969, - "heart_rate": 64 - }, - { - "timestamp": 1030732462.5292969, - "heart_rate": 64 - }, - { - "timestamp": 1030732462.6953125, - "heart_rate": 64 - }, - { - "timestamp": 1030732462.9453125, - "heart_rate": 64 - }, - { - "timestamp": 1030732463.1953125, - "heart_rate": 64 - }, - { - "timestamp": 1030732463.4453125, - "heart_rate": 64 - }, - { - "timestamp": 1030732463.6357422, - "heart_rate": 64 - }, - { - "timestamp": 1030732463.8857422, - "heart_rate": 64 - }, - { - "timestamp": 1030732464.1357422, - "heart_rate": 64 - }, - { - "timestamp": 1030732464.3857422, - "heart_rate": 64 - }, - { - "timestamp": 1030732464.6054688, - "heart_rate": 64 - }, - { - "timestamp": 1030732464.8554688, - "heart_rate": 64 - }, - { - "timestamp": 1030732465.1054688, - "heart_rate": 64 - }, - { - "timestamp": 1030732465.3554688, - "heart_rate": 64 - }, - { - "timestamp": 1030732465.5810547, - "heart_rate": 63 - }, - { - "timestamp": 1030732465.8310547, - "heart_rate": 63 - }, - { - "timestamp": 1030732466.0810547, - "heart_rate": 63 - }, - { - "timestamp": 1030732466.3310547, - "heart_rate": 63 - }, - { - "timestamp": 1030732466.5107422, - "heart_rate": 62 - }, - { - "timestamp": 1030732466.7607422, - "heart_rate": 62 - }, - { - "timestamp": 1030732467.0107422, - "heart_rate": 62 - }, - { - "timestamp": 1030732467.2607422, - "heart_rate": 62 - }, - { - "timestamp": 1030732467.4619141, - "heart_rate": 63 - }, - { - "timestamp": 1030732467.7119141, - "heart_rate": 63 - }, - { - "timestamp": 1030732467.9619141, - "heart_rate": 63 - }, - { - "timestamp": 1030732468.2119141, - "heart_rate": 63 - }, - { - "timestamp": 1030732468.3974609, - "heart_rate": 63 - }, - { - "timestamp": 1030732468.6474609, - "heart_rate": 63 - }, - { - "timestamp": 1030732468.8974609, - "heart_rate": 63 - }, - { - "timestamp": 1030732469.1474609, - "heart_rate": 63 - }, - { - "timestamp": 1030732469.3398438, - "heart_rate": 64 - }, - { - "timestamp": 1030732469.5898438, - "heart_rate": 64 - }, - { - "timestamp": 1030732469.8398438, - "heart_rate": 64 - }, - { - "timestamp": 1030732470.0898438, - "heart_rate": 64 - }, - { - "timestamp": 1030732470.1240234, - "heart_rate": 64 - }, - { - "timestamp": 1030732470.3740234, - "heart_rate": 64 - }, - { - "timestamp": 1030732470.6240234, - "heart_rate": 64 - }, - { - "timestamp": 1030732470.8740234, - "heart_rate": 64 - }, - { - "timestamp": 1030732471.1240234, - "heart_rate": 64 - }, - { - "timestamp": 1030732471.2392578, - "heart_rate": 64 - }, - { - "timestamp": 1030732471.4892578, - "heart_rate": 64 - }, - { - "timestamp": 1030732471.7392578, - "heart_rate": 64 - }, - { - "timestamp": 1030732471.9892578, - "heart_rate": 64 - }, - { - "timestamp": 1030732472.1533203, - "heart_rate": 64 - }, - { - "timestamp": 1030732472.4033203, - "heart_rate": 64 - }, - { - "timestamp": 1030732472.6533203, - "heart_rate": 64 - }, - { - "timestamp": 1030732472.9033203, - "heart_rate": 64 - }, - { - "timestamp": 1030732473.0419922, - "heart_rate": 64 - }, - { - "timestamp": 1030732473.2919922, - "heart_rate": 64 - }, - { - "timestamp": 1030732473.5419922, - "heart_rate": 64 - }, - { - "timestamp": 1030732473.7919922, - "heart_rate": 64 - }, - { - "timestamp": 1030732473.9208984, - "heart_rate": 64 - }, - { - "timestamp": 1030732474.1708984, - "heart_rate": 64 - }, - { - "timestamp": 1030732474.4208984, - "heart_rate": 64 - }, - { - "timestamp": 1030732474.6552734, - "heart_rate": 65 - }, - { - "timestamp": 1030732474.9052734, - "heart_rate": 65 - }, - { - "timestamp": 1030732475.1552734, - "heart_rate": 65 - }, - { - "timestamp": 1030732475.4052734, - "heart_rate": 65 - }, - { - "timestamp": 1030732475.6552734, - "heart_rate": 65 - }, - { - "timestamp": 1030732475.6601562, - "heart_rate": 65 - }, - { - "timestamp": 1030732475.9101562, - "heart_rate": 65 - }, - { - "timestamp": 1030732476.1601562, - "heart_rate": 65 - }, - { - "timestamp": 1030732476.4101562, - "heart_rate": 65 - }, - { - "timestamp": 1030732476.5439453, - "heart_rate": 66 - }, - { - "timestamp": 1030732476.7939453, - "heart_rate": 66 - }, - { - "timestamp": 1030732477.0439453, - "heart_rate": 66 - }, - { - "timestamp": 1030732477.2939453, - "heart_rate": 66 - }, - { - "timestamp": 1030732477.4667969, - "heart_rate": 67 - }, - { - "timestamp": 1030732477.7167969, - "heart_rate": 67 - }, - { - "timestamp": 1030732477.9667969, - "heart_rate": 67 - }, - { - "timestamp": 1030732478.2167969, - "heart_rate": 67 - }, - { - "timestamp": 1030732478.4042969, - "heart_rate": 67 - }, - { - "timestamp": 1030732478.6542969, - "heart_rate": 67 - }, - { - "timestamp": 1030732478.9042969, - "heart_rate": 67 - }, - { - "timestamp": 1030732479.1542969, - "heart_rate": 67 - }, - { - "timestamp": 1030732479.3554688, - "heart_rate": 65 - }, - { - "timestamp": 1030732479.6054688, - "heart_rate": 65 - }, - { - "timestamp": 1030732479.8554688, - "heart_rate": 65 - }, - { - "timestamp": 1030732480.1054688, - "heart_rate": 65 - }, - { - "timestamp": 1030732480.3183594, - "heart_rate": 64 - }, - { - "timestamp": 1030732480.5683594, - "heart_rate": 64 - }, - { - "timestamp": 1030732480.8183594, - "heart_rate": 64 - }, - { - "timestamp": 1030732481.0683594, - "heart_rate": 64 - }, - { - "timestamp": 1030732481.25, - "heart_rate": 64 - }, - { - "timestamp": 1030732481.5, - "heart_rate": 64 - }, - { - "timestamp": 1030732481.75, - "heart_rate": 64 - }, - { - "timestamp": 1030732482, - "heart_rate": 64 - }, - { - "timestamp": 1030732482.1796875, - "heart_rate": 64 - }, - { - "timestamp": 1030732482.4296875, - "heart_rate": 64 - }, - { - "timestamp": 1030732482.6796875, - "heart_rate": 64 - }, - { - "timestamp": 1030732482.9296875, - "heart_rate": 64 - }, - { - "timestamp": 1030732483.0869141, - "heart_rate": 64 - }, - { - "timestamp": 1030732483.3369141, - "heart_rate": 64 - }, - { - "timestamp": 1030732483.5869141, - "heart_rate": 64 - }, - { - "timestamp": 1030732483.8369141, - "heart_rate": 64 - }, - { - "timestamp": 1030732484, - "heart_rate": 65 - }, - { - "timestamp": 1030732484.25, - "heart_rate": 65 - }, - { - "timestamp": 1030732484.5, - "heart_rate": 65 - }, - { - "timestamp": 1030732484.75, - "heart_rate": 65 - }, - { - "timestamp": 1030732484.9267578, - "heart_rate": 65 - }, - { - "timestamp": 1030732485.1767578, - "heart_rate": 65 - }, - { - "timestamp": 1030732485.4267578, - "heart_rate": 65 - }, - { - "timestamp": 1030732485.6767578, - "heart_rate": 65 - }, - { - "timestamp": 1030732485.8496094, - "heart_rate": 65 - }, - { - "timestamp": 1030732486.0996094, - "heart_rate": 65 - }, - { - "timestamp": 1030732486.3496094, - "heart_rate": 65 - }, - { - "timestamp": 1030732486.5996094, - "heart_rate": 65 - }, - { - "timestamp": 1030732486.75, - "heart_rate": 65 - }, - { - "timestamp": 1030732487, - "heart_rate": 65 - }, - { - "timestamp": 1030732487.25, - "heart_rate": 65 - }, - { - "timestamp": 1030732487.5, - "heart_rate": 65 - }, - { - "timestamp": 1030732487.6474609, - "heart_rate": 66 - }, - { - "timestamp": 1030732487.8974609, - "heart_rate": 66 - }, - { - "timestamp": 1030732488.1474609, - "heart_rate": 66 - }, - { - "timestamp": 1030732488.3974609, - "heart_rate": 66 - }, - { - "timestamp": 1030732488.546875, - "heart_rate": 66 - }, - { - "timestamp": 1030732488.796875, - "heart_rate": 66 - }, - { - "timestamp": 1030732489.046875, - "heart_rate": 66 - }, - { - "timestamp": 1030732489.296875, - "heart_rate": 66 - }, - { - "timestamp": 1030732489.4638672, - "heart_rate": 67 - }, - { - "timestamp": 1030732489.7138672, - "heart_rate": 67 - }, - { - "timestamp": 1030732489.9638672, - "heart_rate": 67 - }, - { - "timestamp": 1030732490.2138672, - "heart_rate": 67 - }, - { - "timestamp": 1030732490.3857422, - "heart_rate": 66 - }, - { - "timestamp": 1030732490.6357422, - "heart_rate": 66 - }, - { - "timestamp": 1030732490.8857422, - "heart_rate": 66 - }, - { - "timestamp": 1030732491.1357422, - "heart_rate": 66 - }, - { - "timestamp": 1030732491.2900391, - "heart_rate": 66 - }, - { - "timestamp": 1030732491.5400391, - "heart_rate": 66 - }, - { - "timestamp": 1030732491.7900391, - "heart_rate": 66 - }, - { - "timestamp": 1030732492.0400391, - "heart_rate": 66 - }, - { - "timestamp": 1030732492.1982422, - "heart_rate": 66 - }, - { - "timestamp": 1030732492.4482422, - "heart_rate": 66 - }, - { - "timestamp": 1030732492.6982422, - "heart_rate": 66 - }, - { - "timestamp": 1030732492.9482422, - "heart_rate": 66 - }, - { - "timestamp": 1030732493.0917969, - "heart_rate": 66 - }, - { - "timestamp": 1030732493.3417969, - "heart_rate": 66 - }, - { - "timestamp": 1030732493.5917969, - "heart_rate": 66 - }, - { - "timestamp": 1030732493.8417969, - "heart_rate": 66 - }, - { - "timestamp": 1030732493.9785156, - "heart_rate": 67 - }, - { - "timestamp": 1030732494.2285156, - "heart_rate": 67 - }, - { - "timestamp": 1030732494.4785156, - "heart_rate": 67 - }, - { - "timestamp": 1030732494.7285156, - "heart_rate": 67 - }, - { - "timestamp": 1030732494.8183594, - "heart_rate": 67 - }, - { - "timestamp": 1030732495.0683594, - "heart_rate": 67 - }, - { - "timestamp": 1030732495.3183594, - "heart_rate": 67 - }, - { - "timestamp": 1030732495.5683594, - "heart_rate": 67 - }, - { - "timestamp": 1030732495.6386719, - "heart_rate": 69 - }, - { - "timestamp": 1030732495.8886719, - "heart_rate": 69 - }, - { - "timestamp": 1030732496.1386719, - "heart_rate": 69 - }, - { - "timestamp": 1030732496.3886719, - "heart_rate": 69 - }, - { - "timestamp": 1030732496.4541016, - "heart_rate": 71 - }, - { - "timestamp": 1030732496.7041016, - "heart_rate": 71 - }, - { - "timestamp": 1030732496.9541016, - "heart_rate": 71 - }, - { - "timestamp": 1030732497.2041016, - "heart_rate": 71 - }, - { - "timestamp": 1030732497.2802734, - "heart_rate": 72 - }, - { - "timestamp": 1030732497.5302734, - "heart_rate": 72 - }, - { - "timestamp": 1030732497.7802734, - "heart_rate": 72 - }, - { - "timestamp": 1030732498.0302734, - "heart_rate": 72 - }, - { - "timestamp": 1030732498.1318359, - "heart_rate": 72 - }, - { - "timestamp": 1030732498.3818359, - "heart_rate": 72 - }, - { - "timestamp": 1030732498.6318359, - "heart_rate": 72 - }, - { - "timestamp": 1030732498.8818359, - "heart_rate": 72 - }, - { - "timestamp": 1030732499.0029297, - "heart_rate": 71 - }, - { - "timestamp": 1030732499.2529297, - "heart_rate": 71 - }, - { - "timestamp": 1030732499.5029297, - "heart_rate": 71 - }, - { - "timestamp": 1030732499.7529297, - "heart_rate": 71 - }, - { - "timestamp": 1030732499.8828125, - "heart_rate": 70 - }, - { - "timestamp": 1030732500.1328125, - "heart_rate": 70 - }, - { - "timestamp": 1030732500.3828125, - "heart_rate": 70 - }, - { - "timestamp": 1030732500.6328125, - "heart_rate": 70 - }, - { - "timestamp": 1030732500.7529297, - "heart_rate": 69 - }, - { - "timestamp": 1030732501.0029297, - "heart_rate": 69 - }, - { - "timestamp": 1030732501.2529297, - "heart_rate": 69 - }, - { - "timestamp": 1030732501.5029297, - "heart_rate": 69 - }, - { - "timestamp": 1030732501.6591797, - "heart_rate": 69 - }, - { - "timestamp": 1030732501.9091797, - "heart_rate": 69 - }, - { - "timestamp": 1030732502.1591797, - "heart_rate": 69 - }, - { - "timestamp": 1030732502.4091797, - "heart_rate": 69 - }, - { - "timestamp": 1030732502.5380859, - "heart_rate": 69 - }, - { - "timestamp": 1030732502.7880859, - "heart_rate": 69 - }, - { - "timestamp": 1030732503.0380859, - "heart_rate": 69 - }, - { - "timestamp": 1030732503.2880859, - "heart_rate": 69 - }, - { - "timestamp": 1030732503.4472656, - "heart_rate": 67 - }, - { - "timestamp": 1030732503.6972656, - "heart_rate": 67 - }, - { - "timestamp": 1030732503.9472656, - "heart_rate": 67 - }, - { - "timestamp": 1030732504.1972656, - "heart_rate": 67 - }, - { - "timestamp": 1030732504.3681641, - "heart_rate": 67 - }, - { - "timestamp": 1030732504.6181641, - "heart_rate": 67 - }, - { - "timestamp": 1030732504.8681641, - "heart_rate": 67 - }, - { - "timestamp": 1030732505.1181641, - "heart_rate": 67 - }, - { - "timestamp": 1030732505.2363281, - "heart_rate": 66 - }, - { - "timestamp": 1030732505.4863281, - "heart_rate": 66 - }, - { - "timestamp": 1030732505.7363281, - "heart_rate": 66 - }, - { - "timestamp": 1030732505.9863281, - "heart_rate": 66 - }, - { - "timestamp": 1030732506.1572266, - "heart_rate": 66 - }, - { - "timestamp": 1030732506.4072266, - "heart_rate": 66 - }, - { - "timestamp": 1030732506.6572266, - "heart_rate": 66 - }, - { - "timestamp": 1030732506.9072266, - "heart_rate": 66 - }, - { - "timestamp": 1030732507.1035156, - "heart_rate": 65 - }, - { - "timestamp": 1030732507.3535156, - "heart_rate": 65 - }, - { - "timestamp": 1030732507.6035156, - "heart_rate": 65 - }, - { - "timestamp": 1030732507.8535156, - "heart_rate": 65 - }, - { - "timestamp": 1030732508.0976562, - "heart_rate": 64 - }, - { - "timestamp": 1030732508.3476562, - "heart_rate": 64 - }, - { - "timestamp": 1030732508.5976562, - "heart_rate": 64 - }, - { - "timestamp": 1030732508.8476562, - "heart_rate": 64 - }, - { - "timestamp": 1030732509.0976562, - "heart_rate": 62 - }, - { - "timestamp": 1030732509.3476562, - "heart_rate": 62 - }, - { - "timestamp": 1030732509.5976562, - "heart_rate": 62 - }, - { - "timestamp": 1030732509.8476562, - "heart_rate": 62 - }, - { - "timestamp": 1030732510.0976562, - "heart_rate": 62 - }, - { - "timestamp": 1030732510.1152344, - "heart_rate": 61 - }, - { - "timestamp": 1030732510.3652344, - "heart_rate": 61 - }, - { - "timestamp": 1030732510.6152344, - "heart_rate": 61 - }, - { - "timestamp": 1030732510.8652344, - "heart_rate": 61 - }, - { - "timestamp": 1030732511.1152344, - "heart_rate": 61 - }, - { - "timestamp": 1030732511.1513672, - "heart_rate": 60 - }, - { - "timestamp": 1030732511.4013672, - "heart_rate": 60 - }, - { - "timestamp": 1030732511.6513672, - "heart_rate": 60 - }, - { - "timestamp": 1030732511.9013672, - "heart_rate": 60 - }, - { - "timestamp": 1030732512.1513672, - "heart_rate": 60 - }, - { - "timestamp": 1030732512.1650391, - "heart_rate": 60 - }, - { - "timestamp": 1030732512.4150391, - "heart_rate": 60 - }, - { - "timestamp": 1030732512.6650391, - "heart_rate": 60 - }, - { - "timestamp": 1030732512.9150391, - "heart_rate": 60 - }, - { - "timestamp": 1030732513.1650391, - "heart_rate": 60 - }, - { - "timestamp": 1030732513.1845703, - "heart_rate": 59 - }, - { - "timestamp": 1030732513.4345703, - "heart_rate": 59 - }, - { - "timestamp": 1030732513.6845703, - "heart_rate": 59 - }, - { - "timestamp": 1030732513.9345703, - "heart_rate": 59 - }, - { - "timestamp": 1030732514.1845703, - "heart_rate": 59 - }, - { - "timestamp": 1030732514.2089844, - "heart_rate": 59 - }, - { - "timestamp": 1030732514.4589844, - "heart_rate": 59 - }, - { - "timestamp": 1030732514.7089844, - "heart_rate": 59 - }, - { - "timestamp": 1030732514.9589844, - "heart_rate": 59 - }, - { - "timestamp": 1030732515.2011719, - "heart_rate": 59 - }, - { - "timestamp": 1030732515.4511719, - "heart_rate": 59 - }, - { - "timestamp": 1030732515.7011719, - "heart_rate": 59 - }, - { - "timestamp": 1030732515.9511719, - "heart_rate": 59 - }, - { - "timestamp": 1030732516.1787109, - "heart_rate": 60 - }, - { - "timestamp": 1030732516.4287109, - "heart_rate": 60 - }, - { - "timestamp": 1030732516.6787109, - "heart_rate": 60 - }, - { - "timestamp": 1030732516.9287109, - "heart_rate": 60 - }, - { - "timestamp": 1030732517.1171875, - "heart_rate": 61 - }, - { - "timestamp": 1030732517.3671875, - "heart_rate": 61 - }, - { - "timestamp": 1030732517.6171875, - "heart_rate": 61 - }, - { - "timestamp": 1030732517.8671875, - "heart_rate": 61 - }, - { - "timestamp": 1030732518.0703125, - "heart_rate": 62 - }, - { - "timestamp": 1030732518.3203125, - "heart_rate": 62 - }, - { - "timestamp": 1030732518.5703125, - "heart_rate": 62 - }, - { - "timestamp": 1030732518.8203125, - "heart_rate": 62 - }, - { - "timestamp": 1030732519.0224609, - "heart_rate": 62 - }, - { - "timestamp": 1030732519.2724609, - "heart_rate": 62 - }, - { - "timestamp": 1030732519.5224609, - "heart_rate": 62 - }, - { - "timestamp": 1030732519.7724609, - "heart_rate": 62 - }, - { - "timestamp": 1030732519.9775391, - "heart_rate": 63 - }, - { - "timestamp": 1030732520.2275391, - "heart_rate": 63 - }, - { - "timestamp": 1030732520.4775391, - "heart_rate": 63 - }, - { - "timestamp": 1030732520.7275391, - "heart_rate": 63 - }, - { - "timestamp": 1030732520.9580078, - "heart_rate": 63 - }, - { - "timestamp": 1030732521.2080078, - "heart_rate": 63 - }, - { - "timestamp": 1030732521.4580078, - "heart_rate": 63 - }, - { - "timestamp": 1030732521.7080078, - "heart_rate": 63 - }, - { - "timestamp": 1030732521.9580078, - "heart_rate": 63 - }, - { - "timestamp": 1030732521.9599609, - "heart_rate": 62 - }, - { - "timestamp": 1030732522.2099609, - "heart_rate": 62 - }, - { - "timestamp": 1030732522.4599609, - "heart_rate": 62 - }, - { - "timestamp": 1030732522.7099609, - "heart_rate": 62 - }, - { - "timestamp": 1030732522.953125, - "heart_rate": 61 - }, - { - "timestamp": 1030732523.203125, - "heart_rate": 61 - }, - { - "timestamp": 1030732523.453125, - "heart_rate": 61 - }, - { - "timestamp": 1030732523.703125, - "heart_rate": 61 - }, - { - "timestamp": 1030732523.8662109, - "heart_rate": 61 - }, - { - "timestamp": 1030732524.1162109, - "heart_rate": 61 - }, - { - "timestamp": 1030732524.3662109, - "heart_rate": 61 - }, - { - "timestamp": 1030732524.6162109, - "heart_rate": 61 - }, - { - "timestamp": 1030732524.7861328, - "heart_rate": 63 - }, - { - "timestamp": 1030732525.0361328, - "heart_rate": 63 - }, - { - "timestamp": 1030732525.2861328, - "heart_rate": 63 - }, - { - "timestamp": 1030732525.5361328, - "heart_rate": 63 - }, - { - "timestamp": 1030732525.6992188, - "heart_rate": 64 - }, - { - "timestamp": 1030732525.9492188, - "heart_rate": 64 - }, - { - "timestamp": 1030732526.1992188, - "heart_rate": 64 - }, - { - "timestamp": 1030732526.4492188, - "heart_rate": 64 - }, - { - "timestamp": 1030732526.6396484, - "heart_rate": 65 - }, - { - "timestamp": 1030732526.8896484, - "heart_rate": 65 - }, - { - "timestamp": 1030732527.1396484, - "heart_rate": 65 - }, - { - "timestamp": 1030732527.3896484, - "heart_rate": 65 - }, - { - "timestamp": 1030732527.5410156, - "heart_rate": 65 - }, - { - "timestamp": 1030732527.7910156, - "heart_rate": 65 - }, - { - "timestamp": 1030732528.0410156, - "heart_rate": 65 - }, - { - "timestamp": 1030732528.2910156, - "heart_rate": 65 - }, - { - "timestamp": 1030732528.4970703, - "heart_rate": 65 - }, - { - "timestamp": 1030732528.7470703, - "heart_rate": 65 - }, - { - "timestamp": 1030732528.9970703, - "heart_rate": 65 - }, - { - "timestamp": 1030732529.2470703, - "heart_rate": 65 - }, - { - "timestamp": 1030732529.4462891, - "heart_rate": 64 - }, - { - "timestamp": 1030732529.6962891, - "heart_rate": 64 - }, - { - "timestamp": 1030732529.9462891, - "heart_rate": 64 - }, - { - "timestamp": 1030732530.1962891, - "heart_rate": 64 - }, - { - "timestamp": 1030732530.2880859, - "heart_rate": 64 - }, - { - "timestamp": 1030732530.5380859, - "heart_rate": 64 - }, - { - "timestamp": 1030732530.7880859, - "heart_rate": 64 - }, - { - "timestamp": 1030732531.0380859, - "heart_rate": 64 - }, - { - "timestamp": 1030732531.2480469, - "heart_rate": 63 - }, - { - "timestamp": 1030732531.4980469, - "heart_rate": 63 - }, - { - "timestamp": 1030732531.7480469, - "heart_rate": 63 - }, - { - "timestamp": 1030732531.9980469, - "heart_rate": 63 - }, - { - "timestamp": 1030732532.1767578, - "heart_rate": 64 - }, - { - "timestamp": 1030732532.4267578, - "heart_rate": 64 - }, - { - "timestamp": 1030732532.6767578, - "heart_rate": 64 - }, - { - "timestamp": 1030732532.9267578, - "heart_rate": 64 - }, - { - "timestamp": 1030732533.1533203, - "heart_rate": 63 - }, - { - "timestamp": 1030732533.4033203, - "heart_rate": 63 - }, - { - "timestamp": 1030732533.6533203, - "heart_rate": 63 - }, - { - "timestamp": 1030732533.9033203, - "heart_rate": 63 - }, - { - "timestamp": 1030732534.0966797, - "heart_rate": 63 - }, - { - "timestamp": 1030732534.3466797, - "heart_rate": 63 - }, - { - "timestamp": 1030732534.5966797, - "heart_rate": 63 - }, - { - "timestamp": 1030732534.8466797, - "heart_rate": 63 - }, - { - "timestamp": 1030732535.0332031, - "heart_rate": 64 - }, - { - "timestamp": 1030732535.2832031, - "heart_rate": 64 - }, - { - "timestamp": 1030732535.5332031, - "heart_rate": 64 - }, - { - "timestamp": 1030732535.7832031, - "heart_rate": 64 - }, - { - "timestamp": 1030732535.9755859, - "heart_rate": 64 - }, - { - "timestamp": 1030732536.2255859, - "heart_rate": 64 - }, - { - "timestamp": 1030732536.4755859, - "heart_rate": 64 - }, - { - "timestamp": 1030732536.7255859, - "heart_rate": 64 - }, - { - "timestamp": 1030732536.9199219, - "heart_rate": 64 - }, - { - "timestamp": 1030732537.1699219, - "heart_rate": 64 - }, - { - "timestamp": 1030732537.4199219, - "heart_rate": 64 - }, - { - "timestamp": 1030732537.6699219, - "heart_rate": 64 - }, - { - "timestamp": 1030732537.8378906, - "heart_rate": 64 - }, - { - "timestamp": 1030732538.0878906, - "heart_rate": 64 - }, - { - "timestamp": 1030732538.3378906, - "heart_rate": 64 - }, - { - "timestamp": 1030732538.5878906, - "heart_rate": 64 - }, - { - "timestamp": 1030732538.71875, - "heart_rate": 65 - }, - { - "timestamp": 1030732538.96875, - "heart_rate": 65 - }, - { - "timestamp": 1030732539.21875, - "heart_rate": 65 - }, - { - "timestamp": 1030732539.46875, - "heart_rate": 65 - }, - { - "timestamp": 1030732539.6357422, - "heart_rate": 65 - }, - { - "timestamp": 1030732539.8857422, - "heart_rate": 65 - }, - { - "timestamp": 1030732540.1357422, - "heart_rate": 65 - }, - { - "timestamp": 1030732540.3857422, - "heart_rate": 65 - }, - { - "timestamp": 1030732540.5068359, - "heart_rate": 67 - }, - { - "timestamp": 1030732540.7568359, - "heart_rate": 67 - }, - { - "timestamp": 1030732541.0068359, - "heart_rate": 67 - }, - { - "timestamp": 1030732541.2568359, - "heart_rate": 67 - }, - { - "timestamp": 1030732541.4335938, - "heart_rate": 66 - }, - { - "timestamp": 1030732541.6835938, - "heart_rate": 66 - }, - { - "timestamp": 1030732541.9335938, - "heart_rate": 66 - }, - { - "timestamp": 1030732542.1835938, - "heart_rate": 66 - }, - { - "timestamp": 1030732542.3515625, - "heart_rate": 66 - }, - { - "timestamp": 1030732542.6015625, - "heart_rate": 66 - }, - { - "timestamp": 1030732542.8515625, - "heart_rate": 66 - }, - { - "timestamp": 1030732543.1015625, - "heart_rate": 66 - }, - { - "timestamp": 1030732543.2695312, - "heart_rate": 66 - }, - { - "timestamp": 1030732543.5195312, - "heart_rate": 66 - }, - { - "timestamp": 1030732543.7695312, - "heart_rate": 66 - }, - { - "timestamp": 1030732544.0195312, - "heart_rate": 66 - }, - { - "timestamp": 1030732544.1074219, - "heart_rate": 65 - }, - { - "timestamp": 1030732544.3574219, - "heart_rate": 65 - }, - { - "timestamp": 1030732544.6074219, - "heart_rate": 65 - }, - { - "timestamp": 1030732544.8574219, - "heart_rate": 65 - }, - { - "timestamp": 1030732545.0449219, - "heart_rate": 65 - }, - { - "timestamp": 1030732545.2949219, - "heart_rate": 65 - }, - { - "timestamp": 1030732545.5449219, - "heart_rate": 65 - }, - { - "timestamp": 1030732545.7949219, - "heart_rate": 65 - }, - { - "timestamp": 1030732545.9619141, - "heart_rate": 65 - }, - { - "timestamp": 1030732546.2119141, - "heart_rate": 65 - }, - { - "timestamp": 1030732546.4619141, - "heart_rate": 65 - }, - { - "timestamp": 1030732546.7119141, - "heart_rate": 65 - }, - { - "timestamp": 1030732546.9492188, - "heart_rate": 65 - }, - { - "timestamp": 1030732547.1992188, - "heart_rate": 65 - }, - { - "timestamp": 1030732547.4492188, - "heart_rate": 65 - }, - { - "timestamp": 1030732547.6992188, - "heart_rate": 65 - }, - { - "timestamp": 1030732547.9492188, - "heart_rate": 65 - }, - { - "timestamp": 1030732547.9560547, - "heart_rate": 63 - }, - { - "timestamp": 1030732548.2060547, - "heart_rate": 63 - }, - { - "timestamp": 1030732548.4560547, - "heart_rate": 63 - }, - { - "timestamp": 1030732548.7060547, - "heart_rate": 63 - }, - { - "timestamp": 1030732548.9560547, - "heart_rate": 63 - }, - { - "timestamp": 1030732548.9648438, - "heart_rate": 61 - }, - { - "timestamp": 1030732549.2148438, - "heart_rate": 61 - }, - { - "timestamp": 1030732549.4648438, - "heart_rate": 61 - }, - { - "timestamp": 1030732549.7148438, - "heart_rate": 61 - }, - { - "timestamp": 1030732549.9648438, - "heart_rate": 61 - }, - { - "timestamp": 1030732550.0800781, - "heart_rate": 60 - }, - { - "timestamp": 1030732550.3300781, - "heart_rate": 60 - }, - { - "timestamp": 1030732550.5800781, - "heart_rate": 60 - }, - { - "timestamp": 1030732550.8300781, - "heart_rate": 60 - }, - { - "timestamp": 1030732550.9404297, - "heart_rate": 60 - }, - { - "timestamp": 1030732551.1904297, - "heart_rate": 60 - }, - { - "timestamp": 1030732551.4404297, - "heart_rate": 60 - }, - { - "timestamp": 1030732551.6904297, - "heart_rate": 60 - }, - { - "timestamp": 1030732551.8945312, - "heart_rate": 60 - }, - { - "timestamp": 1030732552.1445312, - "heart_rate": 60 - }, - { - "timestamp": 1030732552.3945312, - "heart_rate": 60 - }, - { - "timestamp": 1030732552.6445312, - "heart_rate": 60 - }, - { - "timestamp": 1030732552.8291016, - "heart_rate": 61 - }, - { - "timestamp": 1030732553.0791016, - "heart_rate": 61 - }, - { - "timestamp": 1030732553.3291016, - "heart_rate": 61 - }, - { - "timestamp": 1030732553.5791016, - "heart_rate": 61 - }, - { - "timestamp": 1030732553.7441406, - "heart_rate": 62 - }, - { - "timestamp": 1030732553.9941406, - "heart_rate": 62 - }, - { - "timestamp": 1030732554.2441406, - "heart_rate": 62 - }, - { - "timestamp": 1030732554.4941406, - "heart_rate": 62 - }, - { - "timestamp": 1030732554.6474609, - "heart_rate": 64 - }, - { - "timestamp": 1030732554.8974609, - "heart_rate": 64 - }, - { - "timestamp": 1030732555.1474609, - "heart_rate": 64 - }, - { - "timestamp": 1030732555.3974609, - "heart_rate": 64 - }, - { - "timestamp": 1030732555.5507812, - "heart_rate": 65 - }, - { - "timestamp": 1030732555.8007812, - "heart_rate": 65 - }, - { - "timestamp": 1030732556.0507812, - "heart_rate": 65 - }, - { - "timestamp": 1030732556.3007812, - "heart_rate": 65 - }, - { - "timestamp": 1030732556.4648438, - "heart_rate": 66 - }, - { - "timestamp": 1030732556.7148438, - "heart_rate": 66 - }, - { - "timestamp": 1030732556.9648438, - "heart_rate": 66 - }, - { - "timestamp": 1030732557.2148438, - "heart_rate": 66 - }, - { - "timestamp": 1030732557.3544922, - "heart_rate": 66 - }, - { - "timestamp": 1030732557.6044922, - "heart_rate": 66 - }, - { - "timestamp": 1030732557.8544922, - "heart_rate": 66 - }, - { - "timestamp": 1030732558.1044922, - "heart_rate": 66 - }, - { - "timestamp": 1030732558.2412109, - "heart_rate": 67 - }, - { - "timestamp": 1030732558.4912109, - "heart_rate": 67 - }, - { - "timestamp": 1030732558.7412109, - "heart_rate": 67 - }, - { - "timestamp": 1030732558.9912109, - "heart_rate": 67 - }, - { - "timestamp": 1030732559.1591797, - "heart_rate": 67 - }, - { - "timestamp": 1030732559.4091797, - "heart_rate": 67 - }, - { - "timestamp": 1030732559.6591797, - "heart_rate": 67 - }, - { - "timestamp": 1030732559.9091797, - "heart_rate": 67 - }, - { - "timestamp": 1030732560.1591797, - "heart_rate": 67 - }, - { - "timestamp": 1030732560.2773438, - "heart_rate": 67 - }, - { - "timestamp": 1030732560.5273438, - "heart_rate": 67 - }, - { - "timestamp": 1030732560.7773438, - "heart_rate": 67 - }, - { - "timestamp": 1030732561.0273438, - "heart_rate": 67 - }, - { - "timestamp": 1030732561.0351562, - "heart_rate": 67 - }, - { - "timestamp": 1030732561.2851562, - "heart_rate": 67 - }, - { - "timestamp": 1030732561.5351562, - "heart_rate": 67 - }, - { - "timestamp": 1030732561.7851562, - "heart_rate": 67 - }, - { - "timestamp": 1030732561.9609375, - "heart_rate": 67 - }, - { - "timestamp": 1030732562.2109375, - "heart_rate": 67 - }, - { - "timestamp": 1030732562.4609375, - "heart_rate": 67 - }, - { - "timestamp": 1030732562.7109375, - "heart_rate": 67 - }, - { - "timestamp": 1030732562.9052734, - "heart_rate": 67 - }, - { - "timestamp": 1030732563.1552734, - "heart_rate": 67 - }, - { - "timestamp": 1030732563.4052734, - "heart_rate": 67 - }, - { - "timestamp": 1030732563.6552734, - "heart_rate": 67 - }, - { - "timestamp": 1030732563.7910156, - "heart_rate": 67 - }, - { - "timestamp": 1030732564.0410156, - "heart_rate": 67 - }, - { - "timestamp": 1030732564.2910156, - "heart_rate": 67 - }, - { - "timestamp": 1030732564.5410156, - "heart_rate": 67 - }, - { - "timestamp": 1030732564.6513672, - "heart_rate": 67 - }, - { - "timestamp": 1030732564.9013672, - "heart_rate": 67 - }, - { - "timestamp": 1030732565.1513672, - "heart_rate": 67 - }, - { - "timestamp": 1030732565.4013672, - "heart_rate": 67 - }, - { - "timestamp": 1030732565.4785156, - "heart_rate": 69 - }, - { - "timestamp": 1030732565.7285156, - "heart_rate": 69 - }, - { - "timestamp": 1030732565.9785156, - "heart_rate": 69 - }, - { - "timestamp": 1030732566.2285156, - "heart_rate": 69 - }, - { - "timestamp": 1030732566.25, - "heart_rate": 71 - }, - { - "timestamp": 1030732566.5, - "heart_rate": 71 - }, - { - "timestamp": 1030732566.75, - "heart_rate": 71 - }, - { - "timestamp": 1030732567, - "heart_rate": 71 - }, - { - "timestamp": 1030732567.0195312, - "heart_rate": 74 - }, - { - "timestamp": 1030732567.2695312, - "heart_rate": 74 - }, - { - "timestamp": 1030732567.5195312, - "heart_rate": 74 - }, - { - "timestamp": 1030732567.7695312, - "heart_rate": 74 - }, - { - "timestamp": 1030732567.7841797, - "heart_rate": 76 - }, - { - "timestamp": 1030732568.0341797, - "heart_rate": 76 - }, - { - "timestamp": 1030732568.2841797, - "heart_rate": 76 - }, - { - "timestamp": 1030732568.5302734, - "heart_rate": 77 - }, - { - "timestamp": 1030732568.7802734, - "heart_rate": 77 - }, - { - "timestamp": 1030732569.0302734, - "heart_rate": 77 - }, - { - "timestamp": 1030732569.2695312, - "heart_rate": 79 - }, - { - "timestamp": 1030732569.5195312, - "heart_rate": 79 - }, - { - "timestamp": 1030732569.7695312, - "heart_rate": 79 - }, - { - "timestamp": 1030732570.0107422, - "heart_rate": 80 - }, - { - "timestamp": 1030732570.2607422, - "heart_rate": 80 - }, - { - "timestamp": 1030732570.5107422, - "heart_rate": 80 - }, - { - "timestamp": 1030732570.7519531, - "heart_rate": 80 - }, - { - "timestamp": 1030732571.0019531, - "heart_rate": 80 - }, - { - "timestamp": 1030732571.2519531, - "heart_rate": 80 - }, - { - "timestamp": 1030732571.4755859, - "heart_rate": 81 - }, - { - "timestamp": 1030732571.7255859, - "heart_rate": 81 - }, - { - "timestamp": 1030732571.9755859, - "heart_rate": 81 - }, - { - "timestamp": 1030732572.1796875, - "heart_rate": 82 - }, - { - "timestamp": 1030732572.4296875, - "heart_rate": 82 - }, - { - "timestamp": 1030732572.6796875, - "heart_rate": 82 - }, - { - "timestamp": 1030732572.8769531, - "heart_rate": 84 - }, - { - "timestamp": 1030732573.1269531, - "heart_rate": 84 - }, - { - "timestamp": 1030732573.3769531, - "heart_rate": 84 - }, - { - "timestamp": 1030732573.5615234, - "heart_rate": 85 - }, - { - "timestamp": 1030732573.8115234, - "heart_rate": 85 - }, - { - "timestamp": 1030732574.0615234, - "heart_rate": 85 - }, - { - "timestamp": 1030732574.2373047, - "heart_rate": 86 - }, - { - "timestamp": 1030732574.4873047, - "heart_rate": 86 - }, - { - "timestamp": 1030732574.7373047, - "heart_rate": 86 - }, - { - "timestamp": 1030732574.9189453, - "heart_rate": 87 - }, - { - "timestamp": 1030732575.1689453, - "heart_rate": 87 - }, - { - "timestamp": 1030732575.4189453, - "heart_rate": 87 - }, - { - "timestamp": 1030732575.5917969, - "heart_rate": 88 - }, - { - "timestamp": 1030732575.8417969, - "heart_rate": 88 - }, - { - "timestamp": 1030732576.0917969, - "heart_rate": 88 - }, - { - "timestamp": 1030732576.2490234, - "heart_rate": 89 - }, - { - "timestamp": 1030732576.4990234, - "heart_rate": 89 - }, - { - "timestamp": 1030732576.7490234, - "heart_rate": 89 - }, - { - "timestamp": 1030732576.9033203, - "heart_rate": 90 - }, - { - "timestamp": 1030732577.1533203, - "heart_rate": 90 - }, - { - "timestamp": 1030732577.4033203, - "heart_rate": 90 - }, - { - "timestamp": 1030732577.5957031, - "heart_rate": 91 - }, - { - "timestamp": 1030732577.8457031, - "heart_rate": 91 - }, - { - "timestamp": 1030732578.0957031, - "heart_rate": 91 - }, - { - "timestamp": 1030732578.2861328, - "heart_rate": 89 - }, - { - "timestamp": 1030732578.5361328, - "heart_rate": 89 - }, - { - "timestamp": 1030732578.7861328, - "heart_rate": 89 - }, - { - "timestamp": 1030732578.9648438, - "heart_rate": 88 - }, - { - "timestamp": 1030732579.2148438, - "heart_rate": 88 - }, - { - "timestamp": 1030732579.4648438, - "heart_rate": 88 - }, - { - "timestamp": 1030732579.6269531, - "heart_rate": 88 - }, - { - "timestamp": 1030732579.8769531, - "heart_rate": 88 - }, - { - "timestamp": 1030732580.1269531, - "heart_rate": 88 - }, - { - "timestamp": 1030732580.3115234, - "heart_rate": 88 - }, - { - "timestamp": 1030732580.5615234, - "heart_rate": 88 - }, - { - "timestamp": 1030732580.8115234, - "heart_rate": 88 - }, - { - "timestamp": 1030732580.9804688, - "heart_rate": 89 - }, - { - "timestamp": 1030732581.2304688, - "heart_rate": 89 - }, - { - "timestamp": 1030732581.4804688, - "heart_rate": 89 - }, - { - "timestamp": 1030732581.6591797, - "heart_rate": 89 - }, - { - "timestamp": 1030732581.9091797, - "heart_rate": 89 - }, - { - "timestamp": 1030732582.1591797, - "heart_rate": 89 - }, - { - "timestamp": 1030732582.3291016, - "heart_rate": 89 - }, - { - "timestamp": 1030732582.5791016, - "heart_rate": 89 - }, - { - "timestamp": 1030732582.8291016, - "heart_rate": 89 - }, - { - "timestamp": 1030732582.9873047, - "heart_rate": 89 - }, - { - "timestamp": 1030732583.2373047, - "heart_rate": 89 - }, - { - "timestamp": 1030732583.4873047, - "heart_rate": 89 - }, - { - "timestamp": 1030732583.6435547, - "heart_rate": 90 - }, - { - "timestamp": 1030732583.8935547, - "heart_rate": 90 - }, - { - "timestamp": 1030732584.1435547, - "heart_rate": 90 - }, - { - "timestamp": 1030732584.2871094, - "heart_rate": 91 - }, - { - "timestamp": 1030732584.5371094, - "heart_rate": 91 - }, - { - "timestamp": 1030732584.7871094, - "heart_rate": 91 - }, - { - "timestamp": 1030732584.9296875, - "heart_rate": 92 - }, - { - "timestamp": 1030732585.1796875, - "heart_rate": 92 - }, - { - "timestamp": 1030732585.4296875, - "heart_rate": 92 - }, - { - "timestamp": 1030732585.5878906, - "heart_rate": 93 - }, - { - "timestamp": 1030732585.8378906, - "heart_rate": 93 - }, - { - "timestamp": 1030732586.0878906, - "heart_rate": 93 - }, - { - "timestamp": 1030732586.2509766, - "heart_rate": 92 - }, - { - "timestamp": 1030732586.5009766, - "heart_rate": 92 - }, - { - "timestamp": 1030732586.7509766, - "heart_rate": 92 - }, - { - "timestamp": 1030732586.9042969, - "heart_rate": 92 - }, - { - "timestamp": 1030732587.1542969, - "heart_rate": 92 - }, - { - "timestamp": 1030732587.4042969, - "heart_rate": 92 - }, - { - "timestamp": 1030732587.5712891, - "heart_rate": 91 - }, - { - "timestamp": 1030732587.8212891, - "heart_rate": 91 - }, - { - "timestamp": 1030732588.0712891, - "heart_rate": 91 - }, - { - "timestamp": 1030732588.2285156, - "heart_rate": 91 - }, - { - "timestamp": 1030732588.4785156, - "heart_rate": 91 - }, - { - "timestamp": 1030732588.7285156, - "heart_rate": 91 - }, - { - "timestamp": 1030732588.8857422, - "heart_rate": 91 - }, - { - "timestamp": 1030732589.1357422, - "heart_rate": 91 - }, - { - "timestamp": 1030732589.3857422, - "heart_rate": 91 - }, - { - "timestamp": 1030732589.5585938, - "heart_rate": 91 - }, - { - "timestamp": 1030732589.8085938, - "heart_rate": 91 - }, - { - "timestamp": 1030732590.0585938, - "heart_rate": 91 - }, - { - "timestamp": 1030732590.1240234, - "heart_rate": 91 - }, - { - "timestamp": 1030732590.3740234, - "heart_rate": 91 - }, - { - "timestamp": 1030732590.6240234, - "heart_rate": 91 - }, - { - "timestamp": 1030732590.7617188, - "heart_rate": 91 - }, - { - "timestamp": 1030732591.0117188, - "heart_rate": 91 - }, - { - "timestamp": 1030732591.2617188, - "heart_rate": 91 - }, - { - "timestamp": 1030732591.3994141, - "heart_rate": 91 - }, - { - "timestamp": 1030732591.6494141, - "heart_rate": 91 - }, - { - "timestamp": 1030732591.8994141, - "heart_rate": 91 - }, - { - "timestamp": 1030732592.0371094, - "heart_rate": 92 - }, - { - "timestamp": 1030732592.2871094, - "heart_rate": 92 - }, - { - "timestamp": 1030732592.5371094, - "heart_rate": 92 - }, - { - "timestamp": 1030732592.6748047, - "heart_rate": 94 - }, - { - "timestamp": 1030732592.9248047, - "heart_rate": 94 - }, - { - "timestamp": 1030732593.0361328, - "heart_rate": 94 - }, - { - "timestamp": 1030732593.2861328, - "heart_rate": 94 - }, - { - "timestamp": 1030732593.5361328, - "heart_rate": 94 - }, - { - "timestamp": 1030732593.7470703, - "heart_rate": 94 - }, - { - "timestamp": 1030732593.9970703, - "heart_rate": 94 - }, - { - "timestamp": 1030732594.2470703, - "heart_rate": 94 - }, - { - "timestamp": 1030732594.453125, - "heart_rate": 94 - }, - { - "timestamp": 1030732594.703125, - "heart_rate": 94 - }, - { - "timestamp": 1030732594.953125, - "heart_rate": 94 - }, - { - "timestamp": 1030732595.1689453, - "heart_rate": 94 - }, - { - "timestamp": 1030732595.4189453, - "heart_rate": 94 - }, - { - "timestamp": 1030732595.6689453, - "heart_rate": 94 - }, - { - "timestamp": 1030732595.8798828, - "heart_rate": 94 - }, - { - "timestamp": 1030732596.1298828, - "heart_rate": 94 - }, - { - "timestamp": 1030732596.3798828, - "heart_rate": 94 - }, - { - "timestamp": 1030732596.5820312, - "heart_rate": 94 - }, - { - "timestamp": 1030732596.8320312, - "heart_rate": 94 - }, - { - "timestamp": 1030732597.0820312, - "heart_rate": 94 - }, - { - "timestamp": 1030732597.2900391, - "heart_rate": 92 - }, - { - "timestamp": 1030732597.5400391, - "heart_rate": 92 - }, - { - "timestamp": 1030732597.7900391, - "heart_rate": 92 - }, - { - "timestamp": 1030732597.9912109, - "heart_rate": 87 - }, - { - "timestamp": 1030732598.2412109, - "heart_rate": 87 - }, - { - "timestamp": 1030732598.4912109, - "heart_rate": 87 - }, - { - "timestamp": 1030732598.6904297, - "heart_rate": 87 - }, - { - "timestamp": 1030732598.9404297, - "heart_rate": 87 - }, - { - "timestamp": 1030732599.1904297, - "heart_rate": 87 - }, - { - "timestamp": 1030732599.3945312, - "heart_rate": 86 - }, - { - "timestamp": 1030732599.3945312, - "heart_rate": 86 - }, - { - "timestamp": 1030732599.3945312, - "heart_rate": 86 - }, - { - "timestamp": 1030732599.3945312, - "heart_rate": 86 - }, - { - "timestamp": 1030732599.3945312, - "heart_rate": 86 - }, - { - "timestamp": 1030732599.3945312, - "heart_rate": 86 - }, - { - "timestamp": 1030732599.3945312, - "heart_rate": 86 - } -] - -merged_record_messages = [ - { - "timestamp": 1030732282, - "heart_rate": 69 - }, - { - "timestamp": 1030732283, - "heart_rate": 69 - }, - { - "timestamp": 1030732284, - "heart_rate": 69 - }, - { - "timestamp": 1030732285, - "heart_rate": 70 - }, - { - "timestamp": 1030732286, - "heart_rate": 70 - }, - { - "timestamp": 1030732287, - "heart_rate": 69 - }, - { - "timestamp": 1030732288, - "heart_rate": 68 - }, - { - "timestamp": 1030732289, - "heart_rate": 67 - }, - { - "timestamp": 1030732290, - "heart_rate": 66 - }, - { - "timestamp": 1030732291, - "heart_rate": 65 - }, - { - "timestamp": 1030732292, - "heart_rate": 65 - }, - { - "timestamp": 1030732293, - "heart_rate": 65 - }, - { - "timestamp": 1030732294, - "heart_rate": 65 - }, - { - "timestamp": 1030732295, - "heart_rate": 65 - }, - { - "timestamp": 1030732296, - "heart_rate": 65 - }, - { - "timestamp": 1030732297, - "heart_rate": 65 - }, - { - "timestamp": 1030732298, - "heart_rate": 65 - }, - { - "timestamp": 1030732299, - "heart_rate": 65 - }, - { - "timestamp": 1030732300, - "heart_rate": 66 - }, - { - "timestamp": 1030732301, - "heart_rate": 66 - }, - { - "timestamp": 1030732302, - "heart_rate": 66 - }, - { - "timestamp": 1030732303, - "heart_rate": 65 - }, - { - "timestamp": 1030732304, - "heart_rate": 66 - }, - { - "timestamp": 1030732305, - "heart_rate": 67 - }, - { - "timestamp": 1030732306, - "heart_rate": 68 - }, - { - "timestamp": 1030732307, - "heart_rate": 69 - }, - { - "timestamp": 1030732308, - "heart_rate": 69 - }, - { - "timestamp": 1030732309, - "heart_rate": 70 - }, - { - "timestamp": 1030732310, - "heart_rate": 71 - }, - { - "timestamp": 1030732311, - "heart_rate": 73 - }, - { - "timestamp": 1030732312, - "heart_rate": 74 - }, - { - "timestamp": 1030732313, - "heart_rate": 74 - }, - { - "timestamp": 1030732314, - "heart_rate": 74 - }, - { - "timestamp": 1030732315, - "heart_rate": 75 - }, - { - "timestamp": 1030732316, - "heart_rate": 77 - }, - { - "timestamp": 1030732317, - "heart_rate": 78 - }, - { - "timestamp": 1030732318, - "heart_rate": 80 - }, - { - "timestamp": 1030732319, - "heart_rate": 80 - }, - { - "timestamp": 1030732320, - "heart_rate": 80 - }, - { - "timestamp": 1030732321, - "heart_rate": 81 - }, - { - "timestamp": 1030732322, - "heart_rate": 81 - }, - { - "timestamp": 1030732323, - "heart_rate": 82 - }, - { - "timestamp": 1030732324, - "heart_rate": 83 - }, - { - "timestamp": 1030732325, - "heart_rate": 85 - }, - { - "timestamp": 1030732326, - "heart_rate": 86 - }, - { - "timestamp": 1030732327, - "heart_rate": 85 - }, - { - "timestamp": 1030732328, - "heart_rate": 85 - }, - { - "timestamp": 1030732329, - "heart_rate": 85 - }, - { - "timestamp": 1030732330, - "heart_rate": 85 - }, - { - "timestamp": 1030732331, - "heart_rate": 86 - }, - { - "timestamp": 1030732332, - "heart_rate": 86 - }, - { - "timestamp": 1030732333, - "heart_rate": 87 - }, - { - "timestamp": 1030732334, - "heart_rate": 89 - }, - { - "timestamp": 1030732335, - "heart_rate": 89 - }, - { - "timestamp": 1030732336, - "heart_rate": 89 - }, - { - "timestamp": 1030732337, - "heart_rate": 89 - }, - { - "timestamp": 1030732338, - "heart_rate": 88 - }, - { - "timestamp": 1030732339, - "heart_rate": 88 - }, - { - "timestamp": 1030732340, - "heart_rate": 88 - }, - { - "timestamp": 1030732341, - "heart_rate": 88 - }, - { - "timestamp": 1030732342, - "heart_rate": 89 - }, - { - "timestamp": 1030732343, - "heart_rate": 89 - }, - { - "timestamp": 1030732344, - "heart_rate": 89 - }, - { - "timestamp": 1030732345, - "heart_rate": 89 - }, - { - "timestamp": 1030732346, - "heart_rate": 89 - }, - { - "timestamp": 1030732347, - "heart_rate": 89 - }, - { - "timestamp": 1030732348, - "heart_rate": 89 - }, - { - "timestamp": 1030732349, - "heart_rate": 89 - }, - { - "timestamp": 1030732350, - "heart_rate": 88 - }, - { - "timestamp": 1030732351, - "heart_rate": 88 - }, - { - "timestamp": 1030732352, - "heart_rate": 88 - }, - { - "timestamp": 1030732353, - "heart_rate": 87 - }, - { - "timestamp": 1030732354, - "heart_rate": 87 - }, - { - "timestamp": 1030732355, - "heart_rate": 87 - }, - { - "timestamp": 1030732356, - "heart_rate": 87 - }, - { - "timestamp": 1030732357, - "heart_rate": 87 - }, - { - "timestamp": 1030732358, - "heart_rate": 87 - }, - { - "timestamp": 1030732359, - "heart_rate": 87 - }, - { - "timestamp": 1030732360, - "heart_rate": 86 - }, - { - "timestamp": 1030732361, - "heart_rate": 87 - }, - { - "timestamp": 1030732362, - "heart_rate": 87 - }, - { - "timestamp": 1030732363, - "heart_rate": 87 - }, - { - "timestamp": 1030732364, - "heart_rate": 86 - }, - { - "timestamp": 1030732365, - "heart_rate": 86 - }, - { - "timestamp": 1030732366, - "heart_rate": 85 - }, - { - "timestamp": 1030732367, - "heart_rate": 86 - }, - { - "timestamp": 1030732368, - "heart_rate": 86 - }, - { - "timestamp": 1030732369, - "heart_rate": 85 - }, - { - "timestamp": 1030732370, - "heart_rate": 85 - }, - { - "timestamp": 1030732371, - "heart_rate": 85 - }, - { - "timestamp": 1030732372, - "heart_rate": 85 - }, - { - "timestamp": 1030732373, - "heart_rate": 84 - }, - { - "timestamp": 1030732374, - "heart_rate": 85 - }, - { - "timestamp": 1030732375, - "heart_rate": 85 - }, - { - "timestamp": 1030732376, - "heart_rate": 84 - }, - { - "timestamp": 1030732377, - "heart_rate": 85 - }, - { - "timestamp": 1030732378, - "heart_rate": 84 - }, - { - "timestamp": 1030732379, - "heart_rate": 84 - }, - { - "timestamp": 1030732380, - "heart_rate": 83 - }, - { - "timestamp": 1030732381, - "heart_rate": 83 - }, - { - "timestamp": 1030732382, - "heart_rate": 83 - }, - { - "timestamp": 1030732383, - "heart_rate": 83 - }, - { - "timestamp": 1030732384, - "heart_rate": 83 - }, - { - "timestamp": 1030732385, - "heart_rate": 85 - }, - { - "timestamp": 1030732386, - "heart_rate": 86 - }, - { - "timestamp": 1030732387, - "heart_rate": 86 - }, - { - "timestamp": 1030732388, - "heart_rate": 86 - }, - { - "timestamp": 1030732389, - "heart_rate": 85 - }, - { - "timestamp": 1030732390, - "heart_rate": 83 - }, - { - "timestamp": 1030732391, - "heart_rate": 81 - }, - { - "timestamp": 1030732392, - "heart_rate": 78 - }, - { - "timestamp": 1030732393, - "heart_rate": 75 - }, - { - "timestamp": 1030732394, - "heart_rate": 73 - }, - { - "timestamp": 1030732395, - "heart_rate": 70 - }, - { - "timestamp": 1030732396, - "heart_rate": 69 - }, - { - "timestamp": 1030732397, - "heart_rate": 67 - }, - { - "timestamp": 1030732398, - "heart_rate": 66 - }, - { - "timestamp": 1030732399, - "heart_rate": 66 - }, - { - "timestamp": 1030732400, - "heart_rate": 67 - }, - { - "timestamp": 1030732401, - "heart_rate": 68 - }, - { - "timestamp": 1030732402, - "heart_rate": 68 - }, - { - "timestamp": 1030732403, - "heart_rate": 68 - }, - { - "timestamp": 1030732404, - "heart_rate": 69 - }, - { - "timestamp": 1030732405, - "heart_rate": 70 - }, - { - "timestamp": 1030732406, - "heart_rate": 69 - }, - { - "timestamp": 1030732407, - "heart_rate": 67 - }, - { - "timestamp": 1030732408, - "heart_rate": 67 - }, - { - "timestamp": 1030732409, - "heart_rate": 67 - }, - { - "timestamp": 1030732410, - "heart_rate": 67 - }, - { - "timestamp": 1030732411, - "heart_rate": 67 - }, - { - "timestamp": 1030732412, - "heart_rate": 68 - }, - { - "timestamp": 1030732413, - "heart_rate": 68 - }, - { - "timestamp": 1030732414, - "heart_rate": 69 - }, - { - "timestamp": 1030732415, - "heart_rate": 69 - }, - { - "timestamp": 1030732416, - "heart_rate": 69 - }, - { - "timestamp": 1030732417, - "heart_rate": 69 - }, - { - "timestamp": 1030732418, - "heart_rate": 68 - }, - { - "timestamp": 1030732419, - "heart_rate": 68 - }, - { - "timestamp": 1030732420, - "heart_rate": 69 - }, - { - "timestamp": 1030732421, - "heart_rate": 70 - }, - { - "timestamp": 1030732422, - "heart_rate": 71 - }, - { - "timestamp": 1030732423, - "heart_rate": 70 - }, - { - "timestamp": 1030732424, - "heart_rate": 71 - }, - { - "timestamp": 1030732425, - "heart_rate": 71 - }, - { - "timestamp": 1030732426, - "heart_rate": 71 - }, - { - "timestamp": 1030732427, - "heart_rate": 72 - }, - { - "timestamp": 1030732428, - "heart_rate": 71 - }, - { - "timestamp": 1030732429, - "heart_rate": 70 - }, - { - "timestamp": 1030732430, - "heart_rate": 68 - }, - { - "timestamp": 1030732431, - "heart_rate": 67 - }, - { - "timestamp": 1030732432, - "heart_rate": 68 - }, - { - "timestamp": 1030732433, - "heart_rate": 68 - }, - { - "timestamp": 1030732434, - "heart_rate": 70 - }, - { - "timestamp": 1030732435, - "heart_rate": 70 - }, - { - "timestamp": 1030732436, - "heart_rate": 71 - }, - { - "timestamp": 1030732437, - "heart_rate": 71 - }, - { - "timestamp": 1030732438, - "heart_rate": 71 - }, - { - "timestamp": 1030732439, - "heart_rate": 72 - }, - { - "timestamp": 1030732440, - "heart_rate": 71 - }, - { - "timestamp": 1030732441, - "heart_rate": 71 - }, - { - "timestamp": 1030732442, - "heart_rate": 71 - }, - { - "timestamp": 1030732443, - "heart_rate": 71 - }, - { - "timestamp": 1030732444, - "heart_rate": 72 - }, - { - "timestamp": 1030732445, - "heart_rate": 72 - }, - { - "timestamp": 1030732446, - "heart_rate": 73 - }, - { - "timestamp": 1030732447, - "heart_rate": 74 - }, - { - "timestamp": 1030732448, - "heart_rate": 75 - }, - { - "timestamp": 1030732449, - "heart_rate": 72 - }, - { - "timestamp": 1030732450, - "heart_rate": 70 - }, - { - "timestamp": 1030732451, - "heart_rate": 68 - }, - { - "timestamp": 1030732452, - "heart_rate": 67 - }, - { - "timestamp": 1030732453, - "heart_rate": 65 - }, - { - "timestamp": 1030732454, - "heart_rate": 64 - }, - { - "timestamp": 1030732455, - "heart_rate": 64 - }, - { - "timestamp": 1030732456, - "heart_rate": 64 - }, - { - "timestamp": 1030732457, - "heart_rate": 64 - }, - { - "timestamp": 1030732458, - "heart_rate": 64 - }, - { - "timestamp": 1030732459, - "heart_rate": 64 - }, - { - "timestamp": 1030732460, - "heart_rate": 64 - }, - { - "timestamp": 1030732461, - "heart_rate": 63 - }, - { - "timestamp": 1030732462, - "heart_rate": 63 - }, - { - "timestamp": 1030732463, - "heart_rate": 64 - }, - { - "timestamp": 1030732464, - "heart_rate": 64 - }, - { - "timestamp": 1030732465, - "heart_rate": 64 - }, - { - "timestamp": 1030732466, - "heart_rate": 64 - }, - { - "timestamp": 1030732467, - "heart_rate": 63 - }, - { - "timestamp": 1030732468, - "heart_rate": 63 - }, - { - "timestamp": 1030732469, - "heart_rate": 63 - }, - { - "timestamp": 1030732470, - "heart_rate": 64 - }, - { - "timestamp": 1030732471, - "heart_rate": 64 - }, - { - "timestamp": 1030732472, - "heart_rate": 64 - }, - { - "timestamp": 1030732473, - "heart_rate": 64 - }, - { - "timestamp": 1030732474, - "heart_rate": 64 - }, - { - "timestamp": 1030732475, - "heart_rate": 65 - }, - { - "timestamp": 1030732476, - "heart_rate": 65 - }, - { - "timestamp": 1030732477, - "heart_rate": 66 - }, - { - "timestamp": 1030732478, - "heart_rate": 67 - }, - { - "timestamp": 1030732479, - "heart_rate": 67 - }, - { - "timestamp": 1030732480, - "heart_rate": 66 - }, - { - "timestamp": 1030732481, - "heart_rate": 64 - }, - { - "timestamp": 1030732482, - "heart_rate": 64 - }, - { - "timestamp": 1030732483, - "heart_rate": 64 - }, - { - "timestamp": 1030732484, - "heart_rate": 64 - }, - { - "timestamp": 1030732485, - "heart_rate": 65 - }, - { - "timestamp": 1030732486, - "heart_rate": 65 - }, - { - "timestamp": 1030732487, - "heart_rate": 65 - }, - { - "timestamp": 1030732488, - "heart_rate": 66 - }, - { - "timestamp": 1030732489, - "heart_rate": 66 - }, - { - "timestamp": 1030732490, - "heart_rate": 67 - }, - { - "timestamp": 1030732491, - "heart_rate": 66 - }, - { - "timestamp": 1030732492, - "heart_rate": 66 - }, - { - "timestamp": 1030732493, - "heart_rate": 66 - }, - { - "timestamp": 1030732494, - "heart_rate": 66 - }, - { - "timestamp": 1030732495, - "heart_rate": 67 - }, - { - "timestamp": 1030732496, - "heart_rate": 68 - }, - { - "timestamp": 1030732497, - "heart_rate": 70 - }, - { - "timestamp": 1030732498, - "heart_rate": 72 - }, - { - "timestamp": 1030732499, - "heart_rate": 72 - }, - { - "timestamp": 1030732500, - "heart_rate": 71 - }, - { - "timestamp": 1030732501, - "heart_rate": 70 - }, - { - "timestamp": 1030732502, - "heart_rate": 69 - }, - { - "timestamp": 1030732503, - "heart_rate": 69 - }, - { - "timestamp": 1030732504, - "heart_rate": 68 - }, - { - "timestamp": 1030732505, - "heart_rate": 67 - }, - { - "timestamp": 1030732506, - "heart_rate": 66 - }, - { - "timestamp": 1030732507, - "heart_rate": 66 - }, - { - "timestamp": 1030732508, - "heart_rate": 65 - }, - { - "timestamp": 1030732509, - "heart_rate": 64 - }, - { - "timestamp": 1030732510, - "heart_rate": 62 - }, - { - "timestamp": 1030732511, - "heart_rate": 61 - }, - { - "timestamp": 1030732512, - "heart_rate": 60 - }, - { - "timestamp": 1030732513, - "heart_rate": 60 - }, - { - "timestamp": 1030732514, - "heart_rate": 59 - }, - { - "timestamp": 1030732515, - "heart_rate": 59 - }, - { - "timestamp": 1030732516, - "heart_rate": 59 - }, - { - "timestamp": 1030732517, - "heart_rate": 60 - }, - { - "timestamp": 1030732518, - "heart_rate": 61 - }, - { - "timestamp": 1030732519, - "heart_rate": 62 - }, - { - "timestamp": 1030732520, - "heart_rate": 62 - }, - { - "timestamp": 1030732521, - "heart_rate": 63 - }, - { - "timestamp": 1030732522, - "heart_rate": 63 - }, - { - "timestamp": 1030732523, - "heart_rate": 62 - }, - { - "timestamp": 1030732524, - "heart_rate": 61 - }, - { - "timestamp": 1030732525, - "heart_rate": 62 - }, - { - "timestamp": 1030732526, - "heart_rate": 63 - }, - { - "timestamp": 1030732527, - "heart_rate": 65 - }, - { - "timestamp": 1030732528, - "heart_rate": 65 - }, - { - "timestamp": 1030732529, - "heart_rate": 65 - }, - { - "timestamp": 1030732530, - "heart_rate": 64 - }, - { - "timestamp": 1030732531, - "heart_rate": 64 - }, - { - "timestamp": 1030732532, - "heart_rate": 63 - }, - { - "timestamp": 1030732533, - "heart_rate": 64 - }, - { - "timestamp": 1030732534, - "heart_rate": 63 - }, - { - "timestamp": 1030732535, - "heart_rate": 63 - }, - { - "timestamp": 1030732536, - "heart_rate": 64 - }, - { - "timestamp": 1030732537, - "heart_rate": 64 - }, - { - "timestamp": 1030732538, - "heart_rate": 64 - }, - { - "timestamp": 1030732539, - "heart_rate": 64 - }, - { - "timestamp": 1030732540, - "heart_rate": 65 - }, - { - "timestamp": 1030732541, - "heart_rate": 66 - }, - { - "timestamp": 1030732542, - "heart_rate": 66 - }, - { - "timestamp": 1030732543, - "heart_rate": 66 - }, - { - "timestamp": 1030732544, - "heart_rate": 66 - }, - { - "timestamp": 1030732545, - "heart_rate": 65 - }, - { - "timestamp": 1030732546, - "heart_rate": 65 - }, - { - "timestamp": 1030732547, - "heart_rate": 65 - }, - { - "timestamp": 1030732548, - "heart_rate": 65 - }, - { - "timestamp": 1030732549, - "heart_rate": 63 - }, - { - "timestamp": 1030732550, - "heart_rate": 61 - }, - { - "timestamp": 1030732551, - "heart_rate": 60 - }, - { - "timestamp": 1030732552, - "heart_rate": 60 - }, - { - "timestamp": 1030732553, - "heart_rate": 60 - }, - { - "timestamp": 1030732554, - "heart_rate": 61 - }, - { - "timestamp": 1030732555, - "heart_rate": 63 - }, - { - "timestamp": 1030732556, - "heart_rate": 65 - }, - { - "timestamp": 1030732557, - "heart_rate": 66 - }, - { - "timestamp": 1030732558, - "heart_rate": 66 - }, - { - "timestamp": 1030732559, - "heart_rate": 67 - }, - { - "timestamp": 1030732560, - "heart_rate": 67 - }, - { - "timestamp": 1030732561, - "heart_rate": 67 - }, - { - "timestamp": 1030732562, - "heart_rate": 67 - }, - { - "timestamp": 1030732563, - "heart_rate": 67 - }, - { - "timestamp": 1030732564, - "heart_rate": 67 - }, - { - "timestamp": 1030732565, - "heart_rate": 67 - }, - { - "timestamp": 1030732566, - "heart_rate": 68 - }, - { - "timestamp": 1030732567, - "heart_rate": 71 - }, - { - "timestamp": 1030732568, - "heart_rate": 74 - }, - { - "timestamp": 1030732569, - "heart_rate": 77 - }, - { - "timestamp": 1030732570, - "heart_rate": 79 - }, - { - "timestamp": 1030732571, - "heart_rate": 80 - }, - { - "timestamp": 1030732572, - "heart_rate": 81 - }, - { - "timestamp": 1030732573, - "heart_rate": 83 - }, - { - "timestamp": 1030732574, - "heart_rate": 85 - }, - { - "timestamp": 1030732575, - "heart_rate": 86 - }, - { - "timestamp": 1030732576, - "heart_rate": 88 - }, - { - "timestamp": 1030732577, - "heart_rate": 89 - }, - { - "timestamp": 1030732578, - "heart_rate": 91 - }, - { - "timestamp": 1030732579, - "heart_rate": 89 - }, - { - "timestamp": 1030732580, - "heart_rate": 88 - }, - { - "timestamp": 1030732581, - "heart_rate": 88 - }, - { - "timestamp": 1030732582, - "heart_rate": 89 - }, - { - "timestamp": 1030732583, - "heart_rate": 89 - }, - { - "timestamp": 1030732584, - "heart_rate": 90 - }, - { - "timestamp": 1030732585, - "heart_rate": 91 - }, - { - "timestamp": 1030732586, - "heart_rate": 93 - }, - { - "timestamp": 1030732587, - "heart_rate": 92 - }, - { - "timestamp": 1030732588, - "heart_rate": 92 - }, - { - "timestamp": 1030732589, - "heart_rate": 91 - }, - { - "timestamp": 1030732590, - "heart_rate": 91 - }, - { - "timestamp": 1030732591, - "heart_rate": 91 - } -] +'''data_expand_hr_mesgs.py: Contains the data for running the hr_mesgs_utils tests''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### + + +component_expansion_of_hr_messages = [ + 1242209, + 1242212.0, 1242213.7314453125, 1242215.5029296875, 1242215.865234375, 1242216.9541015625, 1242218.3369140625, 1242219.6220703125, 1242219.9853515625, + 1242220.71875, 1242221.2607421875, 1242221.83203125, 1242222.103515625, 1242222.970703125, 1242223.849609375, 1242224.234375, 1242225.193359375, + 1242225.537109375, 1242226.345703125, 1242226.9990234375, 1242227.599609375, 1242227.978515625, 1242228.5849609375, 1242228.962890625, 1242229.291015625, + 1242229.8154296875, 1242230.1708984375, 1242230.630859375, 1242230.9794921875, 1242231.3359375, 1242231.7421875, 1242232.041015625, 1242232.517578125, + 1242232.93359375, 1242233.2890625, 1242233.6767578125, 1242234.0703125, 1242234.4638671875, 1242234.9033203125, 1242235.23828125, 1242235.625, + 1242236.0126953125, 1242236.28125, 1242236.6396484375, 1242237.56640625, 1242239.478515625, 1242240.4189453125, 1242241.388671875, 1242242.35546875, + 1242244.2861328125, 1242245.2841796875, 1242246.279296875, 1242247.2900390625, 1242248.3251953125, 1242249.36328125, 1242250.736328125, 1242251.0703125, + 1242251.1640625, 1242251.921875, 1242252.546875, 1242253.5751953125, 1242254.6064453125, 1242255.6201171875, 1242256.626953125, 1242257.568359375, + 1242258.5009765625, 1242259.509765625, 1242260.5712890625, 1242261.142578125, 1242261.66796875, 1242262.72265625, 1242263.7890625, 1242264.869140625, + 1242265.951171875, 1242266.9794921875, 1242268.0087890625, 1242269.0380859375, 1242270.046875, 1242271.0712890625, 1242272.162109375, 1242273.3310546875, + 1242274.494140625, 1242275.6552734375, 1242276.802734375, 1242277.8896484375, 1242278.9677734375, 1242280.048828125, 1242281.115234375, 1242282.1796875, + 1242283.25, 1242284.296875, 1242285.30859375, 1242286.3388671875, 1242287.40625, 1242288.45703125, 1242289.4921875, 1242290.5458984375, + 1242291.5986328125, 1242292.62109375, 1242293.65625, 1242294.6943359375, 1242295.7236328125, 1242296.7744140625, 1242297.849609375, 1242298.5556640625, + 1242299.51953125, 1242300.2177734375, 1242301.1015625, 1242302.2080078125, 1242303.3037109375, 1242304.3857421875, 1242305.453125, 1242306.4921875, + 1242307.544921875, 1242308.609375, 1242309.6494140625, 1242310.6845703125, 1242311.732421875, 1242312.775390625, 1242313.8115234375, 1242314.8408203125, + 1242315.859375, 1242316.9033203125, 1242317.9716796875, 1242319.04296875, 1242320.0966796875, 1242321.1630859375, 1242322.1953125, 1242323.2197265625, + 1242324.2373046875, 1242325.2265625, 1242326.1767578125, 1242327.123046875, 1242328.013671875, 1242328.6884765625, 1242329.87109375, 1242330.8564453125, + 1242331.814453125, 1242332.830078125, 1242333.8212890625, 1242334.83203125, 1242335.818359375, 1242336.8076171875, 1242337.78515625, 1242338.7470703125, + 1242339.7216796875, 1242340.6982421875, 1242341.6806640625, 1242342.6708984375, 1242343.666015625, 1242344.6630859375, 1242345.685546875, 1242346.7275390625, + 1242347.77734375, 1242348.791015625, 1242349.7216796875, 1242350.5986328125, 1242351.5146484375, 1242352.513671875, 1242353.6279296875, 1242354.7880859375, + 1242355.931640625, 1242357.0771484375, 1242358.205078125, 1242359.259765625, 1242360.314453125, 1242361.353515625, 1242362.4091796875, 1242363.470703125, + 1242364.474609375, 1242365.4462890625, 1242366.568359375, 1242367.7119140625, 1242368.8740234375, 1242369.982421875, 1242369.982421875, 1242369.982421875, + 1242371, + 1242372.0, 1242373.0419921875, 1242374.0595703125, 1242375.05078125, 1242376.0244140625, 1242376.9765625, 1242378.0068359375, 1242379.0810546875, + 1242380.2138671875, 1242381.3935546875, 1242382.5712890625, 1242383.7431640625, 1242384.8720703125, 1242385.97265625, 1242387.052734375, 1242388.087890625, + 1242389.091796875, 1242390.1025390625, 1242391.1162109375, 1242392.1533203125, 1242393.1689453125, 1242394.20703125, 1242395.2685546875, 1242396.3369140625, + 1242397.40625, 1242398.4853515625, 1242399.5390625, 1242400.5693359375, 1242401.5380859375, 1242402.552734375, 1242403.6220703125, 1242404.7431640625, + 1242405.86328125, 1242407.0126953125, 1242408.162109375, 1242409.2705078125, 1242410.3994140625, 1242411.5, 1242412.537109375, 1242413.5380859375, + 1242414.4072265625, 1242415.48046875, 1242416.5419921875, 1242417.6337890625, 1242418.68359375, 1242419.787109375, 1242420.8564453125, 1242421.9287109375, + 1242423.005859375, 1242424.02734375, 1242425.076171875, 1242426.12109375, 1242427.1767578125, 1242428.25, 1242429.3076171875, 1242430.3662109375, + 1242431.41015625, 1242432.4521484375, 1242433.4482421875, 1242434.455078125, 1242435.5009765625, 1242436.58984375, 1242437.6796875, 1242438.79296875, + 1242439.8974609375, 1242441.0107421875, 1242442.1044921875, 1242443.228515625, 1242444.3642578125, 1242445.474609375, 1242446.5673828125, 1242447.328125, + 1242448.6318359375, 1242449.6572265625, 1242450.7001953125, 1242451.7587890625, 1242452.8447265625, 1242453.94140625, 1242455.126953125, 1242456.3349609375, + 1242457.541015625, 1242458.7265625, 1242459.9248046875, 1242461.1240234375, 1242462.2998046875, 1242463.4736328125, 1242464.650390625, 1242465.81640625, + 1242466.9931640625, 1242468.1953125, 1242469.3505859375, 1242470.5322265625, 1242471.7412109375, 1242472.94140625, 1242474.1318359375, 1242475.3251953125, + 1242476.5107421875, 1242477.6181640625, 1242478.712890625, 1242479.8349609375, 1242480.9765625, 1242482.10546875, 1242483.21875, 1242484.33984375, + 1242485.396484375, 1242486.486328125, 1242487.6201171875, 1242488.7890625, 1242489.9208984375, 1242491.0703125, 1242492.2373046875, 1242493.4111328125, + 1242494.5732421875, 1242495.7470703125, 1242496.919921875, 1242498.0927734375, 1242499.2978515625, 1242500.4833984375, 1242501.65234375, 1242502.84765625, + 1242504.0380859375, 1242505.185546875, 1242506.326171875, 1242507.306640625, 1242508.5546875, 1242509.6640625, 1242510.7578125, 1242511.8408203125, + 1242512.943359375, 1242514.0673828125, 1242515.19921875, 1242516.3330078125, 1242517.4306640625, 1242518.533203125, 1242519.6357421875, 1242520.7138671875, + 1242521.80859375, 1242522.91015625, 1242523.9892578125, 1242525.08984375, 1242526.20703125, 1242527.3232421875, 1242528.4365234375, 1242529.53515625, + 1242530.6279296875, 1242531.673828125, 1242532.7119140625, 1242533.759765625, 1242534.8017578125, 1242535.83203125, 1242536.8779296875, 1242537.9150390625, + 1242538.9453125, 1242539.982421875, 1242540.98828125, 1242542.01171875, 1242543.0478515625, 1242544.1103515625, 1242545.2109375, 1242546.3203125, + 1242547.4580078125, 1242548.6123046875, 1242549.7822265625, 1242550.9775390625, 1242552.1669921875, 1242553.3349609375, 1242554.5078125, 1242555.6220703125, + 1242556.63671875, 1242557.666015625, 1242558.77734375, 1242559.89453125, 1242561.0458984375, 1242562.2314453125, 1242563.38671875, 1242564.5478515625, + 1242565.7177734375, 1242566.87109375, 1242568.041015625, 1242569.2255859375, 1242570.392578125, 1242571.5810546875, 1242572.79296875, 1242573.93359375, + 1242575.0634765625, 1242576.2080078125, 1242577.33203125, 1242578.447265625, 1242579.5517578125, 1242580.6748046875, 1242581.8388671875, 1242582.9521484375, + 1242584.0771484375, 1242585.220703125, 1242586.34375, 1242587.474609375, 1242588.6162109375, 1242589.7529296875, 1242590.9287109375, 1242592.11328125, + 1242593.3251953125, 1242594.53515625, 1242595.7724609375, 1242596.9892578125, 1242598.1728515625, 1242599.3134765625, 1242600.4345703125, 1242601.4814453125, + 1242602.4345703125, 1242603.390625, 1242604.404296875, 1242605.4287109375, 1242606.44921875, 1242607.4765625, 1242608.5234375, 1242609.35546875, + 1242609.8701171875, 1242610.9150390625, 1242611.9345703125, 1242612.939453125, 1242613.8974609375, 1242614.3642578125, 1242615.4052734375, 1242616.30078125, + 1242617.1884765625, 1242618.3427734375, 1242619.396484375, 1242619.9580078125, 1242621.015625, 1242621.939453125, 1242622.609375, 1242623.1474609375, + 1242623.92578125, 1242624.7041015625, 1242625.482421875, 1242626.5693359375, 1242627.5361328125, 1242628.419921875, 1242629.4208984375, 1242630.4853515625, + 1242631.486328125, 1242632.6103515625, 1242633.177734375, 1242633.8720703125, 1242634.8076171875, 1242635.220703125, 1242636.041015625, 1242636.732421875, + 1242637.4638671875, 1242638.1318359375, 1242638.765625, 1242639.2099609375, 1242639.8291015625, 1242640.5673828125, 1242640.9833984375, 1242641.58203125, + 1242642.1806640625, 1242642.6279296875, 1242643.330078125, 1242643.92578125, 1242644.515625, 1242645.1103515625, 1242645.5888671875, 1242646.17578125, + 1242646.74609375, 1242647.3330078125, 1242647.9072265625, 1242648.5498046875, 1242649.166015625, 1242649.681640625, 1242650.4130859375, 1242651.2177734375, + 1242651.8798828125, 1242652.744140625, 1242653.45703125, 1242654.244140625, 1242654.9755859375, 1242655.544921875, 1242656.203125, 1242656.8857421875, + 1242657.6220703125, 1242658.3173828125, 1242659.0693359375, 1242659.779296875, 1242660.4892578125, 1242661.1982421875, 1242662.560546875, 1242662.869140625, + 1242663.185546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, 1242663.560546875, + 1242959, + 1242960.0, 1242962.28515625, 1242963.3388671875, 1242964.3212890625, 1242965.3193359375, 1242966.2392578125, 1242967.150390625, 1242968.0263671875, + 1242969.041015625, 1242969.5400390625, 1242970.552734375, 1242971.1083984375, 1242972.1123046875, 1242973.158203125, 1242973.439453125, 1242973.9423828125, + 1242974.7841796875, 1242975.8095703125, 1242976.6220703125, 1242977.3203125, 1242978.3544921875, 1242979.2958984375, 1242980.1875, 1242981.12890625, + 1242982.130859375, 1242983.130859375, 1242984.1640625, 1242985.2080078125, 1242986.33203125, 1242987.5859375, 1242988.6240234375, 1242989.298828125, + 1242990.4794921875, 1242991.49609375, 1242992.0546875, 1242992.6044921875, 1242993.2138671875, 1242993.474609375, 1242994.2900390625, 1242994.9638671875, + 1242995.2333984375, 1242995.810546875, 1242996.0703125, 1242996.724609375, 1242997.26171875, 1242997.7607421875, 1242998.0234375, 1242998.400390625, + 1242998.8408203125, 1242999.455078125, 1242999.943359375, 1243000.59765625, 1243001.2041015625, 1243001.748046875, 1243002.2939453125, 1243002.8583984375, + 1243003.5771484375, 1243004.2158203125, 1243004.8154296875, 1243005.2958984375, 1243005.9736328125, 1243006.2998046875, 1243006.9052734375, 1243007.490234375, + 1243008.0478515625, 1243008.818359375, 1243009.2353515625, 1243009.9482421875, 1243010.71875, 1243011.47265625, 1243012.20703125, 1243012.9541015625, + 1243013.701171875, 1243014.4716796875, 1243015.236328125, 1243016.005859375, 1243016.6005859375, 1243017.5107421875, 1243018.248046875, 1243018.876953125, + 1243019.7783203125, 1243020.5439453125, 1243021.337890625, 1243022.1103515625, 1243022.931640625, 1243023.73046875, 1243024.5263671875, 1243025.3125, + 1243026.12890625, 1243026.6640625, 1243027.3427734375, 1243027.7578125, 1243028.578125, 1243029.4013671875, 1243030.1923828125, 1243031.0107421875, + 1243031.8251953125, 1243032.62890625, 1243033.40625, 1243034.197265625, 1243034.982421875, 1243035.8359375, 1243036.56640625, 1243037.3828125, + 1243038.197265625, 1243039.0830078125, 1243039.9013671875, 1243040.7587890625, 1243041.333984375, 1243042.330078125, 1243043.4169921875, 1243044.494140625, + 1243045.0302734375, 1243045.888671875, 1243046.4521484375, 1243047.0185546875, 1243047.5419921875, 1243048.1904296875, 1243048.619140625, 1243049.40234375, + 1243049.8798828125, 1243050.65625, 1243051.419921875, 1243052.0634765625, 1243052.9853515625, 1243053.783203125, 1243054.595703125, 1243055.4287109375, + 1243056.26171875, 1243057.1005859375, 1243057.92578125, 1243058.7275390625, 1243059.4921875, 1243060.2705078125, 1243061.0703125, 1243061.8583984375, + 1243062.6826171875, 1243063.5068359375, 1243064.3251953125, 1243065.146484375, 1243065.998046875, 1243066.880859375, 1243067.748046875, 1243068.626953125, + 1243069.509765625, 1243070.400390625, 1243071.251953125, 1243072.125, 1243072.984375, 1243073.86328125, 1243074.6982421875, 1243075.576171875, + 1243076.4404296875, 1243077.3369140625, 1243078.224609375, 1243079.2919921875, 1243079.97265625, 1243080.8681640625, 1243081.76953125, 1243082.71484375, + 1243083.6669921875, 1243084.6142578125, 1243085.5546875, 1243086.474609375, 1243087.390625, 1243088.2919921875, 1243089.197265625, 1243090.0693359375, + 1243090.9384765625, 1243091.8349609375, 1243092.751953125, 1243093.716796875, 1243094.640625, 1243095.576171875, 1243096.50390625, 1243097.400390625, + 1243098.2666015625, 1243099.16796875, 1243100.0771484375, 1243100.9423828125, 1243101.8251953125, 1243102.7099609375, 1243103.6357421875, 1243104.544921875, + 1243105.462890625, 1243106.357421875, 1243107.283203125, 1243108.162109375, 1243109.291015625, 1243109.92578125, 1243110.8173828125, 1243111.69921875, + 1243112.591796875, 1243113.484375, 1243114.3818359375, 1243115.3056640625, 1243116.1572265625, 1243117.0439453125, 1243117.9130859375, 1243118.759765625, + 1243119.619140625, 1243120.49609375, 1243121.3037109375, 1243122.15625, 1243122.9951171875, 1243123.8408203125, 1243124.6572265625, 1243125.5234375, + 1243126.4296875, 1243127.345703125, 1243128.24609375, 1243129.1162109375, 1243129.9873046875, 1243130.8427734375, 1243131.693359375, 1243132.537109375, + 1243133.392578125, 1243134.2099609375, 1243135.0498046875, 1243135.8857421875, 1243136.6962890625, 1243137.5595703125, 1243138.41015625, 1243139.1396484375, + 1243140.056640625, 1243141.23046875, 1243142.0625, 1243142.68359375, 1243143.3212890625, 1243144.1484375, 1243145.0078125, 1243145.8818359375, + 1243146.7666015625, 1243147.6484375, 1243148.5732421875, 1243149.482421875, 1243150.423828125, 1243151.373046875, 1243152.3349609375, 1243153.25, + 1243154.19140625, 1243155.1259765625, 1243156.0615234375, 1243157.0126953125, 1243157.9677734375, 1243158.9013671875, 1243159.8447265625, 1243160.779296875, + 1243161.6953125, 1243162.6357421875, 1243163.60546875, 1243164.5810546875, 1243165.5107421875, 1243166.4619140625, 1243167.3974609375, 1243168.33984375, + 1243169.1240234375, 1243170.2392578125, 1243171.1533203125, 1243172.0419921875, 1243172.9208984375, 1243173.6552734375, 1243174.66015625, 1243175.5439453125, + 1243176.466796875, 1243177.404296875, 1243178.35546875, 1243179.318359375, 1243180.25, 1243181.1796875, 1243182.0869140625, 1243183.0, + 1243183.9267578125, 1243184.849609375, 1243185.75, 1243186.6474609375, 1243187.546875, 1243188.4638671875, 1243189.3857421875, 1243190.2900390625, + 1243191.1982421875, 1243192.091796875, 1243192.978515625, 1243193.818359375, 1243194.638671875, 1243195.4541015625, 1243196.2802734375, 1243197.1318359375, + 1243198.0029296875, 1243198.8828125, 1243199.7529296875, 1243200.6591796875, 1243201.5380859375, 1243202.447265625, 1243203.3681640625, 1243204.236328125, + 1243205.1572265625, 1243206.103515625, 1243207.09765625, 1243208.09765625, 1243209.115234375, 1243210.1513671875, 1243211.1650390625, 1243212.1845703125, + 1243213.208984375, 1243214.201171875, 1243215.1787109375, 1243216.1171875, 1243217.0703125, 1243218.0224609375, 1243218.9775390625, 1243219.9580078125, + 1243220.9599609375, 1243221.953125, 1243222.8662109375, 1243223.7861328125, 1243224.69921875, 1243225.6396484375, 1243226.541015625, 1243227.4970703125, + 1243228.4462890625, 1243229.2880859375, 1243230.248046875, 1243231.1767578125, 1243232.1533203125, 1243233.0966796875, 1243234.033203125, 1243234.9755859375, + 1243235.919921875, 1243236.837890625, 1243237.71875, 1243238.6357421875, 1243239.5068359375, 1243240.43359375, 1243241.3515625, 1243242.26953125, + 1243243.107421875, 1243244.044921875, 1243244.9619140625, 1243245.94921875, 1243246.9560546875, 1243247.96484375, 1243249.080078125, 1243249.9404296875, + 1243250.89453125, 1243251.8291015625, 1243252.744140625, 1243253.6474609375, 1243254.55078125, 1243255.46484375, 1243256.3544921875, 1243257.2412109375, + 1243258.1591796875, 1243259.27734375, 1243260.03515625, 1243260.9609375, 1243261.9052734375, 1243262.791015625, 1243263.6513671875, 1243264.478515625, + 1243265.25, 1243266.01953125, 1243266.7841796875, 1243267.5302734375, 1243268.26953125, 1243269.0107421875, 1243269.751953125, 1243270.4755859375, + 1243271.1796875, 1243271.876953125, 1243272.5615234375, 1243273.2373046875, 1243273.9189453125, 1243274.591796875, 1243275.2490234375, 1243275.9033203125, + 1243276.595703125, 1243277.2861328125, 1243277.96484375, 1243278.626953125, 1243279.3115234375, 1243279.98046875, 1243280.6591796875, 1243281.3291015625, + 1243281.9873046875, 1243282.6435546875, 1243283.287109375, 1243283.9296875, 1243284.587890625, 1243285.2509765625, 1243285.904296875, 1243286.5712890625, + 1243287.228515625, 1243287.8857421875, 1243288.55859375, 1243289.1240234375, 1243289.76171875, 1243290.3994140625, 1243291.037109375, 1243291.6748046875, + 1243292.0361328125, 1243292.7470703125, 1243293.453125, 1243294.1689453125, 1243294.8798828125, 1243295.58203125, 1243296.2900390625, 1243296.9912109375, + 1243297.6904296875, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, 1243298.39453125, +] + +expanded_hr_messages = [ + { + "timestamp": 1030731510, + "heart_rate": 71 + }, + { + "timestamp": 1030731510.25, + "heart_rate": 71 + }, + { + "timestamp": 1030731510.5, + "heart_rate": 71 + }, + { + "timestamp": 1030731510.75, + "heart_rate": 71 + }, + { + "timestamp": 1030731511, + "heart_rate": 71 + }, + { + "timestamp": 1030731511.25, + "heart_rate": 71 + }, + { + "timestamp": 1030731511.5, + "heart_rate": 71 + }, + { + "timestamp": 1030731511.75, + "heart_rate": 71 + }, + { + "timestamp": 1030731512, + "heart_rate": 71 + }, + { + "timestamp": 1030731512.25, + "heart_rate": 71 + }, + { + "timestamp": 1030731512.5, + "heart_rate": 71 + }, + { + "timestamp": 1030731512.75, + "heart_rate": 71 + }, + { + "timestamp": 1030731513, + "heart_rate": 71 + }, + { + "timestamp": 1030731513.25, + "heart_rate": 71 + }, + { + "timestamp": 1030731513.5, + "heart_rate": 71 + }, + { + "timestamp": 1030731513.75, + "heart_rate": 71 + }, + { + "timestamp": 1030731514, + "heart_rate": 71 + }, + { + "timestamp": 1030731514.25, + "heart_rate": 71 + }, + { + "timestamp": 1030731514.5, + "heart_rate": 71 + }, + { + "timestamp": 1030731514.7314453, + "heart_rate": 71 + }, + { + "timestamp": 1030731514.9814453, + "heart_rate": 71 + }, + { + "timestamp": 1030731515.2314453, + "heart_rate": 71 + }, + { + "timestamp": 1030731515.4814453, + "heart_rate": 71 + }, + { + "timestamp": 1030731515.7314453, + "heart_rate": 71 + }, + { + "timestamp": 1030731515.9814453, + "heart_rate": 71 + }, + { + "timestamp": 1030731516.2314453, + "heart_rate": 71 + }, + { + "timestamp": 1030731516.4814453, + "heart_rate": 71 + }, + { + "timestamp": 1030731516.5029297, + "heart_rate": 71 + }, + { + "timestamp": 1030731516.7529297, + "heart_rate": 71 + }, + { + "timestamp": 1030731516.8652344, + "heart_rate": 71 + }, + { + "timestamp": 1030731517.1152344, + "heart_rate": 71 + }, + { + "timestamp": 1030731517.3652344, + "heart_rate": 71 + }, + { + "timestamp": 1030731517.6152344, + "heart_rate": 71 + }, + { + "timestamp": 1030731517.8652344, + "heart_rate": 71 + }, + { + "timestamp": 1030731517.9541016, + "heart_rate": 71 + }, + { + "timestamp": 1030731518.2041016, + "heart_rate": 71 + }, + { + "timestamp": 1030731518.4541016, + "heart_rate": 71 + }, + { + "timestamp": 1030731518.7041016, + "heart_rate": 71 + }, + { + "timestamp": 1030731518.9541016, + "heart_rate": 71 + }, + { + "timestamp": 1030731519.2041016, + "heart_rate": 71 + }, + { + "timestamp": 1030731519.3369141, + "heart_rate": 71 + }, + { + "timestamp": 1030731519.5869141, + "heart_rate": 71 + }, + { + "timestamp": 1030731519.8369141, + "heart_rate": 71 + }, + { + "timestamp": 1030731520.0869141, + "heart_rate": 71 + }, + { + "timestamp": 1030731520.3369141, + "heart_rate": 71 + }, + { + "timestamp": 1030731520.5869141, + "heart_rate": 71 + }, + { + "timestamp": 1030731520.6220703, + "heart_rate": 71 + }, + { + "timestamp": 1030731520.8720703, + "heart_rate": 71 + }, + { + "timestamp": 1030731520.9853516, + "heart_rate": 71 + }, + { + "timestamp": 1030731521.2353516, + "heart_rate": 71 + }, + { + "timestamp": 1030731521.4853516, + "heart_rate": 71 + }, + { + "timestamp": 1030731521.71875, + "heart_rate": 71 + }, + { + "timestamp": 1030731521.96875, + "heart_rate": 71 + }, + { + "timestamp": 1030731522.21875, + "heart_rate": 71 + }, + { + "timestamp": 1030731522.2607422, + "heart_rate": 71 + }, + { + "timestamp": 1030731522.5107422, + "heart_rate": 71 + }, + { + "timestamp": 1030731522.7607422, + "heart_rate": 71 + }, + { + "timestamp": 1030731522.8320312, + "heart_rate": 71 + }, + { + "timestamp": 1030731523.0820312, + "heart_rate": 71 + }, + { + "timestamp": 1030731523.1035156, + "heart_rate": 71 + }, + { + "timestamp": 1030731523.3535156, + "heart_rate": 71 + }, + { + "timestamp": 1030731523.6035156, + "heart_rate": 71 + }, + { + "timestamp": 1030731523.8535156, + "heart_rate": 71 + }, + { + "timestamp": 1030731523.9707031, + "heart_rate": 71 + }, + { + "timestamp": 1030731524.2207031, + "heart_rate": 71 + }, + { + "timestamp": 1030731524.4707031, + "heart_rate": 71 + }, + { + "timestamp": 1030731524.7207031, + "heart_rate": 71 + }, + { + "timestamp": 1030731524.8496094, + "heart_rate": 71 + }, + { + "timestamp": 1030731525.0996094, + "heart_rate": 71 + }, + { + "timestamp": 1030731525.234375, + "heart_rate": 71 + }, + { + "timestamp": 1030731525.484375, + "heart_rate": 71 + }, + { + "timestamp": 1030731525.734375, + "heart_rate": 71 + }, + { + "timestamp": 1030731525.984375, + "heart_rate": 71 + }, + { + "timestamp": 1030731526.1933594, + "heart_rate": 71 + }, + { + "timestamp": 1030731526.4433594, + "heart_rate": 71 + }, + { + "timestamp": 1030731526.5371094, + "heart_rate": 71 + }, + { + "timestamp": 1030731526.7871094, + "heart_rate": 71 + }, + { + "timestamp": 1030731527.0371094, + "heart_rate": 71 + }, + { + "timestamp": 1030731527.2871094, + "heart_rate": 71 + }, + { + "timestamp": 1030731527.3457031, + "heart_rate": 71 + }, + { + "timestamp": 1030731527.5957031, + "heart_rate": 71 + }, + { + "timestamp": 1030731527.8457031, + "heart_rate": 71 + }, + { + "timestamp": 1030731527.9990234, + "heart_rate": 71 + }, + { + "timestamp": 1030731528.2490234, + "heart_rate": 71 + }, + { + "timestamp": 1030731528.4990234, + "heart_rate": 71 + }, + { + "timestamp": 1030731528.5996094, + "heart_rate": 71 + }, + { + "timestamp": 1030731528.8496094, + "heart_rate": 71 + }, + { + "timestamp": 1030731528.9785156, + "heart_rate": 71 + }, + { + "timestamp": 1030731529.2285156, + "heart_rate": 71 + }, + { + "timestamp": 1030731529.4785156, + "heart_rate": 71 + }, + { + "timestamp": 1030731529.5849609, + "heart_rate": 71 + }, + { + "timestamp": 1030731529.8349609, + "heart_rate": 71 + }, + { + "timestamp": 1030731529.9628906, + "heart_rate": 71 + }, + { + "timestamp": 1030731530.2128906, + "heart_rate": 71 + }, + { + "timestamp": 1030731530.2910156, + "heart_rate": 72 + }, + { + "timestamp": 1030731530.5410156, + "heart_rate": 72 + }, + { + "timestamp": 1030731530.7910156, + "heart_rate": 72 + }, + { + "timestamp": 1030731530.8154297, + "heart_rate": 72 + }, + { + "timestamp": 1030731531.0654297, + "heart_rate": 72 + }, + { + "timestamp": 1030731531.1708984, + "heart_rate": 72 + }, + { + "timestamp": 1030731531.4208984, + "heart_rate": 72 + }, + { + "timestamp": 1030731531.6308594, + "heart_rate": 72 + }, + { + "timestamp": 1030731531.8808594, + "heart_rate": 72 + }, + { + "timestamp": 1030731531.9794922, + "heart_rate": 72 + }, + { + "timestamp": 1030731532.2294922, + "heart_rate": 72 + }, + { + "timestamp": 1030731532.3359375, + "heart_rate": 73 + }, + { + "timestamp": 1030731532.5859375, + "heart_rate": 73 + }, + { + "timestamp": 1030731532.7421875, + "heart_rate": 73 + }, + { + "timestamp": 1030731532.9921875, + "heart_rate": 73 + }, + { + "timestamp": 1030731533.0410156, + "heart_rate": 74 + }, + { + "timestamp": 1030731533.2910156, + "heart_rate": 74 + }, + { + "timestamp": 1030731533.5175781, + "heart_rate": 74 + }, + { + "timestamp": 1030731533.7675781, + "heart_rate": 74 + }, + { + "timestamp": 1030731533.9335938, + "heart_rate": 75 + }, + { + "timestamp": 1030731534.1835938, + "heart_rate": 75 + }, + { + "timestamp": 1030731534.2890625, + "heart_rate": 76 + }, + { + "timestamp": 1030731534.5390625, + "heart_rate": 76 + }, + { + "timestamp": 1030731534.6767578, + "heart_rate": 77 + }, + { + "timestamp": 1030731534.9267578, + "heart_rate": 77 + }, + { + "timestamp": 1030731535.0703125, + "heart_rate": 79 + }, + { + "timestamp": 1030731535.3203125, + "heart_rate": 79 + }, + { + "timestamp": 1030731535.4638672, + "heart_rate": 81 + }, + { + "timestamp": 1030731535.7138672, + "heart_rate": 81 + }, + { + "timestamp": 1030731535.9033203, + "heart_rate": 81 + }, + { + "timestamp": 1030731536.1533203, + "heart_rate": 81 + }, + { + "timestamp": 1030731536.2382812, + "heart_rate": 81 + }, + { + "timestamp": 1030731536.4882812, + "heart_rate": 81 + }, + { + "timestamp": 1030731536.625, + "heart_rate": 81 + }, + { + "timestamp": 1030731536.875, + "heart_rate": 81 + }, + { + "timestamp": 1030731537.0126953, + "heart_rate": 81 + }, + { + "timestamp": 1030731537.2626953, + "heart_rate": 81 + }, + { + "timestamp": 1030731537.28125, + "heart_rate": 81 + }, + { + "timestamp": 1030731537.53125, + "heart_rate": 81 + }, + { + "timestamp": 1030731537.6396484, + "heart_rate": 82 + }, + { + "timestamp": 1030731537.8896484, + "heart_rate": 82 + }, + { + "timestamp": 1030731538.1396484, + "heart_rate": 82 + }, + { + "timestamp": 1030731538.3896484, + "heart_rate": 82 + }, + { + "timestamp": 1030731538.5664062, + "heart_rate": 82 + }, + { + "timestamp": 1030731538.8164062, + "heart_rate": 82 + }, + { + "timestamp": 1030731539.0664062, + "heart_rate": 82 + }, + { + "timestamp": 1030731539.3164062, + "heart_rate": 82 + }, + { + "timestamp": 1030731539.5664062, + "heart_rate": 82 + }, + { + "timestamp": 1030731539.8164062, + "heart_rate": 82 + }, + { + "timestamp": 1030731540.0664062, + "heart_rate": 82 + }, + { + "timestamp": 1030731540.3164062, + "heart_rate": 82 + }, + { + "timestamp": 1030731540.4785156, + "heart_rate": 82 + }, + { + "timestamp": 1030731540.7285156, + "heart_rate": 82 + }, + { + "timestamp": 1030731540.9785156, + "heart_rate": 82 + }, + { + "timestamp": 1030731541.2285156, + "heart_rate": 82 + }, + { + "timestamp": 1030731541.4189453, + "heart_rate": 82 + }, + { + "timestamp": 1030731541.6689453, + "heart_rate": 82 + }, + { + "timestamp": 1030731541.9189453, + "heart_rate": 82 + }, + { + "timestamp": 1030731542.1689453, + "heart_rate": 82 + }, + { + "timestamp": 1030731542.3886719, + "heart_rate": 82 + }, + { + "timestamp": 1030731542.6386719, + "heart_rate": 82 + }, + { + "timestamp": 1030731542.8886719, + "heart_rate": 82 + }, + { + "timestamp": 1030731543.1386719, + "heart_rate": 82 + }, + { + "timestamp": 1030731543.3554688, + "heart_rate": 83 + }, + { + "timestamp": 1030731543.6054688, + "heart_rate": 83 + }, + { + "timestamp": 1030731543.8554688, + "heart_rate": 83 + }, + { + "timestamp": 1030731544.1054688, + "heart_rate": 83 + }, + { + "timestamp": 1030731544.3554688, + "heart_rate": 83 + }, + { + "timestamp": 1030731544.6054688, + "heart_rate": 83 + }, + { + "timestamp": 1030731544.8554688, + "heart_rate": 83 + }, + { + "timestamp": 1030731545.1054688, + "heart_rate": 83 + }, + { + "timestamp": 1030731545.2861328, + "heart_rate": 83 + }, + { + "timestamp": 1030731545.5361328, + "heart_rate": 83 + }, + { + "timestamp": 1030731545.7861328, + "heart_rate": 83 + }, + { + "timestamp": 1030731546.0361328, + "heart_rate": 83 + }, + { + "timestamp": 1030731546.2841797, + "heart_rate": 83 + }, + { + "timestamp": 1030731546.5341797, + "heart_rate": 83 + }, + { + "timestamp": 1030731546.7841797, + "heart_rate": 83 + }, + { + "timestamp": 1030731547.0341797, + "heart_rate": 83 + }, + { + "timestamp": 1030731547.2792969, + "heart_rate": 83 + }, + { + "timestamp": 1030731547.5292969, + "heart_rate": 83 + }, + { + "timestamp": 1030731547.7792969, + "heart_rate": 83 + }, + { + "timestamp": 1030731548.0292969, + "heart_rate": 83 + }, + { + "timestamp": 1030731548.2792969, + "heart_rate": 83 + }, + { + "timestamp": 1030731548.2900391, + "heart_rate": 83 + }, + { + "timestamp": 1030731548.5400391, + "heart_rate": 83 + }, + { + "timestamp": 1030731548.7900391, + "heart_rate": 83 + }, + { + "timestamp": 1030731549.0400391, + "heart_rate": 83 + }, + { + "timestamp": 1030731549.2900391, + "heart_rate": 83 + }, + { + "timestamp": 1030731549.3251953, + "heart_rate": 84 + }, + { + "timestamp": 1030731549.5751953, + "heart_rate": 84 + }, + { + "timestamp": 1030731549.8251953, + "heart_rate": 84 + }, + { + "timestamp": 1030731550.0751953, + "heart_rate": 84 + }, + { + "timestamp": 1030731550.3251953, + "heart_rate": 84 + }, + { + "timestamp": 1030731550.3632812, + "heart_rate": 85 + }, + { + "timestamp": 1030731550.6132812, + "heart_rate": 85 + }, + { + "timestamp": 1030731550.8632812, + "heart_rate": 85 + }, + { + "timestamp": 1030731551.1132812, + "heart_rate": 85 + }, + { + "timestamp": 1030731551.3632812, + "heart_rate": 85 + }, + { + "timestamp": 1030731551.6132812, + "heart_rate": 85 + }, + { + "timestamp": 1030731551.7363281, + "heart_rate": 85 + }, + { + "timestamp": 1030731551.9863281, + "heart_rate": 85 + }, + { + "timestamp": 1030731552.0703125, + "heart_rate": 85 + }, + { + "timestamp": 1030731552.1640625, + "heart_rate": 85 + }, + { + "timestamp": 1030731552.4140625, + "heart_rate": 85 + }, + { + "timestamp": 1030731552.6640625, + "heart_rate": 85 + }, + { + "timestamp": 1030731552.9140625, + "heart_rate": 85 + }, + { + "timestamp": 1030731552.921875, + "heart_rate": 85 + }, + { + "timestamp": 1030731553.171875, + "heart_rate": 85 + }, + { + "timestamp": 1030731553.421875, + "heart_rate": 85 + }, + { + "timestamp": 1030731553.546875, + "heart_rate": 85 + }, + { + "timestamp": 1030731553.796875, + "heart_rate": 85 + }, + { + "timestamp": 1030731554.046875, + "heart_rate": 85 + }, + { + "timestamp": 1030731554.296875, + "heart_rate": 85 + }, + { + "timestamp": 1030731554.546875, + "heart_rate": 85 + }, + { + "timestamp": 1030731554.5751953, + "heart_rate": 85 + }, + { + "timestamp": 1030731554.8251953, + "heart_rate": 85 + }, + { + "timestamp": 1030731555.0751953, + "heart_rate": 85 + }, + { + "timestamp": 1030731555.3251953, + "heart_rate": 85 + }, + { + "timestamp": 1030731555.5751953, + "heart_rate": 85 + }, + { + "timestamp": 1030731555.6064453, + "heart_rate": 85 + }, + { + "timestamp": 1030731555.8564453, + "heart_rate": 85 + }, + { + "timestamp": 1030731556.1064453, + "heart_rate": 85 + }, + { + "timestamp": 1030731556.3564453, + "heart_rate": 85 + }, + { + "timestamp": 1030731556.6064453, + "heart_rate": 85 + }, + { + "timestamp": 1030731556.6201172, + "heart_rate": 85 + }, + { + "timestamp": 1030731556.8701172, + "heart_rate": 85 + }, + { + "timestamp": 1030731557.1201172, + "heart_rate": 85 + }, + { + "timestamp": 1030731557.3701172, + "heart_rate": 85 + }, + { + "timestamp": 1030731557.6201172, + "heart_rate": 85 + }, + { + "timestamp": 1030731557.6269531, + "heart_rate": 85 + }, + { + "timestamp": 1030731557.8769531, + "heart_rate": 85 + }, + { + "timestamp": 1030731558.1269531, + "heart_rate": 85 + }, + { + "timestamp": 1030731558.3769531, + "heart_rate": 85 + }, + { + "timestamp": 1030731558.5683594, + "heart_rate": 85 + }, + { + "timestamp": 1030731558.8183594, + "heart_rate": 85 + }, + { + "timestamp": 1030731559.0683594, + "heart_rate": 85 + }, + { + "timestamp": 1030731559.3183594, + "heart_rate": 85 + }, + { + "timestamp": 1030731559.5009766, + "heart_rate": 85 + }, + { + "timestamp": 1030731559.7509766, + "heart_rate": 85 + }, + { + "timestamp": 1030731560.0009766, + "heart_rate": 85 + }, + { + "timestamp": 1030731560.2509766, + "heart_rate": 85 + }, + { + "timestamp": 1030731560.5009766, + "heart_rate": 85 + }, + { + "timestamp": 1030731560.5097656, + "heart_rate": 86 + }, + { + "timestamp": 1030731560.7597656, + "heart_rate": 86 + }, + { + "timestamp": 1030731561.0097656, + "heart_rate": 86 + }, + { + "timestamp": 1030731561.2597656, + "heart_rate": 86 + }, + { + "timestamp": 1030731561.5097656, + "heart_rate": 86 + }, + { + "timestamp": 1030731561.5712891, + "heart_rate": 83 + }, + { + "timestamp": 1030731561.8212891, + "heart_rate": 83 + }, + { + "timestamp": 1030731562.0712891, + "heart_rate": 83 + }, + { + "timestamp": 1030731562.1425781, + "heart_rate": 83 + }, + { + "timestamp": 1030731562.3925781, + "heart_rate": 83 + }, + { + "timestamp": 1030731562.6425781, + "heart_rate": 83 + }, + { + "timestamp": 1030731562.6679688, + "heart_rate": 83 + }, + { + "timestamp": 1030731562.9179688, + "heart_rate": 83 + }, + { + "timestamp": 1030731563.1679688, + "heart_rate": 83 + }, + { + "timestamp": 1030731563.4179688, + "heart_rate": 83 + }, + { + "timestamp": 1030731563.6679688, + "heart_rate": 83 + }, + { + "timestamp": 1030731563.7226562, + "heart_rate": 83 + }, + { + "timestamp": 1030731563.9726562, + "heart_rate": 83 + }, + { + "timestamp": 1030731564.2226562, + "heart_rate": 83 + }, + { + "timestamp": 1030731564.4726562, + "heart_rate": 83 + }, + { + "timestamp": 1030731564.7226562, + "heart_rate": 83 + }, + { + "timestamp": 1030731564.7890625, + "heart_rate": 83 + }, + { + "timestamp": 1030731565.0390625, + "heart_rate": 83 + }, + { + "timestamp": 1030731565.2890625, + "heart_rate": 83 + }, + { + "timestamp": 1030731565.5390625, + "heart_rate": 83 + }, + { + "timestamp": 1030731565.7890625, + "heart_rate": 83 + }, + { + "timestamp": 1030731565.8691406, + "heart_rate": 82 + }, + { + "timestamp": 1030731566.1191406, + "heart_rate": 82 + }, + { + "timestamp": 1030731566.3691406, + "heart_rate": 82 + }, + { + "timestamp": 1030731566.6191406, + "heart_rate": 82 + }, + { + "timestamp": 1030731566.8691406, + "heart_rate": 82 + }, + { + "timestamp": 1030731566.9511719, + "heart_rate": 82 + }, + { + "timestamp": 1030731567.2011719, + "heart_rate": 82 + }, + { + "timestamp": 1030731567.4511719, + "heart_rate": 82 + }, + { + "timestamp": 1030731567.7011719, + "heart_rate": 82 + }, + { + "timestamp": 1030731567.9511719, + "heart_rate": 82 + }, + { + "timestamp": 1030731567.9794922, + "heart_rate": 81 + }, + { + "timestamp": 1030731568.2294922, + "heart_rate": 81 + }, + { + "timestamp": 1030731568.4794922, + "heart_rate": 81 + }, + { + "timestamp": 1030731568.7294922, + "heart_rate": 81 + }, + { + "timestamp": 1030731568.9794922, + "heart_rate": 81 + }, + { + "timestamp": 1030731569.0087891, + "heart_rate": 80 + }, + { + "timestamp": 1030731569.2587891, + "heart_rate": 80 + }, + { + "timestamp": 1030731569.5087891, + "heart_rate": 80 + }, + { + "timestamp": 1030731569.7587891, + "heart_rate": 80 + }, + { + "timestamp": 1030731570.0087891, + "heart_rate": 80 + }, + { + "timestamp": 1030731570.0380859, + "heart_rate": 79 + }, + { + "timestamp": 1030731570.2880859, + "heart_rate": 79 + }, + { + "timestamp": 1030731570.5380859, + "heart_rate": 79 + }, + { + "timestamp": 1030731570.7880859, + "heart_rate": 79 + }, + { + "timestamp": 1030731571.0380859, + "heart_rate": 79 + }, + { + "timestamp": 1030731571.046875, + "heart_rate": 79 + }, + { + "timestamp": 1030731571.296875, + "heart_rate": 79 + }, + { + "timestamp": 1030731571.546875, + "heart_rate": 79 + }, + { + "timestamp": 1030731571.796875, + "heart_rate": 79 + }, + { + "timestamp": 1030731572.046875, + "heart_rate": 79 + }, + { + "timestamp": 1030731572.0712891, + "heart_rate": 79 + }, + { + "timestamp": 1030731572.3212891, + "heart_rate": 79 + }, + { + "timestamp": 1030731572.5712891, + "heart_rate": 79 + }, + { + "timestamp": 1030731572.8212891, + "heart_rate": 79 + }, + { + "timestamp": 1030731573.0712891, + "heart_rate": 79 + }, + { + "timestamp": 1030731573.1621094, + "heart_rate": 77 + }, + { + "timestamp": 1030731573.4121094, + "heart_rate": 77 + }, + { + "timestamp": 1030731573.6621094, + "heart_rate": 77 + }, + { + "timestamp": 1030731573.9121094, + "heart_rate": 77 + }, + { + "timestamp": 1030731574.1621094, + "heart_rate": 77 + }, + { + "timestamp": 1030731574.3310547, + "heart_rate": 76 + }, + { + "timestamp": 1030731574.5810547, + "heart_rate": 76 + }, + { + "timestamp": 1030731574.8310547, + "heart_rate": 76 + }, + { + "timestamp": 1030731575.0810547, + "heart_rate": 76 + }, + { + "timestamp": 1030731575.3310547, + "heart_rate": 76 + }, + { + "timestamp": 1030731575.4941406, + "heart_rate": 74 + }, + { + "timestamp": 1030731575.7441406, + "heart_rate": 74 + }, + { + "timestamp": 1030731575.9941406, + "heart_rate": 74 + }, + { + "timestamp": 1030731576.2441406, + "heart_rate": 74 + }, + { + "timestamp": 1030731576.4941406, + "heart_rate": 74 + }, + { + "timestamp": 1030731576.6552734, + "heart_rate": 72 + }, + { + "timestamp": 1030731576.9052734, + "heart_rate": 72 + }, + { + "timestamp": 1030731577.1552734, + "heart_rate": 72 + }, + { + "timestamp": 1030731577.4052734, + "heart_rate": 72 + }, + { + "timestamp": 1030731577.6552734, + "heart_rate": 72 + }, + { + "timestamp": 1030731577.8027344, + "heart_rate": 70 + }, + { + "timestamp": 1030731578.0527344, + "heart_rate": 70 + }, + { + "timestamp": 1030731578.3027344, + "heart_rate": 70 + }, + { + "timestamp": 1030731578.5527344, + "heart_rate": 70 + }, + { + "timestamp": 1030731578.8027344, + "heart_rate": 70 + }, + { + "timestamp": 1030731578.8896484, + "heart_rate": 69 + }, + { + "timestamp": 1030731579.1396484, + "heart_rate": 69 + }, + { + "timestamp": 1030731579.3896484, + "heart_rate": 69 + }, + { + "timestamp": 1030731579.6396484, + "heart_rate": 69 + }, + { + "timestamp": 1030731579.8896484, + "heart_rate": 69 + }, + { + "timestamp": 1030731579.9677734, + "heart_rate": 68 + }, + { + "timestamp": 1030731580.2177734, + "heart_rate": 68 + }, + { + "timestamp": 1030731580.4677734, + "heart_rate": 68 + }, + { + "timestamp": 1030731580.7177734, + "heart_rate": 68 + }, + { + "timestamp": 1030731580.9677734, + "heart_rate": 68 + }, + { + "timestamp": 1030731581.0488281, + "heart_rate": 64 + }, + { + "timestamp": 1030731581.2988281, + "heart_rate": 64 + }, + { + "timestamp": 1030731581.5488281, + "heart_rate": 64 + }, + { + "timestamp": 1030731581.7988281, + "heart_rate": 64 + }, + { + "timestamp": 1030731582.0488281, + "heart_rate": 64 + }, + { + "timestamp": 1030731582.1152344, + "heart_rate": 61 + }, + { + "timestamp": 1030731582.3652344, + "heart_rate": 61 + }, + { + "timestamp": 1030731582.6152344, + "heart_rate": 61 + }, + { + "timestamp": 1030731582.8652344, + "heart_rate": 61 + }, + { + "timestamp": 1030731583.1152344, + "heart_rate": 61 + }, + { + "timestamp": 1030731583.1796875, + "heart_rate": 60 + }, + { + "timestamp": 1030731583.4296875, + "heart_rate": 60 + }, + { + "timestamp": 1030731583.6796875, + "heart_rate": 60 + }, + { + "timestamp": 1030731583.9296875, + "heart_rate": 60 + }, + { + "timestamp": 1030731584.1796875, + "heart_rate": 60 + }, + { + "timestamp": 1030731584.25, + "heart_rate": 58 + }, + { + "timestamp": 1030731584.5, + "heart_rate": 58 + }, + { + "timestamp": 1030731584.75, + "heart_rate": 58 + }, + { + "timestamp": 1030731585, + "heart_rate": 58 + }, + { + "timestamp": 1030731585.25, + "heart_rate": 58 + }, + { + "timestamp": 1030731585.296875, + "heart_rate": 58 + }, + { + "timestamp": 1030731585.546875, + "heart_rate": 58 + }, + { + "timestamp": 1030731585.796875, + "heart_rate": 58 + }, + { + "timestamp": 1030731586.046875, + "heart_rate": 58 + }, + { + "timestamp": 1030731586.296875, + "heart_rate": 58 + }, + { + "timestamp": 1030731586.3085938, + "heart_rate": 58 + }, + { + "timestamp": 1030731586.5585938, + "heart_rate": 58 + }, + { + "timestamp": 1030731586.8085938, + "heart_rate": 58 + }, + { + "timestamp": 1030731587.0585938, + "heart_rate": 58 + }, + { + "timestamp": 1030731587.3085938, + "heart_rate": 58 + }, + { + "timestamp": 1030731587.3388672, + "heart_rate": 59 + }, + { + "timestamp": 1030731587.5888672, + "heart_rate": 59 + }, + { + "timestamp": 1030731587.8388672, + "heart_rate": 59 + }, + { + "timestamp": 1030731588.0888672, + "heart_rate": 59 + }, + { + "timestamp": 1030731588.3388672, + "heart_rate": 59 + }, + { + "timestamp": 1030731588.40625, + "heart_rate": 59 + }, + { + "timestamp": 1030731588.65625, + "heart_rate": 59 + }, + { + "timestamp": 1030731588.90625, + "heart_rate": 59 + }, + { + "timestamp": 1030731589.15625, + "heart_rate": 59 + }, + { + "timestamp": 1030731589.40625, + "heart_rate": 59 + }, + { + "timestamp": 1030731589.4570312, + "heart_rate": 59 + }, + { + "timestamp": 1030731589.7070312, + "heart_rate": 59 + }, + { + "timestamp": 1030731589.9570312, + "heart_rate": 59 + }, + { + "timestamp": 1030731590.2070312, + "heart_rate": 59 + }, + { + "timestamp": 1030731590.4570312, + "heart_rate": 59 + }, + { + "timestamp": 1030731590.4921875, + "heart_rate": 59 + }, + { + "timestamp": 1030731590.7421875, + "heart_rate": 59 + }, + { + "timestamp": 1030731590.9921875, + "heart_rate": 59 + }, + { + "timestamp": 1030731591.2421875, + "heart_rate": 59 + }, + { + "timestamp": 1030731591.4921875, + "heart_rate": 59 + }, + { + "timestamp": 1030731591.5458984, + "heart_rate": 59 + }, + { + "timestamp": 1030731591.7958984, + "heart_rate": 59 + }, + { + "timestamp": 1030731592.0458984, + "heart_rate": 59 + }, + { + "timestamp": 1030731592.2958984, + "heart_rate": 59 + }, + { + "timestamp": 1030731592.5458984, + "heart_rate": 59 + }, + { + "timestamp": 1030731592.5986328, + "heart_rate": 59 + }, + { + "timestamp": 1030731592.8486328, + "heart_rate": 59 + }, + { + "timestamp": 1030731593.0986328, + "heart_rate": 59 + }, + { + "timestamp": 1030731593.3486328, + "heart_rate": 59 + }, + { + "timestamp": 1030731593.5986328, + "heart_rate": 59 + }, + { + "timestamp": 1030731593.6210938, + "heart_rate": 58 + }, + { + "timestamp": 1030731593.8710938, + "heart_rate": 58 + }, + { + "timestamp": 1030731594.1210938, + "heart_rate": 58 + }, + { + "timestamp": 1030731594.3710938, + "heart_rate": 58 + }, + { + "timestamp": 1030731594.6210938, + "heart_rate": 58 + }, + { + "timestamp": 1030731594.65625, + "heart_rate": 59 + }, + { + "timestamp": 1030731594.90625, + "heart_rate": 59 + }, + { + "timestamp": 1030731595.15625, + "heart_rate": 59 + }, + { + "timestamp": 1030731595.40625, + "heart_rate": 59 + }, + { + "timestamp": 1030731595.65625, + "heart_rate": 59 + }, + { + "timestamp": 1030731595.6943359, + "heart_rate": 59 + }, + { + "timestamp": 1030731595.9443359, + "heart_rate": 59 + }, + { + "timestamp": 1030731596.1943359, + "heart_rate": 59 + }, + { + "timestamp": 1030731596.4443359, + "heart_rate": 59 + }, + { + "timestamp": 1030731596.6943359, + "heart_rate": 59 + }, + { + "timestamp": 1030731596.7236328, + "heart_rate": 59 + }, + { + "timestamp": 1030731596.9736328, + "heart_rate": 59 + }, + { + "timestamp": 1030731597.2236328, + "heart_rate": 59 + }, + { + "timestamp": 1030731597.4736328, + "heart_rate": 59 + }, + { + "timestamp": 1030731597.7236328, + "heart_rate": 59 + }, + { + "timestamp": 1030731597.7744141, + "heart_rate": 59 + }, + { + "timestamp": 1030731598.0244141, + "heart_rate": 59 + }, + { + "timestamp": 1030731598.2744141, + "heart_rate": 59 + }, + { + "timestamp": 1030731598.5244141, + "heart_rate": 59 + }, + { + "timestamp": 1030731598.7744141, + "heart_rate": 59 + }, + { + "timestamp": 1030731598.8496094, + "heart_rate": 59 + }, + { + "timestamp": 1030731599.0996094, + "heart_rate": 59 + }, + { + "timestamp": 1030731599.3496094, + "heart_rate": 59 + }, + { + "timestamp": 1030731599.5556641, + "heart_rate": 59 + }, + { + "timestamp": 1030731599.8056641, + "heart_rate": 59 + }, + { + "timestamp": 1030731600.0556641, + "heart_rate": 59 + }, + { + "timestamp": 1030731600.3056641, + "heart_rate": 59 + }, + { + "timestamp": 1030731600.5195312, + "heart_rate": 59 + }, + { + "timestamp": 1030731600.7695312, + "heart_rate": 59 + }, + { + "timestamp": 1030731601.0195312, + "heart_rate": 59 + }, + { + "timestamp": 1030731601.2177734, + "heart_rate": 59 + }, + { + "timestamp": 1030731601.4677734, + "heart_rate": 59 + }, + { + "timestamp": 1030731601.7177734, + "heart_rate": 59 + }, + { + "timestamp": 1030731601.9677734, + "heart_rate": 59 + }, + { + "timestamp": 1030731602.1015625, + "heart_rate": 59 + }, + { + "timestamp": 1030731602.3515625, + "heart_rate": 59 + }, + { + "timestamp": 1030731602.6015625, + "heart_rate": 59 + }, + { + "timestamp": 1030731602.8515625, + "heart_rate": 59 + }, + { + "timestamp": 1030731603.1015625, + "heart_rate": 59 + }, + { + "timestamp": 1030731603.2080078, + "heart_rate": 59 + }, + { + "timestamp": 1030731603.4580078, + "heart_rate": 59 + }, + { + "timestamp": 1030731603.7080078, + "heart_rate": 59 + }, + { + "timestamp": 1030731603.9580078, + "heart_rate": 59 + }, + { + "timestamp": 1030731604.2080078, + "heart_rate": 59 + }, + { + "timestamp": 1030731604.3037109, + "heart_rate": 59 + }, + { + "timestamp": 1030731604.5537109, + "heart_rate": 59 + }, + { + "timestamp": 1030731604.8037109, + "heart_rate": 59 + }, + { + "timestamp": 1030731605.0537109, + "heart_rate": 59 + }, + { + "timestamp": 1030731605.3037109, + "heart_rate": 59 + }, + { + "timestamp": 1030731605.3857422, + "heart_rate": 59 + }, + { + "timestamp": 1030731605.6357422, + "heart_rate": 59 + }, + { + "timestamp": 1030731605.8857422, + "heart_rate": 59 + }, + { + "timestamp": 1030731606.1357422, + "heart_rate": 59 + }, + { + "timestamp": 1030731606.3857422, + "heart_rate": 59 + }, + { + "timestamp": 1030731606.453125, + "heart_rate": 59 + }, + { + "timestamp": 1030731606.703125, + "heart_rate": 59 + }, + { + "timestamp": 1030731606.953125, + "heart_rate": 59 + }, + { + "timestamp": 1030731607.203125, + "heart_rate": 59 + }, + { + "timestamp": 1030731607.453125, + "heart_rate": 59 + }, + { + "timestamp": 1030731607.4921875, + "heart_rate": 59 + }, + { + "timestamp": 1030731607.7421875, + "heart_rate": 59 + }, + { + "timestamp": 1030731607.9921875, + "heart_rate": 59 + }, + { + "timestamp": 1030731608.2421875, + "heart_rate": 59 + }, + { + "timestamp": 1030731608.4921875, + "heart_rate": 59 + }, + { + "timestamp": 1030731608.5449219, + "heart_rate": 59 + }, + { + "timestamp": 1030731608.7949219, + "heart_rate": 59 + }, + { + "timestamp": 1030731609.0449219, + "heart_rate": 59 + }, + { + "timestamp": 1030731609.2949219, + "heart_rate": 59 + }, + { + "timestamp": 1030731609.5449219, + "heart_rate": 59 + }, + { + "timestamp": 1030731609.609375, + "heart_rate": 59 + }, + { + "timestamp": 1030731609.859375, + "heart_rate": 59 + }, + { + "timestamp": 1030731610.109375, + "heart_rate": 59 + }, + { + "timestamp": 1030731610.359375, + "heart_rate": 59 + }, + { + "timestamp": 1030731610.609375, + "heart_rate": 59 + }, + { + "timestamp": 1030731610.6494141, + "heart_rate": 59 + }, + { + "timestamp": 1030731610.8994141, + "heart_rate": 59 + }, + { + "timestamp": 1030731611.1494141, + "heart_rate": 59 + }, + { + "timestamp": 1030731611.3994141, + "heart_rate": 59 + }, + { + "timestamp": 1030731611.6494141, + "heart_rate": 59 + }, + { + "timestamp": 1030731611.6845703, + "heart_rate": 59 + }, + { + "timestamp": 1030731611.9345703, + "heart_rate": 59 + }, + { + "timestamp": 1030731612.1845703, + "heart_rate": 59 + }, + { + "timestamp": 1030731612.4345703, + "heart_rate": 59 + }, + { + "timestamp": 1030731612.6845703, + "heart_rate": 59 + }, + { + "timestamp": 1030731612.7324219, + "heart_rate": 60 + }, + { + "timestamp": 1030731612.9824219, + "heart_rate": 60 + }, + { + "timestamp": 1030731613.2324219, + "heart_rate": 60 + }, + { + "timestamp": 1030731613.4824219, + "heart_rate": 60 + }, + { + "timestamp": 1030731613.7324219, + "heart_rate": 60 + }, + { + "timestamp": 1030731613.7753906, + "heart_rate": 60 + }, + { + "timestamp": 1030731614.0253906, + "heart_rate": 60 + }, + { + "timestamp": 1030731614.2753906, + "heart_rate": 60 + }, + { + "timestamp": 1030731614.5253906, + "heart_rate": 60 + }, + { + "timestamp": 1030731614.7753906, + "heart_rate": 60 + }, + { + "timestamp": 1030731614.8115234, + "heart_rate": 60 + }, + { + "timestamp": 1030731615.0615234, + "heart_rate": 60 + }, + { + "timestamp": 1030731615.3115234, + "heart_rate": 60 + }, + { + "timestamp": 1030731615.5615234, + "heart_rate": 60 + }, + { + "timestamp": 1030731615.8115234, + "heart_rate": 60 + }, + { + "timestamp": 1030731615.8408203, + "heart_rate": 59 + }, + { + "timestamp": 1030731616.0908203, + "heart_rate": 59 + }, + { + "timestamp": 1030731616.3408203, + "heart_rate": 59 + }, + { + "timestamp": 1030731616.5908203, + "heart_rate": 59 + }, + { + "timestamp": 1030731616.8408203, + "heart_rate": 59 + }, + { + "timestamp": 1030731616.859375, + "heart_rate": 60 + }, + { + "timestamp": 1030731617.109375, + "heart_rate": 60 + }, + { + "timestamp": 1030731617.359375, + "heart_rate": 60 + }, + { + "timestamp": 1030731617.609375, + "heart_rate": 60 + }, + { + "timestamp": 1030731617.859375, + "heart_rate": 60 + }, + { + "timestamp": 1030731617.9033203, + "heart_rate": 60 + }, + { + "timestamp": 1030731618.1533203, + "heart_rate": 60 + }, + { + "timestamp": 1030731618.4033203, + "heart_rate": 60 + }, + { + "timestamp": 1030731618.6533203, + "heart_rate": 60 + }, + { + "timestamp": 1030731618.9033203, + "heart_rate": 60 + }, + { + "timestamp": 1030731618.9716797, + "heart_rate": 59 + }, + { + "timestamp": 1030731619.2216797, + "heart_rate": 59 + }, + { + "timestamp": 1030731619.4716797, + "heart_rate": 59 + }, + { + "timestamp": 1030731619.7216797, + "heart_rate": 59 + }, + { + "timestamp": 1030731619.9716797, + "heart_rate": 59 + }, + { + "timestamp": 1030731620.0429688, + "heart_rate": 58 + }, + { + "timestamp": 1030731620.2929688, + "heart_rate": 58 + }, + { + "timestamp": 1030731620.5429688, + "heart_rate": 58 + }, + { + "timestamp": 1030731620.7929688, + "heart_rate": 58 + }, + { + "timestamp": 1030731621.0429688, + "heart_rate": 58 + }, + { + "timestamp": 1030731621.0966797, + "heart_rate": 57 + }, + { + "timestamp": 1030731621.3466797, + "heart_rate": 57 + }, + { + "timestamp": 1030731621.5966797, + "heart_rate": 57 + }, + { + "timestamp": 1030731621.8466797, + "heart_rate": 57 + }, + { + "timestamp": 1030731622.0966797, + "heart_rate": 57 + }, + { + "timestamp": 1030731622.1630859, + "heart_rate": 57 + }, + { + "timestamp": 1030731622.4130859, + "heart_rate": 57 + }, + { + "timestamp": 1030731622.6630859, + "heart_rate": 57 + }, + { + "timestamp": 1030731622.9130859, + "heart_rate": 57 + }, + { + "timestamp": 1030731623.1630859, + "heart_rate": 57 + }, + { + "timestamp": 1030731623.1953125, + "heart_rate": 57 + }, + { + "timestamp": 1030731623.4453125, + "heart_rate": 57 + }, + { + "timestamp": 1030731623.6953125, + "heart_rate": 57 + }, + { + "timestamp": 1030731623.9453125, + "heart_rate": 57 + }, + { + "timestamp": 1030731624.1953125, + "heart_rate": 57 + }, + { + "timestamp": 1030731624.2197266, + "heart_rate": 58 + }, + { + "timestamp": 1030731624.4697266, + "heart_rate": 58 + }, + { + "timestamp": 1030731624.7197266, + "heart_rate": 58 + }, + { + "timestamp": 1030731624.9697266, + "heart_rate": 58 + }, + { + "timestamp": 1030731625.2197266, + "heart_rate": 58 + }, + { + "timestamp": 1030731625.2373047, + "heart_rate": 58 + }, + { + "timestamp": 1030731625.4873047, + "heart_rate": 58 + }, + { + "timestamp": 1030731625.7373047, + "heart_rate": 58 + }, + { + "timestamp": 1030731625.9873047, + "heart_rate": 58 + }, + { + "timestamp": 1030731626.2265625, + "heart_rate": 58 + }, + { + "timestamp": 1030731626.4765625, + "heart_rate": 58 + }, + { + "timestamp": 1030731626.7265625, + "heart_rate": 58 + }, + { + "timestamp": 1030731626.9765625, + "heart_rate": 58 + }, + { + "timestamp": 1030731627.1767578, + "heart_rate": 60 + }, + { + "timestamp": 1030731627.4267578, + "heart_rate": 60 + }, + { + "timestamp": 1030731627.6767578, + "heart_rate": 60 + }, + { + "timestamp": 1030731627.9267578, + "heart_rate": 60 + }, + { + "timestamp": 1030731628.1230469, + "heart_rate": 61 + }, + { + "timestamp": 1030731628.3730469, + "heart_rate": 61 + }, + { + "timestamp": 1030731628.6230469, + "heart_rate": 61 + }, + { + "timestamp": 1030731628.8730469, + "heart_rate": 61 + }, + { + "timestamp": 1030731629.0136719, + "heart_rate": 62 + }, + { + "timestamp": 1030731629.2636719, + "heart_rate": 62 + }, + { + "timestamp": 1030731629.5136719, + "heart_rate": 62 + }, + { + "timestamp": 1030731629.6884766, + "heart_rate": 62 + }, + { + "timestamp": 1030731629.9384766, + "heart_rate": 62 + }, + { + "timestamp": 1030731630.1884766, + "heart_rate": 62 + }, + { + "timestamp": 1030731630.4384766, + "heart_rate": 62 + }, + { + "timestamp": 1030731630.6884766, + "heart_rate": 62 + }, + { + "timestamp": 1030731630.8710938, + "heart_rate": 62 + }, + { + "timestamp": 1030731631.1210938, + "heart_rate": 62 + }, + { + "timestamp": 1030731631.3710938, + "heart_rate": 62 + }, + { + "timestamp": 1030731631.6210938, + "heart_rate": 62 + }, + { + "timestamp": 1030731631.8564453, + "heart_rate": 62 + }, + { + "timestamp": 1030731632.1064453, + "heart_rate": 62 + }, + { + "timestamp": 1030731632.3564453, + "heart_rate": 62 + }, + { + "timestamp": 1030731632.6064453, + "heart_rate": 62 + }, + { + "timestamp": 1030731632.8144531, + "heart_rate": 62 + }, + { + "timestamp": 1030731633.0644531, + "heart_rate": 62 + }, + { + "timestamp": 1030731633.3144531, + "heart_rate": 62 + }, + { + "timestamp": 1030731633.5644531, + "heart_rate": 62 + }, + { + "timestamp": 1030731633.8144531, + "heart_rate": 62 + }, + { + "timestamp": 1030731633.8300781, + "heart_rate": 62 + }, + { + "timestamp": 1030731634.0800781, + "heart_rate": 62 + }, + { + "timestamp": 1030731634.3300781, + "heart_rate": 62 + }, + { + "timestamp": 1030731634.5800781, + "heart_rate": 62 + }, + { + "timestamp": 1030731634.8212891, + "heart_rate": 62 + }, + { + "timestamp": 1030731635.0712891, + "heart_rate": 62 + }, + { + "timestamp": 1030731635.3212891, + "heart_rate": 62 + }, + { + "timestamp": 1030731635.5712891, + "heart_rate": 62 + }, + { + "timestamp": 1030731635.8212891, + "heart_rate": 62 + }, + { + "timestamp": 1030731635.8320312, + "heart_rate": 60 + }, + { + "timestamp": 1030731636.0820312, + "heart_rate": 60 + }, + { + "timestamp": 1030731636.3320312, + "heart_rate": 60 + }, + { + "timestamp": 1030731636.5820312, + "heart_rate": 60 + }, + { + "timestamp": 1030731636.8183594, + "heart_rate": 60 + }, + { + "timestamp": 1030731637.0683594, + "heart_rate": 60 + }, + { + "timestamp": 1030731637.3183594, + "heart_rate": 60 + }, + { + "timestamp": 1030731637.5683594, + "heart_rate": 60 + }, + { + "timestamp": 1030731637.8076172, + "heart_rate": 61 + }, + { + "timestamp": 1030731638.0576172, + "heart_rate": 61 + }, + { + "timestamp": 1030731638.3076172, + "heart_rate": 61 + }, + { + "timestamp": 1030731638.5576172, + "heart_rate": 61 + }, + { + "timestamp": 1030731638.7851562, + "heart_rate": 61 + }, + { + "timestamp": 1030731639.0351562, + "heart_rate": 61 + }, + { + "timestamp": 1030731639.2851562, + "heart_rate": 61 + }, + { + "timestamp": 1030731639.5351562, + "heart_rate": 61 + }, + { + "timestamp": 1030731639.7470703, + "heart_rate": 61 + }, + { + "timestamp": 1030731639.9970703, + "heart_rate": 61 + }, + { + "timestamp": 1030731640.2470703, + "heart_rate": 61 + }, + { + "timestamp": 1030731640.4970703, + "heart_rate": 61 + }, + { + "timestamp": 1030731640.7216797, + "heart_rate": 61 + }, + { + "timestamp": 1030731640.9716797, + "heart_rate": 61 + }, + { + "timestamp": 1030731641.2216797, + "heart_rate": 61 + }, + { + "timestamp": 1030731641.4716797, + "heart_rate": 61 + }, + { + "timestamp": 1030731641.6982422, + "heart_rate": 61 + }, + { + "timestamp": 1030731641.9482422, + "heart_rate": 61 + }, + { + "timestamp": 1030731642.1982422, + "heart_rate": 61 + }, + { + "timestamp": 1030731642.4482422, + "heart_rate": 61 + }, + { + "timestamp": 1030731642.6806641, + "heart_rate": 61 + }, + { + "timestamp": 1030731642.9306641, + "heart_rate": 61 + }, + { + "timestamp": 1030731643.1806641, + "heart_rate": 61 + }, + { + "timestamp": 1030731643.4306641, + "heart_rate": 61 + }, + { + "timestamp": 1030731643.6708984, + "heart_rate": 61 + }, + { + "timestamp": 1030731643.9208984, + "heart_rate": 61 + }, + { + "timestamp": 1030731644.1708984, + "heart_rate": 61 + }, + { + "timestamp": 1030731644.4208984, + "heart_rate": 61 + }, + { + "timestamp": 1030731644.6660156, + "heart_rate": 61 + }, + { + "timestamp": 1030731644.9160156, + "heart_rate": 61 + }, + { + "timestamp": 1030731645.1660156, + "heart_rate": 61 + }, + { + "timestamp": 1030731645.4160156, + "heart_rate": 61 + }, + { + "timestamp": 1030731645.6630859, + "heart_rate": 61 + }, + { + "timestamp": 1030731645.9130859, + "heart_rate": 61 + }, + { + "timestamp": 1030731646.1630859, + "heart_rate": 61 + }, + { + "timestamp": 1030731646.4130859, + "heart_rate": 61 + }, + { + "timestamp": 1030731646.6630859, + "heart_rate": 61 + }, + { + "timestamp": 1030731646.6855469, + "heart_rate": 60 + }, + { + "timestamp": 1030731646.9355469, + "heart_rate": 60 + }, + { + "timestamp": 1030731647.1855469, + "heart_rate": 60 + }, + { + "timestamp": 1030731647.4355469, + "heart_rate": 60 + }, + { + "timestamp": 1030731647.6855469, + "heart_rate": 60 + }, + { + "timestamp": 1030731647.7275391, + "heart_rate": 60 + }, + { + "timestamp": 1030731647.9775391, + "heart_rate": 60 + }, + { + "timestamp": 1030731648.2275391, + "heart_rate": 60 + }, + { + "timestamp": 1030731648.4775391, + "heart_rate": 60 + }, + { + "timestamp": 1030731648.7275391, + "heart_rate": 60 + }, + { + "timestamp": 1030731648.7773438, + "heart_rate": 59 + }, + { + "timestamp": 1030731649.0273438, + "heart_rate": 59 + }, + { + "timestamp": 1030731649.2773438, + "heart_rate": 59 + }, + { + "timestamp": 1030731649.5273438, + "heart_rate": 59 + }, + { + "timestamp": 1030731649.7773438, + "heart_rate": 59 + }, + { + "timestamp": 1030731649.7910156, + "heart_rate": 58 + }, + { + "timestamp": 1030731650.0410156, + "heart_rate": 58 + }, + { + "timestamp": 1030731650.2910156, + "heart_rate": 58 + }, + { + "timestamp": 1030731650.5410156, + "heart_rate": 58 + }, + { + "timestamp": 1030731650.7216797, + "heart_rate": 59 + }, + { + "timestamp": 1030731650.9716797, + "heart_rate": 59 + }, + { + "timestamp": 1030731651.2216797, + "heart_rate": 59 + }, + { + "timestamp": 1030731651.4716797, + "heart_rate": 59 + }, + { + "timestamp": 1030731651.5986328, + "heart_rate": 61 + }, + { + "timestamp": 1030731651.8486328, + "heart_rate": 61 + }, + { + "timestamp": 1030731652.0986328, + "heart_rate": 61 + }, + { + "timestamp": 1030731652.3486328, + "heart_rate": 61 + }, + { + "timestamp": 1030731652.5146484, + "heart_rate": 63 + }, + { + "timestamp": 1030731652.7646484, + "heart_rate": 63 + }, + { + "timestamp": 1030731653.0146484, + "heart_rate": 63 + }, + { + "timestamp": 1030731653.2646484, + "heart_rate": 63 + }, + { + "timestamp": 1030731653.5136719, + "heart_rate": 64 + }, + { + "timestamp": 1030731653.7636719, + "heart_rate": 64 + }, + { + "timestamp": 1030731654.0136719, + "heart_rate": 64 + }, + { + "timestamp": 1030731654.2636719, + "heart_rate": 64 + }, + { + "timestamp": 1030731654.5136719, + "heart_rate": 64 + }, + { + "timestamp": 1030731654.6279297, + "heart_rate": 62 + }, + { + "timestamp": 1030731654.8779297, + "heart_rate": 62 + }, + { + "timestamp": 1030731655.1279297, + "heart_rate": 62 + }, + { + "timestamp": 1030731655.3779297, + "heart_rate": 62 + }, + { + "timestamp": 1030731655.6279297, + "heart_rate": 62 + }, + { + "timestamp": 1030731655.7880859, + "heart_rate": 58 + }, + { + "timestamp": 1030731656.0380859, + "heart_rate": 58 + }, + { + "timestamp": 1030731656.2880859, + "heart_rate": 58 + }, + { + "timestamp": 1030731656.5380859, + "heart_rate": 58 + }, + { + "timestamp": 1030731656.7880859, + "heart_rate": 58 + }, + { + "timestamp": 1030731656.9316406, + "heart_rate": 56 + }, + { + "timestamp": 1030731657.1816406, + "heart_rate": 56 + }, + { + "timestamp": 1030731657.4316406, + "heart_rate": 56 + }, + { + "timestamp": 1030731657.6816406, + "heart_rate": 56 + }, + { + "timestamp": 1030731657.9316406, + "heart_rate": 56 + }, + { + "timestamp": 1030731658.0771484, + "heart_rate": 54 + }, + { + "timestamp": 1030731658.3271484, + "heart_rate": 54 + }, + { + "timestamp": 1030731658.5771484, + "heart_rate": 54 + }, + { + "timestamp": 1030731658.8271484, + "heart_rate": 54 + }, + { + "timestamp": 1030731659.0771484, + "heart_rate": 54 + }, + { + "timestamp": 1030731659.2050781, + "heart_rate": 53 + }, + { + "timestamp": 1030731659.4550781, + "heart_rate": 53 + }, + { + "timestamp": 1030731659.7050781, + "heart_rate": 53 + }, + { + "timestamp": 1030731659.9550781, + "heart_rate": 53 + }, + { + "timestamp": 1030731660.2050781, + "heart_rate": 53 + }, + { + "timestamp": 1030731660.2597656, + "heart_rate": 53 + }, + { + "timestamp": 1030731660.5097656, + "heart_rate": 53 + }, + { + "timestamp": 1030731660.7597656, + "heart_rate": 53 + }, + { + "timestamp": 1030731661.0097656, + "heart_rate": 53 + }, + { + "timestamp": 1030731661.2597656, + "heart_rate": 53 + }, + { + "timestamp": 1030731661.3144531, + "heart_rate": 55 + }, + { + "timestamp": 1030731661.5644531, + "heart_rate": 55 + }, + { + "timestamp": 1030731661.8144531, + "heart_rate": 55 + }, + { + "timestamp": 1030731662.0644531, + "heart_rate": 55 + }, + { + "timestamp": 1030731662.3144531, + "heart_rate": 55 + }, + { + "timestamp": 1030731662.3535156, + "heart_rate": 56 + }, + { + "timestamp": 1030731662.6035156, + "heart_rate": 56 + }, + { + "timestamp": 1030731662.8535156, + "heart_rate": 56 + }, + { + "timestamp": 1030731663.1035156, + "heart_rate": 56 + }, + { + "timestamp": 1030731663.3535156, + "heart_rate": 56 + }, + { + "timestamp": 1030731663.4091797, + "heart_rate": 56 + }, + { + "timestamp": 1030731663.6591797, + "heart_rate": 56 + }, + { + "timestamp": 1030731663.9091797, + "heart_rate": 56 + }, + { + "timestamp": 1030731664.1591797, + "heart_rate": 56 + }, + { + "timestamp": 1030731664.4091797, + "heart_rate": 56 + }, + { + "timestamp": 1030731664.4707031, + "heart_rate": 57 + }, + { + "timestamp": 1030731664.7207031, + "heart_rate": 57 + }, + { + "timestamp": 1030731664.9707031, + "heart_rate": 57 + }, + { + "timestamp": 1030731665.2207031, + "heart_rate": 57 + }, + { + "timestamp": 1030731665.4707031, + "heart_rate": 57 + }, + { + "timestamp": 1030731665.4746094, + "heart_rate": 57 + }, + { + "timestamp": 1030731665.7246094, + "heart_rate": 57 + }, + { + "timestamp": 1030731665.9746094, + "heart_rate": 57 + }, + { + "timestamp": 1030731666.2246094, + "heart_rate": 57 + }, + { + "timestamp": 1030731666.4462891, + "heart_rate": 58 + }, + { + "timestamp": 1030731666.6962891, + "heart_rate": 58 + }, + { + "timestamp": 1030731666.9462891, + "heart_rate": 58 + }, + { + "timestamp": 1030731667.1962891, + "heart_rate": 58 + }, + { + "timestamp": 1030731667.4462891, + "heart_rate": 58 + }, + { + "timestamp": 1030731667.5683594, + "heart_rate": 59 + }, + { + "timestamp": 1030731667.8183594, + "heart_rate": 59 + }, + { + "timestamp": 1030731668.0683594, + "heart_rate": 59 + }, + { + "timestamp": 1030731668.3183594, + "heart_rate": 59 + }, + { + "timestamp": 1030731668.5683594, + "heart_rate": 59 + }, + { + "timestamp": 1030731668.7119141, + "heart_rate": 57 + }, + { + "timestamp": 1030731668.9619141, + "heart_rate": 57 + }, + { + "timestamp": 1030731669.2119141, + "heart_rate": 57 + }, + { + "timestamp": 1030731669.4619141, + "heart_rate": 57 + }, + { + "timestamp": 1030731669.7119141, + "heart_rate": 57 + }, + { + "timestamp": 1030731669.8740234, + "heart_rate": 54 + }, + { + "timestamp": 1030731670.1240234, + "heart_rate": 54 + }, + { + "timestamp": 1030731670.3740234, + "heart_rate": 54 + }, + { + "timestamp": 1030731670.6240234, + "heart_rate": 54 + }, + { + "timestamp": 1030731670.8740234, + "heart_rate": 54 + }, + { + "timestamp": 1030731670.9824219, + "heart_rate": 53 + }, + { + "timestamp": 1030731670.9824219, + "heart_rate": 53 + }, + { + "timestamp": 1030731670.9824219, + "heart_rate": 53 + }, + { + "timestamp": 1030731671.2324219, + "heart_rate": 53 + }, + { + "timestamp": 1030731671.4824219, + "heart_rate": 53 + }, + { + "timestamp": 1030731671.7324219, + "heart_rate": 53 + }, + { + "timestamp": 1030731671.9824219, + "heart_rate": 53 + }, + { + "timestamp": 1030731672, + "heart_rate": 55 + }, + { + "timestamp": 1030731672.25, + "heart_rate": 55 + }, + { + "timestamp": 1030731672.5, + "heart_rate": 55 + }, + { + "timestamp": 1030731672.75, + "heart_rate": 55 + }, + { + "timestamp": 1030731673, + "heart_rate": 55 + }, + { + "timestamp": 1030731673.25, + "heart_rate": 55 + }, + { + "timestamp": 1030731673.5, + "heart_rate": 55 + }, + { + "timestamp": 1030731673.75, + "heart_rate": 55 + }, + { + "timestamp": 1030731674, + "heart_rate": 55 + }, + { + "timestamp": 1030731674.0419922, + "heart_rate": 56 + }, + { + "timestamp": 1030731674.2919922, + "heart_rate": 56 + }, + { + "timestamp": 1030731674.5419922, + "heart_rate": 56 + }, + { + "timestamp": 1030731674.7919922, + "heart_rate": 56 + }, + { + "timestamp": 1030731675.0419922, + "heart_rate": 56 + }, + { + "timestamp": 1030731675.0595703, + "heart_rate": 57 + }, + { + "timestamp": 1030731675.3095703, + "heart_rate": 57 + }, + { + "timestamp": 1030731675.5595703, + "heart_rate": 57 + }, + { + "timestamp": 1030731675.8095703, + "heart_rate": 57 + }, + { + "timestamp": 1030731676.0507812, + "heart_rate": 58 + }, + { + "timestamp": 1030731676.3007812, + "heart_rate": 58 + }, + { + "timestamp": 1030731676.5507812, + "heart_rate": 58 + }, + { + "timestamp": 1030731676.8007812, + "heart_rate": 58 + }, + { + "timestamp": 1030731677.0244141, + "heart_rate": 59 + }, + { + "timestamp": 1030731677.2744141, + "heart_rate": 59 + }, + { + "timestamp": 1030731677.5244141, + "heart_rate": 59 + }, + { + "timestamp": 1030731677.7744141, + "heart_rate": 59 + }, + { + "timestamp": 1030731677.9765625, + "heart_rate": 60 + }, + { + "timestamp": 1030731678.2265625, + "heart_rate": 60 + }, + { + "timestamp": 1030731678.4765625, + "heart_rate": 60 + }, + { + "timestamp": 1030731678.7265625, + "heart_rate": 60 + }, + { + "timestamp": 1030731678.9765625, + "heart_rate": 60 + }, + { + "timestamp": 1030731679.0068359, + "heart_rate": 61 + }, + { + "timestamp": 1030731679.2568359, + "heart_rate": 61 + }, + { + "timestamp": 1030731679.5068359, + "heart_rate": 61 + }, + { + "timestamp": 1030731679.7568359, + "heart_rate": 61 + }, + { + "timestamp": 1030731680.0068359, + "heart_rate": 61 + }, + { + "timestamp": 1030731680.0810547, + "heart_rate": 60 + }, + { + "timestamp": 1030731680.3310547, + "heart_rate": 60 + }, + { + "timestamp": 1030731680.5810547, + "heart_rate": 60 + }, + { + "timestamp": 1030731680.8310547, + "heart_rate": 60 + }, + { + "timestamp": 1030731681.0810547, + "heart_rate": 60 + }, + { + "timestamp": 1030731681.2138672, + "heart_rate": 58 + }, + { + "timestamp": 1030731681.4638672, + "heart_rate": 58 + }, + { + "timestamp": 1030731681.7138672, + "heart_rate": 58 + }, + { + "timestamp": 1030731681.9638672, + "heart_rate": 58 + }, + { + "timestamp": 1030731682.2138672, + "heart_rate": 58 + }, + { + "timestamp": 1030731682.3935547, + "heart_rate": 55 + }, + { + "timestamp": 1030731682.6435547, + "heart_rate": 55 + }, + { + "timestamp": 1030731682.8935547, + "heart_rate": 55 + }, + { + "timestamp": 1030731683.1435547, + "heart_rate": 55 + }, + { + "timestamp": 1030731683.3935547, + "heart_rate": 55 + }, + { + "timestamp": 1030731683.5712891, + "heart_rate": 53 + }, + { + "timestamp": 1030731683.8212891, + "heart_rate": 53 + }, + { + "timestamp": 1030731684.0712891, + "heart_rate": 53 + }, + { + "timestamp": 1030731684.3212891, + "heart_rate": 53 + }, + { + "timestamp": 1030731684.5712891, + "heart_rate": 53 + }, + { + "timestamp": 1030731684.7431641, + "heart_rate": 52 + }, + { + "timestamp": 1030731684.9931641, + "heart_rate": 52 + }, + { + "timestamp": 1030731685.2431641, + "heart_rate": 52 + }, + { + "timestamp": 1030731685.4931641, + "heart_rate": 52 + }, + { + "timestamp": 1030731685.7431641, + "heart_rate": 52 + }, + { + "timestamp": 1030731685.8720703, + "heart_rate": 52 + }, + { + "timestamp": 1030731686.1220703, + "heart_rate": 52 + }, + { + "timestamp": 1030731686.3720703, + "heart_rate": 52 + }, + { + "timestamp": 1030731686.6220703, + "heart_rate": 52 + }, + { + "timestamp": 1030731686.8720703, + "heart_rate": 52 + }, + { + "timestamp": 1030731686.9726562, + "heart_rate": 52 + }, + { + "timestamp": 1030731687.2226562, + "heart_rate": 52 + }, + { + "timestamp": 1030731687.4726562, + "heart_rate": 52 + }, + { + "timestamp": 1030731687.7226562, + "heart_rate": 52 + }, + { + "timestamp": 1030731687.9726562, + "heart_rate": 52 + }, + { + "timestamp": 1030731688.0527344, + "heart_rate": 53 + }, + { + "timestamp": 1030731688.3027344, + "heart_rate": 53 + }, + { + "timestamp": 1030731688.5527344, + "heart_rate": 53 + }, + { + "timestamp": 1030731688.8027344, + "heart_rate": 53 + }, + { + "timestamp": 1030731689.0527344, + "heart_rate": 53 + }, + { + "timestamp": 1030731689.0878906, + "heart_rate": 54 + }, + { + "timestamp": 1030731689.3378906, + "heart_rate": 54 + }, + { + "timestamp": 1030731689.5878906, + "heart_rate": 54 + }, + { + "timestamp": 1030731689.8378906, + "heart_rate": 54 + }, + { + "timestamp": 1030731690.0878906, + "heart_rate": 54 + }, + { + "timestamp": 1030731690.0917969, + "heart_rate": 56 + }, + { + "timestamp": 1030731690.3417969, + "heart_rate": 56 + }, + { + "timestamp": 1030731690.5917969, + "heart_rate": 56 + }, + { + "timestamp": 1030731690.8417969, + "heart_rate": 56 + }, + { + "timestamp": 1030731691.0917969, + "heart_rate": 56 + }, + { + "timestamp": 1030731691.1025391, + "heart_rate": 58 + }, + { + "timestamp": 1030731691.3525391, + "heart_rate": 58 + }, + { + "timestamp": 1030731691.6025391, + "heart_rate": 58 + }, + { + "timestamp": 1030731691.8525391, + "heart_rate": 58 + }, + { + "timestamp": 1030731692.1025391, + "heart_rate": 58 + }, + { + "timestamp": 1030731692.1162109, + "heart_rate": 59 + }, + { + "timestamp": 1030731692.3662109, + "heart_rate": 59 + }, + { + "timestamp": 1030731692.6162109, + "heart_rate": 59 + }, + { + "timestamp": 1030731692.8662109, + "heart_rate": 59 + }, + { + "timestamp": 1030731693.1162109, + "heart_rate": 59 + }, + { + "timestamp": 1030731693.1533203, + "heart_rate": 59 + }, + { + "timestamp": 1030731693.4033203, + "heart_rate": 59 + }, + { + "timestamp": 1030731693.6533203, + "heart_rate": 59 + }, + { + "timestamp": 1030731693.9033203, + "heart_rate": 59 + }, + { + "timestamp": 1030731694.1533203, + "heart_rate": 59 + }, + { + "timestamp": 1030731694.1689453, + "heart_rate": 59 + }, + { + "timestamp": 1030731694.4189453, + "heart_rate": 59 + }, + { + "timestamp": 1030731694.6689453, + "heart_rate": 59 + }, + { + "timestamp": 1030731694.9189453, + "heart_rate": 59 + }, + { + "timestamp": 1030731695.1689453, + "heart_rate": 59 + }, + { + "timestamp": 1030731695.2070312, + "heart_rate": 58 + }, + { + "timestamp": 1030731695.4570312, + "heart_rate": 58 + }, + { + "timestamp": 1030731695.7070312, + "heart_rate": 58 + }, + { + "timestamp": 1030731695.9570312, + "heart_rate": 58 + }, + { + "timestamp": 1030731696.2070312, + "heart_rate": 58 + }, + { + "timestamp": 1030731696.2685547, + "heart_rate": 58 + }, + { + "timestamp": 1030731696.5185547, + "heart_rate": 58 + }, + { + "timestamp": 1030731696.7685547, + "heart_rate": 58 + }, + { + "timestamp": 1030731697.0185547, + "heart_rate": 58 + }, + { + "timestamp": 1030731697.2685547, + "heart_rate": 58 + }, + { + "timestamp": 1030731697.3369141, + "heart_rate": 57 + }, + { + "timestamp": 1030731697.5869141, + "heart_rate": 57 + }, + { + "timestamp": 1030731697.8369141, + "heart_rate": 57 + }, + { + "timestamp": 1030731698.0869141, + "heart_rate": 57 + }, + { + "timestamp": 1030731698.3369141, + "heart_rate": 57 + }, + { + "timestamp": 1030731698.40625, + "heart_rate": 57 + }, + { + "timestamp": 1030731698.65625, + "heart_rate": 57 + }, + { + "timestamp": 1030731698.90625, + "heart_rate": 57 + }, + { + "timestamp": 1030731699.15625, + "heart_rate": 57 + }, + { + "timestamp": 1030731699.40625, + "heart_rate": 57 + }, + { + "timestamp": 1030731699.4853516, + "heart_rate": 56 + }, + { + "timestamp": 1030731699.7353516, + "heart_rate": 56 + }, + { + "timestamp": 1030731699.9853516, + "heart_rate": 56 + }, + { + "timestamp": 1030731700.2353516, + "heart_rate": 56 + }, + { + "timestamp": 1030731700.4853516, + "heart_rate": 56 + }, + { + "timestamp": 1030731700.5390625, + "heart_rate": 56 + }, + { + "timestamp": 1030731700.7890625, + "heart_rate": 56 + }, + { + "timestamp": 1030731701.0390625, + "heart_rate": 56 + }, + { + "timestamp": 1030731701.2890625, + "heart_rate": 56 + }, + { + "timestamp": 1030731701.5390625, + "heart_rate": 56 + }, + { + "timestamp": 1030731701.5693359, + "heart_rate": 57 + }, + { + "timestamp": 1030731701.8193359, + "heart_rate": 57 + }, + { + "timestamp": 1030731702.0693359, + "heart_rate": 57 + }, + { + "timestamp": 1030731702.3193359, + "heart_rate": 57 + }, + { + "timestamp": 1030731702.5380859, + "heart_rate": 57 + }, + { + "timestamp": 1030731702.7880859, + "heart_rate": 57 + }, + { + "timestamp": 1030731703.0380859, + "heart_rate": 57 + }, + { + "timestamp": 1030731703.2880859, + "heart_rate": 57 + }, + { + "timestamp": 1030731703.5380859, + "heart_rate": 57 + }, + { + "timestamp": 1030731703.5527344, + "heart_rate": 58 + }, + { + "timestamp": 1030731703.8027344, + "heart_rate": 58 + }, + { + "timestamp": 1030731704.0527344, + "heart_rate": 58 + }, + { + "timestamp": 1030731704.3027344, + "heart_rate": 58 + }, + { + "timestamp": 1030731704.5527344, + "heart_rate": 58 + }, + { + "timestamp": 1030731704.6220703, + "heart_rate": 59 + }, + { + "timestamp": 1030731704.8720703, + "heart_rate": 59 + }, + { + "timestamp": 1030731705.1220703, + "heart_rate": 59 + }, + { + "timestamp": 1030731705.3720703, + "heart_rate": 59 + }, + { + "timestamp": 1030731705.6220703, + "heart_rate": 59 + }, + { + "timestamp": 1030731705.7431641, + "heart_rate": 57 + }, + { + "timestamp": 1030731705.9931641, + "heart_rate": 57 + }, + { + "timestamp": 1030731706.2431641, + "heart_rate": 57 + }, + { + "timestamp": 1030731706.4931641, + "heart_rate": 57 + }, + { + "timestamp": 1030731706.7431641, + "heart_rate": 57 + }, + { + "timestamp": 1030731706.8632812, + "heart_rate": 55 + }, + { + "timestamp": 1030731707.1132812, + "heart_rate": 55 + }, + { + "timestamp": 1030731707.3632812, + "heart_rate": 55 + }, + { + "timestamp": 1030731707.6132812, + "heart_rate": 55 + }, + { + "timestamp": 1030731707.8632812, + "heart_rate": 55 + }, + { + "timestamp": 1030731708.0126953, + "heart_rate": 55 + }, + { + "timestamp": 1030731708.2626953, + "heart_rate": 55 + }, + { + "timestamp": 1030731708.5126953, + "heart_rate": 55 + }, + { + "timestamp": 1030731708.7626953, + "heart_rate": 55 + }, + { + "timestamp": 1030731709.0126953, + "heart_rate": 55 + }, + { + "timestamp": 1030731709.1621094, + "heart_rate": 53 + }, + { + "timestamp": 1030731709.4121094, + "heart_rate": 53 + }, + { + "timestamp": 1030731709.6621094, + "heart_rate": 53 + }, + { + "timestamp": 1030731709.9121094, + "heart_rate": 53 + }, + { + "timestamp": 1030731710.1621094, + "heart_rate": 53 + }, + { + "timestamp": 1030731710.2705078, + "heart_rate": 53 + }, + { + "timestamp": 1030731710.5205078, + "heart_rate": 53 + }, + { + "timestamp": 1030731710.7705078, + "heart_rate": 53 + }, + { + "timestamp": 1030731711.0205078, + "heart_rate": 53 + }, + { + "timestamp": 1030731711.2705078, + "heart_rate": 53 + }, + { + "timestamp": 1030731711.3994141, + "heart_rate": 53 + }, + { + "timestamp": 1030731711.6494141, + "heart_rate": 53 + }, + { + "timestamp": 1030731711.8994141, + "heart_rate": 53 + }, + { + "timestamp": 1030731712.1494141, + "heart_rate": 53 + }, + { + "timestamp": 1030731712.3994141, + "heart_rate": 53 + }, + { + "timestamp": 1030731712.5, + "heart_rate": 54 + }, + { + "timestamp": 1030731712.75, + "heart_rate": 54 + }, + { + "timestamp": 1030731713, + "heart_rate": 54 + }, + { + "timestamp": 1030731713.25, + "heart_rate": 54 + }, + { + "timestamp": 1030731713.5, + "heart_rate": 54 + }, + { + "timestamp": 1030731713.5371094, + "heart_rate": 54 + }, + { + "timestamp": 1030731713.7871094, + "heart_rate": 54 + }, + { + "timestamp": 1030731714.0371094, + "heart_rate": 54 + }, + { + "timestamp": 1030731714.2871094, + "heart_rate": 54 + }, + { + "timestamp": 1030731714.5371094, + "heart_rate": 54 + }, + { + "timestamp": 1030731714.5380859, + "heart_rate": 56 + }, + { + "timestamp": 1030731714.7880859, + "heart_rate": 56 + }, + { + "timestamp": 1030731715.0380859, + "heart_rate": 56 + }, + { + "timestamp": 1030731715.2880859, + "heart_rate": 56 + }, + { + "timestamp": 1030731715.4072266, + "heart_rate": 58 + }, + { + "timestamp": 1030731715.6572266, + "heart_rate": 58 + }, + { + "timestamp": 1030731715.9072266, + "heart_rate": 58 + }, + { + "timestamp": 1030731716.1572266, + "heart_rate": 58 + }, + { + "timestamp": 1030731716.4072266, + "heart_rate": 58 + }, + { + "timestamp": 1030731716.4804688, + "heart_rate": 58 + }, + { + "timestamp": 1030731716.7304688, + "heart_rate": 58 + }, + { + "timestamp": 1030731716.9804688, + "heart_rate": 58 + }, + { + "timestamp": 1030731717.2304688, + "heart_rate": 58 + }, + { + "timestamp": 1030731717.4804688, + "heart_rate": 58 + }, + { + "timestamp": 1030731717.5419922, + "heart_rate": 58 + }, + { + "timestamp": 1030731717.7919922, + "heart_rate": 58 + }, + { + "timestamp": 1030731718.0419922, + "heart_rate": 58 + }, + { + "timestamp": 1030731718.2919922, + "heart_rate": 58 + }, + { + "timestamp": 1030731718.5419922, + "heart_rate": 58 + }, + { + "timestamp": 1030731718.6337891, + "heart_rate": 57 + }, + { + "timestamp": 1030731718.8837891, + "heart_rate": 57 + }, + { + "timestamp": 1030731719.1337891, + "heart_rate": 57 + }, + { + "timestamp": 1030731719.3837891, + "heart_rate": 57 + }, + { + "timestamp": 1030731719.6337891, + "heart_rate": 57 + }, + { + "timestamp": 1030731719.6835938, + "heart_rate": 57 + }, + { + "timestamp": 1030731719.9335938, + "heart_rate": 57 + }, + { + "timestamp": 1030731720.1835938, + "heart_rate": 57 + }, + { + "timestamp": 1030731720.4335938, + "heart_rate": 57 + }, + { + "timestamp": 1030731720.6835938, + "heart_rate": 57 + }, + { + "timestamp": 1030731720.7871094, + "heart_rate": 56 + }, + { + "timestamp": 1030731721.0371094, + "heart_rate": 56 + }, + { + "timestamp": 1030731721.2871094, + "heart_rate": 56 + }, + { + "timestamp": 1030731721.5371094, + "heart_rate": 56 + }, + { + "timestamp": 1030731721.7871094, + "heart_rate": 56 + }, + { + "timestamp": 1030731721.8564453, + "heart_rate": 56 + }, + { + "timestamp": 1030731722.1064453, + "heart_rate": 56 + }, + { + "timestamp": 1030731722.3564453, + "heart_rate": 56 + }, + { + "timestamp": 1030731722.6064453, + "heart_rate": 56 + }, + { + "timestamp": 1030731722.8564453, + "heart_rate": 56 + }, + { + "timestamp": 1030731722.9287109, + "heart_rate": 56 + }, + { + "timestamp": 1030731723.1787109, + "heart_rate": 56 + }, + { + "timestamp": 1030731723.4287109, + "heart_rate": 56 + }, + { + "timestamp": 1030731723.6787109, + "heart_rate": 56 + }, + { + "timestamp": 1030731723.9287109, + "heart_rate": 56 + }, + { + "timestamp": 1030731724.0058594, + "heart_rate": 56 + }, + { + "timestamp": 1030731724.2558594, + "heart_rate": 56 + }, + { + "timestamp": 1030731724.5058594, + "heart_rate": 56 + }, + { + "timestamp": 1030731724.7558594, + "heart_rate": 56 + }, + { + "timestamp": 1030731725.0058594, + "heart_rate": 56 + }, + { + "timestamp": 1030731725.0273438, + "heart_rate": 56 + }, + { + "timestamp": 1030731725.2773438, + "heart_rate": 56 + }, + { + "timestamp": 1030731725.5273438, + "heart_rate": 56 + }, + { + "timestamp": 1030731725.7773438, + "heart_rate": 56 + }, + { + "timestamp": 1030731726.0273438, + "heart_rate": 56 + }, + { + "timestamp": 1030731726.0761719, + "heart_rate": 57 + }, + { + "timestamp": 1030731726.3261719, + "heart_rate": 57 + }, + { + "timestamp": 1030731726.5761719, + "heart_rate": 57 + }, + { + "timestamp": 1030731726.8261719, + "heart_rate": 57 + }, + { + "timestamp": 1030731727.0761719, + "heart_rate": 57 + }, + { + "timestamp": 1030731727.1210938, + "heart_rate": 57 + }, + { + "timestamp": 1030731727.3710938, + "heart_rate": 57 + }, + { + "timestamp": 1030731727.6210938, + "heart_rate": 57 + }, + { + "timestamp": 1030731727.8710938, + "heart_rate": 57 + }, + { + "timestamp": 1030731728.1210938, + "heart_rate": 57 + }, + { + "timestamp": 1030731728.1767578, + "heart_rate": 57 + }, + { + "timestamp": 1030731728.4267578, + "heart_rate": 57 + }, + { + "timestamp": 1030731728.6767578, + "heart_rate": 57 + }, + { + "timestamp": 1030731728.9267578, + "heart_rate": 57 + }, + { + "timestamp": 1030731729.1767578, + "heart_rate": 57 + }, + { + "timestamp": 1030731729.25, + "heart_rate": 57 + }, + { + "timestamp": 1030731729.5, + "heart_rate": 57 + }, + { + "timestamp": 1030731729.75, + "heart_rate": 57 + }, + { + "timestamp": 1030731730, + "heart_rate": 57 + }, + { + "timestamp": 1030731730.25, + "heart_rate": 57 + }, + { + "timestamp": 1030731730.3076172, + "heart_rate": 57 + }, + { + "timestamp": 1030731730.5576172, + "heart_rate": 57 + }, + { + "timestamp": 1030731730.8076172, + "heart_rate": 57 + }, + { + "timestamp": 1030731731.0576172, + "heart_rate": 57 + }, + { + "timestamp": 1030731731.3076172, + "heart_rate": 57 + }, + { + "timestamp": 1030731731.3662109, + "heart_rate": 57 + }, + { + "timestamp": 1030731731.6162109, + "heart_rate": 57 + }, + { + "timestamp": 1030731731.8662109, + "heart_rate": 57 + }, + { + "timestamp": 1030731732.1162109, + "heart_rate": 57 + }, + { + "timestamp": 1030731732.3662109, + "heart_rate": 57 + }, + { + "timestamp": 1030731732.4101562, + "heart_rate": 57 + }, + { + "timestamp": 1030731732.6601562, + "heart_rate": 57 + }, + { + "timestamp": 1030731732.9101562, + "heart_rate": 57 + }, + { + "timestamp": 1030731733.1601562, + "heart_rate": 57 + }, + { + "timestamp": 1030731733.4101562, + "heart_rate": 57 + }, + { + "timestamp": 1030731733.4521484, + "heart_rate": 57 + }, + { + "timestamp": 1030731733.7021484, + "heart_rate": 57 + }, + { + "timestamp": 1030731733.9521484, + "heart_rate": 57 + }, + { + "timestamp": 1030731734.2021484, + "heart_rate": 57 + }, + { + "timestamp": 1030731734.4482422, + "heart_rate": 57 + }, + { + "timestamp": 1030731734.6982422, + "heart_rate": 57 + }, + { + "timestamp": 1030731734.9482422, + "heart_rate": 57 + }, + { + "timestamp": 1030731735.1982422, + "heart_rate": 57 + }, + { + "timestamp": 1030731735.4482422, + "heart_rate": 57 + }, + { + "timestamp": 1030731735.4550781, + "heart_rate": 58 + }, + { + "timestamp": 1030731735.7050781, + "heart_rate": 58 + }, + { + "timestamp": 1030731735.9550781, + "heart_rate": 58 + }, + { + "timestamp": 1030731736.2050781, + "heart_rate": 58 + }, + { + "timestamp": 1030731736.4550781, + "heart_rate": 58 + }, + { + "timestamp": 1030731736.5009766, + "heart_rate": 59 + }, + { + "timestamp": 1030731736.7509766, + "heart_rate": 59 + }, + { + "timestamp": 1030731737.0009766, + "heart_rate": 59 + }, + { + "timestamp": 1030731737.2509766, + "heart_rate": 59 + }, + { + "timestamp": 1030731737.5009766, + "heart_rate": 59 + }, + { + "timestamp": 1030731737.5898438, + "heart_rate": 58 + }, + { + "timestamp": 1030731737.8398438, + "heart_rate": 58 + }, + { + "timestamp": 1030731738.0898438, + "heart_rate": 58 + }, + { + "timestamp": 1030731738.3398438, + "heart_rate": 58 + }, + { + "timestamp": 1030731738.5898438, + "heart_rate": 58 + }, + { + "timestamp": 1030731738.6796875, + "heart_rate": 57 + }, + { + "timestamp": 1030731738.9296875, + "heart_rate": 57 + }, + { + "timestamp": 1030731739.1796875, + "heart_rate": 57 + }, + { + "timestamp": 1030731739.4296875, + "heart_rate": 57 + }, + { + "timestamp": 1030731739.6796875, + "heart_rate": 57 + }, + { + "timestamp": 1030731739.7929688, + "heart_rate": 56 + }, + { + "timestamp": 1030731740.0429688, + "heart_rate": 56 + }, + { + "timestamp": 1030731740.2929688, + "heart_rate": 56 + }, + { + "timestamp": 1030731740.5429688, + "heart_rate": 56 + }, + { + "timestamp": 1030731740.7929688, + "heart_rate": 56 + }, + { + "timestamp": 1030731740.8974609, + "heart_rate": 55 + }, + { + "timestamp": 1030731741.1474609, + "heart_rate": 55 + }, + { + "timestamp": 1030731741.3974609, + "heart_rate": 55 + }, + { + "timestamp": 1030731741.6474609, + "heart_rate": 55 + }, + { + "timestamp": 1030731741.8974609, + "heart_rate": 55 + }, + { + "timestamp": 1030731742.0107422, + "heart_rate": 55 + }, + { + "timestamp": 1030731742.2607422, + "heart_rate": 55 + }, + { + "timestamp": 1030731742.5107422, + "heart_rate": 55 + }, + { + "timestamp": 1030731742.7607422, + "heart_rate": 55 + }, + { + "timestamp": 1030731743.0107422, + "heart_rate": 55 + }, + { + "timestamp": 1030731743.1044922, + "heart_rate": 54 + }, + { + "timestamp": 1030731743.3544922, + "heart_rate": 54 + }, + { + "timestamp": 1030731743.6044922, + "heart_rate": 54 + }, + { + "timestamp": 1030731743.8544922, + "heart_rate": 54 + }, + { + "timestamp": 1030731744.1044922, + "heart_rate": 54 + }, + { + "timestamp": 1030731744.2285156, + "heart_rate": 54 + }, + { + "timestamp": 1030731744.4785156, + "heart_rate": 54 + }, + { + "timestamp": 1030731744.7285156, + "heart_rate": 54 + }, + { + "timestamp": 1030731744.9785156, + "heart_rate": 54 + }, + { + "timestamp": 1030731745.2285156, + "heart_rate": 54 + }, + { + "timestamp": 1030731745.3642578, + "heart_rate": 54 + }, + { + "timestamp": 1030731745.6142578, + "heart_rate": 54 + }, + { + "timestamp": 1030731745.8642578, + "heart_rate": 54 + }, + { + "timestamp": 1030731746.1142578, + "heart_rate": 54 + }, + { + "timestamp": 1030731746.3642578, + "heart_rate": 54 + }, + { + "timestamp": 1030731746.4746094, + "heart_rate": 54 + }, + { + "timestamp": 1030731746.7246094, + "heart_rate": 54 + }, + { + "timestamp": 1030731746.9746094, + "heart_rate": 54 + }, + { + "timestamp": 1030731747.2246094, + "heart_rate": 54 + }, + { + "timestamp": 1030731747.4746094, + "heart_rate": 54 + }, + { + "timestamp": 1030731747.5673828, + "heart_rate": 54 + }, + { + "timestamp": 1030731747.8173828, + "heart_rate": 54 + }, + { + "timestamp": 1030731748.0673828, + "heart_rate": 54 + }, + { + "timestamp": 1030731748.3173828, + "heart_rate": 54 + }, + { + "timestamp": 1030731748.328125, + "heart_rate": 54 + }, + { + "timestamp": 1030731748.578125, + "heart_rate": 54 + }, + { + "timestamp": 1030731748.828125, + "heart_rate": 54 + }, + { + "timestamp": 1030731749.078125, + "heart_rate": 54 + }, + { + "timestamp": 1030731749.328125, + "heart_rate": 54 + }, + { + "timestamp": 1030731749.578125, + "heart_rate": 54 + }, + { + "timestamp": 1030731749.6318359, + "heart_rate": 54 + }, + { + "timestamp": 1030731749.8818359, + "heart_rate": 54 + }, + { + "timestamp": 1030731750.1318359, + "heart_rate": 54 + }, + { + "timestamp": 1030731750.3818359, + "heart_rate": 54 + }, + { + "timestamp": 1030731750.6318359, + "heart_rate": 54 + }, + { + "timestamp": 1030731750.6572266, + "heart_rate": 54 + }, + { + "timestamp": 1030731750.9072266, + "heart_rate": 54 + }, + { + "timestamp": 1030731751.1572266, + "heart_rate": 54 + }, + { + "timestamp": 1030731751.4072266, + "heart_rate": 54 + }, + { + "timestamp": 1030731751.6572266, + "heart_rate": 54 + }, + { + "timestamp": 1030731751.7001953, + "heart_rate": 54 + }, + { + "timestamp": 1030731751.9501953, + "heart_rate": 54 + }, + { + "timestamp": 1030731752.2001953, + "heart_rate": 54 + }, + { + "timestamp": 1030731752.4501953, + "heart_rate": 54 + }, + { + "timestamp": 1030731752.7001953, + "heart_rate": 54 + }, + { + "timestamp": 1030731752.7587891, + "heart_rate": 54 + }, + { + "timestamp": 1030731753.0087891, + "heart_rate": 54 + }, + { + "timestamp": 1030731753.2587891, + "heart_rate": 54 + }, + { + "timestamp": 1030731753.5087891, + "heart_rate": 54 + }, + { + "timestamp": 1030731753.7587891, + "heart_rate": 54 + }, + { + "timestamp": 1030731753.8447266, + "heart_rate": 55 + }, + { + "timestamp": 1030731754.0947266, + "heart_rate": 55 + }, + { + "timestamp": 1030731754.3447266, + "heart_rate": 55 + }, + { + "timestamp": 1030731754.5947266, + "heart_rate": 55 + }, + { + "timestamp": 1030731754.8447266, + "heart_rate": 55 + }, + { + "timestamp": 1030731754.9414062, + "heart_rate": 55 + }, + { + "timestamp": 1030731755.1914062, + "heart_rate": 55 + }, + { + "timestamp": 1030731755.4414062, + "heart_rate": 55 + }, + { + "timestamp": 1030731755.6914062, + "heart_rate": 55 + }, + { + "timestamp": 1030731755.9414062, + "heart_rate": 55 + }, + { + "timestamp": 1030731756.1269531, + "heart_rate": 55 + }, + { + "timestamp": 1030731756.3769531, + "heart_rate": 55 + }, + { + "timestamp": 1030731756.6269531, + "heart_rate": 55 + }, + { + "timestamp": 1030731756.8769531, + "heart_rate": 55 + }, + { + "timestamp": 1030731757.1269531, + "heart_rate": 55 + }, + { + "timestamp": 1030731757.3349609, + "heart_rate": 53 + }, + { + "timestamp": 1030731757.5849609, + "heart_rate": 53 + }, + { + "timestamp": 1030731757.8349609, + "heart_rate": 53 + }, + { + "timestamp": 1030731758.0849609, + "heart_rate": 53 + }, + { + "timestamp": 1030731758.3349609, + "heart_rate": 53 + }, + { + "timestamp": 1030731758.5410156, + "heart_rate": 51 + }, + { + "timestamp": 1030731758.7910156, + "heart_rate": 51 + }, + { + "timestamp": 1030731759.0410156, + "heart_rate": 51 + }, + { + "timestamp": 1030731759.2910156, + "heart_rate": 51 + }, + { + "timestamp": 1030731759.5410156, + "heart_rate": 51 + }, + { + "timestamp": 1030731759.7265625, + "heart_rate": 51 + }, + { + "timestamp": 1030731759.9765625, + "heart_rate": 51 + }, + { + "timestamp": 1030731760.2265625, + "heart_rate": 51 + }, + { + "timestamp": 1030731760.4765625, + "heart_rate": 51 + }, + { + "timestamp": 1030731760.7265625, + "heart_rate": 51 + }, + { + "timestamp": 1030731760.9248047, + "heart_rate": 50 + }, + { + "timestamp": 1030731761.1748047, + "heart_rate": 50 + }, + { + "timestamp": 1030731761.4248047, + "heart_rate": 50 + }, + { + "timestamp": 1030731761.6748047, + "heart_rate": 50 + }, + { + "timestamp": 1030731761.9248047, + "heart_rate": 50 + }, + { + "timestamp": 1030731762.1240234, + "heart_rate": 50 + }, + { + "timestamp": 1030731762.3740234, + "heart_rate": 50 + }, + { + "timestamp": 1030731762.6240234, + "heart_rate": 50 + }, + { + "timestamp": 1030731762.8740234, + "heart_rate": 50 + }, + { + "timestamp": 1030731763.1240234, + "heart_rate": 50 + }, + { + "timestamp": 1030731763.2998047, + "heart_rate": 50 + }, + { + "timestamp": 1030731763.5498047, + "heart_rate": 50 + }, + { + "timestamp": 1030731763.7998047, + "heart_rate": 50 + }, + { + "timestamp": 1030731764.0498047, + "heart_rate": 50 + }, + { + "timestamp": 1030731764.2998047, + "heart_rate": 50 + }, + { + "timestamp": 1030731764.4736328, + "heart_rate": 51 + }, + { + "timestamp": 1030731764.7236328, + "heart_rate": 51 + }, + { + "timestamp": 1030731764.9736328, + "heart_rate": 51 + }, + { + "timestamp": 1030731765.2236328, + "heart_rate": 51 + }, + { + "timestamp": 1030731765.4736328, + "heart_rate": 51 + }, + { + "timestamp": 1030731765.6503906, + "heart_rate": 51 + }, + { + "timestamp": 1030731765.9003906, + "heart_rate": 51 + }, + { + "timestamp": 1030731766.1503906, + "heart_rate": 51 + }, + { + "timestamp": 1030731766.4003906, + "heart_rate": 51 + }, + { + "timestamp": 1030731766.6503906, + "heart_rate": 51 + }, + { + "timestamp": 1030731766.8164062, + "heart_rate": 51 + }, + { + "timestamp": 1030731767.0664062, + "heart_rate": 51 + }, + { + "timestamp": 1030731767.3164062, + "heart_rate": 51 + }, + { + "timestamp": 1030731767.5664062, + "heart_rate": 51 + }, + { + "timestamp": 1030731767.8164062, + "heart_rate": 51 + }, + { + "timestamp": 1030731767.9931641, + "heart_rate": 51 + }, + { + "timestamp": 1030731768.2431641, + "heart_rate": 51 + }, + { + "timestamp": 1030731768.4931641, + "heart_rate": 51 + }, + { + "timestamp": 1030731768.7431641, + "heart_rate": 51 + }, + { + "timestamp": 1030731768.9931641, + "heart_rate": 51 + }, + { + "timestamp": 1030731769.1953125, + "heart_rate": 51 + }, + { + "timestamp": 1030731769.4453125, + "heart_rate": 51 + }, + { + "timestamp": 1030731769.6953125, + "heart_rate": 51 + }, + { + "timestamp": 1030731769.9453125, + "heart_rate": 51 + }, + { + "timestamp": 1030731770.1953125, + "heart_rate": 51 + }, + { + "timestamp": 1030731770.3505859, + "heart_rate": 51 + }, + { + "timestamp": 1030731770.6005859, + "heart_rate": 51 + }, + { + "timestamp": 1030731770.8505859, + "heart_rate": 51 + }, + { + "timestamp": 1030731771.1005859, + "heart_rate": 51 + }, + { + "timestamp": 1030731771.3505859, + "heart_rate": 51 + }, + { + "timestamp": 1030731771.5322266, + "heart_rate": 51 + }, + { + "timestamp": 1030731771.7822266, + "heart_rate": 51 + }, + { + "timestamp": 1030731772.0322266, + "heart_rate": 51 + }, + { + "timestamp": 1030731772.2822266, + "heart_rate": 51 + }, + { + "timestamp": 1030731772.5322266, + "heart_rate": 51 + }, + { + "timestamp": 1030731772.7412109, + "heart_rate": 51 + }, + { + "timestamp": 1030731772.9912109, + "heart_rate": 51 + }, + { + "timestamp": 1030731773.2412109, + "heart_rate": 51 + }, + { + "timestamp": 1030731773.4912109, + "heart_rate": 51 + }, + { + "timestamp": 1030731773.7412109, + "heart_rate": 51 + }, + { + "timestamp": 1030731773.9414062, + "heart_rate": 50 + }, + { + "timestamp": 1030731774.1914062, + "heart_rate": 50 + }, + { + "timestamp": 1030731774.4414062, + "heart_rate": 50 + }, + { + "timestamp": 1030731774.6914062, + "heart_rate": 50 + }, + { + "timestamp": 1030731774.9414062, + "heart_rate": 50 + }, + { + "timestamp": 1030731775.1318359, + "heart_rate": 50 + }, + { + "timestamp": 1030731775.3818359, + "heart_rate": 50 + }, + { + "timestamp": 1030731775.6318359, + "heart_rate": 50 + }, + { + "timestamp": 1030731775.8818359, + "heart_rate": 50 + }, + { + "timestamp": 1030731776.1318359, + "heart_rate": 50 + }, + { + "timestamp": 1030731776.3251953, + "heart_rate": 50 + }, + { + "timestamp": 1030731776.5751953, + "heart_rate": 50 + }, + { + "timestamp": 1030731776.8251953, + "heart_rate": 50 + }, + { + "timestamp": 1030731777.0751953, + "heart_rate": 50 + }, + { + "timestamp": 1030731777.3251953, + "heart_rate": 50 + }, + { + "timestamp": 1030731777.5107422, + "heart_rate": 50 + }, + { + "timestamp": 1030731777.7607422, + "heart_rate": 50 + }, + { + "timestamp": 1030731778.0107422, + "heart_rate": 50 + }, + { + "timestamp": 1030731778.2607422, + "heart_rate": 50 + }, + { + "timestamp": 1030731778.5107422, + "heart_rate": 50 + }, + { + "timestamp": 1030731778.6181641, + "heart_rate": 50 + }, + { + "timestamp": 1030731778.8681641, + "heart_rate": 50 + }, + { + "timestamp": 1030731779.1181641, + "heart_rate": 50 + }, + { + "timestamp": 1030731779.3681641, + "heart_rate": 50 + }, + { + "timestamp": 1030731779.6181641, + "heart_rate": 50 + }, + { + "timestamp": 1030731779.7128906, + "heart_rate": 52 + }, + { + "timestamp": 1030731779.9628906, + "heart_rate": 52 + }, + { + "timestamp": 1030731780.2128906, + "heart_rate": 52 + }, + { + "timestamp": 1030731780.4628906, + "heart_rate": 52 + }, + { + "timestamp": 1030731780.7128906, + "heart_rate": 52 + }, + { + "timestamp": 1030731780.8349609, + "heart_rate": 53 + }, + { + "timestamp": 1030731781.0849609, + "heart_rate": 53 + }, + { + "timestamp": 1030731781.3349609, + "heart_rate": 53 + }, + { + "timestamp": 1030731781.5849609, + "heart_rate": 53 + }, + { + "timestamp": 1030731781.8349609, + "heart_rate": 53 + }, + { + "timestamp": 1030731781.9765625, + "heart_rate": 53 + }, + { + "timestamp": 1030731782.2265625, + "heart_rate": 53 + }, + { + "timestamp": 1030731782.4765625, + "heart_rate": 53 + }, + { + "timestamp": 1030731782.7265625, + "heart_rate": 53 + }, + { + "timestamp": 1030731782.9765625, + "heart_rate": 53 + }, + { + "timestamp": 1030731783.1054688, + "heart_rate": 53 + }, + { + "timestamp": 1030731783.3554688, + "heart_rate": 53 + }, + { + "timestamp": 1030731783.6054688, + "heart_rate": 53 + }, + { + "timestamp": 1030731783.8554688, + "heart_rate": 53 + }, + { + "timestamp": 1030731784.1054688, + "heart_rate": 53 + }, + { + "timestamp": 1030731784.21875, + "heart_rate": 53 + }, + { + "timestamp": 1030731784.46875, + "heart_rate": 53 + }, + { + "timestamp": 1030731784.71875, + "heart_rate": 53 + }, + { + "timestamp": 1030731784.96875, + "heart_rate": 53 + }, + { + "timestamp": 1030731785.21875, + "heart_rate": 53 + }, + { + "timestamp": 1030731785.3398438, + "heart_rate": 53 + }, + { + "timestamp": 1030731785.5898438, + "heart_rate": 53 + }, + { + "timestamp": 1030731785.8398438, + "heart_rate": 53 + }, + { + "timestamp": 1030731786.0898438, + "heart_rate": 53 + }, + { + "timestamp": 1030731786.3398438, + "heart_rate": 53 + }, + { + "timestamp": 1030731786.3964844, + "heart_rate": 54 + }, + { + "timestamp": 1030731786.6464844, + "heart_rate": 54 + }, + { + "timestamp": 1030731786.8964844, + "heart_rate": 54 + }, + { + "timestamp": 1030731787.1464844, + "heart_rate": 54 + }, + { + "timestamp": 1030731787.3964844, + "heart_rate": 54 + }, + { + "timestamp": 1030731787.4863281, + "heart_rate": 54 + }, + { + "timestamp": 1030731787.7363281, + "heart_rate": 54 + }, + { + "timestamp": 1030731787.9863281, + "heart_rate": 54 + }, + { + "timestamp": 1030731788.2363281, + "heart_rate": 54 + }, + { + "timestamp": 1030731788.4863281, + "heart_rate": 54 + }, + { + "timestamp": 1030731788.6201172, + "heart_rate": 55 + }, + { + "timestamp": 1030731788.8701172, + "heart_rate": 55 + }, + { + "timestamp": 1030731789.1201172, + "heart_rate": 55 + }, + { + "timestamp": 1030731789.3701172, + "heart_rate": 55 + }, + { + "timestamp": 1030731789.6201172, + "heart_rate": 55 + }, + { + "timestamp": 1030731789.7890625, + "heart_rate": 54 + }, + { + "timestamp": 1030731790.0390625, + "heart_rate": 54 + }, + { + "timestamp": 1030731790.2890625, + "heart_rate": 54 + }, + { + "timestamp": 1030731790.5390625, + "heart_rate": 54 + }, + { + "timestamp": 1030731790.7890625, + "heart_rate": 54 + }, + { + "timestamp": 1030731790.9208984, + "heart_rate": 53 + }, + { + "timestamp": 1030731791.1708984, + "heart_rate": 53 + }, + { + "timestamp": 1030731791.4208984, + "heart_rate": 53 + }, + { + "timestamp": 1030731791.6708984, + "heart_rate": 53 + }, + { + "timestamp": 1030731791.9208984, + "heart_rate": 53 + }, + { + "timestamp": 1030731792.0703125, + "heart_rate": 53 + }, + { + "timestamp": 1030731792.3203125, + "heart_rate": 53 + }, + { + "timestamp": 1030731792.5703125, + "heart_rate": 53 + }, + { + "timestamp": 1030731792.8203125, + "heart_rate": 53 + }, + { + "timestamp": 1030731793.0703125, + "heart_rate": 53 + }, + { + "timestamp": 1030731793.2373047, + "heart_rate": 53 + }, + { + "timestamp": 1030731793.4873047, + "heart_rate": 53 + }, + { + "timestamp": 1030731793.7373047, + "heart_rate": 53 + }, + { + "timestamp": 1030731793.9873047, + "heart_rate": 53 + }, + { + "timestamp": 1030731794.2373047, + "heart_rate": 53 + }, + { + "timestamp": 1030731794.4111328, + "heart_rate": 52 + }, + { + "timestamp": 1030731794.6611328, + "heart_rate": 52 + }, + { + "timestamp": 1030731794.9111328, + "heart_rate": 52 + }, + { + "timestamp": 1030731795.1611328, + "heart_rate": 52 + }, + { + "timestamp": 1030731795.4111328, + "heart_rate": 52 + }, + { + "timestamp": 1030731795.5732422, + "heart_rate": 52 + }, + { + "timestamp": 1030731795.8232422, + "heart_rate": 52 + }, + { + "timestamp": 1030731796.0732422, + "heart_rate": 52 + }, + { + "timestamp": 1030731796.3232422, + "heart_rate": 52 + }, + { + "timestamp": 1030731796.5732422, + "heart_rate": 52 + }, + { + "timestamp": 1030731796.7470703, + "heart_rate": 51 + }, + { + "timestamp": 1030731796.9970703, + "heart_rate": 51 + }, + { + "timestamp": 1030731797.2470703, + "heart_rate": 51 + }, + { + "timestamp": 1030731797.4970703, + "heart_rate": 51 + }, + { + "timestamp": 1030731797.7470703, + "heart_rate": 51 + }, + { + "timestamp": 1030731797.9199219, + "heart_rate": 51 + }, + { + "timestamp": 1030731798.1699219, + "heart_rate": 51 + }, + { + "timestamp": 1030731798.4199219, + "heart_rate": 51 + }, + { + "timestamp": 1030731798.6699219, + "heart_rate": 51 + }, + { + "timestamp": 1030731798.9199219, + "heart_rate": 51 + }, + { + "timestamp": 1030731799.0927734, + "heart_rate": 51 + }, + { + "timestamp": 1030731799.3427734, + "heart_rate": 51 + }, + { + "timestamp": 1030731799.5927734, + "heart_rate": 51 + }, + { + "timestamp": 1030731799.8427734, + "heart_rate": 51 + }, + { + "timestamp": 1030731800.0927734, + "heart_rate": 51 + }, + { + "timestamp": 1030731800.2978516, + "heart_rate": 51 + }, + { + "timestamp": 1030731800.5478516, + "heart_rate": 51 + }, + { + "timestamp": 1030731800.7978516, + "heart_rate": 51 + }, + { + "timestamp": 1030731801.0478516, + "heart_rate": 51 + }, + { + "timestamp": 1030731801.2978516, + "heart_rate": 51 + }, + { + "timestamp": 1030731801.4833984, + "heart_rate": 51 + }, + { + "timestamp": 1030731801.7333984, + "heart_rate": 51 + }, + { + "timestamp": 1030731801.9833984, + "heart_rate": 51 + }, + { + "timestamp": 1030731802.2333984, + "heart_rate": 51 + }, + { + "timestamp": 1030731802.4833984, + "heart_rate": 51 + }, + { + "timestamp": 1030731802.6523438, + "heart_rate": 51 + }, + { + "timestamp": 1030731802.9023438, + "heart_rate": 51 + }, + { + "timestamp": 1030731803.1523438, + "heart_rate": 51 + }, + { + "timestamp": 1030731803.4023438, + "heart_rate": 51 + }, + { + "timestamp": 1030731803.6523438, + "heart_rate": 51 + }, + { + "timestamp": 1030731803.8476562, + "heart_rate": 51 + }, + { + "timestamp": 1030731804.0976562, + "heart_rate": 51 + }, + { + "timestamp": 1030731804.3476562, + "heart_rate": 51 + }, + { + "timestamp": 1030731804.5976562, + "heart_rate": 51 + }, + { + "timestamp": 1030731804.8476562, + "heart_rate": 51 + }, + { + "timestamp": 1030731805.0380859, + "heart_rate": 51 + }, + { + "timestamp": 1030731805.2880859, + "heart_rate": 51 + }, + { + "timestamp": 1030731805.5380859, + "heart_rate": 51 + }, + { + "timestamp": 1030731805.7880859, + "heart_rate": 51 + }, + { + "timestamp": 1030731806.0380859, + "heart_rate": 51 + }, + { + "timestamp": 1030731806.1855469, + "heart_rate": 50 + }, + { + "timestamp": 1030731806.4355469, + "heart_rate": 50 + }, + { + "timestamp": 1030731806.6855469, + "heart_rate": 50 + }, + { + "timestamp": 1030731806.9355469, + "heart_rate": 50 + }, + { + "timestamp": 1030731807.1855469, + "heart_rate": 50 + }, + { + "timestamp": 1030731807.3261719, + "heart_rate": 51 + }, + { + "timestamp": 1030731807.5761719, + "heart_rate": 51 + }, + { + "timestamp": 1030731807.8261719, + "heart_rate": 51 + }, + { + "timestamp": 1030731808.0761719, + "heart_rate": 51 + }, + { + "timestamp": 1030731808.3066406, + "heart_rate": 52 + }, + { + "timestamp": 1030731808.5566406, + "heart_rate": 52 + }, + { + "timestamp": 1030731808.8066406, + "heart_rate": 52 + }, + { + "timestamp": 1030731809.0566406, + "heart_rate": 52 + }, + { + "timestamp": 1030731809.3066406, + "heart_rate": 52 + }, + { + "timestamp": 1030731809.5546875, + "heart_rate": 52 + }, + { + "timestamp": 1030731809.8046875, + "heart_rate": 52 + }, + { + "timestamp": 1030731810.0546875, + "heart_rate": 52 + }, + { + "timestamp": 1030731810.3046875, + "heart_rate": 52 + }, + { + "timestamp": 1030731810.5546875, + "heart_rate": 52 + }, + { + "timestamp": 1030731810.6640625, + "heart_rate": 52 + }, + { + "timestamp": 1030731810.9140625, + "heart_rate": 52 + }, + { + "timestamp": 1030731811.1640625, + "heart_rate": 52 + }, + { + "timestamp": 1030731811.4140625, + "heart_rate": 52 + }, + { + "timestamp": 1030731811.6640625, + "heart_rate": 52 + }, + { + "timestamp": 1030731811.7578125, + "heart_rate": 52 + }, + { + "timestamp": 1030731812.0078125, + "heart_rate": 52 + }, + { + "timestamp": 1030731812.2578125, + "heart_rate": 52 + }, + { + "timestamp": 1030731812.5078125, + "heart_rate": 52 + }, + { + "timestamp": 1030731812.7578125, + "heart_rate": 52 + }, + { + "timestamp": 1030731812.8408203, + "heart_rate": 53 + }, + { + "timestamp": 1030731813.0908203, + "heart_rate": 53 + }, + { + "timestamp": 1030731813.3408203, + "heart_rate": 53 + }, + { + "timestamp": 1030731813.5908203, + "heart_rate": 53 + }, + { + "timestamp": 1030731813.8408203, + "heart_rate": 53 + }, + { + "timestamp": 1030731813.9433594, + "heart_rate": 54 + }, + { + "timestamp": 1030731814.1933594, + "heart_rate": 54 + }, + { + "timestamp": 1030731814.4433594, + "heart_rate": 54 + }, + { + "timestamp": 1030731814.6933594, + "heart_rate": 54 + }, + { + "timestamp": 1030731814.9433594, + "heart_rate": 54 + }, + { + "timestamp": 1030731815.0673828, + "heart_rate": 54 + }, + { + "timestamp": 1030731815.3173828, + "heart_rate": 54 + }, + { + "timestamp": 1030731815.5673828, + "heart_rate": 54 + }, + { + "timestamp": 1030731815.8173828, + "heart_rate": 54 + }, + { + "timestamp": 1030731816.0673828, + "heart_rate": 54 + }, + { + "timestamp": 1030731816.1992188, + "heart_rate": 54 + }, + { + "timestamp": 1030731816.4492188, + "heart_rate": 54 + }, + { + "timestamp": 1030731816.6992188, + "heart_rate": 54 + }, + { + "timestamp": 1030731816.9492188, + "heart_rate": 54 + }, + { + "timestamp": 1030731817.1992188, + "heart_rate": 54 + }, + { + "timestamp": 1030731817.3330078, + "heart_rate": 53 + }, + { + "timestamp": 1030731817.5830078, + "heart_rate": 53 + }, + { + "timestamp": 1030731817.8330078, + "heart_rate": 53 + }, + { + "timestamp": 1030731818.0830078, + "heart_rate": 53 + }, + { + "timestamp": 1030731818.3330078, + "heart_rate": 53 + }, + { + "timestamp": 1030731818.4306641, + "heart_rate": 53 + }, + { + "timestamp": 1030731818.6806641, + "heart_rate": 53 + }, + { + "timestamp": 1030731818.9306641, + "heart_rate": 53 + }, + { + "timestamp": 1030731819.1806641, + "heart_rate": 53 + }, + { + "timestamp": 1030731819.4306641, + "heart_rate": 53 + }, + { + "timestamp": 1030731819.5332031, + "heart_rate": 54 + }, + { + "timestamp": 1030731819.7832031, + "heart_rate": 54 + }, + { + "timestamp": 1030731820.0332031, + "heart_rate": 54 + }, + { + "timestamp": 1030731820.2832031, + "heart_rate": 54 + }, + { + "timestamp": 1030731820.5332031, + "heart_rate": 54 + }, + { + "timestamp": 1030731820.6357422, + "heart_rate": 54 + }, + { + "timestamp": 1030731820.8857422, + "heart_rate": 54 + }, + { + "timestamp": 1030731821.1357422, + "heart_rate": 54 + }, + { + "timestamp": 1030731821.3857422, + "heart_rate": 54 + }, + { + "timestamp": 1030731821.6357422, + "heart_rate": 54 + }, + { + "timestamp": 1030731821.7138672, + "heart_rate": 54 + }, + { + "timestamp": 1030731821.9638672, + "heart_rate": 54 + }, + { + "timestamp": 1030731822.2138672, + "heart_rate": 54 + }, + { + "timestamp": 1030731822.4638672, + "heart_rate": 54 + }, + { + "timestamp": 1030731822.7138672, + "heart_rate": 54 + }, + { + "timestamp": 1030731822.8085938, + "heart_rate": 55 + }, + { + "timestamp": 1030731823.0585938, + "heart_rate": 55 + }, + { + "timestamp": 1030731823.3085938, + "heart_rate": 55 + }, + { + "timestamp": 1030731823.5585938, + "heart_rate": 55 + }, + { + "timestamp": 1030731823.8085938, + "heart_rate": 55 + }, + { + "timestamp": 1030731823.9101562, + "heart_rate": 55 + }, + { + "timestamp": 1030731824.1601562, + "heart_rate": 55 + }, + { + "timestamp": 1030731824.4101562, + "heart_rate": 55 + }, + { + "timestamp": 1030731824.6601562, + "heart_rate": 55 + }, + { + "timestamp": 1030731824.9101562, + "heart_rate": 55 + }, + { + "timestamp": 1030731824.9892578, + "heart_rate": 55 + }, + { + "timestamp": 1030731825.2392578, + "heart_rate": 55 + }, + { + "timestamp": 1030731825.4892578, + "heart_rate": 55 + }, + { + "timestamp": 1030731825.7392578, + "heart_rate": 55 + }, + { + "timestamp": 1030731825.9892578, + "heart_rate": 55 + }, + { + "timestamp": 1030731826.0898438, + "heart_rate": 55 + }, + { + "timestamp": 1030731826.3398438, + "heart_rate": 55 + }, + { + "timestamp": 1030731826.5898438, + "heart_rate": 55 + }, + { + "timestamp": 1030731826.8398438, + "heart_rate": 55 + }, + { + "timestamp": 1030731827.0898438, + "heart_rate": 55 + }, + { + "timestamp": 1030731827.2070312, + "heart_rate": 55 + }, + { + "timestamp": 1030731827.4570312, + "heart_rate": 55 + }, + { + "timestamp": 1030731827.7070312, + "heart_rate": 55 + }, + { + "timestamp": 1030731827.9570312, + "heart_rate": 55 + }, + { + "timestamp": 1030731828.2070312, + "heart_rate": 55 + }, + { + "timestamp": 1030731828.3232422, + "heart_rate": 54 + }, + { + "timestamp": 1030731828.5732422, + "heart_rate": 54 + }, + { + "timestamp": 1030731828.8232422, + "heart_rate": 54 + }, + { + "timestamp": 1030731829.0732422, + "heart_rate": 54 + }, + { + "timestamp": 1030731829.3232422, + "heart_rate": 54 + }, + { + "timestamp": 1030731829.4365234, + "heart_rate": 54 + }, + { + "timestamp": 1030731829.6865234, + "heart_rate": 54 + }, + { + "timestamp": 1030731829.9365234, + "heart_rate": 54 + }, + { + "timestamp": 1030731830.1865234, + "heart_rate": 54 + }, + { + "timestamp": 1030731830.4365234, + "heart_rate": 54 + }, + { + "timestamp": 1030731830.5351562, + "heart_rate": 54 + }, + { + "timestamp": 1030731830.7851562, + "heart_rate": 54 + }, + { + "timestamp": 1030731831.0351562, + "heart_rate": 54 + }, + { + "timestamp": 1030731831.2851562, + "heart_rate": 54 + }, + { + "timestamp": 1030731831.5351562, + "heart_rate": 54 + }, + { + "timestamp": 1030731831.6279297, + "heart_rate": 54 + }, + { + "timestamp": 1030731831.8779297, + "heart_rate": 54 + }, + { + "timestamp": 1030731832.1279297, + "heart_rate": 54 + }, + { + "timestamp": 1030731832.3779297, + "heart_rate": 54 + }, + { + "timestamp": 1030731832.6279297, + "heart_rate": 54 + }, + { + "timestamp": 1030731832.6738281, + "heart_rate": 55 + }, + { + "timestamp": 1030731832.9238281, + "heart_rate": 55 + }, + { + "timestamp": 1030731833.1738281, + "heart_rate": 55 + }, + { + "timestamp": 1030731833.4238281, + "heart_rate": 55 + }, + { + "timestamp": 1030731833.6738281, + "heart_rate": 55 + }, + { + "timestamp": 1030731833.7119141, + "heart_rate": 56 + }, + { + "timestamp": 1030731833.9619141, + "heart_rate": 56 + }, + { + "timestamp": 1030731834.2119141, + "heart_rate": 56 + }, + { + "timestamp": 1030731834.4619141, + "heart_rate": 56 + }, + { + "timestamp": 1030731834.7119141, + "heart_rate": 56 + }, + { + "timestamp": 1030731834.7597656, + "heart_rate": 57 + }, + { + "timestamp": 1030731835.0097656, + "heart_rate": 57 + }, + { + "timestamp": 1030731835.2597656, + "heart_rate": 57 + }, + { + "timestamp": 1030731835.5097656, + "heart_rate": 57 + }, + { + "timestamp": 1030731835.7597656, + "heart_rate": 57 + }, + { + "timestamp": 1030731835.8017578, + "heart_rate": 57 + }, + { + "timestamp": 1030731836.0517578, + "heart_rate": 57 + }, + { + "timestamp": 1030731836.3017578, + "heart_rate": 57 + }, + { + "timestamp": 1030731836.5517578, + "heart_rate": 57 + }, + { + "timestamp": 1030731836.8017578, + "heart_rate": 57 + }, + { + "timestamp": 1030731836.8320312, + "heart_rate": 57 + }, + { + "timestamp": 1030731837.0820312, + "heart_rate": 57 + }, + { + "timestamp": 1030731837.3320312, + "heart_rate": 57 + }, + { + "timestamp": 1030731837.5820312, + "heart_rate": 57 + }, + { + "timestamp": 1030731837.8320312, + "heart_rate": 57 + }, + { + "timestamp": 1030731837.8779297, + "heart_rate": 57 + }, + { + "timestamp": 1030731838.1279297, + "heart_rate": 57 + }, + { + "timestamp": 1030731838.3779297, + "heart_rate": 57 + }, + { + "timestamp": 1030731838.6279297, + "heart_rate": 57 + }, + { + "timestamp": 1030731838.8779297, + "heart_rate": 57 + }, + { + "timestamp": 1030731838.9150391, + "heart_rate": 58 + }, + { + "timestamp": 1030731839.1650391, + "heart_rate": 58 + }, + { + "timestamp": 1030731839.4150391, + "heart_rate": 58 + }, + { + "timestamp": 1030731839.6650391, + "heart_rate": 58 + }, + { + "timestamp": 1030731839.9150391, + "heart_rate": 58 + }, + { + "timestamp": 1030731839.9453125, + "heart_rate": 58 + }, + { + "timestamp": 1030731840.1953125, + "heart_rate": 58 + }, + { + "timestamp": 1030731840.4453125, + "heart_rate": 58 + }, + { + "timestamp": 1030731840.6953125, + "heart_rate": 58 + }, + { + "timestamp": 1030731840.9453125, + "heart_rate": 58 + }, + { + "timestamp": 1030731840.9824219, + "heart_rate": 58 + }, + { + "timestamp": 1030731841.2324219, + "heart_rate": 58 + }, + { + "timestamp": 1030731841.4824219, + "heart_rate": 58 + }, + { + "timestamp": 1030731841.7324219, + "heart_rate": 58 + }, + { + "timestamp": 1030731841.9824219, + "heart_rate": 58 + }, + { + "timestamp": 1030731841.9882812, + "heart_rate": 58 + }, + { + "timestamp": 1030731842.2382812, + "heart_rate": 58 + }, + { + "timestamp": 1030731842.4882812, + "heart_rate": 58 + }, + { + "timestamp": 1030731842.7382812, + "heart_rate": 58 + }, + { + "timestamp": 1030731842.9882812, + "heart_rate": 58 + }, + { + "timestamp": 1030731843.0117188, + "heart_rate": 58 + }, + { + "timestamp": 1030731843.2617188, + "heart_rate": 58 + }, + { + "timestamp": 1030731843.5117188, + "heart_rate": 58 + }, + { + "timestamp": 1030731843.7617188, + "heart_rate": 58 + }, + { + "timestamp": 1030731844.0117188, + "heart_rate": 58 + }, + { + "timestamp": 1030731844.0478516, + "heart_rate": 58 + }, + { + "timestamp": 1030731844.2978516, + "heart_rate": 58 + }, + { + "timestamp": 1030731844.5478516, + "heart_rate": 58 + }, + { + "timestamp": 1030731844.7978516, + "heart_rate": 58 + }, + { + "timestamp": 1030731845.0478516, + "heart_rate": 58 + }, + { + "timestamp": 1030731845.1103516, + "heart_rate": 58 + }, + { + "timestamp": 1030731845.3603516, + "heart_rate": 58 + }, + { + "timestamp": 1030731845.6103516, + "heart_rate": 58 + }, + { + "timestamp": 1030731845.8603516, + "heart_rate": 58 + }, + { + "timestamp": 1030731846.1103516, + "heart_rate": 58 + }, + { + "timestamp": 1030731846.2109375, + "heart_rate": 57 + }, + { + "timestamp": 1030731846.4609375, + "heart_rate": 57 + }, + { + "timestamp": 1030731846.7109375, + "heart_rate": 57 + }, + { + "timestamp": 1030731846.9609375, + "heart_rate": 57 + }, + { + "timestamp": 1030731847.2109375, + "heart_rate": 57 + }, + { + "timestamp": 1030731847.3203125, + "heart_rate": 56 + }, + { + "timestamp": 1030731847.5703125, + "heart_rate": 56 + }, + { + "timestamp": 1030731847.8203125, + "heart_rate": 56 + }, + { + "timestamp": 1030731848.0703125, + "heart_rate": 56 + }, + { + "timestamp": 1030731848.3203125, + "heart_rate": 56 + }, + { + "timestamp": 1030731848.4580078, + "heart_rate": 55 + }, + { + "timestamp": 1030731848.7080078, + "heart_rate": 55 + }, + { + "timestamp": 1030731848.9580078, + "heart_rate": 55 + }, + { + "timestamp": 1030731849.2080078, + "heart_rate": 55 + }, + { + "timestamp": 1030731849.4580078, + "heart_rate": 55 + }, + { + "timestamp": 1030731849.6123047, + "heart_rate": 54 + }, + { + "timestamp": 1030731849.8623047, + "heart_rate": 54 + }, + { + "timestamp": 1030731850.1123047, + "heart_rate": 54 + }, + { + "timestamp": 1030731850.3623047, + "heart_rate": 54 + }, + { + "timestamp": 1030731850.6123047, + "heart_rate": 54 + }, + { + "timestamp": 1030731850.7822266, + "heart_rate": 53 + }, + { + "timestamp": 1030731851.0322266, + "heart_rate": 53 + }, + { + "timestamp": 1030731851.2822266, + "heart_rate": 53 + }, + { + "timestamp": 1030731851.5322266, + "heart_rate": 53 + }, + { + "timestamp": 1030731851.7822266, + "heart_rate": 53 + }, + { + "timestamp": 1030731851.9775391, + "heart_rate": 52 + }, + { + "timestamp": 1030731852.2275391, + "heart_rate": 52 + }, + { + "timestamp": 1030731852.4775391, + "heart_rate": 52 + }, + { + "timestamp": 1030731852.7275391, + "heart_rate": 52 + }, + { + "timestamp": 1030731852.9775391, + "heart_rate": 52 + }, + { + "timestamp": 1030731853.1669922, + "heart_rate": 51 + }, + { + "timestamp": 1030731853.4169922, + "heart_rate": 51 + }, + { + "timestamp": 1030731853.6669922, + "heart_rate": 51 + }, + { + "timestamp": 1030731853.9169922, + "heart_rate": 51 + }, + { + "timestamp": 1030731854.1669922, + "heart_rate": 51 + }, + { + "timestamp": 1030731854.3349609, + "heart_rate": 51 + }, + { + "timestamp": 1030731854.5849609, + "heart_rate": 51 + }, + { + "timestamp": 1030731854.8349609, + "heart_rate": 51 + }, + { + "timestamp": 1030731855.0849609, + "heart_rate": 51 + }, + { + "timestamp": 1030731855.3349609, + "heart_rate": 51 + }, + { + "timestamp": 1030731855.5078125, + "heart_rate": 51 + }, + { + "timestamp": 1030731855.7578125, + "heart_rate": 51 + }, + { + "timestamp": 1030731856.0078125, + "heart_rate": 51 + }, + { + "timestamp": 1030731856.2578125, + "heart_rate": 51 + }, + { + "timestamp": 1030731856.5078125, + "heart_rate": 51 + }, + { + "timestamp": 1030731856.6220703, + "heart_rate": 51 + }, + { + "timestamp": 1030731856.8720703, + "heart_rate": 51 + }, + { + "timestamp": 1030731857.1220703, + "heart_rate": 51 + }, + { + "timestamp": 1030731857.3720703, + "heart_rate": 51 + }, + { + "timestamp": 1030731857.6220703, + "heart_rate": 51 + }, + { + "timestamp": 1030731857.6367188, + "heart_rate": 53 + }, + { + "timestamp": 1030731857.8867188, + "heart_rate": 53 + }, + { + "timestamp": 1030731858.1367188, + "heart_rate": 53 + }, + { + "timestamp": 1030731858.3867188, + "heart_rate": 53 + }, + { + "timestamp": 1030731858.6367188, + "heart_rate": 53 + }, + { + "timestamp": 1030731858.6660156, + "heart_rate": 55 + }, + { + "timestamp": 1030731858.9160156, + "heart_rate": 55 + }, + { + "timestamp": 1030731859.1660156, + "heart_rate": 55 + }, + { + "timestamp": 1030731859.4160156, + "heart_rate": 55 + }, + { + "timestamp": 1030731859.6660156, + "heart_rate": 55 + }, + { + "timestamp": 1030731859.7773438, + "heart_rate": 57 + }, + { + "timestamp": 1030731860.0273438, + "heart_rate": 57 + }, + { + "timestamp": 1030731860.2773438, + "heart_rate": 57 + }, + { + "timestamp": 1030731860.5273438, + "heart_rate": 57 + }, + { + "timestamp": 1030731860.7773438, + "heart_rate": 57 + }, + { + "timestamp": 1030731860.8945312, + "heart_rate": 55 + }, + { + "timestamp": 1030731861.1445312, + "heart_rate": 55 + }, + { + "timestamp": 1030731861.3945312, + "heart_rate": 55 + }, + { + "timestamp": 1030731861.6445312, + "heart_rate": 55 + }, + { + "timestamp": 1030731861.8945312, + "heart_rate": 55 + }, + { + "timestamp": 1030731862.0458984, + "heart_rate": 55 + }, + { + "timestamp": 1030731862.2958984, + "heart_rate": 55 + }, + { + "timestamp": 1030731862.5458984, + "heart_rate": 55 + }, + { + "timestamp": 1030731862.7958984, + "heart_rate": 55 + }, + { + "timestamp": 1030731863.0458984, + "heart_rate": 55 + }, + { + "timestamp": 1030731863.2314453, + "heart_rate": 53 + }, + { + "timestamp": 1030731863.4814453, + "heart_rate": 53 + }, + { + "timestamp": 1030731863.7314453, + "heart_rate": 53 + }, + { + "timestamp": 1030731863.9814453, + "heart_rate": 53 + }, + { + "timestamp": 1030731864.2314453, + "heart_rate": 53 + }, + { + "timestamp": 1030731864.3867188, + "heart_rate": 53 + }, + { + "timestamp": 1030731864.6367188, + "heart_rate": 53 + }, + { + "timestamp": 1030731864.8867188, + "heart_rate": 53 + }, + { + "timestamp": 1030731865.1367188, + "heart_rate": 53 + }, + { + "timestamp": 1030731865.3867188, + "heart_rate": 53 + }, + { + "timestamp": 1030731865.5478516, + "heart_rate": 52 + }, + { + "timestamp": 1030731865.7978516, + "heart_rate": 52 + }, + { + "timestamp": 1030731866.0478516, + "heart_rate": 52 + }, + { + "timestamp": 1030731866.2978516, + "heart_rate": 52 + }, + { + "timestamp": 1030731866.5478516, + "heart_rate": 52 + }, + { + "timestamp": 1030731866.7177734, + "heart_rate": 52 + }, + { + "timestamp": 1030731866.9677734, + "heart_rate": 52 + }, + { + "timestamp": 1030731867.2177734, + "heart_rate": 52 + }, + { + "timestamp": 1030731867.4677734, + "heart_rate": 52 + }, + { + "timestamp": 1030731867.7177734, + "heart_rate": 52 + }, + { + "timestamp": 1030731867.8710938, + "heart_rate": 52 + }, + { + "timestamp": 1030731868.1210938, + "heart_rate": 52 + }, + { + "timestamp": 1030731868.3710938, + "heart_rate": 52 + }, + { + "timestamp": 1030731868.6210938, + "heart_rate": 52 + }, + { + "timestamp": 1030731868.8710938, + "heart_rate": 52 + }, + { + "timestamp": 1030731869.0410156, + "heart_rate": 52 + }, + { + "timestamp": 1030731869.2910156, + "heart_rate": 52 + }, + { + "timestamp": 1030731869.5410156, + "heart_rate": 52 + }, + { + "timestamp": 1030731869.7910156, + "heart_rate": 52 + }, + { + "timestamp": 1030731870.0410156, + "heart_rate": 52 + }, + { + "timestamp": 1030731870.2255859, + "heart_rate": 51 + }, + { + "timestamp": 1030731870.4755859, + "heart_rate": 51 + }, + { + "timestamp": 1030731870.7255859, + "heart_rate": 51 + }, + { + "timestamp": 1030731870.9755859, + "heart_rate": 51 + }, + { + "timestamp": 1030731871.2255859, + "heart_rate": 51 + }, + { + "timestamp": 1030731871.3925781, + "heart_rate": 51 + }, + { + "timestamp": 1030731871.6425781, + "heart_rate": 51 + }, + { + "timestamp": 1030731871.8925781, + "heart_rate": 51 + }, + { + "timestamp": 1030731872.1425781, + "heart_rate": 51 + }, + { + "timestamp": 1030731872.3925781, + "heart_rate": 51 + }, + { + "timestamp": 1030731872.5810547, + "heart_rate": 51 + }, + { + "timestamp": 1030731872.8310547, + "heart_rate": 51 + }, + { + "timestamp": 1030731873.0810547, + "heart_rate": 51 + }, + { + "timestamp": 1030731873.3310547, + "heart_rate": 51 + }, + { + "timestamp": 1030731873.5810547, + "heart_rate": 51 + }, + { + "timestamp": 1030731873.7929688, + "heart_rate": 51 + }, + { + "timestamp": 1030731874.0429688, + "heart_rate": 51 + }, + { + "timestamp": 1030731874.2929688, + "heart_rate": 51 + }, + { + "timestamp": 1030731874.5429688, + "heart_rate": 51 + }, + { + "timestamp": 1030731874.7929688, + "heart_rate": 51 + }, + { + "timestamp": 1030731874.9335938, + "heart_rate": 51 + }, + { + "timestamp": 1030731875.1835938, + "heart_rate": 51 + }, + { + "timestamp": 1030731875.4335938, + "heart_rate": 51 + }, + { + "timestamp": 1030731875.6835938, + "heart_rate": 51 + }, + { + "timestamp": 1030731875.9335938, + "heart_rate": 51 + }, + { + "timestamp": 1030731876.0634766, + "heart_rate": 52 + }, + { + "timestamp": 1030731876.3134766, + "heart_rate": 52 + }, + { + "timestamp": 1030731876.5634766, + "heart_rate": 52 + }, + { + "timestamp": 1030731876.8134766, + "heart_rate": 52 + }, + { + "timestamp": 1030731877.0634766, + "heart_rate": 52 + }, + { + "timestamp": 1030731877.2080078, + "heart_rate": 52 + }, + { + "timestamp": 1030731877.4580078, + "heart_rate": 52 + }, + { + "timestamp": 1030731877.7080078, + "heart_rate": 52 + }, + { + "timestamp": 1030731877.9580078, + "heart_rate": 52 + }, + { + "timestamp": 1030731878.2080078, + "heart_rate": 52 + }, + { + "timestamp": 1030731878.3320312, + "heart_rate": 53 + }, + { + "timestamp": 1030731878.5820312, + "heart_rate": 53 + }, + { + "timestamp": 1030731878.8320312, + "heart_rate": 53 + }, + { + "timestamp": 1030731879.0820312, + "heart_rate": 53 + }, + { + "timestamp": 1030731879.3320312, + "heart_rate": 53 + }, + { + "timestamp": 1030731879.4472656, + "heart_rate": 53 + }, + { + "timestamp": 1030731879.6972656, + "heart_rate": 53 + }, + { + "timestamp": 1030731879.9472656, + "heart_rate": 53 + }, + { + "timestamp": 1030731880.1972656, + "heart_rate": 53 + }, + { + "timestamp": 1030731880.4472656, + "heart_rate": 53 + }, + { + "timestamp": 1030731880.5517578, + "heart_rate": 53 + }, + { + "timestamp": 1030731880.8017578, + "heart_rate": 53 + }, + { + "timestamp": 1030731881.0517578, + "heart_rate": 53 + }, + { + "timestamp": 1030731881.3017578, + "heart_rate": 53 + }, + { + "timestamp": 1030731881.5517578, + "heart_rate": 53 + }, + { + "timestamp": 1030731881.6748047, + "heart_rate": 54 + }, + { + "timestamp": 1030731881.9248047, + "heart_rate": 54 + }, + { + "timestamp": 1030731882.1748047, + "heart_rate": 54 + }, + { + "timestamp": 1030731882.4248047, + "heart_rate": 54 + }, + { + "timestamp": 1030731882.6748047, + "heart_rate": 54 + }, + { + "timestamp": 1030731882.8388672, + "heart_rate": 54 + }, + { + "timestamp": 1030731883.0888672, + "heart_rate": 54 + }, + { + "timestamp": 1030731883.3388672, + "heart_rate": 54 + }, + { + "timestamp": 1030731883.5888672, + "heart_rate": 54 + }, + { + "timestamp": 1030731883.8388672, + "heart_rate": 54 + }, + { + "timestamp": 1030731883.9521484, + "heart_rate": 53 + }, + { + "timestamp": 1030731884.2021484, + "heart_rate": 53 + }, + { + "timestamp": 1030731884.4521484, + "heart_rate": 53 + }, + { + "timestamp": 1030731884.7021484, + "heart_rate": 53 + }, + { + "timestamp": 1030731884.9521484, + "heart_rate": 53 + }, + { + "timestamp": 1030731885.0771484, + "heart_rate": 53 + }, + { + "timestamp": 1030731885.3271484, + "heart_rate": 53 + }, + { + "timestamp": 1030731885.5771484, + "heart_rate": 53 + }, + { + "timestamp": 1030731885.8271484, + "heart_rate": 53 + }, + { + "timestamp": 1030731886.0771484, + "heart_rate": 53 + }, + { + "timestamp": 1030731886.2207031, + "heart_rate": 53 + }, + { + "timestamp": 1030731886.4707031, + "heart_rate": 53 + }, + { + "timestamp": 1030731886.7207031, + "heart_rate": 53 + }, + { + "timestamp": 1030731886.9707031, + "heart_rate": 53 + }, + { + "timestamp": 1030731887.2207031, + "heart_rate": 53 + }, + { + "timestamp": 1030731887.34375, + "heart_rate": 53 + }, + { + "timestamp": 1030731887.59375, + "heart_rate": 53 + }, + { + "timestamp": 1030731887.84375, + "heart_rate": 53 + }, + { + "timestamp": 1030731888.09375, + "heart_rate": 53 + }, + { + "timestamp": 1030731888.34375, + "heart_rate": 53 + }, + { + "timestamp": 1030731888.4746094, + "heart_rate": 53 + }, + { + "timestamp": 1030731888.7246094, + "heart_rate": 53 + }, + { + "timestamp": 1030731888.9746094, + "heart_rate": 53 + }, + { + "timestamp": 1030731889.2246094, + "heart_rate": 53 + }, + { + "timestamp": 1030731889.4746094, + "heart_rate": 53 + }, + { + "timestamp": 1030731889.6162109, + "heart_rate": 53 + }, + { + "timestamp": 1030731889.8662109, + "heart_rate": 53 + }, + { + "timestamp": 1030731890.1162109, + "heart_rate": 53 + }, + { + "timestamp": 1030731890.3662109, + "heart_rate": 53 + }, + { + "timestamp": 1030731890.6162109, + "heart_rate": 53 + }, + { + "timestamp": 1030731890.7529297, + "heart_rate": 53 + }, + { + "timestamp": 1030731891.0029297, + "heart_rate": 53 + }, + { + "timestamp": 1030731891.2529297, + "heart_rate": 53 + }, + { + "timestamp": 1030731891.5029297, + "heart_rate": 53 + }, + { + "timestamp": 1030731891.7529297, + "heart_rate": 53 + }, + { + "timestamp": 1030731891.9287109, + "heart_rate": 53 + }, + { + "timestamp": 1030731892.1787109, + "heart_rate": 53 + }, + { + "timestamp": 1030731892.4287109, + "heart_rate": 53 + }, + { + "timestamp": 1030731892.6787109, + "heart_rate": 53 + }, + { + "timestamp": 1030731892.9287109, + "heart_rate": 53 + }, + { + "timestamp": 1030731893.1132812, + "heart_rate": 52 + }, + { + "timestamp": 1030731893.3632812, + "heart_rate": 52 + }, + { + "timestamp": 1030731893.6132812, + "heart_rate": 52 + }, + { + "timestamp": 1030731893.8632812, + "heart_rate": 52 + }, + { + "timestamp": 1030731894.1132812, + "heart_rate": 52 + }, + { + "timestamp": 1030731894.3251953, + "heart_rate": 51 + }, + { + "timestamp": 1030731894.5751953, + "heart_rate": 51 + }, + { + "timestamp": 1030731894.8251953, + "heart_rate": 51 + }, + { + "timestamp": 1030731895.0751953, + "heart_rate": 51 + }, + { + "timestamp": 1030731895.3251953, + "heart_rate": 51 + }, + { + "timestamp": 1030731895.5351562, + "heart_rate": 50 + }, + { + "timestamp": 1030731895.7851562, + "heart_rate": 50 + }, + { + "timestamp": 1030731896.0351562, + "heart_rate": 50 + }, + { + "timestamp": 1030731896.2851562, + "heart_rate": 50 + }, + { + "timestamp": 1030731896.5351562, + "heart_rate": 50 + }, + { + "timestamp": 1030731896.7724609, + "heart_rate": 50 + }, + { + "timestamp": 1030731897.0224609, + "heart_rate": 50 + }, + { + "timestamp": 1030731897.2724609, + "heart_rate": 50 + }, + { + "timestamp": 1030731897.5224609, + "heart_rate": 50 + }, + { + "timestamp": 1030731897.7724609, + "heart_rate": 50 + }, + { + "timestamp": 1030731897.9892578, + "heart_rate": 50 + }, + { + "timestamp": 1030731898.2392578, + "heart_rate": 50 + }, + { + "timestamp": 1030731898.4892578, + "heart_rate": 50 + }, + { + "timestamp": 1030731898.7392578, + "heart_rate": 50 + }, + { + "timestamp": 1030731898.9892578, + "heart_rate": 50 + }, + { + "timestamp": 1030731899.1728516, + "heart_rate": 49 + }, + { + "timestamp": 1030731899.4228516, + "heart_rate": 49 + }, + { + "timestamp": 1030731899.6728516, + "heart_rate": 49 + }, + { + "timestamp": 1030731899.9228516, + "heart_rate": 49 + }, + { + "timestamp": 1030731900.1728516, + "heart_rate": 49 + }, + { + "timestamp": 1030731900.3134766, + "heart_rate": 50 + }, + { + "timestamp": 1030731900.5634766, + "heart_rate": 50 + }, + { + "timestamp": 1030731900.8134766, + "heart_rate": 50 + }, + { + "timestamp": 1030731901.0634766, + "heart_rate": 50 + }, + { + "timestamp": 1030731901.3134766, + "heart_rate": 50 + }, + { + "timestamp": 1030731901.4345703, + "heart_rate": 51 + }, + { + "timestamp": 1030731901.6845703, + "heart_rate": 51 + }, + { + "timestamp": 1030731901.9345703, + "heart_rate": 51 + }, + { + "timestamp": 1030731902.1845703, + "heart_rate": 51 + }, + { + "timestamp": 1030731902.4345703, + "heart_rate": 51 + }, + { + "timestamp": 1030731902.4814453, + "heart_rate": 52 + }, + { + "timestamp": 1030731902.7314453, + "heart_rate": 52 + }, + { + "timestamp": 1030731902.9814453, + "heart_rate": 52 + }, + { + "timestamp": 1030731903.2314453, + "heart_rate": 52 + }, + { + "timestamp": 1030731903.4345703, + "heart_rate": 55 + }, + { + "timestamp": 1030731903.6845703, + "heart_rate": 55 + }, + { + "timestamp": 1030731903.9345703, + "heart_rate": 55 + }, + { + "timestamp": 1030731904.1845703, + "heart_rate": 55 + }, + { + "timestamp": 1030731904.390625, + "heart_rate": 58 + }, + { + "timestamp": 1030731904.640625, + "heart_rate": 58 + }, + { + "timestamp": 1030731904.890625, + "heart_rate": 58 + }, + { + "timestamp": 1030731905.140625, + "heart_rate": 58 + }, + { + "timestamp": 1030731905.390625, + "heart_rate": 58 + }, + { + "timestamp": 1030731905.4042969, + "heart_rate": 60 + }, + { + "timestamp": 1030731905.6542969, + "heart_rate": 60 + }, + { + "timestamp": 1030731905.9042969, + "heart_rate": 60 + }, + { + "timestamp": 1030731906.1542969, + "heart_rate": 60 + }, + { + "timestamp": 1030731906.4042969, + "heart_rate": 60 + }, + { + "timestamp": 1030731906.4287109, + "heart_rate": 60 + }, + { + "timestamp": 1030731906.6787109, + "heart_rate": 60 + }, + { + "timestamp": 1030731906.9287109, + "heart_rate": 60 + }, + { + "timestamp": 1030731907.1787109, + "heart_rate": 60 + }, + { + "timestamp": 1030731907.4287109, + "heart_rate": 60 + }, + { + "timestamp": 1030731907.4492188, + "heart_rate": 59 + }, + { + "timestamp": 1030731907.6992188, + "heart_rate": 59 + }, + { + "timestamp": 1030731907.9492188, + "heart_rate": 59 + }, + { + "timestamp": 1030731908.1992188, + "heart_rate": 59 + }, + { + "timestamp": 1030731908.4492188, + "heart_rate": 59 + }, + { + "timestamp": 1030731908.4765625, + "heart_rate": 59 + }, + { + "timestamp": 1030731908.7265625, + "heart_rate": 59 + }, + { + "timestamp": 1030731908.9765625, + "heart_rate": 59 + }, + { + "timestamp": 1030731909.2265625, + "heart_rate": 59 + }, + { + "timestamp": 1030731909.4765625, + "heart_rate": 59 + }, + { + "timestamp": 1030731909.5234375, + "heart_rate": 59 + }, + { + "timestamp": 1030731909.7734375, + "heart_rate": 59 + }, + { + "timestamp": 1030731910.0234375, + "heart_rate": 59 + }, + { + "timestamp": 1030731910.2734375, + "heart_rate": 59 + }, + { + "timestamp": 1030731910.3554688, + "heart_rate": 59 + }, + { + "timestamp": 1030731910.6054688, + "heart_rate": 59 + }, + { + "timestamp": 1030731910.8554688, + "heart_rate": 59 + }, + { + "timestamp": 1030731910.8701172, + "heart_rate": 59 + }, + { + "timestamp": 1030731911.1201172, + "heart_rate": 59 + }, + { + "timestamp": 1030731911.3701172, + "heart_rate": 59 + }, + { + "timestamp": 1030731911.6201172, + "heart_rate": 59 + }, + { + "timestamp": 1030731911.8701172, + "heart_rate": 59 + }, + { + "timestamp": 1030731911.9150391, + "heart_rate": 59 + }, + { + "timestamp": 1030731912.1650391, + "heart_rate": 59 + }, + { + "timestamp": 1030731912.4150391, + "heart_rate": 59 + }, + { + "timestamp": 1030731912.6650391, + "heart_rate": 59 + }, + { + "timestamp": 1030731912.9150391, + "heart_rate": 59 + }, + { + "timestamp": 1030731912.9345703, + "heart_rate": 59 + }, + { + "timestamp": 1030731913.1845703, + "heart_rate": 59 + }, + { + "timestamp": 1030731913.4345703, + "heart_rate": 59 + }, + { + "timestamp": 1030731913.6845703, + "heart_rate": 59 + }, + { + "timestamp": 1030731913.9345703, + "heart_rate": 59 + }, + { + "timestamp": 1030731913.9394531, + "heart_rate": 59 + }, + { + "timestamp": 1030731914.1894531, + "heart_rate": 59 + }, + { + "timestamp": 1030731914.4394531, + "heart_rate": 59 + }, + { + "timestamp": 1030731914.6894531, + "heart_rate": 59 + }, + { + "timestamp": 1030731914.8974609, + "heart_rate": 59 + }, + { + "timestamp": 1030731915.1474609, + "heart_rate": 59 + }, + { + "timestamp": 1030731915.3642578, + "heart_rate": 59 + }, + { + "timestamp": 1030731915.6142578, + "heart_rate": 59 + }, + { + "timestamp": 1030731915.8642578, + "heart_rate": 59 + }, + { + "timestamp": 1030731916.1142578, + "heart_rate": 59 + }, + { + "timestamp": 1030731916.3642578, + "heart_rate": 59 + }, + { + "timestamp": 1030731916.4052734, + "heart_rate": 59 + }, + { + "timestamp": 1030731916.6552734, + "heart_rate": 59 + }, + { + "timestamp": 1030731916.9052734, + "heart_rate": 59 + }, + { + "timestamp": 1030731917.1552734, + "heart_rate": 59 + }, + { + "timestamp": 1030731917.3007812, + "heart_rate": 59 + }, + { + "timestamp": 1030731917.5507812, + "heart_rate": 59 + }, + { + "timestamp": 1030731917.8007812, + "heart_rate": 59 + }, + { + "timestamp": 1030731918.0507812, + "heart_rate": 59 + }, + { + "timestamp": 1030731918.1884766, + "heart_rate": 59 + }, + { + "timestamp": 1030731918.4384766, + "heart_rate": 59 + }, + { + "timestamp": 1030731918.6884766, + "heart_rate": 59 + }, + { + "timestamp": 1030731918.9384766, + "heart_rate": 59 + }, + { + "timestamp": 1030731919.1884766, + "heart_rate": 59 + }, + { + "timestamp": 1030731919.3427734, + "heart_rate": 59 + }, + { + "timestamp": 1030731919.5927734, + "heart_rate": 59 + }, + { + "timestamp": 1030731919.8427734, + "heart_rate": 59 + }, + { + "timestamp": 1030731920.0927734, + "heart_rate": 59 + }, + { + "timestamp": 1030731920.3427734, + "heart_rate": 59 + }, + { + "timestamp": 1030731920.3964844, + "heart_rate": 59 + }, + { + "timestamp": 1030731920.6464844, + "heart_rate": 59 + }, + { + "timestamp": 1030731920.8964844, + "heart_rate": 59 + }, + { + "timestamp": 1030731920.9580078, + "heart_rate": 59 + }, + { + "timestamp": 1030731921.2080078, + "heart_rate": 59 + }, + { + "timestamp": 1030731921.4580078, + "heart_rate": 59 + }, + { + "timestamp": 1030731921.7080078, + "heart_rate": 59 + }, + { + "timestamp": 1030731921.9580078, + "heart_rate": 59 + }, + { + "timestamp": 1030731922.015625, + "heart_rate": 59 + }, + { + "timestamp": 1030731922.265625, + "heart_rate": 59 + }, + { + "timestamp": 1030731922.515625, + "heart_rate": 59 + }, + { + "timestamp": 1030731922.765625, + "heart_rate": 59 + }, + { + "timestamp": 1030731922.9394531, + "heart_rate": 59 + }, + { + "timestamp": 1030731923.1894531, + "heart_rate": 59 + }, + { + "timestamp": 1030731923.4394531, + "heart_rate": 59 + }, + { + "timestamp": 1030731923.609375, + "heart_rate": 59 + }, + { + "timestamp": 1030731923.859375, + "heart_rate": 59 + }, + { + "timestamp": 1030731924.109375, + "heart_rate": 59 + }, + { + "timestamp": 1030731924.1474609, + "heart_rate": 59 + }, + { + "timestamp": 1030731924.3974609, + "heart_rate": 59 + }, + { + "timestamp": 1030731924.6474609, + "heart_rate": 59 + }, + { + "timestamp": 1030731924.8974609, + "heart_rate": 59 + }, + { + "timestamp": 1030731924.9257812, + "heart_rate": 60 + }, + { + "timestamp": 1030731925.1757812, + "heart_rate": 60 + }, + { + "timestamp": 1030731925.4257812, + "heart_rate": 60 + }, + { + "timestamp": 1030731925.6757812, + "heart_rate": 60 + }, + { + "timestamp": 1030731925.7041016, + "heart_rate": 60 + }, + { + "timestamp": 1030731925.9541016, + "heart_rate": 60 + }, + { + "timestamp": 1030731926.2041016, + "heart_rate": 60 + }, + { + "timestamp": 1030731926.4541016, + "heart_rate": 60 + }, + { + "timestamp": 1030731926.4824219, + "heart_rate": 60 + }, + { + "timestamp": 1030731926.7324219, + "heart_rate": 60 + }, + { + "timestamp": 1030731926.9824219, + "heart_rate": 60 + }, + { + "timestamp": 1030731927.2324219, + "heart_rate": 60 + }, + { + "timestamp": 1030731927.4824219, + "heart_rate": 60 + }, + { + "timestamp": 1030731927.5693359, + "heart_rate": 59 + }, + { + "timestamp": 1030731927.8193359, + "heart_rate": 59 + }, + { + "timestamp": 1030731928.0693359, + "heart_rate": 59 + }, + { + "timestamp": 1030731928.3193359, + "heart_rate": 59 + }, + { + "timestamp": 1030731928.5361328, + "heart_rate": 59 + }, + { + "timestamp": 1030731928.7861328, + "heart_rate": 59 + }, + { + "timestamp": 1030731929.0361328, + "heart_rate": 59 + }, + { + "timestamp": 1030731929.2861328, + "heart_rate": 59 + }, + { + "timestamp": 1030731929.4199219, + "heart_rate": 59 + }, + { + "timestamp": 1030731929.6699219, + "heart_rate": 59 + }, + { + "timestamp": 1030731929.9199219, + "heart_rate": 59 + }, + { + "timestamp": 1030731930.1699219, + "heart_rate": 59 + }, + { + "timestamp": 1030731930.4199219, + "heart_rate": 59 + }, + { + "timestamp": 1030731930.4208984, + "heart_rate": 59 + }, + { + "timestamp": 1030731930.6708984, + "heart_rate": 59 + }, + { + "timestamp": 1030731930.9208984, + "heart_rate": 59 + }, + { + "timestamp": 1030731931.1708984, + "heart_rate": 59 + }, + { + "timestamp": 1030731931.4208984, + "heart_rate": 59 + }, + { + "timestamp": 1030731931.4853516, + "heart_rate": 58 + }, + { + "timestamp": 1030731931.7353516, + "heart_rate": 58 + }, + { + "timestamp": 1030731931.9853516, + "heart_rate": 58 + }, + { + "timestamp": 1030731932.2353516, + "heart_rate": 58 + }, + { + "timestamp": 1030731932.4853516, + "heart_rate": 58 + }, + { + "timestamp": 1030731932.4863281, + "heart_rate": 58 + }, + { + "timestamp": 1030731932.7363281, + "heart_rate": 58 + }, + { + "timestamp": 1030731932.9863281, + "heart_rate": 58 + }, + { + "timestamp": 1030731933.2363281, + "heart_rate": 58 + }, + { + "timestamp": 1030731933.4863281, + "heart_rate": 58 + }, + { + "timestamp": 1030731933.6103516, + "heart_rate": 58 + }, + { + "timestamp": 1030731933.8603516, + "heart_rate": 58 + }, + { + "timestamp": 1030731934.1103516, + "heart_rate": 58 + }, + { + "timestamp": 1030731934.1777344, + "heart_rate": 58 + }, + { + "timestamp": 1030731934.4277344, + "heart_rate": 58 + }, + { + "timestamp": 1030731934.6777344, + "heart_rate": 58 + }, + { + "timestamp": 1030731934.8720703, + "heart_rate": 58 + }, + { + "timestamp": 1030731935.1220703, + "heart_rate": 58 + }, + { + "timestamp": 1030731935.3720703, + "heart_rate": 58 + }, + { + "timestamp": 1030731935.6220703, + "heart_rate": 58 + }, + { + "timestamp": 1030731935.8076172, + "heart_rate": 58 + }, + { + "timestamp": 1030731936.0576172, + "heart_rate": 58 + }, + { + "timestamp": 1030731936.2207031, + "heart_rate": 58 + }, + { + "timestamp": 1030731936.4707031, + "heart_rate": 58 + }, + { + "timestamp": 1030731936.7207031, + "heart_rate": 58 + }, + { + "timestamp": 1030731936.9707031, + "heart_rate": 58 + }, + { + "timestamp": 1030731937.0410156, + "heart_rate": 58 + }, + { + "timestamp": 1030731937.2910156, + "heart_rate": 58 + }, + { + "timestamp": 1030731937.5410156, + "heart_rate": 58 + }, + { + "timestamp": 1030731937.7324219, + "heart_rate": 58 + }, + { + "timestamp": 1030731937.9824219, + "heart_rate": 58 + }, + { + "timestamp": 1030731938.2324219, + "heart_rate": 58 + }, + { + "timestamp": 1030731938.4638672, + "heart_rate": 58 + }, + { + "timestamp": 1030731938.7138672, + "heart_rate": 58 + }, + { + "timestamp": 1030731938.9638672, + "heart_rate": 58 + }, + { + "timestamp": 1030731939.1318359, + "heart_rate": 58 + }, + { + "timestamp": 1030731939.3818359, + "heart_rate": 58 + }, + { + "timestamp": 1030731939.6318359, + "heart_rate": 58 + }, + { + "timestamp": 1030731939.765625, + "heart_rate": 58 + }, + { + "timestamp": 1030731940.015625, + "heart_rate": 58 + }, + { + "timestamp": 1030731940.2099609, + "heart_rate": 58 + }, + { + "timestamp": 1030731940.4599609, + "heart_rate": 58 + }, + { + "timestamp": 1030731940.7099609, + "heart_rate": 58 + }, + { + "timestamp": 1030731940.8291016, + "heart_rate": 59 + }, + { + "timestamp": 1030731941.0791016, + "heart_rate": 59 + }, + { + "timestamp": 1030731941.3291016, + "heart_rate": 59 + }, + { + "timestamp": 1030731941.5673828, + "heart_rate": 59 + }, + { + "timestamp": 1030731941.8173828, + "heart_rate": 59 + }, + { + "timestamp": 1030731941.9833984, + "heart_rate": 59 + }, + { + "timestamp": 1030731942.2333984, + "heart_rate": 59 + }, + { + "timestamp": 1030731942.4833984, + "heart_rate": 59 + }, + { + "timestamp": 1030731942.5820312, + "heart_rate": 59 + }, + { + "timestamp": 1030731942.8320312, + "heart_rate": 59 + }, + { + "timestamp": 1030731943.0820312, + "heart_rate": 59 + }, + { + "timestamp": 1030731943.1806641, + "heart_rate": 60 + }, + { + "timestamp": 1030731943.4306641, + "heart_rate": 60 + }, + { + "timestamp": 1030731943.6279297, + "heart_rate": 60 + }, + { + "timestamp": 1030731943.8779297, + "heart_rate": 60 + }, + { + "timestamp": 1030731944.1279297, + "heart_rate": 60 + }, + { + "timestamp": 1030731944.3300781, + "heart_rate": 60 + }, + { + "timestamp": 1030731944.5800781, + "heart_rate": 60 + }, + { + "timestamp": 1030731944.8300781, + "heart_rate": 60 + }, + { + "timestamp": 1030731944.9257812, + "heart_rate": 60 + }, + { + "timestamp": 1030731945.1757812, + "heart_rate": 60 + }, + { + "timestamp": 1030731945.4257812, + "heart_rate": 60 + }, + { + "timestamp": 1030731945.515625, + "heart_rate": 61 + }, + { + "timestamp": 1030731945.765625, + "heart_rate": 61 + }, + { + "timestamp": 1030731946.015625, + "heart_rate": 61 + }, + { + "timestamp": 1030731946.1103516, + "heart_rate": 63 + }, + { + "timestamp": 1030731946.3603516, + "heart_rate": 63 + }, + { + "timestamp": 1030731946.5888672, + "heart_rate": 63 + }, + { + "timestamp": 1030731946.8388672, + "heart_rate": 63 + }, + { + "timestamp": 1030731947.0888672, + "heart_rate": 63 + }, + { + "timestamp": 1030731947.1757812, + "heart_rate": 63 + }, + { + "timestamp": 1030731947.4257812, + "heart_rate": 63 + }, + { + "timestamp": 1030731947.6757812, + "heart_rate": 63 + }, + { + "timestamp": 1030731947.7460938, + "heart_rate": 63 + }, + { + "timestamp": 1030731947.9960938, + "heart_rate": 63 + }, + { + "timestamp": 1030731948.2460938, + "heart_rate": 63 + }, + { + "timestamp": 1030731948.3330078, + "heart_rate": 62 + }, + { + "timestamp": 1030731948.5830078, + "heart_rate": 62 + }, + { + "timestamp": 1030731948.8330078, + "heart_rate": 62 + }, + { + "timestamp": 1030731948.9072266, + "heart_rate": 62 + }, + { + "timestamp": 1030731949.1572266, + "heart_rate": 62 + }, + { + "timestamp": 1030731949.4072266, + "heart_rate": 62 + }, + { + "timestamp": 1030731949.5498047, + "heart_rate": 62 + }, + { + "timestamp": 1030731949.7998047, + "heart_rate": 62 + }, + { + "timestamp": 1030731950.0498047, + "heart_rate": 62 + }, + { + "timestamp": 1030731950.1660156, + "heart_rate": 62 + }, + { + "timestamp": 1030731950.4160156, + "heart_rate": 62 + }, + { + "timestamp": 1030731950.6660156, + "heart_rate": 62 + }, + { + "timestamp": 1030731950.6816406, + "heart_rate": 62 + }, + { + "timestamp": 1030731950.9316406, + "heart_rate": 62 + }, + { + "timestamp": 1030731951.1816406, + "heart_rate": 62 + }, + { + "timestamp": 1030731951.4130859, + "heart_rate": 62 + }, + { + "timestamp": 1030731951.6630859, + "heart_rate": 62 + }, + { + "timestamp": 1030731951.9130859, + "heart_rate": 62 + }, + { + "timestamp": 1030731952.1630859, + "heart_rate": 62 + }, + { + "timestamp": 1030731952.2177734, + "heart_rate": 62 + }, + { + "timestamp": 1030731952.4677734, + "heart_rate": 62 + }, + { + "timestamp": 1030731952.7177734, + "heart_rate": 62 + }, + { + "timestamp": 1030731952.8798828, + "heart_rate": 62 + }, + { + "timestamp": 1030731953.1298828, + "heart_rate": 62 + }, + { + "timestamp": 1030731953.3798828, + "heart_rate": 62 + }, + { + "timestamp": 1030731953.6298828, + "heart_rate": 62 + }, + { + "timestamp": 1030731953.7441406, + "heart_rate": 62 + }, + { + "timestamp": 1030731953.9941406, + "heart_rate": 62 + }, + { + "timestamp": 1030731954.2441406, + "heart_rate": 62 + }, + { + "timestamp": 1030731954.4570312, + "heart_rate": 62 + }, + { + "timestamp": 1030731954.7070312, + "heart_rate": 62 + }, + { + "timestamp": 1030731954.9570312, + "heart_rate": 62 + }, + { + "timestamp": 1030731955.2070312, + "heart_rate": 62 + }, + { + "timestamp": 1030731955.2441406, + "heart_rate": 62 + }, + { + "timestamp": 1030731955.4941406, + "heart_rate": 62 + }, + { + "timestamp": 1030731955.7441406, + "heart_rate": 62 + }, + { + "timestamp": 1030731955.9755859, + "heart_rate": 62 + }, + { + "timestamp": 1030731956.2255859, + "heart_rate": 62 + }, + { + "timestamp": 1030731956.4755859, + "heart_rate": 62 + }, + { + "timestamp": 1030731956.5449219, + "heart_rate": 62 + }, + { + "timestamp": 1030731956.7949219, + "heart_rate": 62 + }, + { + "timestamp": 1030731957.0449219, + "heart_rate": 62 + }, + { + "timestamp": 1030731957.203125, + "heart_rate": 62 + }, + { + "timestamp": 1030731957.453125, + "heart_rate": 62 + }, + { + "timestamp": 1030731957.703125, + "heart_rate": 62 + }, + { + "timestamp": 1030731957.8857422, + "heart_rate": 62 + }, + { + "timestamp": 1030731958.1357422, + "heart_rate": 62 + }, + { + "timestamp": 1030731958.3857422, + "heart_rate": 62 + }, + { + "timestamp": 1030731958.6220703, + "heart_rate": 62 + }, + { + "timestamp": 1030731958.8720703, + "heart_rate": 62 + }, + { + "timestamp": 1030731959.1220703, + "heart_rate": 62 + }, + { + "timestamp": 1030731959.3173828, + "heart_rate": 62 + }, + { + "timestamp": 1030731959.5673828, + "heart_rate": 62 + }, + { + "timestamp": 1030731959.8173828, + "heart_rate": 62 + }, + { + "timestamp": 1030731960.0673828, + "heart_rate": 62 + }, + { + "timestamp": 1030731960.0693359, + "heart_rate": 62 + }, + { + "timestamp": 1030731960.3193359, + "heart_rate": 62 + }, + { + "timestamp": 1030731960.5693359, + "heart_rate": 62 + }, + { + "timestamp": 1030731960.7792969, + "heart_rate": 61 + }, + { + "timestamp": 1030731961.0292969, + "heart_rate": 61 + }, + { + "timestamp": 1030731961.2792969, + "heart_rate": 61 + }, + { + "timestamp": 1030731961.4892578, + "heart_rate": 61 + }, + { + "timestamp": 1030731961.7392578, + "heart_rate": 61 + }, + { + "timestamp": 1030731961.9892578, + "heart_rate": 61 + }, + { + "timestamp": 1030731962.1982422, + "heart_rate": 61 + }, + { + "timestamp": 1030731962.4482422, + "heart_rate": 61 + }, + { + "timestamp": 1030731962.6982422, + "heart_rate": 61 + }, + { + "timestamp": 1030731962.9482422, + "heart_rate": 61 + }, + { + "timestamp": 1030731963.1982422, + "heart_rate": 61 + }, + { + "timestamp": 1030731963.4482422, + "heart_rate": 61 + }, + { + "timestamp": 1030731963.5605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731963.8105469, + "heart_rate": 71 + }, + { + "timestamp": 1030731963.8691406, + "heart_rate": 71 + }, + { + "timestamp": 1030731964.1191406, + "heart_rate": 71 + }, + { + "timestamp": 1030731964.1855469, + "heart_rate": 71 + }, + { + "timestamp": 1030731964.4355469, + "heart_rate": 71 + }, + { + "timestamp": 1030731964.5605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731964.5605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731964.5605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731964.5605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731964.5605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731964.5605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731964.5605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731964.8105469, + "heart_rate": 71 + }, + { + "timestamp": 1030731965.0605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731965.3105469, + "heart_rate": 71 + }, + { + "timestamp": 1030731965.5605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731965.8105469, + "heart_rate": 71 + }, + { + "timestamp": 1030731966.0605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731966.3105469, + "heart_rate": 71 + }, + { + "timestamp": 1030731966.5605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731966.8105469, + "heart_rate": 71 + }, + { + "timestamp": 1030731967.0605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731967.3105469, + "heart_rate": 71 + }, + { + "timestamp": 1030731967.5605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731967.8105469, + "heart_rate": 71 + }, + { + "timestamp": 1030731968.0605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731968.3105469, + "heart_rate": 71 + }, + { + "timestamp": 1030731968.5605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731968.8105469, + "heart_rate": 71 + }, + { + "timestamp": 1030731969.0605469, + "heart_rate": 71 + }, + { + "timestamp": 1030731969.3105469, + "heart_rate": 71 + }, + { + "timestamp": 1030731969.5605469, + "heart_rate": 71 + }, + { + "timestamp": 1030732260, + "heart_rate": 71 + }, + { + "timestamp": 1030732260.25, + "heart_rate": 71 + }, + { + "timestamp": 1030732260.5, + "heart_rate": 71 + }, + { + "timestamp": 1030732260.75, + "heart_rate": 71 + }, + { + "timestamp": 1030732261, + "heart_rate": 71 + }, + { + "timestamp": 1030732261.25, + "heart_rate": 71 + }, + { + "timestamp": 1030732261.5, + "heart_rate": 71 + }, + { + "timestamp": 1030732261.75, + "heart_rate": 71 + }, + { + "timestamp": 1030732262, + "heart_rate": 71 + }, + { + "timestamp": 1030732262.25, + "heart_rate": 71 + }, + { + "timestamp": 1030732262.5, + "heart_rate": 71 + }, + { + "timestamp": 1030732262.75, + "heart_rate": 71 + }, + { + "timestamp": 1030732263, + "heart_rate": 71 + }, + { + "timestamp": 1030732263.25, + "heart_rate": 71 + }, + { + "timestamp": 1030732263.2851562, + "heart_rate": 71 + }, + { + "timestamp": 1030732263.5351562, + "heart_rate": 71 + }, + { + "timestamp": 1030732263.7851562, + "heart_rate": 71 + }, + { + "timestamp": 1030732264.0351562, + "heart_rate": 71 + }, + { + "timestamp": 1030732264.2851562, + "heart_rate": 71 + }, + { + "timestamp": 1030732264.3388672, + "heart_rate": 71 + }, + { + "timestamp": 1030732264.5888672, + "heart_rate": 71 + }, + { + "timestamp": 1030732264.8388672, + "heart_rate": 71 + }, + { + "timestamp": 1030732265.0888672, + "heart_rate": 71 + }, + { + "timestamp": 1030732265.3212891, + "heart_rate": 71 + }, + { + "timestamp": 1030732265.5712891, + "heart_rate": 71 + }, + { + "timestamp": 1030732265.8212891, + "heart_rate": 71 + }, + { + "timestamp": 1030732266.0712891, + "heart_rate": 71 + }, + { + "timestamp": 1030732266.3193359, + "heart_rate": 71 + }, + { + "timestamp": 1030732266.5693359, + "heart_rate": 71 + }, + { + "timestamp": 1030732266.8193359, + "heart_rate": 71 + }, + { + "timestamp": 1030732267.0693359, + "heart_rate": 71 + }, + { + "timestamp": 1030732267.2392578, + "heart_rate": 71 + }, + { + "timestamp": 1030732267.4892578, + "heart_rate": 71 + }, + { + "timestamp": 1030732267.7392578, + "heart_rate": 71 + }, + { + "timestamp": 1030732267.9892578, + "heart_rate": 71 + }, + { + "timestamp": 1030732268.1503906, + "heart_rate": 71 + }, + { + "timestamp": 1030732268.4003906, + "heart_rate": 71 + }, + { + "timestamp": 1030732268.6503906, + "heart_rate": 71 + }, + { + "timestamp": 1030732268.9003906, + "heart_rate": 71 + }, + { + "timestamp": 1030732269.0263672, + "heart_rate": 69 + }, + { + "timestamp": 1030732269.2763672, + "heart_rate": 69 + }, + { + "timestamp": 1030732269.5263672, + "heart_rate": 69 + }, + { + "timestamp": 1030732269.7763672, + "heart_rate": 69 + }, + { + "timestamp": 1030732270.0263672, + "heart_rate": 69 + }, + { + "timestamp": 1030732270.0410156, + "heart_rate": 68 + }, + { + "timestamp": 1030732270.2910156, + "heart_rate": 68 + }, + { + "timestamp": 1030732270.5400391, + "heart_rate": 68 + }, + { + "timestamp": 1030732270.7900391, + "heart_rate": 68 + }, + { + "timestamp": 1030732271.0400391, + "heart_rate": 68 + }, + { + "timestamp": 1030732271.2900391, + "heart_rate": 68 + }, + { + "timestamp": 1030732271.5400391, + "heart_rate": 68 + }, + { + "timestamp": 1030732271.5527344, + "heart_rate": 68 + }, + { + "timestamp": 1030732271.8027344, + "heart_rate": 68 + }, + { + "timestamp": 1030732272.0527344, + "heart_rate": 68 + }, + { + "timestamp": 1030732272.1083984, + "heart_rate": 68 + }, + { + "timestamp": 1030732272.3583984, + "heart_rate": 68 + }, + { + "timestamp": 1030732272.6083984, + "heart_rate": 68 + }, + { + "timestamp": 1030732272.8583984, + "heart_rate": 68 + }, + { + "timestamp": 1030732273.1083984, + "heart_rate": 68 + }, + { + "timestamp": 1030732273.1123047, + "heart_rate": 68 + }, + { + "timestamp": 1030732273.3623047, + "heart_rate": 68 + }, + { + "timestamp": 1030732273.6123047, + "heart_rate": 68 + }, + { + "timestamp": 1030732273.8623047, + "heart_rate": 68 + }, + { + "timestamp": 1030732274.1123047, + "heart_rate": 68 + }, + { + "timestamp": 1030732274.1582031, + "heart_rate": 68 + }, + { + "timestamp": 1030732274.4082031, + "heart_rate": 68 + }, + { + "timestamp": 1030732274.4394531, + "heart_rate": 68 + }, + { + "timestamp": 1030732274.6894531, + "heart_rate": 68 + }, + { + "timestamp": 1030732274.9394531, + "heart_rate": 68 + }, + { + "timestamp": 1030732274.9423828, + "heart_rate": 68 + }, + { + "timestamp": 1030732275.1923828, + "heart_rate": 68 + }, + { + "timestamp": 1030732275.4423828, + "heart_rate": 68 + }, + { + "timestamp": 1030732275.6923828, + "heart_rate": 68 + }, + { + "timestamp": 1030732275.7841797, + "heart_rate": 68 + }, + { + "timestamp": 1030732276.0341797, + "heart_rate": 68 + }, + { + "timestamp": 1030732276.2841797, + "heart_rate": 68 + }, + { + "timestamp": 1030732276.5341797, + "heart_rate": 68 + }, + { + "timestamp": 1030732276.7841797, + "heart_rate": 68 + }, + { + "timestamp": 1030732276.8095703, + "heart_rate": 68 + }, + { + "timestamp": 1030732277.0595703, + "heart_rate": 68 + }, + { + "timestamp": 1030732277.3095703, + "heart_rate": 68 + }, + { + "timestamp": 1030732277.5595703, + "heart_rate": 68 + }, + { + "timestamp": 1030732277.6220703, + "heart_rate": 68 + }, + { + "timestamp": 1030732277.8720703, + "heart_rate": 68 + }, + { + "timestamp": 1030732278.1220703, + "heart_rate": 68 + }, + { + "timestamp": 1030732278.3203125, + "heart_rate": 68 + }, + { + "timestamp": 1030732278.5703125, + "heart_rate": 68 + }, + { + "timestamp": 1030732278.8203125, + "heart_rate": 68 + }, + { + "timestamp": 1030732279.0703125, + "heart_rate": 68 + }, + { + "timestamp": 1030732279.3203125, + "heart_rate": 68 + }, + { + "timestamp": 1030732279.3544922, + "heart_rate": 68 + }, + { + "timestamp": 1030732279.6044922, + "heart_rate": 68 + }, + { + "timestamp": 1030732279.8544922, + "heart_rate": 68 + }, + { + "timestamp": 1030732280.1044922, + "heart_rate": 68 + }, + { + "timestamp": 1030732280.2958984, + "heart_rate": 68 + }, + { + "timestamp": 1030732280.5458984, + "heart_rate": 68 + }, + { + "timestamp": 1030732280.7958984, + "heart_rate": 68 + }, + { + "timestamp": 1030732281.0458984, + "heart_rate": 68 + }, + { + "timestamp": 1030732281.1875, + "heart_rate": 69 + }, + { + "timestamp": 1030732281.4375, + "heart_rate": 69 + }, + { + "timestamp": 1030732281.6875, + "heart_rate": 69 + }, + { + "timestamp": 1030732281.9375, + "heart_rate": 69 + }, + { + "timestamp": 1030732282.1289062, + "heart_rate": 69 + }, + { + "timestamp": 1030732282.3789062, + "heart_rate": 69 + }, + { + "timestamp": 1030732282.6289062, + "heart_rate": 69 + }, + { + "timestamp": 1030732282.8789062, + "heart_rate": 69 + }, + { + "timestamp": 1030732283.1289062, + "heart_rate": 69 + }, + { + "timestamp": 1030732283.1308594, + "heart_rate": 69 + }, + { + "timestamp": 1030732283.3808594, + "heart_rate": 69 + }, + { + "timestamp": 1030732283.6308594, + "heart_rate": 69 + }, + { + "timestamp": 1030732283.8808594, + "heart_rate": 69 + }, + { + "timestamp": 1030732284.1308594, + "heart_rate": 70 + }, + { + "timestamp": 1030732284.3808594, + "heart_rate": 70 + }, + { + "timestamp": 1030732284.6308594, + "heart_rate": 70 + }, + { + "timestamp": 1030732284.8808594, + "heart_rate": 70 + }, + { + "timestamp": 1030732285.1308594, + "heart_rate": 70 + }, + { + "timestamp": 1030732285.1640625, + "heart_rate": 70 + }, + { + "timestamp": 1030732285.4140625, + "heart_rate": 70 + }, + { + "timestamp": 1030732285.6640625, + "heart_rate": 70 + }, + { + "timestamp": 1030732285.9140625, + "heart_rate": 70 + }, + { + "timestamp": 1030732286.1640625, + "heart_rate": 70 + }, + { + "timestamp": 1030732286.2080078, + "heart_rate": 69 + }, + { + "timestamp": 1030732286.4580078, + "heart_rate": 69 + }, + { + "timestamp": 1030732286.7080078, + "heart_rate": 69 + }, + { + "timestamp": 1030732286.9580078, + "heart_rate": 69 + }, + { + "timestamp": 1030732287.2080078, + "heart_rate": 69 + }, + { + "timestamp": 1030732287.3320312, + "heart_rate": 68 + }, + { + "timestamp": 1030732287.5820312, + "heart_rate": 68 + }, + { + "timestamp": 1030732287.8320312, + "heart_rate": 68 + }, + { + "timestamp": 1030732288.0820312, + "heart_rate": 68 + }, + { + "timestamp": 1030732288.3320312, + "heart_rate": 68 + }, + { + "timestamp": 1030732288.5820312, + "heart_rate": 68 + }, + { + "timestamp": 1030732288.5859375, + "heart_rate": 66 + }, + { + "timestamp": 1030732288.8359375, + "heart_rate": 66 + }, + { + "timestamp": 1030732289.0859375, + "heart_rate": 66 + }, + { + "timestamp": 1030732289.3359375, + "heart_rate": 66 + }, + { + "timestamp": 1030732289.5859375, + "heart_rate": 66 + }, + { + "timestamp": 1030732289.6240234, + "heart_rate": 65 + }, + { + "timestamp": 1030732289.8740234, + "heart_rate": 65 + }, + { + "timestamp": 1030732290.1240234, + "heart_rate": 65 + }, + { + "timestamp": 1030732290.2988281, + "heart_rate": 65 + }, + { + "timestamp": 1030732290.5488281, + "heart_rate": 65 + }, + { + "timestamp": 1030732290.7988281, + "heart_rate": 65 + }, + { + "timestamp": 1030732291.0488281, + "heart_rate": 65 + }, + { + "timestamp": 1030732291.2988281, + "heart_rate": 65 + }, + { + "timestamp": 1030732291.4794922, + "heart_rate": 65 + }, + { + "timestamp": 1030732291.7294922, + "heart_rate": 65 + }, + { + "timestamp": 1030732291.9794922, + "heart_rate": 65 + }, + { + "timestamp": 1030732292.2294922, + "heart_rate": 65 + }, + { + "timestamp": 1030732292.4794922, + "heart_rate": 65 + }, + { + "timestamp": 1030732292.4960938, + "heart_rate": 65 + }, + { + "timestamp": 1030732292.7460938, + "heart_rate": 65 + }, + { + "timestamp": 1030732292.9960938, + "heart_rate": 65 + }, + { + "timestamp": 1030732293.0546875, + "heart_rate": 65 + }, + { + "timestamp": 1030732293.3046875, + "heart_rate": 65 + }, + { + "timestamp": 1030732293.5546875, + "heart_rate": 65 + }, + { + "timestamp": 1030732293.6044922, + "heart_rate": 65 + }, + { + "timestamp": 1030732293.8544922, + "heart_rate": 65 + }, + { + "timestamp": 1030732294.1044922, + "heart_rate": 65 + }, + { + "timestamp": 1030732294.2138672, + "heart_rate": 65 + }, + { + "timestamp": 1030732294.4638672, + "heart_rate": 65 + }, + { + "timestamp": 1030732294.4746094, + "heart_rate": 65 + }, + { + "timestamp": 1030732294.7246094, + "heart_rate": 65 + }, + { + "timestamp": 1030732294.9746094, + "heart_rate": 65 + }, + { + "timestamp": 1030732295.2246094, + "heart_rate": 65 + }, + { + "timestamp": 1030732295.2900391, + "heart_rate": 65 + }, + { + "timestamp": 1030732295.5400391, + "heart_rate": 65 + }, + { + "timestamp": 1030732295.7900391, + "heart_rate": 65 + }, + { + "timestamp": 1030732295.9638672, + "heart_rate": 65 + }, + { + "timestamp": 1030732296.2138672, + "heart_rate": 65 + }, + { + "timestamp": 1030732296.2333984, + "heart_rate": 65 + }, + { + "timestamp": 1030732296.4833984, + "heart_rate": 65 + }, + { + "timestamp": 1030732296.7333984, + "heart_rate": 65 + }, + { + "timestamp": 1030732296.8105469, + "heart_rate": 65 + }, + { + "timestamp": 1030732297.0605469, + "heart_rate": 65 + }, + { + "timestamp": 1030732297.0703125, + "heart_rate": 65 + }, + { + "timestamp": 1030732297.3203125, + "heart_rate": 65 + }, + { + "timestamp": 1030732297.5703125, + "heart_rate": 65 + }, + { + "timestamp": 1030732297.7246094, + "heart_rate": 65 + }, + { + "timestamp": 1030732297.9746094, + "heart_rate": 65 + }, + { + "timestamp": 1030732298.2246094, + "heart_rate": 65 + }, + { + "timestamp": 1030732298.2617188, + "heart_rate": 65 + }, + { + "timestamp": 1030732298.5117188, + "heart_rate": 65 + }, + { + "timestamp": 1030732298.7607422, + "heart_rate": 66 + }, + { + "timestamp": 1030732299.0107422, + "heart_rate": 66 + }, + { + "timestamp": 1030732299.0234375, + "heart_rate": 66 + }, + { + "timestamp": 1030732299.2734375, + "heart_rate": 66 + }, + { + "timestamp": 1030732299.4003906, + "heart_rate": 66 + }, + { + "timestamp": 1030732299.6503906, + "heart_rate": 66 + }, + { + "timestamp": 1030732299.8408203, + "heart_rate": 66 + }, + { + "timestamp": 1030732300.0908203, + "heart_rate": 66 + }, + { + "timestamp": 1030732300.3408203, + "heart_rate": 66 + }, + { + "timestamp": 1030732300.4550781, + "heart_rate": 66 + }, + { + "timestamp": 1030732300.7050781, + "heart_rate": 66 + }, + { + "timestamp": 1030732300.9433594, + "heart_rate": 66 + }, + { + "timestamp": 1030732301.1933594, + "heart_rate": 66 + }, + { + "timestamp": 1030732301.4433594, + "heart_rate": 66 + }, + { + "timestamp": 1030732301.5976562, + "heart_rate": 65 + }, + { + "timestamp": 1030732301.8476562, + "heart_rate": 65 + }, + { + "timestamp": 1030732302.0976562, + "heart_rate": 65 + }, + { + "timestamp": 1030732302.2041016, + "heart_rate": 65 + }, + { + "timestamp": 1030732302.4541016, + "heart_rate": 65 + }, + { + "timestamp": 1030732302.7041016, + "heart_rate": 65 + }, + { + "timestamp": 1030732302.7480469, + "heart_rate": 66 + }, + { + "timestamp": 1030732302.9980469, + "heart_rate": 66 + }, + { + "timestamp": 1030732303.2480469, + "heart_rate": 66 + }, + { + "timestamp": 1030732303.2939453, + "heart_rate": 66 + }, + { + "timestamp": 1030732303.5439453, + "heart_rate": 66 + }, + { + "timestamp": 1030732303.7939453, + "heart_rate": 66 + }, + { + "timestamp": 1030732303.8583984, + "heart_rate": 66 + }, + { + "timestamp": 1030732304.1083984, + "heart_rate": 66 + }, + { + "timestamp": 1030732304.3583984, + "heart_rate": 66 + }, + { + "timestamp": 1030732304.5771484, + "heart_rate": 67 + }, + { + "timestamp": 1030732304.8271484, + "heart_rate": 67 + }, + { + "timestamp": 1030732305.0771484, + "heart_rate": 67 + }, + { + "timestamp": 1030732305.2158203, + "heart_rate": 68 + }, + { + "timestamp": 1030732305.4658203, + "heart_rate": 68 + }, + { + "timestamp": 1030732305.7158203, + "heart_rate": 68 + }, + { + "timestamp": 1030732305.8154297, + "heart_rate": 69 + }, + { + "timestamp": 1030732306.0654297, + "heart_rate": 69 + }, + { + "timestamp": 1030732306.2958984, + "heart_rate": 69 + }, + { + "timestamp": 1030732306.5458984, + "heart_rate": 69 + }, + { + "timestamp": 1030732306.7958984, + "heart_rate": 69 + }, + { + "timestamp": 1030732306.9736328, + "heart_rate": 69 + }, + { + "timestamp": 1030732307.2236328, + "heart_rate": 69 + }, + { + "timestamp": 1030732307.2998047, + "heart_rate": 69 + }, + { + "timestamp": 1030732307.5498047, + "heart_rate": 69 + }, + { + "timestamp": 1030732307.7998047, + "heart_rate": 69 + }, + { + "timestamp": 1030732307.9052734, + "heart_rate": 70 + }, + { + "timestamp": 1030732308.1552734, + "heart_rate": 70 + }, + { + "timestamp": 1030732308.4052734, + "heart_rate": 70 + }, + { + "timestamp": 1030732308.4902344, + "heart_rate": 70 + }, + { + "timestamp": 1030732308.7402344, + "heart_rate": 70 + }, + { + "timestamp": 1030732308.9902344, + "heart_rate": 70 + }, + { + "timestamp": 1030732309.0478516, + "heart_rate": 71 + }, + { + "timestamp": 1030732309.2978516, + "heart_rate": 71 + }, + { + "timestamp": 1030732309.5478516, + "heart_rate": 71 + }, + { + "timestamp": 1030732309.7978516, + "heart_rate": 71 + }, + { + "timestamp": 1030732309.8183594, + "heart_rate": 72 + }, + { + "timestamp": 1030732310.0683594, + "heart_rate": 72 + }, + { + "timestamp": 1030732310.2353516, + "heart_rate": 73 + }, + { + "timestamp": 1030732310.4853516, + "heart_rate": 73 + }, + { + "timestamp": 1030732310.7353516, + "heart_rate": 73 + }, + { + "timestamp": 1030732310.9482422, + "heart_rate": 74 + }, + { + "timestamp": 1030732311.1982422, + "heart_rate": 74 + }, + { + "timestamp": 1030732311.4482422, + "heart_rate": 74 + }, + { + "timestamp": 1030732311.6982422, + "heart_rate": 74 + }, + { + "timestamp": 1030732311.71875, + "heart_rate": 74 + }, + { + "timestamp": 1030732311.96875, + "heart_rate": 74 + }, + { + "timestamp": 1030732312.21875, + "heart_rate": 74 + }, + { + "timestamp": 1030732312.46875, + "heart_rate": 74 + }, + { + "timestamp": 1030732312.4726562, + "heart_rate": 74 + }, + { + "timestamp": 1030732312.7226562, + "heart_rate": 74 + }, + { + "timestamp": 1030732312.9726562, + "heart_rate": 74 + }, + { + "timestamp": 1030732313.2070312, + "heart_rate": 74 + }, + { + "timestamp": 1030732313.4570312, + "heart_rate": 74 + }, + { + "timestamp": 1030732313.7070312, + "heart_rate": 74 + }, + { + "timestamp": 1030732313.9541016, + "heart_rate": 74 + }, + { + "timestamp": 1030732314.2041016, + "heart_rate": 74 + }, + { + "timestamp": 1030732314.4541016, + "heart_rate": 74 + }, + { + "timestamp": 1030732314.7011719, + "heart_rate": 76 + }, + { + "timestamp": 1030732314.9511719, + "heart_rate": 76 + }, + { + "timestamp": 1030732315.2011719, + "heart_rate": 76 + }, + { + "timestamp": 1030732315.4511719, + "heart_rate": 76 + }, + { + "timestamp": 1030732315.4716797, + "heart_rate": 77 + }, + { + "timestamp": 1030732315.7216797, + "heart_rate": 77 + }, + { + "timestamp": 1030732315.9716797, + "heart_rate": 77 + }, + { + "timestamp": 1030732316.2216797, + "heart_rate": 77 + }, + { + "timestamp": 1030732316.2363281, + "heart_rate": 78 + }, + { + "timestamp": 1030732316.4863281, + "heart_rate": 78 + }, + { + "timestamp": 1030732316.7363281, + "heart_rate": 78 + }, + { + "timestamp": 1030732316.9863281, + "heart_rate": 78 + }, + { + "timestamp": 1030732317.0058594, + "heart_rate": 80 + }, + { + "timestamp": 1030732317.2558594, + "heart_rate": 80 + }, + { + "timestamp": 1030732317.5058594, + "heart_rate": 80 + }, + { + "timestamp": 1030732317.6005859, + "heart_rate": 80 + }, + { + "timestamp": 1030732317.8505859, + "heart_rate": 80 + }, + { + "timestamp": 1030732318.1005859, + "heart_rate": 80 + }, + { + "timestamp": 1030732318.3505859, + "heart_rate": 80 + }, + { + "timestamp": 1030732318.5107422, + "heart_rate": 80 + }, + { + "timestamp": 1030732318.7607422, + "heart_rate": 80 + }, + { + "timestamp": 1030732319.0107422, + "heart_rate": 80 + }, + { + "timestamp": 1030732319.2480469, + "heart_rate": 80 + }, + { + "timestamp": 1030732319.4980469, + "heart_rate": 80 + }, + { + "timestamp": 1030732319.7480469, + "heart_rate": 80 + }, + { + "timestamp": 1030732319.8769531, + "heart_rate": 81 + }, + { + "timestamp": 1030732320.1269531, + "heart_rate": 81 + }, + { + "timestamp": 1030732320.3769531, + "heart_rate": 81 + }, + { + "timestamp": 1030732320.6269531, + "heart_rate": 81 + }, + { + "timestamp": 1030732320.7783203, + "heart_rate": 81 + }, + { + "timestamp": 1030732321.0283203, + "heart_rate": 81 + }, + { + "timestamp": 1030732321.2783203, + "heart_rate": 81 + }, + { + "timestamp": 1030732321.5283203, + "heart_rate": 81 + }, + { + "timestamp": 1030732321.5439453, + "heart_rate": 82 + }, + { + "timestamp": 1030732321.7939453, + "heart_rate": 82 + }, + { + "timestamp": 1030732322.0439453, + "heart_rate": 82 + }, + { + "timestamp": 1030732322.2939453, + "heart_rate": 82 + }, + { + "timestamp": 1030732322.3378906, + "heart_rate": 82 + }, + { + "timestamp": 1030732322.5878906, + "heart_rate": 82 + }, + { + "timestamp": 1030732322.8378906, + "heart_rate": 82 + }, + { + "timestamp": 1030732323.0878906, + "heart_rate": 82 + }, + { + "timestamp": 1030732323.1103516, + "heart_rate": 83 + }, + { + "timestamp": 1030732323.3603516, + "heart_rate": 83 + }, + { + "timestamp": 1030732323.6103516, + "heart_rate": 83 + }, + { + "timestamp": 1030732323.8603516, + "heart_rate": 83 + }, + { + "timestamp": 1030732323.9316406, + "heart_rate": 84 + }, + { + "timestamp": 1030732324.1816406, + "heart_rate": 84 + }, + { + "timestamp": 1030732324.4316406, + "heart_rate": 84 + }, + { + "timestamp": 1030732324.6816406, + "heart_rate": 84 + }, + { + "timestamp": 1030732324.7304688, + "heart_rate": 86 + }, + { + "timestamp": 1030732324.9804688, + "heart_rate": 86 + }, + { + "timestamp": 1030732325.2304688, + "heart_rate": 86 + }, + { + "timestamp": 1030732325.4804688, + "heart_rate": 86 + }, + { + "timestamp": 1030732325.5263672, + "heart_rate": 85 + }, + { + "timestamp": 1030732325.7763672, + "heart_rate": 85 + }, + { + "timestamp": 1030732326.0263672, + "heart_rate": 85 + }, + { + "timestamp": 1030732326.2763672, + "heart_rate": 85 + }, + { + "timestamp": 1030732326.3125, + "heart_rate": 85 + }, + { + "timestamp": 1030732326.5625, + "heart_rate": 85 + }, + { + "timestamp": 1030732326.8125, + "heart_rate": 85 + }, + { + "timestamp": 1030732327.0625, + "heart_rate": 85 + }, + { + "timestamp": 1030732327.1289062, + "heart_rate": 85 + }, + { + "timestamp": 1030732327.3789062, + "heart_rate": 85 + }, + { + "timestamp": 1030732327.6289062, + "heart_rate": 85 + }, + { + "timestamp": 1030732327.6640625, + "heart_rate": 85 + }, + { + "timestamp": 1030732327.9140625, + "heart_rate": 85 + }, + { + "timestamp": 1030732328.1640625, + "heart_rate": 85 + }, + { + "timestamp": 1030732328.3427734, + "heart_rate": 85 + }, + { + "timestamp": 1030732328.5927734, + "heart_rate": 85 + }, + { + "timestamp": 1030732328.7578125, + "heart_rate": 85 + }, + { + "timestamp": 1030732329.0078125, + "heart_rate": 85 + }, + { + "timestamp": 1030732329.2578125, + "heart_rate": 85 + }, + { + "timestamp": 1030732329.5078125, + "heart_rate": 85 + }, + { + "timestamp": 1030732329.578125, + "heart_rate": 85 + }, + { + "timestamp": 1030732329.828125, + "heart_rate": 85 + }, + { + "timestamp": 1030732330.078125, + "heart_rate": 85 + }, + { + "timestamp": 1030732330.328125, + "heart_rate": 85 + }, + { + "timestamp": 1030732330.4013672, + "heart_rate": 86 + }, + { + "timestamp": 1030732330.6513672, + "heart_rate": 86 + }, + { + "timestamp": 1030732330.9013672, + "heart_rate": 86 + }, + { + "timestamp": 1030732331.1513672, + "heart_rate": 86 + }, + { + "timestamp": 1030732331.1923828, + "heart_rate": 86 + }, + { + "timestamp": 1030732331.4423828, + "heart_rate": 86 + }, + { + "timestamp": 1030732331.6923828, + "heart_rate": 86 + }, + { + "timestamp": 1030732331.9423828, + "heart_rate": 86 + }, + { + "timestamp": 1030732332.0107422, + "heart_rate": 87 + }, + { + "timestamp": 1030732332.2607422, + "heart_rate": 87 + }, + { + "timestamp": 1030732332.5107422, + "heart_rate": 87 + }, + { + "timestamp": 1030732332.7607422, + "heart_rate": 87 + }, + { + "timestamp": 1030732332.8251953, + "heart_rate": 89 + }, + { + "timestamp": 1030732333.0751953, + "heart_rate": 89 + }, + { + "timestamp": 1030732333.3251953, + "heart_rate": 89 + }, + { + "timestamp": 1030732333.5751953, + "heart_rate": 89 + }, + { + "timestamp": 1030732333.6289062, + "heart_rate": 90 + }, + { + "timestamp": 1030732333.8789062, + "heart_rate": 90 + }, + { + "timestamp": 1030732334.1289062, + "heart_rate": 90 + }, + { + "timestamp": 1030732334.3789062, + "heart_rate": 90 + }, + { + "timestamp": 1030732334.40625, + "heart_rate": 89 + }, + { + "timestamp": 1030732334.65625, + "heart_rate": 89 + }, + { + "timestamp": 1030732334.90625, + "heart_rate": 89 + }, + { + "timestamp": 1030732335.15625, + "heart_rate": 89 + }, + { + "timestamp": 1030732335.1972656, + "heart_rate": 89 + }, + { + "timestamp": 1030732335.4472656, + "heart_rate": 89 + }, + { + "timestamp": 1030732335.6972656, + "heart_rate": 89 + }, + { + "timestamp": 1030732335.9472656, + "heart_rate": 89 + }, + { + "timestamp": 1030732335.9824219, + "heart_rate": 89 + }, + { + "timestamp": 1030732336.2324219, + "heart_rate": 89 + }, + { + "timestamp": 1030732336.4824219, + "heart_rate": 89 + }, + { + "timestamp": 1030732336.7324219, + "heart_rate": 89 + }, + { + "timestamp": 1030732336.8359375, + "heart_rate": 88 + }, + { + "timestamp": 1030732337.0859375, + "heart_rate": 88 + }, + { + "timestamp": 1030732337.3359375, + "heart_rate": 88 + }, + { + "timestamp": 1030732337.5664062, + "heart_rate": 88 + }, + { + "timestamp": 1030732337.8164062, + "heart_rate": 88 + }, + { + "timestamp": 1030732338.0664062, + "heart_rate": 88 + }, + { + "timestamp": 1030732338.3164062, + "heart_rate": 88 + }, + { + "timestamp": 1030732338.3828125, + "heart_rate": 88 + }, + { + "timestamp": 1030732338.6328125, + "heart_rate": 88 + }, + { + "timestamp": 1030732338.8828125, + "heart_rate": 88 + }, + { + "timestamp": 1030732339.1328125, + "heart_rate": 88 + }, + { + "timestamp": 1030732339.1972656, + "heart_rate": 88 + }, + { + "timestamp": 1030732339.4472656, + "heart_rate": 88 + }, + { + "timestamp": 1030732339.6972656, + "heart_rate": 88 + }, + { + "timestamp": 1030732339.9472656, + "heart_rate": 88 + }, + { + "timestamp": 1030732340.0830078, + "heart_rate": 88 + }, + { + "timestamp": 1030732340.3330078, + "heart_rate": 88 + }, + { + "timestamp": 1030732340.5830078, + "heart_rate": 88 + }, + { + "timestamp": 1030732340.8330078, + "heart_rate": 88 + }, + { + "timestamp": 1030732340.9013672, + "heart_rate": 89 + }, + { + "timestamp": 1030732341.1513672, + "heart_rate": 89 + }, + { + "timestamp": 1030732341.4013672, + "heart_rate": 89 + }, + { + "timestamp": 1030732341.6513672, + "heart_rate": 89 + }, + { + "timestamp": 1030732341.7587891, + "heart_rate": 89 + }, + { + "timestamp": 1030732342.0087891, + "heart_rate": 89 + }, + { + "timestamp": 1030732342.2587891, + "heart_rate": 89 + }, + { + "timestamp": 1030732342.3339844, + "heart_rate": 89 + }, + { + "timestamp": 1030732342.5839844, + "heart_rate": 89 + }, + { + "timestamp": 1030732342.8339844, + "heart_rate": 89 + }, + { + "timestamp": 1030732343.0839844, + "heart_rate": 89 + }, + { + "timestamp": 1030732343.3300781, + "heart_rate": 89 + }, + { + "timestamp": 1030732343.5800781, + "heart_rate": 89 + }, + { + "timestamp": 1030732343.8300781, + "heart_rate": 89 + }, + { + "timestamp": 1030732344.0800781, + "heart_rate": 89 + }, + { + "timestamp": 1030732344.3300781, + "heart_rate": 89 + }, + { + "timestamp": 1030732344.4169922, + "heart_rate": 89 + }, + { + "timestamp": 1030732344.6669922, + "heart_rate": 89 + }, + { + "timestamp": 1030732344.9169922, + "heart_rate": 89 + }, + { + "timestamp": 1030732345.1669922, + "heart_rate": 89 + }, + { + "timestamp": 1030732345.4169922, + "heart_rate": 89 + }, + { + "timestamp": 1030732345.4941406, + "heart_rate": 89 + }, + { + "timestamp": 1030732345.7441406, + "heart_rate": 89 + }, + { + "timestamp": 1030732345.9941406, + "heart_rate": 89 + }, + { + "timestamp": 1030732346.0302734, + "heart_rate": 89 + }, + { + "timestamp": 1030732346.2802734, + "heart_rate": 89 + }, + { + "timestamp": 1030732346.5302734, + "heart_rate": 89 + }, + { + "timestamp": 1030732346.7802734, + "heart_rate": 89 + }, + { + "timestamp": 1030732346.8886719, + "heart_rate": 89 + }, + { + "timestamp": 1030732347.1386719, + "heart_rate": 89 + }, + { + "timestamp": 1030732347.3886719, + "heart_rate": 89 + }, + { + "timestamp": 1030732347.4521484, + "heart_rate": 89 + }, + { + "timestamp": 1030732347.7021484, + "heart_rate": 89 + }, + { + "timestamp": 1030732347.9521484, + "heart_rate": 89 + }, + { + "timestamp": 1030732348.0185547, + "heart_rate": 89 + }, + { + "timestamp": 1030732348.2685547, + "heart_rate": 89 + }, + { + "timestamp": 1030732348.5185547, + "heart_rate": 89 + }, + { + "timestamp": 1030732348.5419922, + "heart_rate": 88 + }, + { + "timestamp": 1030732348.7919922, + "heart_rate": 88 + }, + { + "timestamp": 1030732349.0419922, + "heart_rate": 88 + }, + { + "timestamp": 1030732349.1904297, + "heart_rate": 88 + }, + { + "timestamp": 1030732349.4404297, + "heart_rate": 88 + }, + { + "timestamp": 1030732349.6191406, + "heart_rate": 88 + }, + { + "timestamp": 1030732349.8691406, + "heart_rate": 88 + }, + { + "timestamp": 1030732350.1191406, + "heart_rate": 88 + }, + { + "timestamp": 1030732350.3691406, + "heart_rate": 88 + }, + { + "timestamp": 1030732350.4023438, + "heart_rate": 88 + }, + { + "timestamp": 1030732350.6523438, + "heart_rate": 88 + }, + { + "timestamp": 1030732350.8798828, + "heart_rate": 88 + }, + { + "timestamp": 1030732351.1298828, + "heart_rate": 88 + }, + { + "timestamp": 1030732351.3798828, + "heart_rate": 88 + }, + { + "timestamp": 1030732351.6298828, + "heart_rate": 88 + }, + { + "timestamp": 1030732351.65625, + "heart_rate": 88 + }, + { + "timestamp": 1030732351.90625, + "heart_rate": 88 + }, + { + "timestamp": 1030732352.15625, + "heart_rate": 88 + }, + { + "timestamp": 1030732352.40625, + "heart_rate": 88 + }, + { + "timestamp": 1030732352.4199219, + "heart_rate": 87 + }, + { + "timestamp": 1030732352.6699219, + "heart_rate": 87 + }, + { + "timestamp": 1030732352.9199219, + "heart_rate": 87 + }, + { + "timestamp": 1030732353.0634766, + "heart_rate": 87 + }, + { + "timestamp": 1030732353.3134766, + "heart_rate": 87 + }, + { + "timestamp": 1030732353.5634766, + "heart_rate": 87 + }, + { + "timestamp": 1030732353.8134766, + "heart_rate": 87 + }, + { + "timestamp": 1030732353.9853516, + "heart_rate": 87 + }, + { + "timestamp": 1030732354.2353516, + "heart_rate": 87 + }, + { + "timestamp": 1030732354.4853516, + "heart_rate": 87 + }, + { + "timestamp": 1030732354.7353516, + "heart_rate": 87 + }, + { + "timestamp": 1030732354.7832031, + "heart_rate": 87 + }, + { + "timestamp": 1030732355.0332031, + "heart_rate": 87 + }, + { + "timestamp": 1030732355.2832031, + "heart_rate": 87 + }, + { + "timestamp": 1030732355.5332031, + "heart_rate": 87 + }, + { + "timestamp": 1030732355.5957031, + "heart_rate": 87 + }, + { + "timestamp": 1030732355.8457031, + "heart_rate": 87 + }, + { + "timestamp": 1030732356.0957031, + "heart_rate": 87 + }, + { + "timestamp": 1030732356.3457031, + "heart_rate": 87 + }, + { + "timestamp": 1030732356.4287109, + "heart_rate": 87 + }, + { + "timestamp": 1030732356.6787109, + "heart_rate": 87 + }, + { + "timestamp": 1030732356.9287109, + "heart_rate": 87 + }, + { + "timestamp": 1030732357.1787109, + "heart_rate": 87 + }, + { + "timestamp": 1030732357.2617188, + "heart_rate": 87 + }, + { + "timestamp": 1030732357.5117188, + "heart_rate": 87 + }, + { + "timestamp": 1030732357.7617188, + "heart_rate": 87 + }, + { + "timestamp": 1030732358.0117188, + "heart_rate": 87 + }, + { + "timestamp": 1030732358.1005859, + "heart_rate": 87 + }, + { + "timestamp": 1030732358.3505859, + "heart_rate": 87 + }, + { + "timestamp": 1030732358.6005859, + "heart_rate": 87 + }, + { + "timestamp": 1030732358.8505859, + "heart_rate": 87 + }, + { + "timestamp": 1030732358.9257812, + "heart_rate": 86 + }, + { + "timestamp": 1030732359.1757812, + "heart_rate": 86 + }, + { + "timestamp": 1030732359.4257812, + "heart_rate": 86 + }, + { + "timestamp": 1030732359.6757812, + "heart_rate": 86 + }, + { + "timestamp": 1030732359.7275391, + "heart_rate": 87 + }, + { + "timestamp": 1030732359.9775391, + "heart_rate": 87 + }, + { + "timestamp": 1030732360.2275391, + "heart_rate": 87 + }, + { + "timestamp": 1030732360.4775391, + "heart_rate": 87 + }, + { + "timestamp": 1030732360.4921875, + "heart_rate": 87 + }, + { + "timestamp": 1030732360.7421875, + "heart_rate": 87 + }, + { + "timestamp": 1030732360.9921875, + "heart_rate": 87 + }, + { + "timestamp": 1030732361.2421875, + "heart_rate": 87 + }, + { + "timestamp": 1030732361.2705078, + "heart_rate": 87 + }, + { + "timestamp": 1030732361.5205078, + "heart_rate": 87 + }, + { + "timestamp": 1030732361.7705078, + "heart_rate": 87 + }, + { + "timestamp": 1030732362.0205078, + "heart_rate": 87 + }, + { + "timestamp": 1030732362.0703125, + "heart_rate": 87 + }, + { + "timestamp": 1030732362.3203125, + "heart_rate": 87 + }, + { + "timestamp": 1030732362.5703125, + "heart_rate": 87 + }, + { + "timestamp": 1030732362.8203125, + "heart_rate": 87 + }, + { + "timestamp": 1030732362.8583984, + "heart_rate": 86 + }, + { + "timestamp": 1030732363.1083984, + "heart_rate": 86 + }, + { + "timestamp": 1030732363.3583984, + "heart_rate": 86 + }, + { + "timestamp": 1030732363.6083984, + "heart_rate": 86 + }, + { + "timestamp": 1030732363.6826172, + "heart_rate": 86 + }, + { + "timestamp": 1030732363.9326172, + "heart_rate": 86 + }, + { + "timestamp": 1030732364.1826172, + "heart_rate": 86 + }, + { + "timestamp": 1030732364.4326172, + "heart_rate": 86 + }, + { + "timestamp": 1030732364.5068359, + "heart_rate": 85 + }, + { + "timestamp": 1030732364.7568359, + "heart_rate": 85 + }, + { + "timestamp": 1030732365.0068359, + "heart_rate": 85 + }, + { + "timestamp": 1030732365.2568359, + "heart_rate": 85 + }, + { + "timestamp": 1030732365.3251953, + "heart_rate": 85 + }, + { + "timestamp": 1030732365.5751953, + "heart_rate": 85 + }, + { + "timestamp": 1030732365.8251953, + "heart_rate": 85 + }, + { + "timestamp": 1030732366.0751953, + "heart_rate": 85 + }, + { + "timestamp": 1030732366.1464844, + "heart_rate": 86 + }, + { + "timestamp": 1030732366.3964844, + "heart_rate": 86 + }, + { + "timestamp": 1030732366.6464844, + "heart_rate": 86 + }, + { + "timestamp": 1030732366.8964844, + "heart_rate": 86 + }, + { + "timestamp": 1030732366.9980469, + "heart_rate": 86 + }, + { + "timestamp": 1030732367.2480469, + "heart_rate": 86 + }, + { + "timestamp": 1030732367.4980469, + "heart_rate": 86 + }, + { + "timestamp": 1030732367.7480469, + "heart_rate": 86 + }, + { + "timestamp": 1030732367.8808594, + "heart_rate": 85 + }, + { + "timestamp": 1030732368.1308594, + "heart_rate": 85 + }, + { + "timestamp": 1030732368.3808594, + "heart_rate": 85 + }, + { + "timestamp": 1030732368.6308594, + "heart_rate": 85 + }, + { + "timestamp": 1030732368.7480469, + "heart_rate": 85 + }, + { + "timestamp": 1030732368.9980469, + "heart_rate": 85 + }, + { + "timestamp": 1030732369.2480469, + "heart_rate": 85 + }, + { + "timestamp": 1030732369.4980469, + "heart_rate": 85 + }, + { + "timestamp": 1030732369.6269531, + "heart_rate": 85 + }, + { + "timestamp": 1030732369.8769531, + "heart_rate": 85 + }, + { + "timestamp": 1030732370.1269531, + "heart_rate": 85 + }, + { + "timestamp": 1030732370.3769531, + "heart_rate": 85 + }, + { + "timestamp": 1030732370.5097656, + "heart_rate": 85 + }, + { + "timestamp": 1030732370.7597656, + "heart_rate": 85 + }, + { + "timestamp": 1030732371.0097656, + "heart_rate": 85 + }, + { + "timestamp": 1030732371.2597656, + "heart_rate": 85 + }, + { + "timestamp": 1030732371.4003906, + "heart_rate": 85 + }, + { + "timestamp": 1030732371.6503906, + "heart_rate": 85 + }, + { + "timestamp": 1030732371.9003906, + "heart_rate": 85 + }, + { + "timestamp": 1030732372.1503906, + "heart_rate": 85 + }, + { + "timestamp": 1030732372.2519531, + "heart_rate": 84 + }, + { + "timestamp": 1030732372.5019531, + "heart_rate": 84 + }, + { + "timestamp": 1030732372.7519531, + "heart_rate": 84 + }, + { + "timestamp": 1030732373.0019531, + "heart_rate": 84 + }, + { + "timestamp": 1030732373.125, + "heart_rate": 85 + }, + { + "timestamp": 1030732373.375, + "heart_rate": 85 + }, + { + "timestamp": 1030732373.625, + "heart_rate": 85 + }, + { + "timestamp": 1030732373.875, + "heart_rate": 85 + }, + { + "timestamp": 1030732373.984375, + "heart_rate": 85 + }, + { + "timestamp": 1030732374.234375, + "heart_rate": 85 + }, + { + "timestamp": 1030732374.484375, + "heart_rate": 85 + }, + { + "timestamp": 1030732374.734375, + "heart_rate": 85 + }, + { + "timestamp": 1030732374.8632812, + "heart_rate": 84 + }, + { + "timestamp": 1030732375.1132812, + "heart_rate": 84 + }, + { + "timestamp": 1030732375.3632812, + "heart_rate": 84 + }, + { + "timestamp": 1030732375.6132812, + "heart_rate": 84 + }, + { + "timestamp": 1030732375.6982422, + "heart_rate": 85 + }, + { + "timestamp": 1030732375.9482422, + "heart_rate": 85 + }, + { + "timestamp": 1030732376.1982422, + "heart_rate": 85 + }, + { + "timestamp": 1030732376.4482422, + "heart_rate": 85 + }, + { + "timestamp": 1030732376.5761719, + "heart_rate": 84 + }, + { + "timestamp": 1030732376.8261719, + "heart_rate": 84 + }, + { + "timestamp": 1030732377.0761719, + "heart_rate": 84 + }, + { + "timestamp": 1030732377.3261719, + "heart_rate": 84 + }, + { + "timestamp": 1030732377.4404297, + "heart_rate": 84 + }, + { + "timestamp": 1030732377.6904297, + "heart_rate": 84 + }, + { + "timestamp": 1030732377.9404297, + "heart_rate": 84 + }, + { + "timestamp": 1030732378.1904297, + "heart_rate": 84 + }, + { + "timestamp": 1030732378.3369141, + "heart_rate": 84 + }, + { + "timestamp": 1030732378.5869141, + "heart_rate": 84 + }, + { + "timestamp": 1030732378.8369141, + "heart_rate": 84 + }, + { + "timestamp": 1030732379.0869141, + "heart_rate": 84 + }, + { + "timestamp": 1030732379.2246094, + "heart_rate": 83 + }, + { + "timestamp": 1030732379.4746094, + "heart_rate": 83 + }, + { + "timestamp": 1030732379.7246094, + "heart_rate": 83 + }, + { + "timestamp": 1030732379.9746094, + "heart_rate": 83 + }, + { + "timestamp": 1030732380.2246094, + "heart_rate": 83 + }, + { + "timestamp": 1030732380.2919922, + "heart_rate": 83 + }, + { + "timestamp": 1030732380.5419922, + "heart_rate": 83 + }, + { + "timestamp": 1030732380.7919922, + "heart_rate": 83 + }, + { + "timestamp": 1030732380.9726562, + "heart_rate": 83 + }, + { + "timestamp": 1030732381.2226562, + "heart_rate": 83 + }, + { + "timestamp": 1030732381.4726562, + "heart_rate": 83 + }, + { + "timestamp": 1030732381.7226562, + "heart_rate": 83 + }, + { + "timestamp": 1030732381.8681641, + "heart_rate": 83 + }, + { + "timestamp": 1030732382.1181641, + "heart_rate": 83 + }, + { + "timestamp": 1030732382.3681641, + "heart_rate": 83 + }, + { + "timestamp": 1030732382.6181641, + "heart_rate": 83 + }, + { + "timestamp": 1030732382.7695312, + "heart_rate": 83 + }, + { + "timestamp": 1030732383.0195312, + "heart_rate": 83 + }, + { + "timestamp": 1030732383.2695312, + "heart_rate": 83 + }, + { + "timestamp": 1030732383.5195312, + "heart_rate": 83 + }, + { + "timestamp": 1030732383.7148438, + "heart_rate": 84 + }, + { + "timestamp": 1030732383.9648438, + "heart_rate": 84 + }, + { + "timestamp": 1030732384.2148438, + "heart_rate": 84 + }, + { + "timestamp": 1030732384.4648438, + "heart_rate": 84 + }, + { + "timestamp": 1030732384.6669922, + "heart_rate": 85 + }, + { + "timestamp": 1030732384.9169922, + "heart_rate": 85 + }, + { + "timestamp": 1030732385.1669922, + "heart_rate": 85 + }, + { + "timestamp": 1030732385.4169922, + "heart_rate": 85 + }, + { + "timestamp": 1030732385.6142578, + "heart_rate": 86 + }, + { + "timestamp": 1030732385.8642578, + "heart_rate": 86 + }, + { + "timestamp": 1030732386.1142578, + "heart_rate": 86 + }, + { + "timestamp": 1030732386.3642578, + "heart_rate": 86 + }, + { + "timestamp": 1030732386.5546875, + "heart_rate": 86 + }, + { + "timestamp": 1030732386.8046875, + "heart_rate": 86 + }, + { + "timestamp": 1030732387.0546875, + "heart_rate": 86 + }, + { + "timestamp": 1030732387.3046875, + "heart_rate": 86 + }, + { + "timestamp": 1030732387.4746094, + "heart_rate": 86 + }, + { + "timestamp": 1030732387.7246094, + "heart_rate": 86 + }, + { + "timestamp": 1030732387.9746094, + "heart_rate": 86 + }, + { + "timestamp": 1030732388.2246094, + "heart_rate": 86 + }, + { + "timestamp": 1030732388.390625, + "heart_rate": 84 + }, + { + "timestamp": 1030732388.640625, + "heart_rate": 84 + }, + { + "timestamp": 1030732388.890625, + "heart_rate": 84 + }, + { + "timestamp": 1030732389.140625, + "heart_rate": 84 + }, + { + "timestamp": 1030732389.2919922, + "heart_rate": 83 + }, + { + "timestamp": 1030732389.5419922, + "heart_rate": 83 + }, + { + "timestamp": 1030732389.7919922, + "heart_rate": 83 + }, + { + "timestamp": 1030732390.0419922, + "heart_rate": 83 + }, + { + "timestamp": 1030732390.1972656, + "heart_rate": 81 + }, + { + "timestamp": 1030732390.4472656, + "heart_rate": 81 + }, + { + "timestamp": 1030732390.6972656, + "heart_rate": 81 + }, + { + "timestamp": 1030732390.9472656, + "heart_rate": 81 + }, + { + "timestamp": 1030732391.0693359, + "heart_rate": 79 + }, + { + "timestamp": 1030732391.3193359, + "heart_rate": 79 + }, + { + "timestamp": 1030732391.5693359, + "heart_rate": 79 + }, + { + "timestamp": 1030732391.8193359, + "heart_rate": 79 + }, + { + "timestamp": 1030732391.9384766, + "heart_rate": 75 + }, + { + "timestamp": 1030732392.1884766, + "heart_rate": 75 + }, + { + "timestamp": 1030732392.4384766, + "heart_rate": 75 + }, + { + "timestamp": 1030732392.6884766, + "heart_rate": 75 + }, + { + "timestamp": 1030732392.8349609, + "heart_rate": 73 + }, + { + "timestamp": 1030732393.0849609, + "heart_rate": 73 + }, + { + "timestamp": 1030732393.3349609, + "heart_rate": 73 + }, + { + "timestamp": 1030732393.5849609, + "heart_rate": 73 + }, + { + "timestamp": 1030732393.7519531, + "heart_rate": 71 + }, + { + "timestamp": 1030732394.0019531, + "heart_rate": 71 + }, + { + "timestamp": 1030732394.2519531, + "heart_rate": 71 + }, + { + "timestamp": 1030732394.5019531, + "heart_rate": 71 + }, + { + "timestamp": 1030732394.7167969, + "heart_rate": 69 + }, + { + "timestamp": 1030732394.9667969, + "heart_rate": 69 + }, + { + "timestamp": 1030732395.2167969, + "heart_rate": 69 + }, + { + "timestamp": 1030732395.4667969, + "heart_rate": 69 + }, + { + "timestamp": 1030732395.640625, + "heart_rate": 68 + }, + { + "timestamp": 1030732395.890625, + "heart_rate": 68 + }, + { + "timestamp": 1030732396.140625, + "heart_rate": 68 + }, + { + "timestamp": 1030732396.390625, + "heart_rate": 68 + }, + { + "timestamp": 1030732396.5761719, + "heart_rate": 66 + }, + { + "timestamp": 1030732396.8261719, + "heart_rate": 66 + }, + { + "timestamp": 1030732397.0761719, + "heart_rate": 66 + }, + { + "timestamp": 1030732397.3261719, + "heart_rate": 66 + }, + { + "timestamp": 1030732397.5039062, + "heart_rate": 66 + }, + { + "timestamp": 1030732397.7539062, + "heart_rate": 66 + }, + { + "timestamp": 1030732398.0039062, + "heart_rate": 66 + }, + { + "timestamp": 1030732398.2539062, + "heart_rate": 66 + }, + { + "timestamp": 1030732398.4003906, + "heart_rate": 66 + }, + { + "timestamp": 1030732398.6503906, + "heart_rate": 66 + }, + { + "timestamp": 1030732398.9003906, + "heart_rate": 66 + }, + { + "timestamp": 1030732399.1503906, + "heart_rate": 66 + }, + { + "timestamp": 1030732399.2666016, + "heart_rate": 67 + }, + { + "timestamp": 1030732399.5166016, + "heart_rate": 67 + }, + { + "timestamp": 1030732399.7666016, + "heart_rate": 67 + }, + { + "timestamp": 1030732400.0166016, + "heart_rate": 67 + }, + { + "timestamp": 1030732400.1679688, + "heart_rate": 68 + }, + { + "timestamp": 1030732400.4179688, + "heart_rate": 68 + }, + { + "timestamp": 1030732400.6679688, + "heart_rate": 68 + }, + { + "timestamp": 1030732400.9179688, + "heart_rate": 68 + }, + { + "timestamp": 1030732401.0771484, + "heart_rate": 68 + }, + { + "timestamp": 1030732401.3271484, + "heart_rate": 68 + }, + { + "timestamp": 1030732401.5771484, + "heart_rate": 68 + }, + { + "timestamp": 1030732401.8271484, + "heart_rate": 68 + }, + { + "timestamp": 1030732401.9423828, + "heart_rate": 68 + }, + { + "timestamp": 1030732402.1923828, + "heart_rate": 68 + }, + { + "timestamp": 1030732402.4423828, + "heart_rate": 68 + }, + { + "timestamp": 1030732402.6923828, + "heart_rate": 68 + }, + { + "timestamp": 1030732402.8251953, + "heart_rate": 69 + }, + { + "timestamp": 1030732403.0751953, + "heart_rate": 69 + }, + { + "timestamp": 1030732403.3251953, + "heart_rate": 69 + }, + { + "timestamp": 1030732403.5751953, + "heart_rate": 69 + }, + { + "timestamp": 1030732403.7099609, + "heart_rate": 70 + }, + { + "timestamp": 1030732403.9599609, + "heart_rate": 70 + }, + { + "timestamp": 1030732404.2099609, + "heart_rate": 70 + }, + { + "timestamp": 1030732404.4599609, + "heart_rate": 70 + }, + { + "timestamp": 1030732404.6357422, + "heart_rate": 70 + }, + { + "timestamp": 1030732404.8857422, + "heart_rate": 70 + }, + { + "timestamp": 1030732405.1357422, + "heart_rate": 70 + }, + { + "timestamp": 1030732405.3857422, + "heart_rate": 70 + }, + { + "timestamp": 1030732405.5449219, + "heart_rate": 68 + }, + { + "timestamp": 1030732405.7949219, + "heart_rate": 68 + }, + { + "timestamp": 1030732406.0449219, + "heart_rate": 68 + }, + { + "timestamp": 1030732406.2949219, + "heart_rate": 68 + }, + { + "timestamp": 1030732406.4628906, + "heart_rate": 67 + }, + { + "timestamp": 1030732406.7128906, + "heart_rate": 67 + }, + { + "timestamp": 1030732406.9628906, + "heart_rate": 67 + }, + { + "timestamp": 1030732407.2128906, + "heart_rate": 67 + }, + { + "timestamp": 1030732407.3574219, + "heart_rate": 67 + }, + { + "timestamp": 1030732407.6074219, + "heart_rate": 67 + }, + { + "timestamp": 1030732407.8574219, + "heart_rate": 67 + }, + { + "timestamp": 1030732408.1074219, + "heart_rate": 67 + }, + { + "timestamp": 1030732408.2832031, + "heart_rate": 67 + }, + { + "timestamp": 1030732408.5332031, + "heart_rate": 67 + }, + { + "timestamp": 1030732408.7832031, + "heart_rate": 67 + }, + { + "timestamp": 1030732409.0332031, + "heart_rate": 67 + }, + { + "timestamp": 1030732409.1621094, + "heart_rate": 67 + }, + { + "timestamp": 1030732409.4121094, + "heart_rate": 67 + }, + { + "timestamp": 1030732409.6621094, + "heart_rate": 67 + }, + { + "timestamp": 1030732409.9121094, + "heart_rate": 67 + }, + { + "timestamp": 1030732410.1621094, + "heart_rate": 67 + }, + { + "timestamp": 1030732410.2910156, + "heart_rate": 67 + }, + { + "timestamp": 1030732410.5410156, + "heart_rate": 67 + }, + { + "timestamp": 1030732410.7910156, + "heart_rate": 67 + }, + { + "timestamp": 1030732410.9257812, + "heart_rate": 68 + }, + { + "timestamp": 1030732411.1757812, + "heart_rate": 68 + }, + { + "timestamp": 1030732411.4257812, + "heart_rate": 68 + }, + { + "timestamp": 1030732411.6757812, + "heart_rate": 68 + }, + { + "timestamp": 1030732411.8173828, + "heart_rate": 68 + }, + { + "timestamp": 1030732412.0673828, + "heart_rate": 68 + }, + { + "timestamp": 1030732412.3173828, + "heart_rate": 68 + }, + { + "timestamp": 1030732412.5673828, + "heart_rate": 68 + }, + { + "timestamp": 1030732412.6992188, + "heart_rate": 68 + }, + { + "timestamp": 1030732412.9492188, + "heart_rate": 68 + }, + { + "timestamp": 1030732413.1992188, + "heart_rate": 68 + }, + { + "timestamp": 1030732413.4492188, + "heart_rate": 68 + }, + { + "timestamp": 1030732413.5917969, + "heart_rate": 69 + }, + { + "timestamp": 1030732413.8417969, + "heart_rate": 69 + }, + { + "timestamp": 1030732414.0917969, + "heart_rate": 69 + }, + { + "timestamp": 1030732414.3417969, + "heart_rate": 69 + }, + { + "timestamp": 1030732414.484375, + "heart_rate": 69 + }, + { + "timestamp": 1030732414.734375, + "heart_rate": 69 + }, + { + "timestamp": 1030732414.984375, + "heart_rate": 69 + }, + { + "timestamp": 1030732415.234375, + "heart_rate": 69 + }, + { + "timestamp": 1030732415.3818359, + "heart_rate": 69 + }, + { + "timestamp": 1030732415.6318359, + "heart_rate": 69 + }, + { + "timestamp": 1030732415.8818359, + "heart_rate": 69 + }, + { + "timestamp": 1030732416.1318359, + "heart_rate": 69 + }, + { + "timestamp": 1030732416.3056641, + "heart_rate": 69 + }, + { + "timestamp": 1030732416.5556641, + "heart_rate": 69 + }, + { + "timestamp": 1030732416.8056641, + "heart_rate": 69 + }, + { + "timestamp": 1030732417.0556641, + "heart_rate": 69 + }, + { + "timestamp": 1030732417.1572266, + "heart_rate": 68 + }, + { + "timestamp": 1030732417.4072266, + "heart_rate": 68 + }, + { + "timestamp": 1030732417.6572266, + "heart_rate": 68 + }, + { + "timestamp": 1030732417.9072266, + "heart_rate": 68 + }, + { + "timestamp": 1030732418.0439453, + "heart_rate": 68 + }, + { + "timestamp": 1030732418.2939453, + "heart_rate": 68 + }, + { + "timestamp": 1030732418.5439453, + "heart_rate": 68 + }, + { + "timestamp": 1030732418.7939453, + "heart_rate": 68 + }, + { + "timestamp": 1030732418.9130859, + "heart_rate": 69 + }, + { + "timestamp": 1030732419.1630859, + "heart_rate": 69 + }, + { + "timestamp": 1030732419.4130859, + "heart_rate": 69 + }, + { + "timestamp": 1030732419.6630859, + "heart_rate": 69 + }, + { + "timestamp": 1030732419.7597656, + "heart_rate": 70 + }, + { + "timestamp": 1030732420.0097656, + "heart_rate": 70 + }, + { + "timestamp": 1030732420.2597656, + "heart_rate": 70 + }, + { + "timestamp": 1030732420.5097656, + "heart_rate": 70 + }, + { + "timestamp": 1030732420.6191406, + "heart_rate": 71 + }, + { + "timestamp": 1030732420.8691406, + "heart_rate": 71 + }, + { + "timestamp": 1030732421.1191406, + "heart_rate": 71 + }, + { + "timestamp": 1030732421.3691406, + "heart_rate": 71 + }, + { + "timestamp": 1030732421.4960938, + "heart_rate": 71 + }, + { + "timestamp": 1030732421.7460938, + "heart_rate": 71 + }, + { + "timestamp": 1030732421.9960938, + "heart_rate": 71 + }, + { + "timestamp": 1030732422.2460938, + "heart_rate": 71 + }, + { + "timestamp": 1030732422.3037109, + "heart_rate": 70 + }, + { + "timestamp": 1030732422.5537109, + "heart_rate": 70 + }, + { + "timestamp": 1030732422.8037109, + "heart_rate": 70 + }, + { + "timestamp": 1030732423.0537109, + "heart_rate": 70 + }, + { + "timestamp": 1030732423.15625, + "heart_rate": 71 + }, + { + "timestamp": 1030732423.40625, + "heart_rate": 71 + }, + { + "timestamp": 1030732423.65625, + "heart_rate": 71 + }, + { + "timestamp": 1030732423.90625, + "heart_rate": 71 + }, + { + "timestamp": 1030732423.9951172, + "heart_rate": 71 + }, + { + "timestamp": 1030732424.2451172, + "heart_rate": 71 + }, + { + "timestamp": 1030732424.4951172, + "heart_rate": 71 + }, + { + "timestamp": 1030732424.7451172, + "heart_rate": 71 + }, + { + "timestamp": 1030732424.8408203, + "heart_rate": 71 + }, + { + "timestamp": 1030732425.0908203, + "heart_rate": 71 + }, + { + "timestamp": 1030732425.3408203, + "heart_rate": 71 + }, + { + "timestamp": 1030732425.5908203, + "heart_rate": 71 + }, + { + "timestamp": 1030732425.6572266, + "heart_rate": 72 + }, + { + "timestamp": 1030732425.9072266, + "heart_rate": 72 + }, + { + "timestamp": 1030732426.1572266, + "heart_rate": 72 + }, + { + "timestamp": 1030732426.4072266, + "heart_rate": 72 + }, + { + "timestamp": 1030732426.5234375, + "heart_rate": 72 + }, + { + "timestamp": 1030732426.7734375, + "heart_rate": 72 + }, + { + "timestamp": 1030732427.0234375, + "heart_rate": 72 + }, + { + "timestamp": 1030732427.2734375, + "heart_rate": 72 + }, + { + "timestamp": 1030732427.4296875, + "heart_rate": 71 + }, + { + "timestamp": 1030732427.6796875, + "heart_rate": 71 + }, + { + "timestamp": 1030732427.9296875, + "heart_rate": 71 + }, + { + "timestamp": 1030732428.1796875, + "heart_rate": 71 + }, + { + "timestamp": 1030732428.3457031, + "heart_rate": 69 + }, + { + "timestamp": 1030732428.5957031, + "heart_rate": 69 + }, + { + "timestamp": 1030732428.8457031, + "heart_rate": 69 + }, + { + "timestamp": 1030732429.0957031, + "heart_rate": 69 + }, + { + "timestamp": 1030732429.2460938, + "heart_rate": 68 + }, + { + "timestamp": 1030732429.4960938, + "heart_rate": 68 + }, + { + "timestamp": 1030732429.7460938, + "heart_rate": 68 + }, + { + "timestamp": 1030732429.9960938, + "heart_rate": 68 + }, + { + "timestamp": 1030732430.1162109, + "heart_rate": 67 + }, + { + "timestamp": 1030732430.3662109, + "heart_rate": 67 + }, + { + "timestamp": 1030732430.6162109, + "heart_rate": 67 + }, + { + "timestamp": 1030732430.8662109, + "heart_rate": 67 + }, + { + "timestamp": 1030732430.9873047, + "heart_rate": 68 + }, + { + "timestamp": 1030732431.2373047, + "heart_rate": 68 + }, + { + "timestamp": 1030732431.4873047, + "heart_rate": 68 + }, + { + "timestamp": 1030732431.7373047, + "heart_rate": 68 + }, + { + "timestamp": 1030732431.8427734, + "heart_rate": 68 + }, + { + "timestamp": 1030732432.0927734, + "heart_rate": 68 + }, + { + "timestamp": 1030732432.3427734, + "heart_rate": 68 + }, + { + "timestamp": 1030732432.5927734, + "heart_rate": 68 + }, + { + "timestamp": 1030732432.6933594, + "heart_rate": 69 + }, + { + "timestamp": 1030732432.9433594, + "heart_rate": 69 + }, + { + "timestamp": 1030732433.1933594, + "heart_rate": 69 + }, + { + "timestamp": 1030732433.4433594, + "heart_rate": 69 + }, + { + "timestamp": 1030732433.5371094, + "heart_rate": 70 + }, + { + "timestamp": 1030732433.7871094, + "heart_rate": 70 + }, + { + "timestamp": 1030732434.0371094, + "heart_rate": 70 + }, + { + "timestamp": 1030732434.2871094, + "heart_rate": 70 + }, + { + "timestamp": 1030732434.3925781, + "heart_rate": 70 + }, + { + "timestamp": 1030732434.6425781, + "heart_rate": 70 + }, + { + "timestamp": 1030732434.8925781, + "heart_rate": 70 + }, + { + "timestamp": 1030732435.1425781, + "heart_rate": 70 + }, + { + "timestamp": 1030732435.2099609, + "heart_rate": 71 + }, + { + "timestamp": 1030732435.4599609, + "heart_rate": 71 + }, + { + "timestamp": 1030732435.7099609, + "heart_rate": 71 + }, + { + "timestamp": 1030732435.9599609, + "heart_rate": 71 + }, + { + "timestamp": 1030732436.0498047, + "heart_rate": 71 + }, + { + "timestamp": 1030732436.2998047, + "heart_rate": 71 + }, + { + "timestamp": 1030732436.5498047, + "heart_rate": 71 + }, + { + "timestamp": 1030732436.7998047, + "heart_rate": 71 + }, + { + "timestamp": 1030732436.8857422, + "heart_rate": 71 + }, + { + "timestamp": 1030732437.1357422, + "heart_rate": 71 + }, + { + "timestamp": 1030732437.3857422, + "heart_rate": 71 + }, + { + "timestamp": 1030732437.6357422, + "heart_rate": 71 + }, + { + "timestamp": 1030732437.6962891, + "heart_rate": 72 + }, + { + "timestamp": 1030732437.9462891, + "heart_rate": 72 + }, + { + "timestamp": 1030732438.1962891, + "heart_rate": 72 + }, + { + "timestamp": 1030732438.4462891, + "heart_rate": 72 + }, + { + "timestamp": 1030732438.5595703, + "heart_rate": 72 + }, + { + "timestamp": 1030732438.8095703, + "heart_rate": 72 + }, + { + "timestamp": 1030732439.0595703, + "heart_rate": 72 + }, + { + "timestamp": 1030732439.3095703, + "heart_rate": 72 + }, + { + "timestamp": 1030732439.4101562, + "heart_rate": 71 + }, + { + "timestamp": 1030732439.6601562, + "heart_rate": 71 + }, + { + "timestamp": 1030732439.9101562, + "heart_rate": 71 + }, + { + "timestamp": 1030732440.1396484, + "heart_rate": 71 + }, + { + "timestamp": 1030732440.3896484, + "heart_rate": 71 + }, + { + "timestamp": 1030732440.6396484, + "heart_rate": 71 + }, + { + "timestamp": 1030732440.8896484, + "heart_rate": 71 + }, + { + "timestamp": 1030732441.0566406, + "heart_rate": 71 + }, + { + "timestamp": 1030732441.3066406, + "heart_rate": 71 + }, + { + "timestamp": 1030732441.5566406, + "heart_rate": 71 + }, + { + "timestamp": 1030732441.8066406, + "heart_rate": 71 + }, + { + "timestamp": 1030732442.0566406, + "heart_rate": 71 + }, + { + "timestamp": 1030732442.2304688, + "heart_rate": 71 + }, + { + "timestamp": 1030732442.4804688, + "heart_rate": 71 + }, + { + "timestamp": 1030732442.7304688, + "heart_rate": 71 + }, + { + "timestamp": 1030732442.9804688, + "heart_rate": 71 + }, + { + "timestamp": 1030732443.0625, + "heart_rate": 72 + }, + { + "timestamp": 1030732443.3125, + "heart_rate": 72 + }, + { + "timestamp": 1030732443.5625, + "heart_rate": 72 + }, + { + "timestamp": 1030732443.6835938, + "heart_rate": 72 + }, + { + "timestamp": 1030732443.9335938, + "heart_rate": 72 + }, + { + "timestamp": 1030732444.1835938, + "heart_rate": 72 + }, + { + "timestamp": 1030732444.3212891, + "heart_rate": 72 + }, + { + "timestamp": 1030732444.5712891, + "heart_rate": 72 + }, + { + "timestamp": 1030732444.8212891, + "heart_rate": 72 + }, + { + "timestamp": 1030732445.0712891, + "heart_rate": 72 + }, + { + "timestamp": 1030732445.1484375, + "heart_rate": 73 + }, + { + "timestamp": 1030732445.3984375, + "heart_rate": 73 + }, + { + "timestamp": 1030732445.6484375, + "heart_rate": 73 + }, + { + "timestamp": 1030732445.8984375, + "heart_rate": 73 + }, + { + "timestamp": 1030732446.0078125, + "heart_rate": 74 + }, + { + "timestamp": 1030732446.2578125, + "heart_rate": 74 + }, + { + "timestamp": 1030732446.5078125, + "heart_rate": 74 + }, + { + "timestamp": 1030732446.7578125, + "heart_rate": 74 + }, + { + "timestamp": 1030732446.8818359, + "heart_rate": 75 + }, + { + "timestamp": 1030732447.1318359, + "heart_rate": 75 + }, + { + "timestamp": 1030732447.3818359, + "heart_rate": 75 + }, + { + "timestamp": 1030732447.6318359, + "heart_rate": 75 + }, + { + "timestamp": 1030732447.7666016, + "heart_rate": 74 + }, + { + "timestamp": 1030732448.0166016, + "heart_rate": 74 + }, + { + "timestamp": 1030732448.2666016, + "heart_rate": 74 + }, + { + "timestamp": 1030732448.5166016, + "heart_rate": 74 + }, + { + "timestamp": 1030732448.6484375, + "heart_rate": 70 + }, + { + "timestamp": 1030732448.8984375, + "heart_rate": 70 + }, + { + "timestamp": 1030732449.1484375, + "heart_rate": 70 + }, + { + "timestamp": 1030732449.3984375, + "heart_rate": 70 + }, + { + "timestamp": 1030732449.5732422, + "heart_rate": 69 + }, + { + "timestamp": 1030732449.8232422, + "heart_rate": 69 + }, + { + "timestamp": 1030732450.0732422, + "heart_rate": 69 + }, + { + "timestamp": 1030732450.3232422, + "heart_rate": 69 + }, + { + "timestamp": 1030732450.4824219, + "heart_rate": 68 + }, + { + "timestamp": 1030732450.7324219, + "heart_rate": 68 + }, + { + "timestamp": 1030732450.9824219, + "heart_rate": 68 + }, + { + "timestamp": 1030732451.2324219, + "heart_rate": 68 + }, + { + "timestamp": 1030732451.4238281, + "heart_rate": 66 + }, + { + "timestamp": 1030732451.6738281, + "heart_rate": 66 + }, + { + "timestamp": 1030732451.9238281, + "heart_rate": 66 + }, + { + "timestamp": 1030732452.1738281, + "heart_rate": 66 + }, + { + "timestamp": 1030732452.3730469, + "heart_rate": 65 + }, + { + "timestamp": 1030732452.6230469, + "heart_rate": 65 + }, + { + "timestamp": 1030732452.8730469, + "heart_rate": 65 + }, + { + "timestamp": 1030732453.1230469, + "heart_rate": 65 + }, + { + "timestamp": 1030732453.3349609, + "heart_rate": 64 + }, + { + "timestamp": 1030732453.5849609, + "heart_rate": 64 + }, + { + "timestamp": 1030732453.8349609, + "heart_rate": 64 + }, + { + "timestamp": 1030732454.0849609, + "heart_rate": 64 + }, + { + "timestamp": 1030732454.25, + "heart_rate": 64 + }, + { + "timestamp": 1030732454.5, + "heart_rate": 64 + }, + { + "timestamp": 1030732454.75, + "heart_rate": 64 + }, + { + "timestamp": 1030732455, + "heart_rate": 64 + }, + { + "timestamp": 1030732455.1914062, + "heart_rate": 64 + }, + { + "timestamp": 1030732455.4414062, + "heart_rate": 64 + }, + { + "timestamp": 1030732455.6914062, + "heart_rate": 64 + }, + { + "timestamp": 1030732455.9414062, + "heart_rate": 64 + }, + { + "timestamp": 1030732456.1259766, + "heart_rate": 64 + }, + { + "timestamp": 1030732456.3759766, + "heart_rate": 64 + }, + { + "timestamp": 1030732456.6259766, + "heart_rate": 64 + }, + { + "timestamp": 1030732456.8759766, + "heart_rate": 64 + }, + { + "timestamp": 1030732457.0615234, + "heart_rate": 64 + }, + { + "timestamp": 1030732457.3115234, + "heart_rate": 64 + }, + { + "timestamp": 1030732457.5615234, + "heart_rate": 64 + }, + { + "timestamp": 1030732457.8115234, + "heart_rate": 64 + }, + { + "timestamp": 1030732458.0126953, + "heart_rate": 64 + }, + { + "timestamp": 1030732458.2626953, + "heart_rate": 64 + }, + { + "timestamp": 1030732458.5126953, + "heart_rate": 64 + }, + { + "timestamp": 1030732458.7626953, + "heart_rate": 64 + }, + { + "timestamp": 1030732458.9677734, + "heart_rate": 64 + }, + { + "timestamp": 1030732459.2177734, + "heart_rate": 64 + }, + { + "timestamp": 1030732459.4677734, + "heart_rate": 64 + }, + { + "timestamp": 1030732459.7177734, + "heart_rate": 64 + }, + { + "timestamp": 1030732459.9013672, + "heart_rate": 63 + }, + { + "timestamp": 1030732460.1513672, + "heart_rate": 63 + }, + { + "timestamp": 1030732460.4013672, + "heart_rate": 63 + }, + { + "timestamp": 1030732460.6513672, + "heart_rate": 63 + }, + { + "timestamp": 1030732460.8447266, + "heart_rate": 63 + }, + { + "timestamp": 1030732461.0947266, + "heart_rate": 63 + }, + { + "timestamp": 1030732461.3447266, + "heart_rate": 63 + }, + { + "timestamp": 1030732461.5947266, + "heart_rate": 63 + }, + { + "timestamp": 1030732461.7792969, + "heart_rate": 64 + }, + { + "timestamp": 1030732462.0292969, + "heart_rate": 64 + }, + { + "timestamp": 1030732462.2792969, + "heart_rate": 64 + }, + { + "timestamp": 1030732462.5292969, + "heart_rate": 64 + }, + { + "timestamp": 1030732462.6953125, + "heart_rate": 64 + }, + { + "timestamp": 1030732462.9453125, + "heart_rate": 64 + }, + { + "timestamp": 1030732463.1953125, + "heart_rate": 64 + }, + { + "timestamp": 1030732463.4453125, + "heart_rate": 64 + }, + { + "timestamp": 1030732463.6357422, + "heart_rate": 64 + }, + { + "timestamp": 1030732463.8857422, + "heart_rate": 64 + }, + { + "timestamp": 1030732464.1357422, + "heart_rate": 64 + }, + { + "timestamp": 1030732464.3857422, + "heart_rate": 64 + }, + { + "timestamp": 1030732464.6054688, + "heart_rate": 64 + }, + { + "timestamp": 1030732464.8554688, + "heart_rate": 64 + }, + { + "timestamp": 1030732465.1054688, + "heart_rate": 64 + }, + { + "timestamp": 1030732465.3554688, + "heart_rate": 64 + }, + { + "timestamp": 1030732465.5810547, + "heart_rate": 63 + }, + { + "timestamp": 1030732465.8310547, + "heart_rate": 63 + }, + { + "timestamp": 1030732466.0810547, + "heart_rate": 63 + }, + { + "timestamp": 1030732466.3310547, + "heart_rate": 63 + }, + { + "timestamp": 1030732466.5107422, + "heart_rate": 62 + }, + { + "timestamp": 1030732466.7607422, + "heart_rate": 62 + }, + { + "timestamp": 1030732467.0107422, + "heart_rate": 62 + }, + { + "timestamp": 1030732467.2607422, + "heart_rate": 62 + }, + { + "timestamp": 1030732467.4619141, + "heart_rate": 63 + }, + { + "timestamp": 1030732467.7119141, + "heart_rate": 63 + }, + { + "timestamp": 1030732467.9619141, + "heart_rate": 63 + }, + { + "timestamp": 1030732468.2119141, + "heart_rate": 63 + }, + { + "timestamp": 1030732468.3974609, + "heart_rate": 63 + }, + { + "timestamp": 1030732468.6474609, + "heart_rate": 63 + }, + { + "timestamp": 1030732468.8974609, + "heart_rate": 63 + }, + { + "timestamp": 1030732469.1474609, + "heart_rate": 63 + }, + { + "timestamp": 1030732469.3398438, + "heart_rate": 64 + }, + { + "timestamp": 1030732469.5898438, + "heart_rate": 64 + }, + { + "timestamp": 1030732469.8398438, + "heart_rate": 64 + }, + { + "timestamp": 1030732470.0898438, + "heart_rate": 64 + }, + { + "timestamp": 1030732470.1240234, + "heart_rate": 64 + }, + { + "timestamp": 1030732470.3740234, + "heart_rate": 64 + }, + { + "timestamp": 1030732470.6240234, + "heart_rate": 64 + }, + { + "timestamp": 1030732470.8740234, + "heart_rate": 64 + }, + { + "timestamp": 1030732471.1240234, + "heart_rate": 64 + }, + { + "timestamp": 1030732471.2392578, + "heart_rate": 64 + }, + { + "timestamp": 1030732471.4892578, + "heart_rate": 64 + }, + { + "timestamp": 1030732471.7392578, + "heart_rate": 64 + }, + { + "timestamp": 1030732471.9892578, + "heart_rate": 64 + }, + { + "timestamp": 1030732472.1533203, + "heart_rate": 64 + }, + { + "timestamp": 1030732472.4033203, + "heart_rate": 64 + }, + { + "timestamp": 1030732472.6533203, + "heart_rate": 64 + }, + { + "timestamp": 1030732472.9033203, + "heart_rate": 64 + }, + { + "timestamp": 1030732473.0419922, + "heart_rate": 64 + }, + { + "timestamp": 1030732473.2919922, + "heart_rate": 64 + }, + { + "timestamp": 1030732473.5419922, + "heart_rate": 64 + }, + { + "timestamp": 1030732473.7919922, + "heart_rate": 64 + }, + { + "timestamp": 1030732473.9208984, + "heart_rate": 64 + }, + { + "timestamp": 1030732474.1708984, + "heart_rate": 64 + }, + { + "timestamp": 1030732474.4208984, + "heart_rate": 64 + }, + { + "timestamp": 1030732474.6552734, + "heart_rate": 65 + }, + { + "timestamp": 1030732474.9052734, + "heart_rate": 65 + }, + { + "timestamp": 1030732475.1552734, + "heart_rate": 65 + }, + { + "timestamp": 1030732475.4052734, + "heart_rate": 65 + }, + { + "timestamp": 1030732475.6552734, + "heart_rate": 65 + }, + { + "timestamp": 1030732475.6601562, + "heart_rate": 65 + }, + { + "timestamp": 1030732475.9101562, + "heart_rate": 65 + }, + { + "timestamp": 1030732476.1601562, + "heart_rate": 65 + }, + { + "timestamp": 1030732476.4101562, + "heart_rate": 65 + }, + { + "timestamp": 1030732476.5439453, + "heart_rate": 66 + }, + { + "timestamp": 1030732476.7939453, + "heart_rate": 66 + }, + { + "timestamp": 1030732477.0439453, + "heart_rate": 66 + }, + { + "timestamp": 1030732477.2939453, + "heart_rate": 66 + }, + { + "timestamp": 1030732477.4667969, + "heart_rate": 67 + }, + { + "timestamp": 1030732477.7167969, + "heart_rate": 67 + }, + { + "timestamp": 1030732477.9667969, + "heart_rate": 67 + }, + { + "timestamp": 1030732478.2167969, + "heart_rate": 67 + }, + { + "timestamp": 1030732478.4042969, + "heart_rate": 67 + }, + { + "timestamp": 1030732478.6542969, + "heart_rate": 67 + }, + { + "timestamp": 1030732478.9042969, + "heart_rate": 67 + }, + { + "timestamp": 1030732479.1542969, + "heart_rate": 67 + }, + { + "timestamp": 1030732479.3554688, + "heart_rate": 65 + }, + { + "timestamp": 1030732479.6054688, + "heart_rate": 65 + }, + { + "timestamp": 1030732479.8554688, + "heart_rate": 65 + }, + { + "timestamp": 1030732480.1054688, + "heart_rate": 65 + }, + { + "timestamp": 1030732480.3183594, + "heart_rate": 64 + }, + { + "timestamp": 1030732480.5683594, + "heart_rate": 64 + }, + { + "timestamp": 1030732480.8183594, + "heart_rate": 64 + }, + { + "timestamp": 1030732481.0683594, + "heart_rate": 64 + }, + { + "timestamp": 1030732481.25, + "heart_rate": 64 + }, + { + "timestamp": 1030732481.5, + "heart_rate": 64 + }, + { + "timestamp": 1030732481.75, + "heart_rate": 64 + }, + { + "timestamp": 1030732482, + "heart_rate": 64 + }, + { + "timestamp": 1030732482.1796875, + "heart_rate": 64 + }, + { + "timestamp": 1030732482.4296875, + "heart_rate": 64 + }, + { + "timestamp": 1030732482.6796875, + "heart_rate": 64 + }, + { + "timestamp": 1030732482.9296875, + "heart_rate": 64 + }, + { + "timestamp": 1030732483.0869141, + "heart_rate": 64 + }, + { + "timestamp": 1030732483.3369141, + "heart_rate": 64 + }, + { + "timestamp": 1030732483.5869141, + "heart_rate": 64 + }, + { + "timestamp": 1030732483.8369141, + "heart_rate": 64 + }, + { + "timestamp": 1030732484, + "heart_rate": 65 + }, + { + "timestamp": 1030732484.25, + "heart_rate": 65 + }, + { + "timestamp": 1030732484.5, + "heart_rate": 65 + }, + { + "timestamp": 1030732484.75, + "heart_rate": 65 + }, + { + "timestamp": 1030732484.9267578, + "heart_rate": 65 + }, + { + "timestamp": 1030732485.1767578, + "heart_rate": 65 + }, + { + "timestamp": 1030732485.4267578, + "heart_rate": 65 + }, + { + "timestamp": 1030732485.6767578, + "heart_rate": 65 + }, + { + "timestamp": 1030732485.8496094, + "heart_rate": 65 + }, + { + "timestamp": 1030732486.0996094, + "heart_rate": 65 + }, + { + "timestamp": 1030732486.3496094, + "heart_rate": 65 + }, + { + "timestamp": 1030732486.5996094, + "heart_rate": 65 + }, + { + "timestamp": 1030732486.75, + "heart_rate": 65 + }, + { + "timestamp": 1030732487, + "heart_rate": 65 + }, + { + "timestamp": 1030732487.25, + "heart_rate": 65 + }, + { + "timestamp": 1030732487.5, + "heart_rate": 65 + }, + { + "timestamp": 1030732487.6474609, + "heart_rate": 66 + }, + { + "timestamp": 1030732487.8974609, + "heart_rate": 66 + }, + { + "timestamp": 1030732488.1474609, + "heart_rate": 66 + }, + { + "timestamp": 1030732488.3974609, + "heart_rate": 66 + }, + { + "timestamp": 1030732488.546875, + "heart_rate": 66 + }, + { + "timestamp": 1030732488.796875, + "heart_rate": 66 + }, + { + "timestamp": 1030732489.046875, + "heart_rate": 66 + }, + { + "timestamp": 1030732489.296875, + "heart_rate": 66 + }, + { + "timestamp": 1030732489.4638672, + "heart_rate": 67 + }, + { + "timestamp": 1030732489.7138672, + "heart_rate": 67 + }, + { + "timestamp": 1030732489.9638672, + "heart_rate": 67 + }, + { + "timestamp": 1030732490.2138672, + "heart_rate": 67 + }, + { + "timestamp": 1030732490.3857422, + "heart_rate": 66 + }, + { + "timestamp": 1030732490.6357422, + "heart_rate": 66 + }, + { + "timestamp": 1030732490.8857422, + "heart_rate": 66 + }, + { + "timestamp": 1030732491.1357422, + "heart_rate": 66 + }, + { + "timestamp": 1030732491.2900391, + "heart_rate": 66 + }, + { + "timestamp": 1030732491.5400391, + "heart_rate": 66 + }, + { + "timestamp": 1030732491.7900391, + "heart_rate": 66 + }, + { + "timestamp": 1030732492.0400391, + "heart_rate": 66 + }, + { + "timestamp": 1030732492.1982422, + "heart_rate": 66 + }, + { + "timestamp": 1030732492.4482422, + "heart_rate": 66 + }, + { + "timestamp": 1030732492.6982422, + "heart_rate": 66 + }, + { + "timestamp": 1030732492.9482422, + "heart_rate": 66 + }, + { + "timestamp": 1030732493.0917969, + "heart_rate": 66 + }, + { + "timestamp": 1030732493.3417969, + "heart_rate": 66 + }, + { + "timestamp": 1030732493.5917969, + "heart_rate": 66 + }, + { + "timestamp": 1030732493.8417969, + "heart_rate": 66 + }, + { + "timestamp": 1030732493.9785156, + "heart_rate": 67 + }, + { + "timestamp": 1030732494.2285156, + "heart_rate": 67 + }, + { + "timestamp": 1030732494.4785156, + "heart_rate": 67 + }, + { + "timestamp": 1030732494.7285156, + "heart_rate": 67 + }, + { + "timestamp": 1030732494.8183594, + "heart_rate": 67 + }, + { + "timestamp": 1030732495.0683594, + "heart_rate": 67 + }, + { + "timestamp": 1030732495.3183594, + "heart_rate": 67 + }, + { + "timestamp": 1030732495.5683594, + "heart_rate": 67 + }, + { + "timestamp": 1030732495.6386719, + "heart_rate": 69 + }, + { + "timestamp": 1030732495.8886719, + "heart_rate": 69 + }, + { + "timestamp": 1030732496.1386719, + "heart_rate": 69 + }, + { + "timestamp": 1030732496.3886719, + "heart_rate": 69 + }, + { + "timestamp": 1030732496.4541016, + "heart_rate": 71 + }, + { + "timestamp": 1030732496.7041016, + "heart_rate": 71 + }, + { + "timestamp": 1030732496.9541016, + "heart_rate": 71 + }, + { + "timestamp": 1030732497.2041016, + "heart_rate": 71 + }, + { + "timestamp": 1030732497.2802734, + "heart_rate": 72 + }, + { + "timestamp": 1030732497.5302734, + "heart_rate": 72 + }, + { + "timestamp": 1030732497.7802734, + "heart_rate": 72 + }, + { + "timestamp": 1030732498.0302734, + "heart_rate": 72 + }, + { + "timestamp": 1030732498.1318359, + "heart_rate": 72 + }, + { + "timestamp": 1030732498.3818359, + "heart_rate": 72 + }, + { + "timestamp": 1030732498.6318359, + "heart_rate": 72 + }, + { + "timestamp": 1030732498.8818359, + "heart_rate": 72 + }, + { + "timestamp": 1030732499.0029297, + "heart_rate": 71 + }, + { + "timestamp": 1030732499.2529297, + "heart_rate": 71 + }, + { + "timestamp": 1030732499.5029297, + "heart_rate": 71 + }, + { + "timestamp": 1030732499.7529297, + "heart_rate": 71 + }, + { + "timestamp": 1030732499.8828125, + "heart_rate": 70 + }, + { + "timestamp": 1030732500.1328125, + "heart_rate": 70 + }, + { + "timestamp": 1030732500.3828125, + "heart_rate": 70 + }, + { + "timestamp": 1030732500.6328125, + "heart_rate": 70 + }, + { + "timestamp": 1030732500.7529297, + "heart_rate": 69 + }, + { + "timestamp": 1030732501.0029297, + "heart_rate": 69 + }, + { + "timestamp": 1030732501.2529297, + "heart_rate": 69 + }, + { + "timestamp": 1030732501.5029297, + "heart_rate": 69 + }, + { + "timestamp": 1030732501.6591797, + "heart_rate": 69 + }, + { + "timestamp": 1030732501.9091797, + "heart_rate": 69 + }, + { + "timestamp": 1030732502.1591797, + "heart_rate": 69 + }, + { + "timestamp": 1030732502.4091797, + "heart_rate": 69 + }, + { + "timestamp": 1030732502.5380859, + "heart_rate": 69 + }, + { + "timestamp": 1030732502.7880859, + "heart_rate": 69 + }, + { + "timestamp": 1030732503.0380859, + "heart_rate": 69 + }, + { + "timestamp": 1030732503.2880859, + "heart_rate": 69 + }, + { + "timestamp": 1030732503.4472656, + "heart_rate": 67 + }, + { + "timestamp": 1030732503.6972656, + "heart_rate": 67 + }, + { + "timestamp": 1030732503.9472656, + "heart_rate": 67 + }, + { + "timestamp": 1030732504.1972656, + "heart_rate": 67 + }, + { + "timestamp": 1030732504.3681641, + "heart_rate": 67 + }, + { + "timestamp": 1030732504.6181641, + "heart_rate": 67 + }, + { + "timestamp": 1030732504.8681641, + "heart_rate": 67 + }, + { + "timestamp": 1030732505.1181641, + "heart_rate": 67 + }, + { + "timestamp": 1030732505.2363281, + "heart_rate": 66 + }, + { + "timestamp": 1030732505.4863281, + "heart_rate": 66 + }, + { + "timestamp": 1030732505.7363281, + "heart_rate": 66 + }, + { + "timestamp": 1030732505.9863281, + "heart_rate": 66 + }, + { + "timestamp": 1030732506.1572266, + "heart_rate": 66 + }, + { + "timestamp": 1030732506.4072266, + "heart_rate": 66 + }, + { + "timestamp": 1030732506.6572266, + "heart_rate": 66 + }, + { + "timestamp": 1030732506.9072266, + "heart_rate": 66 + }, + { + "timestamp": 1030732507.1035156, + "heart_rate": 65 + }, + { + "timestamp": 1030732507.3535156, + "heart_rate": 65 + }, + { + "timestamp": 1030732507.6035156, + "heart_rate": 65 + }, + { + "timestamp": 1030732507.8535156, + "heart_rate": 65 + }, + { + "timestamp": 1030732508.0976562, + "heart_rate": 64 + }, + { + "timestamp": 1030732508.3476562, + "heart_rate": 64 + }, + { + "timestamp": 1030732508.5976562, + "heart_rate": 64 + }, + { + "timestamp": 1030732508.8476562, + "heart_rate": 64 + }, + { + "timestamp": 1030732509.0976562, + "heart_rate": 62 + }, + { + "timestamp": 1030732509.3476562, + "heart_rate": 62 + }, + { + "timestamp": 1030732509.5976562, + "heart_rate": 62 + }, + { + "timestamp": 1030732509.8476562, + "heart_rate": 62 + }, + { + "timestamp": 1030732510.0976562, + "heart_rate": 62 + }, + { + "timestamp": 1030732510.1152344, + "heart_rate": 61 + }, + { + "timestamp": 1030732510.3652344, + "heart_rate": 61 + }, + { + "timestamp": 1030732510.6152344, + "heart_rate": 61 + }, + { + "timestamp": 1030732510.8652344, + "heart_rate": 61 + }, + { + "timestamp": 1030732511.1152344, + "heart_rate": 61 + }, + { + "timestamp": 1030732511.1513672, + "heart_rate": 60 + }, + { + "timestamp": 1030732511.4013672, + "heart_rate": 60 + }, + { + "timestamp": 1030732511.6513672, + "heart_rate": 60 + }, + { + "timestamp": 1030732511.9013672, + "heart_rate": 60 + }, + { + "timestamp": 1030732512.1513672, + "heart_rate": 60 + }, + { + "timestamp": 1030732512.1650391, + "heart_rate": 60 + }, + { + "timestamp": 1030732512.4150391, + "heart_rate": 60 + }, + { + "timestamp": 1030732512.6650391, + "heart_rate": 60 + }, + { + "timestamp": 1030732512.9150391, + "heart_rate": 60 + }, + { + "timestamp": 1030732513.1650391, + "heart_rate": 60 + }, + { + "timestamp": 1030732513.1845703, + "heart_rate": 59 + }, + { + "timestamp": 1030732513.4345703, + "heart_rate": 59 + }, + { + "timestamp": 1030732513.6845703, + "heart_rate": 59 + }, + { + "timestamp": 1030732513.9345703, + "heart_rate": 59 + }, + { + "timestamp": 1030732514.1845703, + "heart_rate": 59 + }, + { + "timestamp": 1030732514.2089844, + "heart_rate": 59 + }, + { + "timestamp": 1030732514.4589844, + "heart_rate": 59 + }, + { + "timestamp": 1030732514.7089844, + "heart_rate": 59 + }, + { + "timestamp": 1030732514.9589844, + "heart_rate": 59 + }, + { + "timestamp": 1030732515.2011719, + "heart_rate": 59 + }, + { + "timestamp": 1030732515.4511719, + "heart_rate": 59 + }, + { + "timestamp": 1030732515.7011719, + "heart_rate": 59 + }, + { + "timestamp": 1030732515.9511719, + "heart_rate": 59 + }, + { + "timestamp": 1030732516.1787109, + "heart_rate": 60 + }, + { + "timestamp": 1030732516.4287109, + "heart_rate": 60 + }, + { + "timestamp": 1030732516.6787109, + "heart_rate": 60 + }, + { + "timestamp": 1030732516.9287109, + "heart_rate": 60 + }, + { + "timestamp": 1030732517.1171875, + "heart_rate": 61 + }, + { + "timestamp": 1030732517.3671875, + "heart_rate": 61 + }, + { + "timestamp": 1030732517.6171875, + "heart_rate": 61 + }, + { + "timestamp": 1030732517.8671875, + "heart_rate": 61 + }, + { + "timestamp": 1030732518.0703125, + "heart_rate": 62 + }, + { + "timestamp": 1030732518.3203125, + "heart_rate": 62 + }, + { + "timestamp": 1030732518.5703125, + "heart_rate": 62 + }, + { + "timestamp": 1030732518.8203125, + "heart_rate": 62 + }, + { + "timestamp": 1030732519.0224609, + "heart_rate": 62 + }, + { + "timestamp": 1030732519.2724609, + "heart_rate": 62 + }, + { + "timestamp": 1030732519.5224609, + "heart_rate": 62 + }, + { + "timestamp": 1030732519.7724609, + "heart_rate": 62 + }, + { + "timestamp": 1030732519.9775391, + "heart_rate": 63 + }, + { + "timestamp": 1030732520.2275391, + "heart_rate": 63 + }, + { + "timestamp": 1030732520.4775391, + "heart_rate": 63 + }, + { + "timestamp": 1030732520.7275391, + "heart_rate": 63 + }, + { + "timestamp": 1030732520.9580078, + "heart_rate": 63 + }, + { + "timestamp": 1030732521.2080078, + "heart_rate": 63 + }, + { + "timestamp": 1030732521.4580078, + "heart_rate": 63 + }, + { + "timestamp": 1030732521.7080078, + "heart_rate": 63 + }, + { + "timestamp": 1030732521.9580078, + "heart_rate": 63 + }, + { + "timestamp": 1030732521.9599609, + "heart_rate": 62 + }, + { + "timestamp": 1030732522.2099609, + "heart_rate": 62 + }, + { + "timestamp": 1030732522.4599609, + "heart_rate": 62 + }, + { + "timestamp": 1030732522.7099609, + "heart_rate": 62 + }, + { + "timestamp": 1030732522.953125, + "heart_rate": 61 + }, + { + "timestamp": 1030732523.203125, + "heart_rate": 61 + }, + { + "timestamp": 1030732523.453125, + "heart_rate": 61 + }, + { + "timestamp": 1030732523.703125, + "heart_rate": 61 + }, + { + "timestamp": 1030732523.8662109, + "heart_rate": 61 + }, + { + "timestamp": 1030732524.1162109, + "heart_rate": 61 + }, + { + "timestamp": 1030732524.3662109, + "heart_rate": 61 + }, + { + "timestamp": 1030732524.6162109, + "heart_rate": 61 + }, + { + "timestamp": 1030732524.7861328, + "heart_rate": 63 + }, + { + "timestamp": 1030732525.0361328, + "heart_rate": 63 + }, + { + "timestamp": 1030732525.2861328, + "heart_rate": 63 + }, + { + "timestamp": 1030732525.5361328, + "heart_rate": 63 + }, + { + "timestamp": 1030732525.6992188, + "heart_rate": 64 + }, + { + "timestamp": 1030732525.9492188, + "heart_rate": 64 + }, + { + "timestamp": 1030732526.1992188, + "heart_rate": 64 + }, + { + "timestamp": 1030732526.4492188, + "heart_rate": 64 + }, + { + "timestamp": 1030732526.6396484, + "heart_rate": 65 + }, + { + "timestamp": 1030732526.8896484, + "heart_rate": 65 + }, + { + "timestamp": 1030732527.1396484, + "heart_rate": 65 + }, + { + "timestamp": 1030732527.3896484, + "heart_rate": 65 + }, + { + "timestamp": 1030732527.5410156, + "heart_rate": 65 + }, + { + "timestamp": 1030732527.7910156, + "heart_rate": 65 + }, + { + "timestamp": 1030732528.0410156, + "heart_rate": 65 + }, + { + "timestamp": 1030732528.2910156, + "heart_rate": 65 + }, + { + "timestamp": 1030732528.4970703, + "heart_rate": 65 + }, + { + "timestamp": 1030732528.7470703, + "heart_rate": 65 + }, + { + "timestamp": 1030732528.9970703, + "heart_rate": 65 + }, + { + "timestamp": 1030732529.2470703, + "heart_rate": 65 + }, + { + "timestamp": 1030732529.4462891, + "heart_rate": 64 + }, + { + "timestamp": 1030732529.6962891, + "heart_rate": 64 + }, + { + "timestamp": 1030732529.9462891, + "heart_rate": 64 + }, + { + "timestamp": 1030732530.1962891, + "heart_rate": 64 + }, + { + "timestamp": 1030732530.2880859, + "heart_rate": 64 + }, + { + "timestamp": 1030732530.5380859, + "heart_rate": 64 + }, + { + "timestamp": 1030732530.7880859, + "heart_rate": 64 + }, + { + "timestamp": 1030732531.0380859, + "heart_rate": 64 + }, + { + "timestamp": 1030732531.2480469, + "heart_rate": 63 + }, + { + "timestamp": 1030732531.4980469, + "heart_rate": 63 + }, + { + "timestamp": 1030732531.7480469, + "heart_rate": 63 + }, + { + "timestamp": 1030732531.9980469, + "heart_rate": 63 + }, + { + "timestamp": 1030732532.1767578, + "heart_rate": 64 + }, + { + "timestamp": 1030732532.4267578, + "heart_rate": 64 + }, + { + "timestamp": 1030732532.6767578, + "heart_rate": 64 + }, + { + "timestamp": 1030732532.9267578, + "heart_rate": 64 + }, + { + "timestamp": 1030732533.1533203, + "heart_rate": 63 + }, + { + "timestamp": 1030732533.4033203, + "heart_rate": 63 + }, + { + "timestamp": 1030732533.6533203, + "heart_rate": 63 + }, + { + "timestamp": 1030732533.9033203, + "heart_rate": 63 + }, + { + "timestamp": 1030732534.0966797, + "heart_rate": 63 + }, + { + "timestamp": 1030732534.3466797, + "heart_rate": 63 + }, + { + "timestamp": 1030732534.5966797, + "heart_rate": 63 + }, + { + "timestamp": 1030732534.8466797, + "heart_rate": 63 + }, + { + "timestamp": 1030732535.0332031, + "heart_rate": 64 + }, + { + "timestamp": 1030732535.2832031, + "heart_rate": 64 + }, + { + "timestamp": 1030732535.5332031, + "heart_rate": 64 + }, + { + "timestamp": 1030732535.7832031, + "heart_rate": 64 + }, + { + "timestamp": 1030732535.9755859, + "heart_rate": 64 + }, + { + "timestamp": 1030732536.2255859, + "heart_rate": 64 + }, + { + "timestamp": 1030732536.4755859, + "heart_rate": 64 + }, + { + "timestamp": 1030732536.7255859, + "heart_rate": 64 + }, + { + "timestamp": 1030732536.9199219, + "heart_rate": 64 + }, + { + "timestamp": 1030732537.1699219, + "heart_rate": 64 + }, + { + "timestamp": 1030732537.4199219, + "heart_rate": 64 + }, + { + "timestamp": 1030732537.6699219, + "heart_rate": 64 + }, + { + "timestamp": 1030732537.8378906, + "heart_rate": 64 + }, + { + "timestamp": 1030732538.0878906, + "heart_rate": 64 + }, + { + "timestamp": 1030732538.3378906, + "heart_rate": 64 + }, + { + "timestamp": 1030732538.5878906, + "heart_rate": 64 + }, + { + "timestamp": 1030732538.71875, + "heart_rate": 65 + }, + { + "timestamp": 1030732538.96875, + "heart_rate": 65 + }, + { + "timestamp": 1030732539.21875, + "heart_rate": 65 + }, + { + "timestamp": 1030732539.46875, + "heart_rate": 65 + }, + { + "timestamp": 1030732539.6357422, + "heart_rate": 65 + }, + { + "timestamp": 1030732539.8857422, + "heart_rate": 65 + }, + { + "timestamp": 1030732540.1357422, + "heart_rate": 65 + }, + { + "timestamp": 1030732540.3857422, + "heart_rate": 65 + }, + { + "timestamp": 1030732540.5068359, + "heart_rate": 67 + }, + { + "timestamp": 1030732540.7568359, + "heart_rate": 67 + }, + { + "timestamp": 1030732541.0068359, + "heart_rate": 67 + }, + { + "timestamp": 1030732541.2568359, + "heart_rate": 67 + }, + { + "timestamp": 1030732541.4335938, + "heart_rate": 66 + }, + { + "timestamp": 1030732541.6835938, + "heart_rate": 66 + }, + { + "timestamp": 1030732541.9335938, + "heart_rate": 66 + }, + { + "timestamp": 1030732542.1835938, + "heart_rate": 66 + }, + { + "timestamp": 1030732542.3515625, + "heart_rate": 66 + }, + { + "timestamp": 1030732542.6015625, + "heart_rate": 66 + }, + { + "timestamp": 1030732542.8515625, + "heart_rate": 66 + }, + { + "timestamp": 1030732543.1015625, + "heart_rate": 66 + }, + { + "timestamp": 1030732543.2695312, + "heart_rate": 66 + }, + { + "timestamp": 1030732543.5195312, + "heart_rate": 66 + }, + { + "timestamp": 1030732543.7695312, + "heart_rate": 66 + }, + { + "timestamp": 1030732544.0195312, + "heart_rate": 66 + }, + { + "timestamp": 1030732544.1074219, + "heart_rate": 65 + }, + { + "timestamp": 1030732544.3574219, + "heart_rate": 65 + }, + { + "timestamp": 1030732544.6074219, + "heart_rate": 65 + }, + { + "timestamp": 1030732544.8574219, + "heart_rate": 65 + }, + { + "timestamp": 1030732545.0449219, + "heart_rate": 65 + }, + { + "timestamp": 1030732545.2949219, + "heart_rate": 65 + }, + { + "timestamp": 1030732545.5449219, + "heart_rate": 65 + }, + { + "timestamp": 1030732545.7949219, + "heart_rate": 65 + }, + { + "timestamp": 1030732545.9619141, + "heart_rate": 65 + }, + { + "timestamp": 1030732546.2119141, + "heart_rate": 65 + }, + { + "timestamp": 1030732546.4619141, + "heart_rate": 65 + }, + { + "timestamp": 1030732546.7119141, + "heart_rate": 65 + }, + { + "timestamp": 1030732546.9492188, + "heart_rate": 65 + }, + { + "timestamp": 1030732547.1992188, + "heart_rate": 65 + }, + { + "timestamp": 1030732547.4492188, + "heart_rate": 65 + }, + { + "timestamp": 1030732547.6992188, + "heart_rate": 65 + }, + { + "timestamp": 1030732547.9492188, + "heart_rate": 65 + }, + { + "timestamp": 1030732547.9560547, + "heart_rate": 63 + }, + { + "timestamp": 1030732548.2060547, + "heart_rate": 63 + }, + { + "timestamp": 1030732548.4560547, + "heart_rate": 63 + }, + { + "timestamp": 1030732548.7060547, + "heart_rate": 63 + }, + { + "timestamp": 1030732548.9560547, + "heart_rate": 63 + }, + { + "timestamp": 1030732548.9648438, + "heart_rate": 61 + }, + { + "timestamp": 1030732549.2148438, + "heart_rate": 61 + }, + { + "timestamp": 1030732549.4648438, + "heart_rate": 61 + }, + { + "timestamp": 1030732549.7148438, + "heart_rate": 61 + }, + { + "timestamp": 1030732549.9648438, + "heart_rate": 61 + }, + { + "timestamp": 1030732550.0800781, + "heart_rate": 60 + }, + { + "timestamp": 1030732550.3300781, + "heart_rate": 60 + }, + { + "timestamp": 1030732550.5800781, + "heart_rate": 60 + }, + { + "timestamp": 1030732550.8300781, + "heart_rate": 60 + }, + { + "timestamp": 1030732550.9404297, + "heart_rate": 60 + }, + { + "timestamp": 1030732551.1904297, + "heart_rate": 60 + }, + { + "timestamp": 1030732551.4404297, + "heart_rate": 60 + }, + { + "timestamp": 1030732551.6904297, + "heart_rate": 60 + }, + { + "timestamp": 1030732551.8945312, + "heart_rate": 60 + }, + { + "timestamp": 1030732552.1445312, + "heart_rate": 60 + }, + { + "timestamp": 1030732552.3945312, + "heart_rate": 60 + }, + { + "timestamp": 1030732552.6445312, + "heart_rate": 60 + }, + { + "timestamp": 1030732552.8291016, + "heart_rate": 61 + }, + { + "timestamp": 1030732553.0791016, + "heart_rate": 61 + }, + { + "timestamp": 1030732553.3291016, + "heart_rate": 61 + }, + { + "timestamp": 1030732553.5791016, + "heart_rate": 61 + }, + { + "timestamp": 1030732553.7441406, + "heart_rate": 62 + }, + { + "timestamp": 1030732553.9941406, + "heart_rate": 62 + }, + { + "timestamp": 1030732554.2441406, + "heart_rate": 62 + }, + { + "timestamp": 1030732554.4941406, + "heart_rate": 62 + }, + { + "timestamp": 1030732554.6474609, + "heart_rate": 64 + }, + { + "timestamp": 1030732554.8974609, + "heart_rate": 64 + }, + { + "timestamp": 1030732555.1474609, + "heart_rate": 64 + }, + { + "timestamp": 1030732555.3974609, + "heart_rate": 64 + }, + { + "timestamp": 1030732555.5507812, + "heart_rate": 65 + }, + { + "timestamp": 1030732555.8007812, + "heart_rate": 65 + }, + { + "timestamp": 1030732556.0507812, + "heart_rate": 65 + }, + { + "timestamp": 1030732556.3007812, + "heart_rate": 65 + }, + { + "timestamp": 1030732556.4648438, + "heart_rate": 66 + }, + { + "timestamp": 1030732556.7148438, + "heart_rate": 66 + }, + { + "timestamp": 1030732556.9648438, + "heart_rate": 66 + }, + { + "timestamp": 1030732557.2148438, + "heart_rate": 66 + }, + { + "timestamp": 1030732557.3544922, + "heart_rate": 66 + }, + { + "timestamp": 1030732557.6044922, + "heart_rate": 66 + }, + { + "timestamp": 1030732557.8544922, + "heart_rate": 66 + }, + { + "timestamp": 1030732558.1044922, + "heart_rate": 66 + }, + { + "timestamp": 1030732558.2412109, + "heart_rate": 67 + }, + { + "timestamp": 1030732558.4912109, + "heart_rate": 67 + }, + { + "timestamp": 1030732558.7412109, + "heart_rate": 67 + }, + { + "timestamp": 1030732558.9912109, + "heart_rate": 67 + }, + { + "timestamp": 1030732559.1591797, + "heart_rate": 67 + }, + { + "timestamp": 1030732559.4091797, + "heart_rate": 67 + }, + { + "timestamp": 1030732559.6591797, + "heart_rate": 67 + }, + { + "timestamp": 1030732559.9091797, + "heart_rate": 67 + }, + { + "timestamp": 1030732560.1591797, + "heart_rate": 67 + }, + { + "timestamp": 1030732560.2773438, + "heart_rate": 67 + }, + { + "timestamp": 1030732560.5273438, + "heart_rate": 67 + }, + { + "timestamp": 1030732560.7773438, + "heart_rate": 67 + }, + { + "timestamp": 1030732561.0273438, + "heart_rate": 67 + }, + { + "timestamp": 1030732561.0351562, + "heart_rate": 67 + }, + { + "timestamp": 1030732561.2851562, + "heart_rate": 67 + }, + { + "timestamp": 1030732561.5351562, + "heart_rate": 67 + }, + { + "timestamp": 1030732561.7851562, + "heart_rate": 67 + }, + { + "timestamp": 1030732561.9609375, + "heart_rate": 67 + }, + { + "timestamp": 1030732562.2109375, + "heart_rate": 67 + }, + { + "timestamp": 1030732562.4609375, + "heart_rate": 67 + }, + { + "timestamp": 1030732562.7109375, + "heart_rate": 67 + }, + { + "timestamp": 1030732562.9052734, + "heart_rate": 67 + }, + { + "timestamp": 1030732563.1552734, + "heart_rate": 67 + }, + { + "timestamp": 1030732563.4052734, + "heart_rate": 67 + }, + { + "timestamp": 1030732563.6552734, + "heart_rate": 67 + }, + { + "timestamp": 1030732563.7910156, + "heart_rate": 67 + }, + { + "timestamp": 1030732564.0410156, + "heart_rate": 67 + }, + { + "timestamp": 1030732564.2910156, + "heart_rate": 67 + }, + { + "timestamp": 1030732564.5410156, + "heart_rate": 67 + }, + { + "timestamp": 1030732564.6513672, + "heart_rate": 67 + }, + { + "timestamp": 1030732564.9013672, + "heart_rate": 67 + }, + { + "timestamp": 1030732565.1513672, + "heart_rate": 67 + }, + { + "timestamp": 1030732565.4013672, + "heart_rate": 67 + }, + { + "timestamp": 1030732565.4785156, + "heart_rate": 69 + }, + { + "timestamp": 1030732565.7285156, + "heart_rate": 69 + }, + { + "timestamp": 1030732565.9785156, + "heart_rate": 69 + }, + { + "timestamp": 1030732566.2285156, + "heart_rate": 69 + }, + { + "timestamp": 1030732566.25, + "heart_rate": 71 + }, + { + "timestamp": 1030732566.5, + "heart_rate": 71 + }, + { + "timestamp": 1030732566.75, + "heart_rate": 71 + }, + { + "timestamp": 1030732567, + "heart_rate": 71 + }, + { + "timestamp": 1030732567.0195312, + "heart_rate": 74 + }, + { + "timestamp": 1030732567.2695312, + "heart_rate": 74 + }, + { + "timestamp": 1030732567.5195312, + "heart_rate": 74 + }, + { + "timestamp": 1030732567.7695312, + "heart_rate": 74 + }, + { + "timestamp": 1030732567.7841797, + "heart_rate": 76 + }, + { + "timestamp": 1030732568.0341797, + "heart_rate": 76 + }, + { + "timestamp": 1030732568.2841797, + "heart_rate": 76 + }, + { + "timestamp": 1030732568.5302734, + "heart_rate": 77 + }, + { + "timestamp": 1030732568.7802734, + "heart_rate": 77 + }, + { + "timestamp": 1030732569.0302734, + "heart_rate": 77 + }, + { + "timestamp": 1030732569.2695312, + "heart_rate": 79 + }, + { + "timestamp": 1030732569.5195312, + "heart_rate": 79 + }, + { + "timestamp": 1030732569.7695312, + "heart_rate": 79 + }, + { + "timestamp": 1030732570.0107422, + "heart_rate": 80 + }, + { + "timestamp": 1030732570.2607422, + "heart_rate": 80 + }, + { + "timestamp": 1030732570.5107422, + "heart_rate": 80 + }, + { + "timestamp": 1030732570.7519531, + "heart_rate": 80 + }, + { + "timestamp": 1030732571.0019531, + "heart_rate": 80 + }, + { + "timestamp": 1030732571.2519531, + "heart_rate": 80 + }, + { + "timestamp": 1030732571.4755859, + "heart_rate": 81 + }, + { + "timestamp": 1030732571.7255859, + "heart_rate": 81 + }, + { + "timestamp": 1030732571.9755859, + "heart_rate": 81 + }, + { + "timestamp": 1030732572.1796875, + "heart_rate": 82 + }, + { + "timestamp": 1030732572.4296875, + "heart_rate": 82 + }, + { + "timestamp": 1030732572.6796875, + "heart_rate": 82 + }, + { + "timestamp": 1030732572.8769531, + "heart_rate": 84 + }, + { + "timestamp": 1030732573.1269531, + "heart_rate": 84 + }, + { + "timestamp": 1030732573.3769531, + "heart_rate": 84 + }, + { + "timestamp": 1030732573.5615234, + "heart_rate": 85 + }, + { + "timestamp": 1030732573.8115234, + "heart_rate": 85 + }, + { + "timestamp": 1030732574.0615234, + "heart_rate": 85 + }, + { + "timestamp": 1030732574.2373047, + "heart_rate": 86 + }, + { + "timestamp": 1030732574.4873047, + "heart_rate": 86 + }, + { + "timestamp": 1030732574.7373047, + "heart_rate": 86 + }, + { + "timestamp": 1030732574.9189453, + "heart_rate": 87 + }, + { + "timestamp": 1030732575.1689453, + "heart_rate": 87 + }, + { + "timestamp": 1030732575.4189453, + "heart_rate": 87 + }, + { + "timestamp": 1030732575.5917969, + "heart_rate": 88 + }, + { + "timestamp": 1030732575.8417969, + "heart_rate": 88 + }, + { + "timestamp": 1030732576.0917969, + "heart_rate": 88 + }, + { + "timestamp": 1030732576.2490234, + "heart_rate": 89 + }, + { + "timestamp": 1030732576.4990234, + "heart_rate": 89 + }, + { + "timestamp": 1030732576.7490234, + "heart_rate": 89 + }, + { + "timestamp": 1030732576.9033203, + "heart_rate": 90 + }, + { + "timestamp": 1030732577.1533203, + "heart_rate": 90 + }, + { + "timestamp": 1030732577.4033203, + "heart_rate": 90 + }, + { + "timestamp": 1030732577.5957031, + "heart_rate": 91 + }, + { + "timestamp": 1030732577.8457031, + "heart_rate": 91 + }, + { + "timestamp": 1030732578.0957031, + "heart_rate": 91 + }, + { + "timestamp": 1030732578.2861328, + "heart_rate": 89 + }, + { + "timestamp": 1030732578.5361328, + "heart_rate": 89 + }, + { + "timestamp": 1030732578.7861328, + "heart_rate": 89 + }, + { + "timestamp": 1030732578.9648438, + "heart_rate": 88 + }, + { + "timestamp": 1030732579.2148438, + "heart_rate": 88 + }, + { + "timestamp": 1030732579.4648438, + "heart_rate": 88 + }, + { + "timestamp": 1030732579.6269531, + "heart_rate": 88 + }, + { + "timestamp": 1030732579.8769531, + "heart_rate": 88 + }, + { + "timestamp": 1030732580.1269531, + "heart_rate": 88 + }, + { + "timestamp": 1030732580.3115234, + "heart_rate": 88 + }, + { + "timestamp": 1030732580.5615234, + "heart_rate": 88 + }, + { + "timestamp": 1030732580.8115234, + "heart_rate": 88 + }, + { + "timestamp": 1030732580.9804688, + "heart_rate": 89 + }, + { + "timestamp": 1030732581.2304688, + "heart_rate": 89 + }, + { + "timestamp": 1030732581.4804688, + "heart_rate": 89 + }, + { + "timestamp": 1030732581.6591797, + "heart_rate": 89 + }, + { + "timestamp": 1030732581.9091797, + "heart_rate": 89 + }, + { + "timestamp": 1030732582.1591797, + "heart_rate": 89 + }, + { + "timestamp": 1030732582.3291016, + "heart_rate": 89 + }, + { + "timestamp": 1030732582.5791016, + "heart_rate": 89 + }, + { + "timestamp": 1030732582.8291016, + "heart_rate": 89 + }, + { + "timestamp": 1030732582.9873047, + "heart_rate": 89 + }, + { + "timestamp": 1030732583.2373047, + "heart_rate": 89 + }, + { + "timestamp": 1030732583.4873047, + "heart_rate": 89 + }, + { + "timestamp": 1030732583.6435547, + "heart_rate": 90 + }, + { + "timestamp": 1030732583.8935547, + "heart_rate": 90 + }, + { + "timestamp": 1030732584.1435547, + "heart_rate": 90 + }, + { + "timestamp": 1030732584.2871094, + "heart_rate": 91 + }, + { + "timestamp": 1030732584.5371094, + "heart_rate": 91 + }, + { + "timestamp": 1030732584.7871094, + "heart_rate": 91 + }, + { + "timestamp": 1030732584.9296875, + "heart_rate": 92 + }, + { + "timestamp": 1030732585.1796875, + "heart_rate": 92 + }, + { + "timestamp": 1030732585.4296875, + "heart_rate": 92 + }, + { + "timestamp": 1030732585.5878906, + "heart_rate": 93 + }, + { + "timestamp": 1030732585.8378906, + "heart_rate": 93 + }, + { + "timestamp": 1030732586.0878906, + "heart_rate": 93 + }, + { + "timestamp": 1030732586.2509766, + "heart_rate": 92 + }, + { + "timestamp": 1030732586.5009766, + "heart_rate": 92 + }, + { + "timestamp": 1030732586.7509766, + "heart_rate": 92 + }, + { + "timestamp": 1030732586.9042969, + "heart_rate": 92 + }, + { + "timestamp": 1030732587.1542969, + "heart_rate": 92 + }, + { + "timestamp": 1030732587.4042969, + "heart_rate": 92 + }, + { + "timestamp": 1030732587.5712891, + "heart_rate": 91 + }, + { + "timestamp": 1030732587.8212891, + "heart_rate": 91 + }, + { + "timestamp": 1030732588.0712891, + "heart_rate": 91 + }, + { + "timestamp": 1030732588.2285156, + "heart_rate": 91 + }, + { + "timestamp": 1030732588.4785156, + "heart_rate": 91 + }, + { + "timestamp": 1030732588.7285156, + "heart_rate": 91 + }, + { + "timestamp": 1030732588.8857422, + "heart_rate": 91 + }, + { + "timestamp": 1030732589.1357422, + "heart_rate": 91 + }, + { + "timestamp": 1030732589.3857422, + "heart_rate": 91 + }, + { + "timestamp": 1030732589.5585938, + "heart_rate": 91 + }, + { + "timestamp": 1030732589.8085938, + "heart_rate": 91 + }, + { + "timestamp": 1030732590.0585938, + "heart_rate": 91 + }, + { + "timestamp": 1030732590.1240234, + "heart_rate": 91 + }, + { + "timestamp": 1030732590.3740234, + "heart_rate": 91 + }, + { + "timestamp": 1030732590.6240234, + "heart_rate": 91 + }, + { + "timestamp": 1030732590.7617188, + "heart_rate": 91 + }, + { + "timestamp": 1030732591.0117188, + "heart_rate": 91 + }, + { + "timestamp": 1030732591.2617188, + "heart_rate": 91 + }, + { + "timestamp": 1030732591.3994141, + "heart_rate": 91 + }, + { + "timestamp": 1030732591.6494141, + "heart_rate": 91 + }, + { + "timestamp": 1030732591.8994141, + "heart_rate": 91 + }, + { + "timestamp": 1030732592.0371094, + "heart_rate": 92 + }, + { + "timestamp": 1030732592.2871094, + "heart_rate": 92 + }, + { + "timestamp": 1030732592.5371094, + "heart_rate": 92 + }, + { + "timestamp": 1030732592.6748047, + "heart_rate": 94 + }, + { + "timestamp": 1030732592.9248047, + "heart_rate": 94 + }, + { + "timestamp": 1030732593.0361328, + "heart_rate": 94 + }, + { + "timestamp": 1030732593.2861328, + "heart_rate": 94 + }, + { + "timestamp": 1030732593.5361328, + "heart_rate": 94 + }, + { + "timestamp": 1030732593.7470703, + "heart_rate": 94 + }, + { + "timestamp": 1030732593.9970703, + "heart_rate": 94 + }, + { + "timestamp": 1030732594.2470703, + "heart_rate": 94 + }, + { + "timestamp": 1030732594.453125, + "heart_rate": 94 + }, + { + "timestamp": 1030732594.703125, + "heart_rate": 94 + }, + { + "timestamp": 1030732594.953125, + "heart_rate": 94 + }, + { + "timestamp": 1030732595.1689453, + "heart_rate": 94 + }, + { + "timestamp": 1030732595.4189453, + "heart_rate": 94 + }, + { + "timestamp": 1030732595.6689453, + "heart_rate": 94 + }, + { + "timestamp": 1030732595.8798828, + "heart_rate": 94 + }, + { + "timestamp": 1030732596.1298828, + "heart_rate": 94 + }, + { + "timestamp": 1030732596.3798828, + "heart_rate": 94 + }, + { + "timestamp": 1030732596.5820312, + "heart_rate": 94 + }, + { + "timestamp": 1030732596.8320312, + "heart_rate": 94 + }, + { + "timestamp": 1030732597.0820312, + "heart_rate": 94 + }, + { + "timestamp": 1030732597.2900391, + "heart_rate": 92 + }, + { + "timestamp": 1030732597.5400391, + "heart_rate": 92 + }, + { + "timestamp": 1030732597.7900391, + "heart_rate": 92 + }, + { + "timestamp": 1030732597.9912109, + "heart_rate": 87 + }, + { + "timestamp": 1030732598.2412109, + "heart_rate": 87 + }, + { + "timestamp": 1030732598.4912109, + "heart_rate": 87 + }, + { + "timestamp": 1030732598.6904297, + "heart_rate": 87 + }, + { + "timestamp": 1030732598.9404297, + "heart_rate": 87 + }, + { + "timestamp": 1030732599.1904297, + "heart_rate": 87 + }, + { + "timestamp": 1030732599.3945312, + "heart_rate": 86 + }, + { + "timestamp": 1030732599.3945312, + "heart_rate": 86 + }, + { + "timestamp": 1030732599.3945312, + "heart_rate": 86 + }, + { + "timestamp": 1030732599.3945312, + "heart_rate": 86 + }, + { + "timestamp": 1030732599.3945312, + "heart_rate": 86 + }, + { + "timestamp": 1030732599.3945312, + "heart_rate": 86 + }, + { + "timestamp": 1030732599.3945312, + "heart_rate": 86 + } +] + +merged_record_messages = [ + { + "timestamp": 1030732282, + "heart_rate": 69 + }, + { + "timestamp": 1030732283, + "heart_rate": 69 + }, + { + "timestamp": 1030732284, + "heart_rate": 69 + }, + { + "timestamp": 1030732285, + "heart_rate": 70 + }, + { + "timestamp": 1030732286, + "heart_rate": 70 + }, + { + "timestamp": 1030732287, + "heart_rate": 69 + }, + { + "timestamp": 1030732288, + "heart_rate": 68 + }, + { + "timestamp": 1030732289, + "heart_rate": 67 + }, + { + "timestamp": 1030732290, + "heart_rate": 66 + }, + { + "timestamp": 1030732291, + "heart_rate": 65 + }, + { + "timestamp": 1030732292, + "heart_rate": 65 + }, + { + "timestamp": 1030732293, + "heart_rate": 65 + }, + { + "timestamp": 1030732294, + "heart_rate": 65 + }, + { + "timestamp": 1030732295, + "heart_rate": 65 + }, + { + "timestamp": 1030732296, + "heart_rate": 65 + }, + { + "timestamp": 1030732297, + "heart_rate": 65 + }, + { + "timestamp": 1030732298, + "heart_rate": 65 + }, + { + "timestamp": 1030732299, + "heart_rate": 65 + }, + { + "timestamp": 1030732300, + "heart_rate": 66 + }, + { + "timestamp": 1030732301, + "heart_rate": 66 + }, + { + "timestamp": 1030732302, + "heart_rate": 66 + }, + { + "timestamp": 1030732303, + "heart_rate": 65 + }, + { + "timestamp": 1030732304, + "heart_rate": 66 + }, + { + "timestamp": 1030732305, + "heart_rate": 67 + }, + { + "timestamp": 1030732306, + "heart_rate": 68 + }, + { + "timestamp": 1030732307, + "heart_rate": 69 + }, + { + "timestamp": 1030732308, + "heart_rate": 69 + }, + { + "timestamp": 1030732309, + "heart_rate": 70 + }, + { + "timestamp": 1030732310, + "heart_rate": 71 + }, + { + "timestamp": 1030732311, + "heart_rate": 73 + }, + { + "timestamp": 1030732312, + "heart_rate": 74 + }, + { + "timestamp": 1030732313, + "heart_rate": 74 + }, + { + "timestamp": 1030732314, + "heart_rate": 74 + }, + { + "timestamp": 1030732315, + "heart_rate": 75 + }, + { + "timestamp": 1030732316, + "heart_rate": 77 + }, + { + "timestamp": 1030732317, + "heart_rate": 78 + }, + { + "timestamp": 1030732318, + "heart_rate": 80 + }, + { + "timestamp": 1030732319, + "heart_rate": 80 + }, + { + "timestamp": 1030732320, + "heart_rate": 80 + }, + { + "timestamp": 1030732321, + "heart_rate": 81 + }, + { + "timestamp": 1030732322, + "heart_rate": 81 + }, + { + "timestamp": 1030732323, + "heart_rate": 82 + }, + { + "timestamp": 1030732324, + "heart_rate": 83 + }, + { + "timestamp": 1030732325, + "heart_rate": 85 + }, + { + "timestamp": 1030732326, + "heart_rate": 86 + }, + { + "timestamp": 1030732327, + "heart_rate": 85 + }, + { + "timestamp": 1030732328, + "heart_rate": 85 + }, + { + "timestamp": 1030732329, + "heart_rate": 85 + }, + { + "timestamp": 1030732330, + "heart_rate": 85 + }, + { + "timestamp": 1030732331, + "heart_rate": 86 + }, + { + "timestamp": 1030732332, + "heart_rate": 86 + }, + { + "timestamp": 1030732333, + "heart_rate": 87 + }, + { + "timestamp": 1030732334, + "heart_rate": 89 + }, + { + "timestamp": 1030732335, + "heart_rate": 89 + }, + { + "timestamp": 1030732336, + "heart_rate": 89 + }, + { + "timestamp": 1030732337, + "heart_rate": 89 + }, + { + "timestamp": 1030732338, + "heart_rate": 88 + }, + { + "timestamp": 1030732339, + "heart_rate": 88 + }, + { + "timestamp": 1030732340, + "heart_rate": 88 + }, + { + "timestamp": 1030732341, + "heart_rate": 88 + }, + { + "timestamp": 1030732342, + "heart_rate": 89 + }, + { + "timestamp": 1030732343, + "heart_rate": 89 + }, + { + "timestamp": 1030732344, + "heart_rate": 89 + }, + { + "timestamp": 1030732345, + "heart_rate": 89 + }, + { + "timestamp": 1030732346, + "heart_rate": 89 + }, + { + "timestamp": 1030732347, + "heart_rate": 89 + }, + { + "timestamp": 1030732348, + "heart_rate": 89 + }, + { + "timestamp": 1030732349, + "heart_rate": 89 + }, + { + "timestamp": 1030732350, + "heart_rate": 88 + }, + { + "timestamp": 1030732351, + "heart_rate": 88 + }, + { + "timestamp": 1030732352, + "heart_rate": 88 + }, + { + "timestamp": 1030732353, + "heart_rate": 87 + }, + { + "timestamp": 1030732354, + "heart_rate": 87 + }, + { + "timestamp": 1030732355, + "heart_rate": 87 + }, + { + "timestamp": 1030732356, + "heart_rate": 87 + }, + { + "timestamp": 1030732357, + "heart_rate": 87 + }, + { + "timestamp": 1030732358, + "heart_rate": 87 + }, + { + "timestamp": 1030732359, + "heart_rate": 87 + }, + { + "timestamp": 1030732360, + "heart_rate": 86 + }, + { + "timestamp": 1030732361, + "heart_rate": 87 + }, + { + "timestamp": 1030732362, + "heart_rate": 87 + }, + { + "timestamp": 1030732363, + "heart_rate": 87 + }, + { + "timestamp": 1030732364, + "heart_rate": 86 + }, + { + "timestamp": 1030732365, + "heart_rate": 86 + }, + { + "timestamp": 1030732366, + "heart_rate": 85 + }, + { + "timestamp": 1030732367, + "heart_rate": 86 + }, + { + "timestamp": 1030732368, + "heart_rate": 86 + }, + { + "timestamp": 1030732369, + "heart_rate": 85 + }, + { + "timestamp": 1030732370, + "heart_rate": 85 + }, + { + "timestamp": 1030732371, + "heart_rate": 85 + }, + { + "timestamp": 1030732372, + "heart_rate": 85 + }, + { + "timestamp": 1030732373, + "heart_rate": 84 + }, + { + "timestamp": 1030732374, + "heart_rate": 85 + }, + { + "timestamp": 1030732375, + "heart_rate": 85 + }, + { + "timestamp": 1030732376, + "heart_rate": 84 + }, + { + "timestamp": 1030732377, + "heart_rate": 85 + }, + { + "timestamp": 1030732378, + "heart_rate": 84 + }, + { + "timestamp": 1030732379, + "heart_rate": 84 + }, + { + "timestamp": 1030732380, + "heart_rate": 83 + }, + { + "timestamp": 1030732381, + "heart_rate": 83 + }, + { + "timestamp": 1030732382, + "heart_rate": 83 + }, + { + "timestamp": 1030732383, + "heart_rate": 83 + }, + { + "timestamp": 1030732384, + "heart_rate": 83 + }, + { + "timestamp": 1030732385, + "heart_rate": 85 + }, + { + "timestamp": 1030732386, + "heart_rate": 86 + }, + { + "timestamp": 1030732387, + "heart_rate": 86 + }, + { + "timestamp": 1030732388, + "heart_rate": 86 + }, + { + "timestamp": 1030732389, + "heart_rate": 85 + }, + { + "timestamp": 1030732390, + "heart_rate": 83 + }, + { + "timestamp": 1030732391, + "heart_rate": 81 + }, + { + "timestamp": 1030732392, + "heart_rate": 78 + }, + { + "timestamp": 1030732393, + "heart_rate": 75 + }, + { + "timestamp": 1030732394, + "heart_rate": 73 + }, + { + "timestamp": 1030732395, + "heart_rate": 70 + }, + { + "timestamp": 1030732396, + "heart_rate": 69 + }, + { + "timestamp": 1030732397, + "heart_rate": 67 + }, + { + "timestamp": 1030732398, + "heart_rate": 66 + }, + { + "timestamp": 1030732399, + "heart_rate": 66 + }, + { + "timestamp": 1030732400, + "heart_rate": 67 + }, + { + "timestamp": 1030732401, + "heart_rate": 68 + }, + { + "timestamp": 1030732402, + "heart_rate": 68 + }, + { + "timestamp": 1030732403, + "heart_rate": 68 + }, + { + "timestamp": 1030732404, + "heart_rate": 69 + }, + { + "timestamp": 1030732405, + "heart_rate": 70 + }, + { + "timestamp": 1030732406, + "heart_rate": 69 + }, + { + "timestamp": 1030732407, + "heart_rate": 67 + }, + { + "timestamp": 1030732408, + "heart_rate": 67 + }, + { + "timestamp": 1030732409, + "heart_rate": 67 + }, + { + "timestamp": 1030732410, + "heart_rate": 67 + }, + { + "timestamp": 1030732411, + "heart_rate": 67 + }, + { + "timestamp": 1030732412, + "heart_rate": 68 + }, + { + "timestamp": 1030732413, + "heart_rate": 68 + }, + { + "timestamp": 1030732414, + "heart_rate": 69 + }, + { + "timestamp": 1030732415, + "heart_rate": 69 + }, + { + "timestamp": 1030732416, + "heart_rate": 69 + }, + { + "timestamp": 1030732417, + "heart_rate": 69 + }, + { + "timestamp": 1030732418, + "heart_rate": 68 + }, + { + "timestamp": 1030732419, + "heart_rate": 68 + }, + { + "timestamp": 1030732420, + "heart_rate": 69 + }, + { + "timestamp": 1030732421, + "heart_rate": 70 + }, + { + "timestamp": 1030732422, + "heart_rate": 71 + }, + { + "timestamp": 1030732423, + "heart_rate": 70 + }, + { + "timestamp": 1030732424, + "heart_rate": 71 + }, + { + "timestamp": 1030732425, + "heart_rate": 71 + }, + { + "timestamp": 1030732426, + "heart_rate": 71 + }, + { + "timestamp": 1030732427, + "heart_rate": 72 + }, + { + "timestamp": 1030732428, + "heart_rate": 71 + }, + { + "timestamp": 1030732429, + "heart_rate": 70 + }, + { + "timestamp": 1030732430, + "heart_rate": 68 + }, + { + "timestamp": 1030732431, + "heart_rate": 67 + }, + { + "timestamp": 1030732432, + "heart_rate": 68 + }, + { + "timestamp": 1030732433, + "heart_rate": 68 + }, + { + "timestamp": 1030732434, + "heart_rate": 70 + }, + { + "timestamp": 1030732435, + "heart_rate": 70 + }, + { + "timestamp": 1030732436, + "heart_rate": 71 + }, + { + "timestamp": 1030732437, + "heart_rate": 71 + }, + { + "timestamp": 1030732438, + "heart_rate": 71 + }, + { + "timestamp": 1030732439, + "heart_rate": 72 + }, + { + "timestamp": 1030732440, + "heart_rate": 71 + }, + { + "timestamp": 1030732441, + "heart_rate": 71 + }, + { + "timestamp": 1030732442, + "heart_rate": 71 + }, + { + "timestamp": 1030732443, + "heart_rate": 71 + }, + { + "timestamp": 1030732444, + "heart_rate": 72 + }, + { + "timestamp": 1030732445, + "heart_rate": 72 + }, + { + "timestamp": 1030732446, + "heart_rate": 73 + }, + { + "timestamp": 1030732447, + "heart_rate": 74 + }, + { + "timestamp": 1030732448, + "heart_rate": 75 + }, + { + "timestamp": 1030732449, + "heart_rate": 72 + }, + { + "timestamp": 1030732450, + "heart_rate": 70 + }, + { + "timestamp": 1030732451, + "heart_rate": 68 + }, + { + "timestamp": 1030732452, + "heart_rate": 67 + }, + { + "timestamp": 1030732453, + "heart_rate": 65 + }, + { + "timestamp": 1030732454, + "heart_rate": 64 + }, + { + "timestamp": 1030732455, + "heart_rate": 64 + }, + { + "timestamp": 1030732456, + "heart_rate": 64 + }, + { + "timestamp": 1030732457, + "heart_rate": 64 + }, + { + "timestamp": 1030732458, + "heart_rate": 64 + }, + { + "timestamp": 1030732459, + "heart_rate": 64 + }, + { + "timestamp": 1030732460, + "heart_rate": 64 + }, + { + "timestamp": 1030732461, + "heart_rate": 63 + }, + { + "timestamp": 1030732462, + "heart_rate": 63 + }, + { + "timestamp": 1030732463, + "heart_rate": 64 + }, + { + "timestamp": 1030732464, + "heart_rate": 64 + }, + { + "timestamp": 1030732465, + "heart_rate": 64 + }, + { + "timestamp": 1030732466, + "heart_rate": 64 + }, + { + "timestamp": 1030732467, + "heart_rate": 63 + }, + { + "timestamp": 1030732468, + "heart_rate": 63 + }, + { + "timestamp": 1030732469, + "heart_rate": 63 + }, + { + "timestamp": 1030732470, + "heart_rate": 64 + }, + { + "timestamp": 1030732471, + "heart_rate": 64 + }, + { + "timestamp": 1030732472, + "heart_rate": 64 + }, + { + "timestamp": 1030732473, + "heart_rate": 64 + }, + { + "timestamp": 1030732474, + "heart_rate": 64 + }, + { + "timestamp": 1030732475, + "heart_rate": 65 + }, + { + "timestamp": 1030732476, + "heart_rate": 65 + }, + { + "timestamp": 1030732477, + "heart_rate": 66 + }, + { + "timestamp": 1030732478, + "heart_rate": 67 + }, + { + "timestamp": 1030732479, + "heart_rate": 67 + }, + { + "timestamp": 1030732480, + "heart_rate": 66 + }, + { + "timestamp": 1030732481, + "heart_rate": 64 + }, + { + "timestamp": 1030732482, + "heart_rate": 64 + }, + { + "timestamp": 1030732483, + "heart_rate": 64 + }, + { + "timestamp": 1030732484, + "heart_rate": 64 + }, + { + "timestamp": 1030732485, + "heart_rate": 65 + }, + { + "timestamp": 1030732486, + "heart_rate": 65 + }, + { + "timestamp": 1030732487, + "heart_rate": 65 + }, + { + "timestamp": 1030732488, + "heart_rate": 66 + }, + { + "timestamp": 1030732489, + "heart_rate": 66 + }, + { + "timestamp": 1030732490, + "heart_rate": 67 + }, + { + "timestamp": 1030732491, + "heart_rate": 66 + }, + { + "timestamp": 1030732492, + "heart_rate": 66 + }, + { + "timestamp": 1030732493, + "heart_rate": 66 + }, + { + "timestamp": 1030732494, + "heart_rate": 66 + }, + { + "timestamp": 1030732495, + "heart_rate": 67 + }, + { + "timestamp": 1030732496, + "heart_rate": 68 + }, + { + "timestamp": 1030732497, + "heart_rate": 70 + }, + { + "timestamp": 1030732498, + "heart_rate": 72 + }, + { + "timestamp": 1030732499, + "heart_rate": 72 + }, + { + "timestamp": 1030732500, + "heart_rate": 71 + }, + { + "timestamp": 1030732501, + "heart_rate": 70 + }, + { + "timestamp": 1030732502, + "heart_rate": 69 + }, + { + "timestamp": 1030732503, + "heart_rate": 69 + }, + { + "timestamp": 1030732504, + "heart_rate": 68 + }, + { + "timestamp": 1030732505, + "heart_rate": 67 + }, + { + "timestamp": 1030732506, + "heart_rate": 66 + }, + { + "timestamp": 1030732507, + "heart_rate": 66 + }, + { + "timestamp": 1030732508, + "heart_rate": 65 + }, + { + "timestamp": 1030732509, + "heart_rate": 64 + }, + { + "timestamp": 1030732510, + "heart_rate": 62 + }, + { + "timestamp": 1030732511, + "heart_rate": 61 + }, + { + "timestamp": 1030732512, + "heart_rate": 60 + }, + { + "timestamp": 1030732513, + "heart_rate": 60 + }, + { + "timestamp": 1030732514, + "heart_rate": 59 + }, + { + "timestamp": 1030732515, + "heart_rate": 59 + }, + { + "timestamp": 1030732516, + "heart_rate": 59 + }, + { + "timestamp": 1030732517, + "heart_rate": 60 + }, + { + "timestamp": 1030732518, + "heart_rate": 61 + }, + { + "timestamp": 1030732519, + "heart_rate": 62 + }, + { + "timestamp": 1030732520, + "heart_rate": 62 + }, + { + "timestamp": 1030732521, + "heart_rate": 63 + }, + { + "timestamp": 1030732522, + "heart_rate": 63 + }, + { + "timestamp": 1030732523, + "heart_rate": 62 + }, + { + "timestamp": 1030732524, + "heart_rate": 61 + }, + { + "timestamp": 1030732525, + "heart_rate": 62 + }, + { + "timestamp": 1030732526, + "heart_rate": 63 + }, + { + "timestamp": 1030732527, + "heart_rate": 65 + }, + { + "timestamp": 1030732528, + "heart_rate": 65 + }, + { + "timestamp": 1030732529, + "heart_rate": 65 + }, + { + "timestamp": 1030732530, + "heart_rate": 64 + }, + { + "timestamp": 1030732531, + "heart_rate": 64 + }, + { + "timestamp": 1030732532, + "heart_rate": 63 + }, + { + "timestamp": 1030732533, + "heart_rate": 64 + }, + { + "timestamp": 1030732534, + "heart_rate": 63 + }, + { + "timestamp": 1030732535, + "heart_rate": 63 + }, + { + "timestamp": 1030732536, + "heart_rate": 64 + }, + { + "timestamp": 1030732537, + "heart_rate": 64 + }, + { + "timestamp": 1030732538, + "heart_rate": 64 + }, + { + "timestamp": 1030732539, + "heart_rate": 64 + }, + { + "timestamp": 1030732540, + "heart_rate": 65 + }, + { + "timestamp": 1030732541, + "heart_rate": 66 + }, + { + "timestamp": 1030732542, + "heart_rate": 66 + }, + { + "timestamp": 1030732543, + "heart_rate": 66 + }, + { + "timestamp": 1030732544, + "heart_rate": 66 + }, + { + "timestamp": 1030732545, + "heart_rate": 65 + }, + { + "timestamp": 1030732546, + "heart_rate": 65 + }, + { + "timestamp": 1030732547, + "heart_rate": 65 + }, + { + "timestamp": 1030732548, + "heart_rate": 65 + }, + { + "timestamp": 1030732549, + "heart_rate": 63 + }, + { + "timestamp": 1030732550, + "heart_rate": 61 + }, + { + "timestamp": 1030732551, + "heart_rate": 60 + }, + { + "timestamp": 1030732552, + "heart_rate": 60 + }, + { + "timestamp": 1030732553, + "heart_rate": 60 + }, + { + "timestamp": 1030732554, + "heart_rate": 61 + }, + { + "timestamp": 1030732555, + "heart_rate": 63 + }, + { + "timestamp": 1030732556, + "heart_rate": 65 + }, + { + "timestamp": 1030732557, + "heart_rate": 66 + }, + { + "timestamp": 1030732558, + "heart_rate": 66 + }, + { + "timestamp": 1030732559, + "heart_rate": 67 + }, + { + "timestamp": 1030732560, + "heart_rate": 67 + }, + { + "timestamp": 1030732561, + "heart_rate": 67 + }, + { + "timestamp": 1030732562, + "heart_rate": 67 + }, + { + "timestamp": 1030732563, + "heart_rate": 67 + }, + { + "timestamp": 1030732564, + "heart_rate": 67 + }, + { + "timestamp": 1030732565, + "heart_rate": 67 + }, + { + "timestamp": 1030732566, + "heart_rate": 68 + }, + { + "timestamp": 1030732567, + "heart_rate": 71 + }, + { + "timestamp": 1030732568, + "heart_rate": 74 + }, + { + "timestamp": 1030732569, + "heart_rate": 77 + }, + { + "timestamp": 1030732570, + "heart_rate": 79 + }, + { + "timestamp": 1030732571, + "heart_rate": 80 + }, + { + "timestamp": 1030732572, + "heart_rate": 81 + }, + { + "timestamp": 1030732573, + "heart_rate": 83 + }, + { + "timestamp": 1030732574, + "heart_rate": 85 + }, + { + "timestamp": 1030732575, + "heart_rate": 86 + }, + { + "timestamp": 1030732576, + "heart_rate": 88 + }, + { + "timestamp": 1030732577, + "heart_rate": 89 + }, + { + "timestamp": 1030732578, + "heart_rate": 91 + }, + { + "timestamp": 1030732579, + "heart_rate": 89 + }, + { + "timestamp": 1030732580, + "heart_rate": 88 + }, + { + "timestamp": 1030732581, + "heart_rate": 88 + }, + { + "timestamp": 1030732582, + "heart_rate": 89 + }, + { + "timestamp": 1030732583, + "heart_rate": 89 + }, + { + "timestamp": 1030732584, + "heart_rate": 90 + }, + { + "timestamp": 1030732585, + "heart_rate": 91 + }, + { + "timestamp": 1030732586, + "heart_rate": 93 + }, + { + "timestamp": 1030732587, + "heart_rate": 92 + }, + { + "timestamp": 1030732588, + "heart_rate": 92 + }, + { + "timestamp": 1030732589, + "heart_rate": 91 + }, + { + "timestamp": 1030732590, + "heart_rate": 91 + }, + { + "timestamp": 1030732591, + "heart_rate": 91 + } +] diff --git a/tests/test_accumulator.py b/tests/test_accumulator.py index 746701f..14476ce 100644 --- a/tests/test_accumulator.py +++ b/tests/test_accumulator.py @@ -1,45 +1,45 @@ -'''test_accumulator.py: Contains the set of tests for the Accumulator class in the Python FIT SDK''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### - - -from garmin_fit_sdk.accumulator import Accumulator - -def test_accumulator(): - '''Tests functionality of the accumulator class.''' - accumulator = Accumulator() - - accumulator.createAccumulatedField(0,0,0) - - assert accumulator.accumulate(0,0,1,8) == 1 - assert accumulator.accumulate(0,0,2,8) == 2 - assert accumulator.accumulate(0,0,3,8) == 3 - assert accumulator.accumulate(0,0,4,8) == 4 - -def test_accumulators_accumulates_multiple_fields_independently(): - '''Tests that the accumulator can hold and accumluate different fields at the same time.''' - accumulator = Accumulator() - - accumulator.createAccumulatedField(0,0,0) - assert accumulator.accumulate(0,0,254,8) == 254 - - accumulator.createAccumulatedField(1,1,0) - assert accumulator.accumulate(1,1,2,8) == 2 - - assert accumulator.accumulate(0,0,0,8) == 256 - -def test_accumulator_accumulates_field_rollover(): - '''Tests that the accumulator handles rollover field values accordingly.''' - accumulator = Accumulator() - - accumulator.createAccumulatedField(0,0,250) - - assert accumulator.accumulate(0,0,254,8) == 254 - assert accumulator.accumulate(0,0,255,8) == 255 - assert accumulator.accumulate(0,0,0,8) == 256 +'''test_accumulator.py: Contains the set of tests for the Accumulator class in the Python FIT SDK''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### + + +from garmin_fit_sdk.accumulator import Accumulator + +def test_accumulator(): + '''Tests functionality of the accumulator class.''' + accumulator = Accumulator() + + accumulator.createAccumulatedField(0,0,0) + + assert accumulator.accumulate(0,0,1,8) == 1 + assert accumulator.accumulate(0,0,2,8) == 2 + assert accumulator.accumulate(0,0,3,8) == 3 + assert accumulator.accumulate(0,0,4,8) == 4 + +def test_accumulators_accumulates_multiple_fields_independently(): + '''Tests that the accumulator can hold and accumluate different fields at the same time.''' + accumulator = Accumulator() + + accumulator.createAccumulatedField(0,0,0) + assert accumulator.accumulate(0,0,254,8) == 254 + + accumulator.createAccumulatedField(1,1,0) + assert accumulator.accumulate(1,1,2,8) == 2 + + assert accumulator.accumulate(0,0,0,8) == 256 + +def test_accumulator_accumulates_field_rollover(): + '''Tests that the accumulator handles rollover field values accordingly.''' + accumulator = Accumulator() + + accumulator.createAccumulatedField(0,0,250) + + assert accumulator.accumulate(0,0,254,8) == 254 + assert accumulator.accumulate(0,0,255,8) == 255 + assert accumulator.accumulate(0,0,0,8) == 256 assert accumulator.accumulate(0,0,3,8) == 259 \ No newline at end of file diff --git a/tests/test_bitstream.py b/tests/test_bitstream.py index ff0d2ad..50ac941 100644 --- a/tests/test_bitstream.py +++ b/tests/test_bitstream.py @@ -1,165 +1,165 @@ -'''test_bitstream.py: Contains the set of tests for the Bitstream class in the Python FIT SDK''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### - - -import pytest -from garmin_fit_sdk import BitStream -from garmin_fit_sdk import fit as FIT - - -class TestFromByteArray: - def test_next_bit(self): - bit_stream = BitStream([0xAA, 0xAA], FIT.BASE_TYPE['UINT8']) - values = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1] - - index = 0 - for expected in values: - assert bit_stream.bits_available() == len(values) - index - assert bit_stream.has_bits_available() is True - - actual = bit_stream.read_bit() - assert actual == expected - - assert bit_stream.bits_available() == len(values) - index - 1 - - index += 1 - - @pytest.mark.parametrize( - "test_data", - [ - { - 'data': [0xAA], - 'base_type': FIT.BASE_TYPE['UINT8'], - 'bits_to_read': [4, 4], - 'values': [0xA, 0xA] - }, - { - 'data': [0xAA], - 'base_type': FIT.BASE_TYPE['UINT8'], - 'bits_to_read': [8], - 'values': [0xAA] - }, - { - 'data': [0xAA, 0xAA], - 'base_type': FIT.BASE_TYPE['UINT8'], - 'bits_to_read': [16], - 'values': [0xAAAA] - }, - { - 'data': [0xFF, 0xFF], - 'base_type': FIT.BASE_TYPE['UINT8'], - 'bits_to_read': [16], - 'values': [0xFFFF] - }, - { - 'data': [0xAA, 0xAA, 0xAA, 0x2A], - 'base_type': FIT.BASE_TYPE['UINT8'], - 'bits_to_read': [32], - 'values': [0x2AAAAAAA] - }, - { - 'data': [0x10, 0x32, 0x54, 0x76], - 'base_type': FIT.BASE_TYPE['UINT8'], - 'bits_to_read': [32], - 'values': [0x76543210] - }, - ], - ) - def test_from_byte_array(self, test_data): - bit_stream = BitStream(test_data['data'], test_data['base_type']) - index = 0 - for expected in test_data['values']: - actual = bit_stream.read_bits(test_data['bits_to_read'][index]) - assert actual == expected - index += 1 - -class TestFromInteger: - - def test_next_bit(self): - bit_stream = BitStream(0x0FAA, FIT.BASE_TYPE['UINT16']) - values = [0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0] - - index = 0 - for expected in values: - assert bit_stream.bits_available() == len(values) - index - assert bit_stream.has_bits_available() is True - - actual = bit_stream.read_bit() - assert actual == expected - - assert bit_stream.bits_available() == len(values) - index - 1 - - index += 1 - - @pytest.mark.parametrize( - "test_data", - [ - { - 'data': 0xAA, - 'base_type': FIT.BASE_TYPE['UINT8'], - 'bits_to_read': [4], - 'values': [0xA] - }, - { - 'data': 0xAA, - 'base_type': FIT.BASE_TYPE['UINT8'], - 'bits_to_read': [4, 4], - 'values': [0xA, 0xA] - }, - { - 'data': 0xAA, - 'base_type': FIT.BASE_TYPE['UINT8'], - 'bits_to_read': [4, 1, 1, 1, 1], - 'values': [0xA, 0x0, 0x1, 0x0, 0x1] - }, - { - 'data': 0xAA, - 'base_type': FIT.BASE_TYPE['UINT16'], - 'bits_to_read': [4, 1, 1, 1, 1], - 'values': [0xA, 0x0, 0x1, 0x0, 0x1] - }, - { - 'data': [0xAAAA, 0x2AAA], - 'base_type': FIT.BASE_TYPE['UINT16'], - 'bits_to_read': [32], - 'values': [0x2AAAAAAA] - }, - { - 'data': [0xAAAAAAAA], - 'base_type': FIT.BASE_TYPE['UINT32'], - 'bits_to_read': [16, 8, 8], - 'values': [0xAAAA, 0xAA, 0xAA] - }, - ], - ) - def test_from_integer(self, test_data): - bit_stream = BitStream(test_data['data'], test_data['base_type']) - index = 0 - for expected in test_data['values']: - actual = bit_stream.read_bits(test_data['bits_to_read'][index]) - assert actual == expected - index += 1 - -def test_exception_raised_big_overstep(): - '''Test that makes sure that an index error exception is raised when reading too many bits.''' - try: - bit_stream = BitStream(0x0FAA, FIT.BASE_TYPE['UINT16']) - bit_stream.read_bits(20) - assert False - except IndexError: - assert True -def test_exception_raised_boundary(): - '''Test that makes sure that an index error exception is raised when reading one too many bits.''' - try: - bit_stream = BitStream(0x0FAA, FIT.BASE_TYPE['UINT16']) - bit_stream.read_bits(16) - bit_stream.read_bit() - assert False - except IndexError: - assert True +'''test_bitstream.py: Contains the set of tests for the Bitstream class in the Python FIT SDK''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### + + +import pytest +from garmin_fit_sdk import BitStream +from garmin_fit_sdk import fit as FIT + + +class TestFromByteArray: + def test_next_bit(self): + bit_stream = BitStream([0xAA, 0xAA], FIT.BASE_TYPE['UINT8']) + values = [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1] + + index = 0 + for expected in values: + assert bit_stream.bits_available() == len(values) - index + assert bit_stream.has_bits_available() is True + + actual = bit_stream.read_bit() + assert actual == expected + + assert bit_stream.bits_available() == len(values) - index - 1 + + index += 1 + + @pytest.mark.parametrize( + "test_data", + [ + { + 'data': [0xAA], + 'base_type': FIT.BASE_TYPE['UINT8'], + 'bits_to_read': [4, 4], + 'values': [0xA, 0xA] + }, + { + 'data': [0xAA], + 'base_type': FIT.BASE_TYPE['UINT8'], + 'bits_to_read': [8], + 'values': [0xAA] + }, + { + 'data': [0xAA, 0xAA], + 'base_type': FIT.BASE_TYPE['UINT8'], + 'bits_to_read': [16], + 'values': [0xAAAA] + }, + { + 'data': [0xFF, 0xFF], + 'base_type': FIT.BASE_TYPE['UINT8'], + 'bits_to_read': [16], + 'values': [0xFFFF] + }, + { + 'data': [0xAA, 0xAA, 0xAA, 0x2A], + 'base_type': FIT.BASE_TYPE['UINT8'], + 'bits_to_read': [32], + 'values': [0x2AAAAAAA] + }, + { + 'data': [0x10, 0x32, 0x54, 0x76], + 'base_type': FIT.BASE_TYPE['UINT8'], + 'bits_to_read': [32], + 'values': [0x76543210] + }, + ], + ) + def test_from_byte_array(self, test_data): + bit_stream = BitStream(test_data['data'], test_data['base_type']) + index = 0 + for expected in test_data['values']: + actual = bit_stream.read_bits(test_data['bits_to_read'][index]) + assert actual == expected + index += 1 + +class TestFromInteger: + + def test_next_bit(self): + bit_stream = BitStream(0x0FAA, FIT.BASE_TYPE['UINT16']) + values = [0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0] + + index = 0 + for expected in values: + assert bit_stream.bits_available() == len(values) - index + assert bit_stream.has_bits_available() is True + + actual = bit_stream.read_bit() + assert actual == expected + + assert bit_stream.bits_available() == len(values) - index - 1 + + index += 1 + + @pytest.mark.parametrize( + "test_data", + [ + { + 'data': 0xAA, + 'base_type': FIT.BASE_TYPE['UINT8'], + 'bits_to_read': [4], + 'values': [0xA] + }, + { + 'data': 0xAA, + 'base_type': FIT.BASE_TYPE['UINT8'], + 'bits_to_read': [4, 4], + 'values': [0xA, 0xA] + }, + { + 'data': 0xAA, + 'base_type': FIT.BASE_TYPE['UINT8'], + 'bits_to_read': [4, 1, 1, 1, 1], + 'values': [0xA, 0x0, 0x1, 0x0, 0x1] + }, + { + 'data': 0xAA, + 'base_type': FIT.BASE_TYPE['UINT16'], + 'bits_to_read': [4, 1, 1, 1, 1], + 'values': [0xA, 0x0, 0x1, 0x0, 0x1] + }, + { + 'data': [0xAAAA, 0x2AAA], + 'base_type': FIT.BASE_TYPE['UINT16'], + 'bits_to_read': [32], + 'values': [0x2AAAAAAA] + }, + { + 'data': [0xAAAAAAAA], + 'base_type': FIT.BASE_TYPE['UINT32'], + 'bits_to_read': [16, 8, 8], + 'values': [0xAAAA, 0xAA, 0xAA] + }, + ], + ) + def test_from_integer(self, test_data): + bit_stream = BitStream(test_data['data'], test_data['base_type']) + index = 0 + for expected in test_data['values']: + actual = bit_stream.read_bits(test_data['bits_to_read'][index]) + assert actual == expected + index += 1 + +def test_exception_raised_big_overstep(): + '''Test that makes sure that an index error exception is raised when reading too many bits.''' + try: + bit_stream = BitStream(0x0FAA, FIT.BASE_TYPE['UINT16']) + bit_stream.read_bits(20) + assert False + except IndexError: + assert True +def test_exception_raised_boundary(): + '''Test that makes sure that an index error exception is raised when reading one too many bits.''' + try: + bit_stream = BitStream(0x0FAA, FIT.BASE_TYPE['UINT16']) + bit_stream.read_bits(16) + bit_stream.read_bit() + assert False + except IndexError: + assert True diff --git a/tests/test_crc_calculator.py b/tests/test_crc_calculator.py index d03f1d2..4368ed4 100644 --- a/tests/test_crc_calculator.py +++ b/tests/test_crc_calculator.py @@ -1,45 +1,45 @@ -'''test_crc_calculator.py: Contains the set of tests for the Stream class in the Python FIT SDK''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### - - -import pytest -from garmin_fit_sdk import CrcCalculator - -from tests.data import Data - - -@pytest.mark.parametrize( - "data,crc_expected,is_correct_crc", - [ - (Data.fit_file_invalid, 0x0000, False), - (Data.fit_file_minimum, 0x488D, True), - (Data.fit_file_short, 0xE3B9, True), - ], -) -def test_file_header_crc(data, crc_expected, is_correct_crc): - '''Tests which validate crc calcualtion on fit file headers''' - if is_correct_crc: - assert (CrcCalculator.calculate_crc(data, 0, 12) == - crc_expected) == is_correct_crc - - -@pytest.mark.parametrize( - "data,file_length,crc_expected,is_correct_crc", - [ - (Data.fit_file_invalid, len(Data.fit_file_invalid) - 2, 0x0000, False), - (Data.fit_file_minimum, len(Data.fit_file_minimum) - 2, 0x0000, True), - (Data.fit_file_short, len(Data.fit_file_short) - 2, 0x4F87, True), - ], -) -def test_file_crc(data, crc_expected, is_correct_crc, file_length): - '''Tests which validate crc calcualtion on fit file data.''' - if is_correct_crc: - assert ( - CrcCalculator.calculate_crc(data, 0, file_length) == crc_expected - ) == is_correct_crc +'''test_crc_calculator.py: Contains the set of tests for the Stream class in the Python FIT SDK''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### + + +import pytest +from garmin_fit_sdk import CrcCalculator + +from tests.data import Data + + +@pytest.mark.parametrize( + "data,crc_expected,is_correct_crc", + [ + (Data.fit_file_invalid, 0x0000, False), + (Data.fit_file_minimum, 0x488D, True), + (Data.fit_file_short, 0xE3B9, True), + ], +) +def test_file_header_crc(data, crc_expected, is_correct_crc): + '''Tests which validate crc calcualtion on fit file headers''' + if is_correct_crc: + assert (CrcCalculator.calculate_crc(data, 0, 12) == + crc_expected) == is_correct_crc + + +@pytest.mark.parametrize( + "data,file_length,crc_expected,is_correct_crc", + [ + (Data.fit_file_invalid, len(Data.fit_file_invalid) - 2, 0x0000, False), + (Data.fit_file_minimum, len(Data.fit_file_minimum) - 2, 0x0000, True), + (Data.fit_file_short, len(Data.fit_file_short) - 2, 0x4F87, True), + ], +) +def test_file_crc(data, crc_expected, is_correct_crc, file_length): + '''Tests which validate crc calcualtion on fit file data.''' + if is_correct_crc: + assert ( + CrcCalculator.calculate_crc(data, 0, file_length) == crc_expected + ) == is_correct_crc diff --git a/tests/test_decoder.py b/tests/test_decoder.py index 38c918c..8fee2a6 100644 --- a/tests/test_decoder.py +++ b/tests/test_decoder.py @@ -1,723 +1,723 @@ -'''test_decoder.py: Contains the set of tests for the decoder class in the Python FIT SDK''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### - - -from datetime import datetime, timezone - -import pytest -from garmin_fit_sdk import Decoder, Stream, CrcCalculator -from garmin_fit_sdk.decoder import DecodeMode - -from tests.data import Data - - -class TestCheckIntegrity: - '''Set of tests verify that the decoder class correctly tests the integrity of one or more fit files.''' - @pytest.mark.parametrize( - "data,expected_value", - [ - (bytearray(), False), - (Data.fit_file_invalid, False), - (Data.fit_file_minimum, True), - (Data.fit_file_short, True), - - (Data.fit_file_incorrect_data_size, False) - ], ids=["Empty File", "Invalid Fit File", "Minimum Size Fit File", - "Fit File with Messages", "Incorrect Data Size"] - ) - def test_check_integrity(self, data, expected_value): - '''Tests the validity of the decoder when it checks a fit file's integrity.''' - stream = Stream.from_byte_array(data) - decoder = Decoder(stream) - assert decoder.check_integrity() == expected_value - - def test_check_integrity_is_fit_fail(self, mocker): - '''Tests that an invalid fit file will fail when checking integrity.''' - stream = Stream.from_byte_array(Data.fit_file_short) - mocker.patch('garmin_fit_sdk.Decoder.is_fit', return_value=False) - decoder = Decoder(stream) - - assert decoder.check_integrity() is False - - @pytest.mark.parametrize( - "data,expected_value", - [ - (Data.fit_file_invalid, False), - (Data.fit_file_minimum, True), - (Data.fit_file_short, True), - (bytearray(), False), - (bytearray([0xE]), False), - (bytearray([0x0A, 0x10, 0xD9, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x2E, 0x46, 0x49, 0x54, 0x91, 0x33, 0x00, 0x00]), False), - (bytearray([0x0E, 0x10, 0xD9, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x2C, 0x46, 0x49, 0x54, 0x91, 0x33, 0x00, 0x00]), False), - ], ids=["Invalid Fit File", "Minimum Size Fit File", "Fit File with Messages", - "Empty File", "Input Length < 14", "Header Size != 14 || 12", "Data Type != .FIT"] - ) - def test_is_fit(self, data, expected_value): - '''Tests the validity of the decoder function used to determine if a file is a valid fit file.''' - stream = Stream.from_byte_array(data) - decoder = Decoder(stream) - assert decoder.is_fit() == expected_value - -class TestDecoderConstructor: - '''Set of tests that test the functionality of the Decoder constructor''' - def test_fails_if_stream_is_none(self): - '''Tests that the decoder will properly throw an error if a stream that is None is provided.''' - try: - decoder = Decoder(None) - assert False - except RuntimeError: - assert True - -class TestSkipHeaderDecodeMode: - '''Set of tests that test the fuctionality of the skip header decode mode''' - def test_invalid_header_with_skip_header(self): - '''Tests that file with invalid header should not fail when decode mode is skip header''' - stream = Stream.from_byte_array(Data.fit_file_short_invalid_header) - decoder = Decoder(stream) - messages, errors = decoder.read(decode_mode = DecodeMode.SKIP_HEADER) - - assert len(errors) == 0 - assert len(messages['file_id_mesgs']) == 1 - - def test_invalid_header_without_skip_header(self): - '''Tests that file with invalid header should fail when decode mode is normal''' - stream = Stream.from_byte_array(Data.fit_file_short_invalid_header) - decoder = Decoder(stream) - messages, errors = decoder.read() - - assert len(errors) == 1 - - def test_valid_header_with_skip_header(self): - '''Tests that file with valid header should not fail when decode mode is skip header''' - stream = Stream.from_byte_array(Data.fit_file_short) - decoder = Decoder(stream) - messages, errors = decoder.read(decode_mode = DecodeMode.SKIP_HEADER) - - assert len(errors) == 0 - assert len(messages['file_id_mesgs']) == 1 - - def test_invalid_crc_with_skip_header(self): - '''Tests that file with invalid CRC should not fail when decode mode is skip header''' - stream = Stream.from_byte_array(Data.fit_file_short_new_invalid_crc) - decoder = Decoder(stream) - messages, errors = decoder.read(decode_mode = DecodeMode.SKIP_HEADER) - - assert len(errors) == 0 - assert len(messages['file_id_mesgs']) == 1 - -class TestDataOnlyDecodeMode: - '''Set of tests that test the fuctionality of the data only decode mode''' - def test_no_header_with_data_only(self): - '''Tests that file with no header should not fail when decode mode is data only''' - stream = Stream.from_byte_array(Data.fit_file_short_data_only) - decoder = Decoder(stream) - messages, errors = decoder.read(decode_mode = DecodeMode.DATA_ONLY) - - assert len(errors) == 0 - assert len(messages['file_id_mesgs']) == 1 - - def test_no_header_without_data_only(self): - '''Tests that file with no header fails when decode mode is data only''' - stream = Stream.from_byte_array(Data.fit_file_short_data_only) - decoder = Decoder(stream) - messages, errors = decoder.read() - - assert len(errors) == 1 - - def test_invalid_crc_with_data_only(self): - '''Tests that file with invalid CRC should not fail when decode mode is data only''' - stream = Stream.from_byte_array(Data.fit_file_short_new_invalid_crc[14:]) - decoder = Decoder(stream) - messages, errors = decoder.read(decode_mode = DecodeMode.DATA_ONLY) - - assert len(errors) == 0 - assert len(messages['file_id_mesgs']) == 1 - -class TestReadFileHeader: - '''Set of tests that test the functionality of reading file headers and the File Header class''' - def test_read_file_header(self): - '''Tests reading the file header with the decoder and decoding the profile and protocol versions.''' - stream = Stream.from_byte_array(Data.fit_file_minimum) - decoder = Decoder(stream) - - file_header = decoder.read_file_header(stream) - - assert file_header.header_size == 14 - assert file_header.protocol_version == 32 - assert file_header.profile_version == 2187 - assert file_header.data_size == 0 - assert file_header.data_type == [b'.FIT'] - assert file_header.header_crc == 18573 - assert file_header.file_total_size == 14 - - def test_read_file_header_dict(self): - '''Tests reading the file header and converting the class to a dictionary.''' - stream = Stream.from_byte_array(Data.fit_file_minimum) - decoder = Decoder(stream) - - file_header = decoder.read_file_header(stream) - file_header_dict = file_header.get_dict() - - protocol_version = (file_header.protocol_version >> 4) + ((file_header.protocol_version & 0x0F) / 10) - profile_version = file_header.profile_version / 1000 if file_header.profile_version > 2199 else 100 - - assert file_header.header_size == file_header_dict['header_size'] - assert protocol_version == file_header_dict['protocol_version'] - assert profile_version == file_header_dict['profile_version'] - assert file_header.data_size == file_header_dict['data_size'] - assert file_header.data_type == file_header_dict['data_type'] - assert file_header.header_crc == file_header_dict['header_crc'] - assert file_header.file_total_size == file_header_dict['file_total_size'] - -class TestDecoderRead(): - '''Set of tests that verify the validity and accuracy of the decoder when reading files.''' - @pytest.mark.parametrize( - "data,num_messages", - [ - (Data.fit_file_minimum, 0), - (Data.fit_file_short, 2), - (Data.fit_file_short_new, 1), - (Data.fit_file_chained, 4) - ], ids=["Fit File Minimum", "Fit File Short with Invalids", "Fit File Short", "Chained Fit File"] - ) - def test_successful_read(self, data, num_messages): - '''Tests that the decoder successfully reads fit files and returns the correct number of messages.''' - stream = Stream.from_byte_array(data) - decoder = Decoder(stream) - messages, errors = decoder.read() - assert len(errors) == 0 - assert decoder.get_num_messages() == num_messages - - def test_stream_not_reset(self): - '''Tests that the decoder does not reset the stream before decoding.''' - stream = Stream.from_byte_array(Data.fit_file_short) - decoder = Decoder(stream) - decoder.read() - - assert stream.position() == stream.get_length() - messages, errors = decoder.read() - assert len(errors) == 0 and len(messages) == 0 - - def test_compressed_timestamp_message_should_throw(self): - '''Tests that the decoder should throw an error when reading a message with a compressed timestamp''' - stream = Stream.from_byte_array(Data.fit_file_short_compressed_timestamp) - decoder = Decoder(stream) - messages, errors = decoder.read() - - assert len(errors) == 1 - assert "Compressed timestamp messages are not currently supported" in str(errors[0]) - - def test_read_incorrect_field_def_size(self): - '''Tests that the decoder doesn't break when reading a message with an incorrect field definition size.''' - stream = Stream.from_byte_array(Data.fit_file_short_with_wrong_field_def_size) - decoder = Decoder(stream) - messages, errors = decoder.read(convert_datetimes_to_dates=False) - - assert len(errors) == 0 - assert "time_created" in messages["file_id_mesgs"][0] - - def test_invalid_crc_should_fail(self): - '''Test decoder should fail when CRC is invalid''' - stream = Stream.from_byte_array(Data.fit_file_short_invalid_CRC) - decoder = Decoder(stream) - messages, errors = decoder.read() - - assert len(errors) == 1 - assert len(messages['file_id_mesgs']) == 1 - - - @pytest.mark.parametrize( - "data,expected_output", - [ - (Data.fit_file_short_new, {'file_id_mesgs' : [{'manufacturer': 'garmin', 'type': 'activity', 'time_created': 1000000000, 'product_name': 'abcdefghi'}]}), - (Data.fit_file_short_none_array, {'file_id_mesgs' : [{'manufacturer': 'garmin', 'type': 'activity', 'time_created': 1000000000}]}) - ], ids=["Fit File Short", "Fit File Short w/ Invalid String"] - ) - def test_read_decoder_output(self, data, expected_output): - '''Tests the validity of the decoder's output after reading a fit file.''' - stream = Stream.from_byte_array(data) - decoder = Decoder(stream) - messages, errors = decoder.read(convert_datetimes_to_dates=False) - assert expected_output == messages - assert len(errors) == 0 - - - @pytest.mark.parametrize( - "option_status,expected_value", - [ - (True, -127), - (False, 1865), - (None, -127) - ], ids=["Set to True", "Set to False", "Default Should Apply Scale and Offset"] - ) - def test_apply_scale_and_offset(self, option_status, expected_value): - '''Tests the validity of applying scales and offsets to the decoded fields.''' - stream = Stream.from_file('tests/fits/ActivityDevFields.fit') - decoder = Decoder(stream) - if option_status is not None: - messages, errors = decoder.read(apply_scale_and_offset=option_status, merge_heart_rates=False) - else: - messages, errors = decoder.read() - assert len(errors) == 0 - assert messages['record_mesgs'][0]['altitude'] == expected_value - - def test_scale_and_offset_apply_to_arrays(self): - stream = Stream.from_file('tests/fits/WithGearChangeData.fit') - decoder = Decoder(stream) - messages, errors = decoder.read() - assert len(errors) == 0 - - left_power_phase = messages['record_mesgs'][28]['left_power_phase'] - left_power_phase_peak = messages['record_mesgs'][28]['left_power_phase_peak'] - - right_power_phase = messages['record_mesgs'][28]['right_power_phase'] - right_power_phase_peak = messages['record_mesgs'][28]['right_power_phase_peak'] - - assert left_power_phase == [337.5000052734376, 199.68750312011724] - assert left_power_phase_peak == [75.93750118652346, 104.0625016259766] - assert right_power_phase == [7.031250109863283, 205.31250320800785] - assert right_power_phase_peak == [70.31250109863284, 106.8750016699219] - - def test_scale_and_offset_correct_type_conversion(self): - '''Tests applying scale and offset producing the correct data type.''' - stream = Stream.from_file('tests/fits/WithGearChangeData.fit') - decoder = Decoder(stream) - messages, errors = decoder.read() - assert len(errors) == 0 - - assert messages['record_mesgs'][0]['power'] == 0 - assert isinstance(messages['record_mesgs'][0]['power'], int) is True - - assert messages['file_id_mesgs'][0]['product'] == 3843 - assert isinstance(messages['file_id_mesgs'][0]['product'], int) is True - - assert isinstance(messages['event_mesgs'][4]['rear_gear_num'], int) is True - - @pytest.mark.parametrize( - "option_status,expected_value", - [ - (True, datetime.fromtimestamp(1000000000 + 631065600, timezone.utc)), - (False, 1000000000), - (None, datetime.fromtimestamp(1000000000 + 631065600, timezone.utc)) - ], ids=["Set to True", "Set to False", "Default Should Convert Timestamps"] - ) - def test_convert_datetimes_to_python_datetimes(self, option_status, expected_value): - '''Tests the validity of converting timestamps to python datetimes when decoding files.''' - stream = Stream.from_byte_array(Data.fit_file_short_new) - decoder = Decoder(stream) - if option_status is not None: - messages, errors = decoder.read(convert_datetimes_to_dates=option_status) - else: - messages, errors = decoder.read() - - assert len(errors) == 0 - - if option_status is False: - assert messages['file_id_mesgs'][0]['time_created'] == expected_value - else: - assert str(messages['file_id_mesgs'][0]['time_created']) == str(expected_value.replace(tzinfo=timezone.utc)) - - @pytest.mark.parametrize( - "option_status,expected_type_value", - [ - (True, 'activity'), - (False, 4), - (None, 'activity') - ], ids=["Set to True", "Set to False", "Default Should Convert"] - ) - def test_convert_types_to_strings(self, option_status, expected_type_value): - '''Tests the validity of converting types to strings when decoding files.''' - stream = Stream.from_byte_array(Data.fit_file_short_new) - decoder = Decoder(stream) - if option_status is not None: - messages, errors = decoder.read(convert_types_to_strings=option_status) - else: - messages, errors = decoder.read() - assert len(errors) == 0 - assert messages['file_id_mesgs'][0]['type'] == expected_type_value - - - @pytest.mark.parametrize( - "field_key,expected_value", - [ - (0, pytest.approx(3.0, 0.1)), - (2, [-10, 12]), - (3, ['Hello!', 'Good Job!']) - ], ids=["Single Value", "Array of Values", "String Value(s)"] - ) - def test_read_developer_data(self, field_key, expected_value): - '''Tests the validity of reading developer data from a fit file''' - stream = Stream.from_file('tests/fits/ActivityDevFields.fit') - decoder = Decoder(stream) - messages, errors = decoder.read() - - assert len(errors) == 0 - assert len(messages['record_mesgs']) == 3601 and len(messages['session_mesgs']) == 1 - - assert messages['session_mesgs'][0]['developer_fields'][field_key] == expected_value - - def test_read_dev_data_no_field_description(self): - '''Tests reading past dev data with no field description message or dev data ID.''' - - stream = Stream.from_byte_array(Data.fit_file_dev_data_missing_field_description) - decoder = Decoder(stream) - messages, errors = decoder.read() - - assert len(errors) == 0 and len(messages['activity_mesgs']) == 1 - - def test_read_multibyte_dev_data(self): - '''Tests reading developer data with a multi-byte base type.''' - stream = Stream.from_byte_array(Data.fit_file_short_multibyte_dev_data) - decoder = Decoder(stream) - messages, errors = decoder.read() - - assert len(errors) == 0 and len(messages['session_mesgs']) == 1 - assert messages['session_mesgs'][0]['developer_fields'][0] == 1234 - - @pytest.mark.parametrize( - "option_status", - [ - (True), - (False), - (None) - ], ids=["Set to True", "Set to False", "Default should have CRC calculations enabled"] - ) - def test_enable_crc_options(self, mocker, option_status): - '''Tests enabling and disabling CRC calculation when decoding a FIT file.''' - spy_add_bytes = mocker.spy(CrcCalculator, "add_bytes") - spy_get_crc = mocker.spy(CrcCalculator, "get_crc") - - stream = Stream.from_byte_array(Data.fit_file_short) - decoder = Decoder(stream) - - if option_status is not None: - messages, errors = decoder.read(enable_crc_check=option_status) - else: - messages, errors = decoder.read() - - assert len(errors) == 0 - - assert spy_add_bytes.call_count == 0 if option_status is False else spy_add_bytes.call_count > 0 - assert spy_get_crc.call_count == 0 if option_status is False else spy_get_crc.call_count > 0 - - @pytest.mark.parametrize( - "option_status, data, expected_error_status", - [ - (True, Data.fit_file_short_new, False), - (True, Data.fit_file_short_new_invalid_crc, True), - (False, Data.fit_file_short_new, False), - (False, Data.fit_file_short_new_invalid_crc, False), - ], ids=["With CRC | Valid File", "With CRC | Invalid File", "Without CRC | Valid File", "Without CRC | Invalid File"] - ) - def test_enable_crc_options_errors_returned(self, option_status, data, expected_error_status): - '''Tests if errors are returned when decoding a file when CRC calculations are enabled or disabled.''' - stream = Stream.from_byte_array(data) - decoder = Decoder(stream) - messages, errors = decoder.read(enable_crc_check=option_status) - - assert len(errors) == 0 if expected_error_status is False else len(errors) > 0 - - @pytest.mark.parametrize( - "option_status", - [ - (True), - (False), - (None) - ], ids=["Set to True", "Set to False", "Default should expand sub fields"] - ) - def test_expand_sub_fields_options(self, option_status): - '''Tests the validity of expanding sub fields of messages decoded from a fit file''' - stream = Stream.from_file('tests/fits/WithGearChangeData.fit') - decoder = Decoder(stream) - if option_status is not None: - messages, errors = decoder.read(expand_sub_fields=option_status, convert_types_to_strings=False) - else: - messages, errors = decoder.read(convert_types_to_strings=False) - - assert len(errors) == 0 - assert decoder.get_num_messages() == 2055 - - for message in (message for message in messages['event_mesgs'] if message['event'] == 'rider_position_change'): - if option_status is True or option_status is None: - assert message['rider_position'] == message['data'] - - @pytest.mark.parametrize( - "option_status, is_integer", - [ - (True, False), - (False, True), - ], ids=["Convert Types is True, No Ints", "Convert Types is True, All Ints"] - ) - def test_expand_sub_fields_convert_types_to_strings(self, option_status, is_integer): - stream = Stream.from_file('tests/fits/WithGearChangeData.fit') - decoder = Decoder(stream) - messages, errors = decoder.read(convert_types_to_strings=option_status) - - assert len(errors) == 0 - - rider_position_event_mesgs = [mesg for mesg in messages['event_mesgs'] if 'rider_position' in mesg] - - for mesg in rider_position_event_mesgs: - assert isinstance(mesg['rider_position'], int) is is_integer - - @pytest.mark.parametrize( - "option_status, data, distances", - [ - (True, Data.fit_file_800m_repeats_little_endian, [4000, 800, 200, 1000]), - (False, Data.fit_file_800m_repeats_little_endian, [400000, 80000, 20000, 100000]), - (True, Data.fit_file_800m_repeats_big_endian, [4000, 800, 200, 1000]), - (False, Data.fit_file_800m_repeats_big_endian, [400000, 80000, 20000, 100000]), - ], ids=["Apply Scale and Offset is True, Little Endian", "Apply Scale and Offset is False, Little Endian", - "Apply Scale and Offset is True, Big Endian", "Apply Scale and Offset is False, Big Endian"] - ) - def test_expand_sub_fields_scale_and_offset(self, option_status, data, distances): - stream = Stream.from_byte_array(data) - decoder = Decoder(stream) - messages, errors = decoder.read(apply_scale_and_offset=option_status, merge_heart_rates=False) - - assert len(errors) == 0 - - duration_distance_workout_step_mesgs = [mesg for mesg in messages['workout_step_mesgs'] if 'duration_distance' in mesg] - - for mesg, distance in zip(duration_distance_workout_step_mesgs, distances): - assert mesg['duration_distance'] == distance - - def test_messages_with_no_fields(self): - '''Tests reading messages with no fields assigned in their message definition''' - stream = Stream.from_byte_array(Data.fit_file_messages_with_no_fields) - decoder = Decoder(stream) - messages, errors = decoder.read() - assert len(errors) == 0 - - serial_number = 3452116910 - - assert len(messages['pad_mesgs']) == 1 - assert len(messages['file_id_mesgs']) == 2 - - assert messages['pad_mesgs'][0] == {} - - assert messages['file_id_mesgs'][0]["serial_number"] == serial_number - assert messages['file_id_mesgs'][1]["serial_number"] == serial_number - -class TestComponentExpansion: - def test_sub_field_and_component_expansion(self): - stream = Stream.from_file('tests/fits/WithGearChangeData.fit') - decoder = Decoder(stream) - messages, errors = decoder.read() - - assert len(errors) == 0 - - rider_position_event_mesgs = [mesg for mesg in messages['event_mesgs'] if 'gear_change_data' in mesg] - - index = 0 - for mesg in rider_position_event_mesgs: - expected = Data.gear_change_data[index] - assert mesg['front_gear_num'] == expected['front_gear_num'] - assert mesg['front_gear'] == expected['front_gear'] - assert mesg['rear_gear_num'] == expected['rear_gear_num'] - assert mesg['rear_gear'] == expected['rear_gear'] - assert mesg['data'] == expected['data'] - assert mesg['gear_change_data'] == expected['gear_change_data'] - - index += 1 - - @pytest.mark.parametrize( - "option_status", - [ - (True), - (False), - (None) - ], ids=["Set to True", "Set to False", "Default should expand components"] - ) - def test_component_expansion_options(self, option_status): - '''Tests the validity of expanding components of messages decoded from a fit file''' - stream = Stream.from_file('tests/fits/WithGearChangeData.fit') - decoder = Decoder(stream) - if option_status is not None: - messages, errors = decoder.read(expand_components=option_status, merge_heart_rates=False) - else: - messages, errors = decoder.read() - - assert len(errors) == 0 - - for message in messages['record_mesgs']: - if option_status is True or option_status is None: - assert message['speed'] == message['enhanced_speed'] - assert message['altitude'] == message['enhanced_altitude'] - else: - assert 'enhanced_speed' not in message - assert 'enhanced_altitude' not in message - - def test_hr_message_component_expansion(self): - '''Tests component expansion given heart rate messages.''' - stream = Stream.from_file('tests/fits/HrmPluginTestActivity.fit') - decoder = Decoder(stream) - messages, errors = decoder.read() - assert len(errors) == 0 - - assert messages['hr_mesgs'][0]['event_timestamp'] == 1242209 - - hr_mesgs = messages['hr_mesgs'] - - index = 0 - for message in hr_mesgs: - if isinstance(message['event_timestamp'], float): - assert message['event_timestamp'] == pytest.approx(Data.hrm_plugin_test_activity_expected[index]) - index += 1 - continue - for timestamp in message['event_timestamp']: - assert timestamp == pytest.approx(Data.hrm_plugin_test_activity_expected[index]) - index += 1 - - def test_enum_component_expansion(self): - '''Tests component expansion in a monitoring file which includes expanded components which are enums.''' - stream = Stream.from_byte_array(Data.fit_file_monitoring) - decoder = Decoder(stream) - messages, errors = decoder.read() - assert len(errors) == 0 - assert len(messages['monitoring_mesgs']) == 4 - assert messages['monitoring_mesgs'][0]['activity_type'] == "running" and messages['monitoring_mesgs'][0]['intensity'] == 3 - assert messages['monitoring_mesgs'][0]['cycles'] == 10 - - assert messages['monitoring_mesgs'][1]['activity_type'] == "walking" and messages['monitoring_mesgs'][1]['intensity'] == 0 - assert messages['monitoring_mesgs'][1]['cycles'] == 30 - - assert messages['monitoring_mesgs'][2]['activity_type'] == 30 and messages['monitoring_mesgs'][2]['intensity'] == 0 - assert messages['monitoring_mesgs'][2]['cycles'] == 15 - - assert 'activity_type' not in messages['monitoring_mesgs'][3] and 'intensity' not in messages['monitoring_mesgs'][3] - assert messages['monitoring_mesgs'][3]['cycles'] == 15 - -class TestMergeHeartrates: - '''Set of tests which verify the functionality of merging heartrates to records when decoding.''' - @pytest.mark.parametrize( - "option_status, expected", - [ - (True, False), - (False, True), - (None, False) - ], ids=["Set to True", "Set to False", "Default should merge heart rates"] - ) - def test_merge_heart_rates_options(self, option_status, expected): - '''Tests that all the options settings for merge_heart_rates work as expected when decoding.''' - stream = Stream.from_file('tests/fits/HrmPluginTestActivity.fit') - decoder = Decoder(stream) - - if option_status is not None: - messages, errors = decoder.read(merge_heart_rates=option_status) - else: - messages, errors = decoder.read() - - assert len(errors) == 0 - - missing_hr = False - for message in messages['record_mesgs']: - if 'heart_rate' not in message: - missing_hr = True - assert missing_hr == expected - - def test_merge_heart_rate_fails_without_scale_and_offset(self): - '''Tests to ensure that decoding fails when merge_heart_rates == True but apply_scale_and_offset == False''' - stream = Stream.from_file('tests/fits/HrmPluginTestActivity.fit') - decoder = Decoder(stream) - messages, errors = decoder.read(apply_scale_and_offset=False) - assert len(errors) == 1 - - def test_merge_heart_rate_fails_without_expand_components(self): - '''Tests to ensure that decoding fails when merge_heart_rates == True but expand_components == False''' - stream = Stream.from_file('tests/fits/HrmPluginTestActivity.fit') - decoder = Decoder(stream) - messages, errors = decoder.read(expand_components=False) - assert len(errors) == 1 - -class TestAccumulatedFields: - def test_expanded_components_expand_with_fields_that_accumulate(self): - '''Tests that expanding components which are set to accumulate, accumulate properly.''' - stream = Stream.from_byte_array(Data.fit_file_accumulated_components) - decoder = Decoder(stream) - messages, errors = decoder.read() - assert len(errors) == 0 - - assert messages['record_mesgs'][0]['cycles'] == 254 - assert messages['record_mesgs'][0]['total_cycles'] == 254 - - assert messages['record_mesgs'][1]['cycles'] == 0 - assert messages['record_mesgs'][1]['total_cycles'] == 256 - - assert messages['record_mesgs'][2]['cycles'] == 1 - assert messages['record_mesgs'][2]['total_cycles'] == 257 - - def test_expanded_components_which_accumulate_and_have_initial_value_scale_and_accumulate(self): - '''Tests that when an accumulated, expanded component field that is given an initial value is scaled accordingly in accumulation.''' - stream = Stream.from_byte_array(Data.fit_file_compressed_speed_distance_with_initial_distance) - decoder = Decoder(stream) - messages, errors = decoder.read() - assert len(errors) == 0 - - # The first distance field is not expanded from a compressedSpeedDistance field - assert messages['record_mesgs'][0]['distance'] == 2 - assert messages['record_mesgs'][1]['distance'] == 264 - assert messages['record_mesgs'][2]['distance'] == 276 - -class TestDecoderExceptions: - '''Set of tests which verifies behavior of the decoder when various exceptions are raised''' - @pytest.mark.parametrize( - "exception", - [ - KeyboardInterrupt, - SystemExit, - ], ids=["KeyboardInterrupt", "SystemExit"] - ) - def test_keyboard_interrupt_and_system_exit_exceptions_are_rethrown(self, mocker, exception): - '''Tests to ensure that the decoder rethrows KeyboardInterrupt and SystemExit exceptions''' - stream = Stream.from_byte_array(Data.fit_file_short) - decoder = Decoder(stream) - - mocked_is_fit = mocker.patch('garmin_fit_sdk.Decoder.is_fit') - mocked_is_fit.side_effect = exception - - with pytest.raises(exception): - decoder.read() - - @pytest.mark.parametrize( - "exception", - [ - Exception, - RuntimeError, - BufferError, - LookupError, - IndexError - ], ids=["Generic Exception", "RuntimeError", "BufferError", "LookupError", "IndexError"] - ) - def test_other_exceptions_are_not_rethrown(self, mocker, exception): - '''Tests to ensure that the decoder does not rethrow other exceptions''' - stream = Stream.from_byte_array(Data.fit_file_short) - decoder = Decoder(stream) - - mocked_is_fit = mocker.patch('garmin_fit_sdk.Decoder.is_fit') - mocked_is_fit.side_effect = exception - - messages, errors = decoder.read() - - assert len(errors) == 1 - -def test_mesg_listener(): - '''Tests that a message listener passed to the decoder is correctly called.''' - stream = Stream.from_byte_array(Data.fit_file_short) - decoder = Decoder(stream) - - def mesg_listener(mesg_num, message): - raise Exception("The message listener was called!") - - messages, errors = decoder.read(mesg_listener=mesg_listener) - - assert len(errors) == 1 - assert str(errors[0]) == "The message listener was called!" +'''test_decoder.py: Contains the set of tests for the decoder class in the Python FIT SDK''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### + + +from datetime import datetime, timezone + +import pytest +from garmin_fit_sdk import Decoder, Stream, CrcCalculator +from garmin_fit_sdk.decoder import DecodeMode + +from tests.data import Data + + +class TestCheckIntegrity: + '''Set of tests verify that the decoder class correctly tests the integrity of one or more fit files.''' + @pytest.mark.parametrize( + "data,expected_value", + [ + (bytearray(), False), + (Data.fit_file_invalid, False), + (Data.fit_file_minimum, True), + (Data.fit_file_short, True), + + (Data.fit_file_incorrect_data_size, False) + ], ids=["Empty File", "Invalid Fit File", "Minimum Size Fit File", + "Fit File with Messages", "Incorrect Data Size"] + ) + def test_check_integrity(self, data, expected_value): + '''Tests the validity of the decoder when it checks a fit file's integrity.''' + stream = Stream.from_byte_array(data) + decoder = Decoder(stream) + assert decoder.check_integrity() == expected_value + + def test_check_integrity_is_fit_fail(self, mocker): + '''Tests that an invalid fit file will fail when checking integrity.''' + stream = Stream.from_byte_array(Data.fit_file_short) + mocker.patch('garmin_fit_sdk.Decoder.is_fit', return_value=False) + decoder = Decoder(stream) + + assert decoder.check_integrity() is False + + @pytest.mark.parametrize( + "data,expected_value", + [ + (Data.fit_file_invalid, False), + (Data.fit_file_minimum, True), + (Data.fit_file_short, True), + (bytearray(), False), + (bytearray([0xE]), False), + (bytearray([0x0A, 0x10, 0xD9, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x2E, 0x46, 0x49, 0x54, 0x91, 0x33, 0x00, 0x00]), False), + (bytearray([0x0E, 0x10, 0xD9, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x2C, 0x46, 0x49, 0x54, 0x91, 0x33, 0x00, 0x00]), False), + ], ids=["Invalid Fit File", "Minimum Size Fit File", "Fit File with Messages", + "Empty File", "Input Length < 14", "Header Size != 14 || 12", "Data Type != .FIT"] + ) + def test_is_fit(self, data, expected_value): + '''Tests the validity of the decoder function used to determine if a file is a valid fit file.''' + stream = Stream.from_byte_array(data) + decoder = Decoder(stream) + assert decoder.is_fit() == expected_value + +class TestDecoderConstructor: + '''Set of tests that test the functionality of the Decoder constructor''' + def test_fails_if_stream_is_none(self): + '''Tests that the decoder will properly throw an error if a stream that is None is provided.''' + try: + decoder = Decoder(None) + assert False + except RuntimeError: + assert True + +class TestSkipHeaderDecodeMode: + '''Set of tests that test the fuctionality of the skip header decode mode''' + def test_invalid_header_with_skip_header(self): + '''Tests that file with invalid header should not fail when decode mode is skip header''' + stream = Stream.from_byte_array(Data.fit_file_short_invalid_header) + decoder = Decoder(stream) + messages, errors = decoder.read(decode_mode = DecodeMode.SKIP_HEADER) + + assert len(errors) == 0 + assert len(messages['file_id_mesgs']) == 1 + + def test_invalid_header_without_skip_header(self): + '''Tests that file with invalid header should fail when decode mode is normal''' + stream = Stream.from_byte_array(Data.fit_file_short_invalid_header) + decoder = Decoder(stream) + messages, errors = decoder.read() + + assert len(errors) == 1 + + def test_valid_header_with_skip_header(self): + '''Tests that file with valid header should not fail when decode mode is skip header''' + stream = Stream.from_byte_array(Data.fit_file_short) + decoder = Decoder(stream) + messages, errors = decoder.read(decode_mode = DecodeMode.SKIP_HEADER) + + assert len(errors) == 0 + assert len(messages['file_id_mesgs']) == 1 + + def test_invalid_crc_with_skip_header(self): + '''Tests that file with invalid CRC should not fail when decode mode is skip header''' + stream = Stream.from_byte_array(Data.fit_file_short_new_invalid_crc) + decoder = Decoder(stream) + messages, errors = decoder.read(decode_mode = DecodeMode.SKIP_HEADER) + + assert len(errors) == 0 + assert len(messages['file_id_mesgs']) == 1 + +class TestDataOnlyDecodeMode: + '''Set of tests that test the fuctionality of the data only decode mode''' + def test_no_header_with_data_only(self): + '''Tests that file with no header should not fail when decode mode is data only''' + stream = Stream.from_byte_array(Data.fit_file_short_data_only) + decoder = Decoder(stream) + messages, errors = decoder.read(decode_mode = DecodeMode.DATA_ONLY) + + assert len(errors) == 0 + assert len(messages['file_id_mesgs']) == 1 + + def test_no_header_without_data_only(self): + '''Tests that file with no header fails when decode mode is data only''' + stream = Stream.from_byte_array(Data.fit_file_short_data_only) + decoder = Decoder(stream) + messages, errors = decoder.read() + + assert len(errors) == 1 + + def test_invalid_crc_with_data_only(self): + '''Tests that file with invalid CRC should not fail when decode mode is data only''' + stream = Stream.from_byte_array(Data.fit_file_short_new_invalid_crc[14:]) + decoder = Decoder(stream) + messages, errors = decoder.read(decode_mode = DecodeMode.DATA_ONLY) + + assert len(errors) == 0 + assert len(messages['file_id_mesgs']) == 1 + +class TestReadFileHeader: + '''Set of tests that test the functionality of reading file headers and the File Header class''' + def test_read_file_header(self): + '''Tests reading the file header with the decoder and decoding the profile and protocol versions.''' + stream = Stream.from_byte_array(Data.fit_file_minimum) + decoder = Decoder(stream) + + file_header = decoder.read_file_header(stream) + + assert file_header.header_size == 14 + assert file_header.protocol_version == 32 + assert file_header.profile_version == 2187 + assert file_header.data_size == 0 + assert file_header.data_type == [b'.FIT'] + assert file_header.header_crc == 18573 + assert file_header.file_total_size == 14 + + def test_read_file_header_dict(self): + '''Tests reading the file header and converting the class to a dictionary.''' + stream = Stream.from_byte_array(Data.fit_file_minimum) + decoder = Decoder(stream) + + file_header = decoder.read_file_header(stream) + file_header_dict = file_header.get_dict() + + protocol_version = (file_header.protocol_version >> 4) + ((file_header.protocol_version & 0x0F) / 10) + profile_version = file_header.profile_version / 1000 if file_header.profile_version > 2199 else 100 + + assert file_header.header_size == file_header_dict['header_size'] + assert protocol_version == file_header_dict['protocol_version'] + assert profile_version == file_header_dict['profile_version'] + assert file_header.data_size == file_header_dict['data_size'] + assert file_header.data_type == file_header_dict['data_type'] + assert file_header.header_crc == file_header_dict['header_crc'] + assert file_header.file_total_size == file_header_dict['file_total_size'] + +class TestDecoderRead(): + '''Set of tests that verify the validity and accuracy of the decoder when reading files.''' + @pytest.mark.parametrize( + "data,num_messages", + [ + (Data.fit_file_minimum, 0), + (Data.fit_file_short, 2), + (Data.fit_file_short_new, 1), + (Data.fit_file_chained, 4) + ], ids=["Fit File Minimum", "Fit File Short with Invalids", "Fit File Short", "Chained Fit File"] + ) + def test_successful_read(self, data, num_messages): + '''Tests that the decoder successfully reads fit files and returns the correct number of messages.''' + stream = Stream.from_byte_array(data) + decoder = Decoder(stream) + messages, errors = decoder.read() + assert len(errors) == 0 + assert decoder.get_num_messages() == num_messages + + def test_stream_not_reset(self): + '''Tests that the decoder does not reset the stream before decoding.''' + stream = Stream.from_byte_array(Data.fit_file_short) + decoder = Decoder(stream) + decoder.read() + + assert stream.position() == stream.get_length() + messages, errors = decoder.read() + assert len(errors) == 0 and len(messages) == 0 + + def test_compressed_timestamp_message_should_throw(self): + '''Tests that the decoder should throw an error when reading a message with a compressed timestamp''' + stream = Stream.from_byte_array(Data.fit_file_short_compressed_timestamp) + decoder = Decoder(stream) + messages, errors = decoder.read() + + assert len(errors) == 1 + assert "Compressed timestamp messages are not currently supported" in str(errors[0]) + + def test_read_incorrect_field_def_size(self): + '''Tests that the decoder doesn't break when reading a message with an incorrect field definition size.''' + stream = Stream.from_byte_array(Data.fit_file_short_with_wrong_field_def_size) + decoder = Decoder(stream) + messages, errors = decoder.read(convert_datetimes_to_dates=False) + + assert len(errors) == 0 + assert "time_created" in messages["file_id_mesgs"][0] + + def test_invalid_crc_should_fail(self): + '''Test decoder should fail when CRC is invalid''' + stream = Stream.from_byte_array(Data.fit_file_short_invalid_CRC) + decoder = Decoder(stream) + messages, errors = decoder.read() + + assert len(errors) == 1 + assert len(messages['file_id_mesgs']) == 1 + + + @pytest.mark.parametrize( + "data,expected_output", + [ + (Data.fit_file_short_new, {'file_id_mesgs' : [{'manufacturer': 'garmin', 'type': 'activity', 'time_created': 1000000000, 'product_name': 'abcdefghi'}]}), + (Data.fit_file_short_none_array, {'file_id_mesgs' : [{'manufacturer': 'garmin', 'type': 'activity', 'time_created': 1000000000}]}) + ], ids=["Fit File Short", "Fit File Short w/ Invalid String"] + ) + def test_read_decoder_output(self, data, expected_output): + '''Tests the validity of the decoder's output after reading a fit file.''' + stream = Stream.from_byte_array(data) + decoder = Decoder(stream) + messages, errors = decoder.read(convert_datetimes_to_dates=False) + assert expected_output == messages + assert len(errors) == 0 + + + @pytest.mark.parametrize( + "option_status,expected_value", + [ + (True, -127), + (False, 1865), + (None, -127) + ], ids=["Set to True", "Set to False", "Default Should Apply Scale and Offset"] + ) + def test_apply_scale_and_offset(self, option_status, expected_value): + '''Tests the validity of applying scales and offsets to the decoded fields.''' + stream = Stream.from_file('tests/fits/ActivityDevFields.fit') + decoder = Decoder(stream) + if option_status is not None: + messages, errors = decoder.read(apply_scale_and_offset=option_status, merge_heart_rates=False) + else: + messages, errors = decoder.read() + assert len(errors) == 0 + assert messages['record_mesgs'][0]['altitude'] == expected_value + + def test_scale_and_offset_apply_to_arrays(self): + stream = Stream.from_file('tests/fits/WithGearChangeData.fit') + decoder = Decoder(stream) + messages, errors = decoder.read() + assert len(errors) == 0 + + left_power_phase = messages['record_mesgs'][28]['left_power_phase'] + left_power_phase_peak = messages['record_mesgs'][28]['left_power_phase_peak'] + + right_power_phase = messages['record_mesgs'][28]['right_power_phase'] + right_power_phase_peak = messages['record_mesgs'][28]['right_power_phase_peak'] + + assert left_power_phase == [337.5000052734376, 199.68750312011724] + assert left_power_phase_peak == [75.93750118652346, 104.0625016259766] + assert right_power_phase == [7.031250109863283, 205.31250320800785] + assert right_power_phase_peak == [70.31250109863284, 106.8750016699219] + + def test_scale_and_offset_correct_type_conversion(self): + '''Tests applying scale and offset producing the correct data type.''' + stream = Stream.from_file('tests/fits/WithGearChangeData.fit') + decoder = Decoder(stream) + messages, errors = decoder.read() + assert len(errors) == 0 + + assert messages['record_mesgs'][0]['power'] == 0 + assert isinstance(messages['record_mesgs'][0]['power'], int) is True + + assert messages['file_id_mesgs'][0]['product'] == 3843 + assert isinstance(messages['file_id_mesgs'][0]['product'], int) is True + + assert isinstance(messages['event_mesgs'][4]['rear_gear_num'], int) is True + + @pytest.mark.parametrize( + "option_status,expected_value", + [ + (True, datetime.fromtimestamp(1000000000 + 631065600, timezone.utc)), + (False, 1000000000), + (None, datetime.fromtimestamp(1000000000 + 631065600, timezone.utc)) + ], ids=["Set to True", "Set to False", "Default Should Convert Timestamps"] + ) + def test_convert_datetimes_to_python_datetimes(self, option_status, expected_value): + '''Tests the validity of converting timestamps to python datetimes when decoding files.''' + stream = Stream.from_byte_array(Data.fit_file_short_new) + decoder = Decoder(stream) + if option_status is not None: + messages, errors = decoder.read(convert_datetimes_to_dates=option_status) + else: + messages, errors = decoder.read() + + assert len(errors) == 0 + + if option_status is False: + assert messages['file_id_mesgs'][0]['time_created'] == expected_value + else: + assert str(messages['file_id_mesgs'][0]['time_created']) == str(expected_value.replace(tzinfo=timezone.utc)) + + @pytest.mark.parametrize( + "option_status,expected_type_value", + [ + (True, 'activity'), + (False, 4), + (None, 'activity') + ], ids=["Set to True", "Set to False", "Default Should Convert"] + ) + def test_convert_types_to_strings(self, option_status, expected_type_value): + '''Tests the validity of converting types to strings when decoding files.''' + stream = Stream.from_byte_array(Data.fit_file_short_new) + decoder = Decoder(stream) + if option_status is not None: + messages, errors = decoder.read(convert_types_to_strings=option_status) + else: + messages, errors = decoder.read() + assert len(errors) == 0 + assert messages['file_id_mesgs'][0]['type'] == expected_type_value + + + @pytest.mark.parametrize( + "field_key,expected_value", + [ + (0, pytest.approx(3.0, 0.1)), + (2, [-10, 12]), + (3, ['Hello!', 'Good Job!']) + ], ids=["Single Value", "Array of Values", "String Value(s)"] + ) + def test_read_developer_data(self, field_key, expected_value): + '''Tests the validity of reading developer data from a fit file''' + stream = Stream.from_file('tests/fits/ActivityDevFields.fit') + decoder = Decoder(stream) + messages, errors = decoder.read() + + assert len(errors) == 0 + assert len(messages['record_mesgs']) == 3601 and len(messages['session_mesgs']) == 1 + + assert messages['session_mesgs'][0]['developer_fields'][field_key] == expected_value + + def test_read_dev_data_no_field_description(self): + '''Tests reading past dev data with no field description message or dev data ID.''' + + stream = Stream.from_byte_array(Data.fit_file_dev_data_missing_field_description) + decoder = Decoder(stream) + messages, errors = decoder.read() + + assert len(errors) == 0 and len(messages['activity_mesgs']) == 1 + + def test_read_multibyte_dev_data(self): + '''Tests reading developer data with a multi-byte base type.''' + stream = Stream.from_byte_array(Data.fit_file_short_multibyte_dev_data) + decoder = Decoder(stream) + messages, errors = decoder.read() + + assert len(errors) == 0 and len(messages['session_mesgs']) == 1 + assert messages['session_mesgs'][0]['developer_fields'][0] == 1234 + + @pytest.mark.parametrize( + "option_status", + [ + (True), + (False), + (None) + ], ids=["Set to True", "Set to False", "Default should have CRC calculations enabled"] + ) + def test_enable_crc_options(self, mocker, option_status): + '''Tests enabling and disabling CRC calculation when decoding a FIT file.''' + spy_add_bytes = mocker.spy(CrcCalculator, "add_bytes") + spy_get_crc = mocker.spy(CrcCalculator, "get_crc") + + stream = Stream.from_byte_array(Data.fit_file_short) + decoder = Decoder(stream) + + if option_status is not None: + messages, errors = decoder.read(enable_crc_check=option_status) + else: + messages, errors = decoder.read() + + assert len(errors) == 0 + + assert spy_add_bytes.call_count == 0 if option_status is False else spy_add_bytes.call_count > 0 + assert spy_get_crc.call_count == 0 if option_status is False else spy_get_crc.call_count > 0 + + @pytest.mark.parametrize( + "option_status, data, expected_error_status", + [ + (True, Data.fit_file_short_new, False), + (True, Data.fit_file_short_new_invalid_crc, True), + (False, Data.fit_file_short_new, False), + (False, Data.fit_file_short_new_invalid_crc, False), + ], ids=["With CRC | Valid File", "With CRC | Invalid File", "Without CRC | Valid File", "Without CRC | Invalid File"] + ) + def test_enable_crc_options_errors_returned(self, option_status, data, expected_error_status): + '''Tests if errors are returned when decoding a file when CRC calculations are enabled or disabled.''' + stream = Stream.from_byte_array(data) + decoder = Decoder(stream) + messages, errors = decoder.read(enable_crc_check=option_status) + + assert len(errors) == 0 if expected_error_status is False else len(errors) > 0 + + @pytest.mark.parametrize( + "option_status", + [ + (True), + (False), + (None) + ], ids=["Set to True", "Set to False", "Default should expand sub fields"] + ) + def test_expand_sub_fields_options(self, option_status): + '''Tests the validity of expanding sub fields of messages decoded from a fit file''' + stream = Stream.from_file('tests/fits/WithGearChangeData.fit') + decoder = Decoder(stream) + if option_status is not None: + messages, errors = decoder.read(expand_sub_fields=option_status, convert_types_to_strings=False) + else: + messages, errors = decoder.read(convert_types_to_strings=False) + + assert len(errors) == 0 + assert decoder.get_num_messages() == 2055 + + for message in (message for message in messages['event_mesgs'] if message['event'] == 'rider_position_change'): + if option_status is True or option_status is None: + assert message['rider_position'] == message['data'] + + @pytest.mark.parametrize( + "option_status, is_integer", + [ + (True, False), + (False, True), + ], ids=["Convert Types is True, No Ints", "Convert Types is True, All Ints"] + ) + def test_expand_sub_fields_convert_types_to_strings(self, option_status, is_integer): + stream = Stream.from_file('tests/fits/WithGearChangeData.fit') + decoder = Decoder(stream) + messages, errors = decoder.read(convert_types_to_strings=option_status) + + assert len(errors) == 0 + + rider_position_event_mesgs = [mesg for mesg in messages['event_mesgs'] if 'rider_position' in mesg] + + for mesg in rider_position_event_mesgs: + assert isinstance(mesg['rider_position'], int) is is_integer + + @pytest.mark.parametrize( + "option_status, data, distances", + [ + (True, Data.fit_file_800m_repeats_little_endian, [4000, 800, 200, 1000]), + (False, Data.fit_file_800m_repeats_little_endian, [400000, 80000, 20000, 100000]), + (True, Data.fit_file_800m_repeats_big_endian, [4000, 800, 200, 1000]), + (False, Data.fit_file_800m_repeats_big_endian, [400000, 80000, 20000, 100000]), + ], ids=["Apply Scale and Offset is True, Little Endian", "Apply Scale and Offset is False, Little Endian", + "Apply Scale and Offset is True, Big Endian", "Apply Scale and Offset is False, Big Endian"] + ) + def test_expand_sub_fields_scale_and_offset(self, option_status, data, distances): + stream = Stream.from_byte_array(data) + decoder = Decoder(stream) + messages, errors = decoder.read(apply_scale_and_offset=option_status, merge_heart_rates=False) + + assert len(errors) == 0 + + duration_distance_workout_step_mesgs = [mesg for mesg in messages['workout_step_mesgs'] if 'duration_distance' in mesg] + + for mesg, distance in zip(duration_distance_workout_step_mesgs, distances): + assert mesg['duration_distance'] == distance + + def test_messages_with_no_fields(self): + '''Tests reading messages with no fields assigned in their message definition''' + stream = Stream.from_byte_array(Data.fit_file_messages_with_no_fields) + decoder = Decoder(stream) + messages, errors = decoder.read() + assert len(errors) == 0 + + serial_number = 3452116910 + + assert len(messages['pad_mesgs']) == 1 + assert len(messages['file_id_mesgs']) == 2 + + assert messages['pad_mesgs'][0] == {} + + assert messages['file_id_mesgs'][0]["serial_number"] == serial_number + assert messages['file_id_mesgs'][1]["serial_number"] == serial_number + +class TestComponentExpansion: + def test_sub_field_and_component_expansion(self): + stream = Stream.from_file('tests/fits/WithGearChangeData.fit') + decoder = Decoder(stream) + messages, errors = decoder.read() + + assert len(errors) == 0 + + rider_position_event_mesgs = [mesg for mesg in messages['event_mesgs'] if 'gear_change_data' in mesg] + + index = 0 + for mesg in rider_position_event_mesgs: + expected = Data.gear_change_data[index] + assert mesg['front_gear_num'] == expected['front_gear_num'] + assert mesg['front_gear'] == expected['front_gear'] + assert mesg['rear_gear_num'] == expected['rear_gear_num'] + assert mesg['rear_gear'] == expected['rear_gear'] + assert mesg['data'] == expected['data'] + assert mesg['gear_change_data'] == expected['gear_change_data'] + + index += 1 + + @pytest.mark.parametrize( + "option_status", + [ + (True), + (False), + (None) + ], ids=["Set to True", "Set to False", "Default should expand components"] + ) + def test_component_expansion_options(self, option_status): + '''Tests the validity of expanding components of messages decoded from a fit file''' + stream = Stream.from_file('tests/fits/WithGearChangeData.fit') + decoder = Decoder(stream) + if option_status is not None: + messages, errors = decoder.read(expand_components=option_status, merge_heart_rates=False) + else: + messages, errors = decoder.read() + + assert len(errors) == 0 + + for message in messages['record_mesgs']: + if option_status is True or option_status is None: + assert message['speed'] == message['enhanced_speed'] + assert message['altitude'] == message['enhanced_altitude'] + else: + assert 'enhanced_speed' not in message + assert 'enhanced_altitude' not in message + + def test_hr_message_component_expansion(self): + '''Tests component expansion given heart rate messages.''' + stream = Stream.from_file('tests/fits/HrmPluginTestActivity.fit') + decoder = Decoder(stream) + messages, errors = decoder.read() + assert len(errors) == 0 + + assert messages['hr_mesgs'][0]['event_timestamp'] == 1242209 + + hr_mesgs = messages['hr_mesgs'] + + index = 0 + for message in hr_mesgs: + if isinstance(message['event_timestamp'], float): + assert message['event_timestamp'] == pytest.approx(Data.hrm_plugin_test_activity_expected[index]) + index += 1 + continue + for timestamp in message['event_timestamp']: + assert timestamp == pytest.approx(Data.hrm_plugin_test_activity_expected[index]) + index += 1 + + def test_enum_component_expansion(self): + '''Tests component expansion in a monitoring file which includes expanded components which are enums.''' + stream = Stream.from_byte_array(Data.fit_file_monitoring) + decoder = Decoder(stream) + messages, errors = decoder.read() + assert len(errors) == 0 + assert len(messages['monitoring_mesgs']) == 4 + assert messages['monitoring_mesgs'][0]['activity_type'] == "running" and messages['monitoring_mesgs'][0]['intensity'] == 3 + assert messages['monitoring_mesgs'][0]['cycles'] == 10 + + assert messages['monitoring_mesgs'][1]['activity_type'] == "walking" and messages['monitoring_mesgs'][1]['intensity'] == 0 + assert messages['monitoring_mesgs'][1]['cycles'] == 30 + + assert messages['monitoring_mesgs'][2]['activity_type'] == 30 and messages['monitoring_mesgs'][2]['intensity'] == 0 + assert messages['monitoring_mesgs'][2]['cycles'] == 15 + + assert 'activity_type' not in messages['monitoring_mesgs'][3] and 'intensity' not in messages['monitoring_mesgs'][3] + assert messages['monitoring_mesgs'][3]['cycles'] == 15 + +class TestMergeHeartrates: + '''Set of tests which verify the functionality of merging heartrates to records when decoding.''' + @pytest.mark.parametrize( + "option_status, expected", + [ + (True, False), + (False, True), + (None, False) + ], ids=["Set to True", "Set to False", "Default should merge heart rates"] + ) + def test_merge_heart_rates_options(self, option_status, expected): + '''Tests that all the options settings for merge_heart_rates work as expected when decoding.''' + stream = Stream.from_file('tests/fits/HrmPluginTestActivity.fit') + decoder = Decoder(stream) + + if option_status is not None: + messages, errors = decoder.read(merge_heart_rates=option_status) + else: + messages, errors = decoder.read() + + assert len(errors) == 0 + + missing_hr = False + for message in messages['record_mesgs']: + if 'heart_rate' not in message: + missing_hr = True + assert missing_hr == expected + + def test_merge_heart_rate_fails_without_scale_and_offset(self): + '''Tests to ensure that decoding fails when merge_heart_rates == True but apply_scale_and_offset == False''' + stream = Stream.from_file('tests/fits/HrmPluginTestActivity.fit') + decoder = Decoder(stream) + messages, errors = decoder.read(apply_scale_and_offset=False) + assert len(errors) == 1 + + def test_merge_heart_rate_fails_without_expand_components(self): + '''Tests to ensure that decoding fails when merge_heart_rates == True but expand_components == False''' + stream = Stream.from_file('tests/fits/HrmPluginTestActivity.fit') + decoder = Decoder(stream) + messages, errors = decoder.read(expand_components=False) + assert len(errors) == 1 + +class TestAccumulatedFields: + def test_expanded_components_expand_with_fields_that_accumulate(self): + '''Tests that expanding components which are set to accumulate, accumulate properly.''' + stream = Stream.from_byte_array(Data.fit_file_accumulated_components) + decoder = Decoder(stream) + messages, errors = decoder.read() + assert len(errors) == 0 + + assert messages['record_mesgs'][0]['cycles'] == 254 + assert messages['record_mesgs'][0]['total_cycles'] == 254 + + assert messages['record_mesgs'][1]['cycles'] == 0 + assert messages['record_mesgs'][1]['total_cycles'] == 256 + + assert messages['record_mesgs'][2]['cycles'] == 1 + assert messages['record_mesgs'][2]['total_cycles'] == 257 + + def test_expanded_components_which_accumulate_and_have_initial_value_scale_and_accumulate(self): + '''Tests that when an accumulated, expanded component field that is given an initial value is scaled accordingly in accumulation.''' + stream = Stream.from_byte_array(Data.fit_file_compressed_speed_distance_with_initial_distance) + decoder = Decoder(stream) + messages, errors = decoder.read() + assert len(errors) == 0 + + # The first distance field is not expanded from a compressedSpeedDistance field + assert messages['record_mesgs'][0]['distance'] == 2 + assert messages['record_mesgs'][1]['distance'] == 264 + assert messages['record_mesgs'][2]['distance'] == 276 + +class TestDecoderExceptions: + '''Set of tests which verifies behavior of the decoder when various exceptions are raised''' + @pytest.mark.parametrize( + "exception", + [ + KeyboardInterrupt, + SystemExit, + ], ids=["KeyboardInterrupt", "SystemExit"] + ) + def test_keyboard_interrupt_and_system_exit_exceptions_are_rethrown(self, mocker, exception): + '''Tests to ensure that the decoder rethrows KeyboardInterrupt and SystemExit exceptions''' + stream = Stream.from_byte_array(Data.fit_file_short) + decoder = Decoder(stream) + + mocked_is_fit = mocker.patch('garmin_fit_sdk.Decoder.is_fit') + mocked_is_fit.side_effect = exception + + with pytest.raises(exception): + decoder.read() + + @pytest.mark.parametrize( + "exception", + [ + Exception, + RuntimeError, + BufferError, + LookupError, + IndexError + ], ids=["Generic Exception", "RuntimeError", "BufferError", "LookupError", "IndexError"] + ) + def test_other_exceptions_are_not_rethrown(self, mocker, exception): + '''Tests to ensure that the decoder does not rethrow other exceptions''' + stream = Stream.from_byte_array(Data.fit_file_short) + decoder = Decoder(stream) + + mocked_is_fit = mocker.patch('garmin_fit_sdk.Decoder.is_fit') + mocked_is_fit.side_effect = exception + + messages, errors = decoder.read() + + assert len(errors) == 1 + +def test_mesg_listener(): + '''Tests that a message listener passed to the decoder is correctly called.''' + stream = Stream.from_byte_array(Data.fit_file_short) + decoder = Decoder(stream) + + def mesg_listener(mesg_num, message): + raise Exception("The message listener was called!") + + messages, errors = decoder.read(mesg_listener=mesg_listener) + + assert len(errors) == 1 + assert str(errors[0]) == "The message listener was called!" diff --git a/tests/test_hr_mesg_utils.py b/tests/test_hr_mesg_utils.py index 4baeb54..33bbe4c 100644 --- a/tests/test_hr_mesg_utils.py +++ b/tests/test_hr_mesg_utils.py @@ -1,51 +1,51 @@ -'''test_hr_mesg_utils.py: Contains the tests for the heart rate message merging functionality''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### - - -from garmin_fit_sdk import hr_mesg_utils -from garmin_fit_sdk.decoder import Decoder -from garmin_fit_sdk.stream import Stream - -from . import data_expand_hr_mesgs - - -def test_expand_heart_rates(): - '''Tests expanding heart rates''' - stream = Stream.from_file("tests/fits/HrmPluginTestActivity.fit") - decoder = Decoder(stream) - messages, errors = decoder.read() - - assert len(errors) == 0 - - heartrates = hr_mesg_utils.expand_heart_rates(messages['hr_mesgs']) - - assert len(heartrates) == len(data_expand_hr_mesgs.expanded_hr_messages) - - index = 0 - for message in heartrates: - expected = data_expand_hr_mesgs.expanded_hr_messages[index] - assert message['timestamp'] == expected['timestamp'] - assert message['heart_rate'] == expected['heart_rate'] - index += 1 - -def test_hr_mesgs_to_record_mesgs(): - '''Tests that the heart rate messages are merged into the record messages correctly.''' - stream = Stream.from_file("tests/fits/HrmPluginTestActivity.fit") - decoder = Decoder(stream) - messages, errors = decoder.read(merge_heart_rates=True, convert_datetimes_to_dates=False) - - assert len(errors) == 0 - assert len(messages['record_mesgs']) == len(data_expand_hr_mesgs.merged_record_messages) - - index = 0 - for message in messages['record_mesgs']: - expected = data_expand_hr_mesgs.merged_record_messages[index] - assert message['timestamp'] == expected['timestamp'] - assert message['heart_rate'] == expected['heart_rate'] - index += 1 +'''test_hr_mesg_utils.py: Contains the tests for the heart rate message merging functionality''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### + + +from garmin_fit_sdk import hr_mesg_utils +from garmin_fit_sdk.decoder import Decoder +from garmin_fit_sdk.stream import Stream + +from . import data_expand_hr_mesgs + + +def test_expand_heart_rates(): + '''Tests expanding heart rates''' + stream = Stream.from_file("tests/fits/HrmPluginTestActivity.fit") + decoder = Decoder(stream) + messages, errors = decoder.read() + + assert len(errors) == 0 + + heartrates = hr_mesg_utils.expand_heart_rates(messages['hr_mesgs']) + + assert len(heartrates) == len(data_expand_hr_mesgs.expanded_hr_messages) + + index = 0 + for message in heartrates: + expected = data_expand_hr_mesgs.expanded_hr_messages[index] + assert message['timestamp'] == expected['timestamp'] + assert message['heart_rate'] == expected['heart_rate'] + index += 1 + +def test_hr_mesgs_to_record_mesgs(): + '''Tests that the heart rate messages are merged into the record messages correctly.''' + stream = Stream.from_file("tests/fits/HrmPluginTestActivity.fit") + decoder = Decoder(stream) + messages, errors = decoder.read(merge_heart_rates=True, convert_datetimes_to_dates=False) + + assert len(errors) == 0 + assert len(messages['record_mesgs']) == len(data_expand_hr_mesgs.merged_record_messages) + + index = 0 + for message in messages['record_mesgs']: + expected = data_expand_hr_mesgs.merged_record_messages[index] + assert message['timestamp'] == expected['timestamp'] + assert message['heart_rate'] == expected['heart_rate'] + index += 1 diff --git a/tests/test_stream.py b/tests/test_stream.py index 3f5e9b0..478ff2d 100644 --- a/tests/test_stream.py +++ b/tests/test_stream.py @@ -1,234 +1,234 @@ -'''test_stream.py: Contains the set of tests for the Stream class in the Python FIT SDK''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### - - -import io - -import pytest -from garmin_fit_sdk import Stream, util - - -def test_stream_from_buffered_reader(): - '''Tests creating a stream from a buffered reader object''' - buffered_reader = io.BufferedReader( - io.BytesIO(bytearray([0x0E, 0x20, 0x8B]))) - stream = Stream.from_buffered_reader(buffered_reader) - assert stream.get_buffered_reader() is not None - assert stream.peek_byte() == 0x0E - -def test_stream_from_bytes_io(): - '''Tests creating a stream from a BytesIO object''' - bytes_io = io.BytesIO(bytearray([0x0E, 0x20, 0x8B])) - stream = Stream.from_bytes_io(bytes_io) - assert stream.get_buffered_reader() is not None - assert stream.peek_byte() == 0x0E - -def test_stream_from_byte_array(): - '''Tests creating a stream from a bytearray object''' - byte_array = bytearray([0x0E, 0x20, 0x8B]) - stream = Stream.from_byte_array(byte_array) - assert stream.get_buffered_reader() is not None - assert stream.peek_byte() == 0x0E - -def test_stream_from_file(): - '''Tests creating a stream from a binary fit file''' - stream = Stream.from_file("tests/fits/ActivityDevFields.fit") - assert stream.get_buffered_reader() is not None - assert stream.peek_byte() == 0x0E - - -@pytest.mark.parametrize( - "given_bytes,position,expected_value", - [ - (bytearray([0x0E, 0x20, 0x8B]), 0, 0x0E), - (bytearray([0x0E, 0x20, 0x8B]), 1, 0x20), - (bytearray([0x0E, 0x20, 0x8B]), 2, 0x8B), - ], -) -class TestParametrizedByByte: - '''Group of tests for testing read and peek by byte''' - def test_peek_byte(self, given_bytes, position, expected_value): - '''Tests peeking a single byte from the stream and returning its value''' - stream = Stream.from_byte_array(given_bytes) - stream.seek(position) - assert stream.peek_byte() == expected_value - assert stream.peek_byte() == stream.read_byte() - - def test_read_byte(self, given_bytes, position, expected_value): - '''Tests reading a single byte from the stream and returning its value''' - stream = Stream.from_byte_array(given_bytes) - stream.seek(position) - assert stream.read_byte() == expected_value - stream.seek(position) - assert stream.peek_byte() == stream.read_byte() - - -@pytest.mark.parametrize( - "given_bytes,num_bytes,expected_value", - [ - (bytearray([0x0E, 0x20, 0x8B]), 0, bytearray([])), - (bytearray([0x0E, 0x20, 0x8B]), 1, bytearray([0x0E])), - (bytearray([0x0E, 0x20, 0x8B]), 2, bytearray([0x0E, 0x20])), - (bytearray([0x0E, 0x20, 0x8B]), 3, bytearray([0x0E, 0x20, 0x8B])), - ], -) -class TestParametrizedByBytes: - '''Set of tests for verifying reads and peeks greater than one byte''' - def test_peek_bytes(self, given_bytes, num_bytes, expected_value): - '''Tests peeking a number of bytes from a stream''' - stream = Stream.from_byte_array(given_bytes) - assert stream.peek_bytes(num_bytes) == expected_value - assert stream.peek_bytes(num_bytes) == stream.read_bytes(num_bytes) - - def test_read_bytes(self, given_bytes, num_bytes, expected_value): - '''Tests peeking a number of bytes from a stream''' - stream = Stream.from_byte_array(given_bytes) - assert stream.read_bytes(num_bytes) == expected_value - stream.reset() - assert stream.peek_bytes(num_bytes) == stream.read_bytes(num_bytes) - - -@pytest.mark.parametrize( - "given_bytes,start,end,expected_value", - [ - (bytearray([0x0E, 0x20, 0x8B]), 0, 1, bytearray([0x0E])), - (bytearray([0x0E, 0x20, 0x8B]), 1, 2, bytearray([0x20])), - (bytearray([0x0E, 0x20, 0x8B]), 0, 2, bytearray([0x0E, 0x20])), - (bytearray([0x0E, 0x20, 0x8B]), 0, 3, bytearray([0x0E, 0x20, 0x8B])), - ], -) -def test_slice(given_bytes, start, end, expected_value): - '''Tests taking an array values from the stream from the start index to the end''' - stream = Stream.from_byte_array(given_bytes) - starting_position = stream.position() - assert stream.slice(start, end) == expected_value - assert stream.position() == starting_position - - -class TestReadValues: - '''Set of tests which validate correct reading of numeric values and strings from the stream.''' - @pytest.mark.parametrize( - "given_bytes", - [ - (bytearray([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])), - ], - ) - class TestInts: - '''Set of tests which verify decoding of int values from a fit file.''' - def test_read_unint8(self, given_bytes): - stream = Stream.from_byte_array(given_bytes) - values = stream.read_and_unpack(stream.get_length(), '=8B' ) - assert values == [255, 255, 255, 255, 255, 255, 255, 255] - - def test_read_sint8(self, given_bytes): - stream = Stream.from_byte_array(given_bytes) - values = stream.read_and_unpack(stream.get_length(), '=8b' ) - assert values == [-1, -1, -1, -1, -1, -1, -1, -1] - - def test_read_unint16(self, given_bytes): - stream = Stream.from_byte_array(given_bytes) - values = stream.read_and_unpack(stream.get_length(), '=4H' ) - assert values == [65535, 65535, 65535, 65535] - - def test_read_sint16(self, given_bytes): - stream = Stream.from_byte_array(given_bytes) - values = stream.read_and_unpack(stream.get_length(), '=4h' ) - assert values == [-1, -1, -1, -1] - - def test_read_uint32(self, given_bytes): - stream = Stream.from_byte_array(given_bytes) - values = stream.read_and_unpack(stream.get_length(), '=2I' ) - assert values == [4294967295, 4294967295] - - def test_read_sint32(self, given_bytes): - stream = Stream.from_byte_array(given_bytes) - values = stream.read_and_unpack(stream.get_length(), '=2i' ) - assert values == [-1, -1] - - def test_read_uint64(self, given_bytes): - stream = Stream.from_byte_array(given_bytes) - values = stream.read_and_unpack(stream.get_length(), '=Q' ) - assert values == [18446744073709551615] - def test_read_sint64(self, given_bytes): - stream = Stream.from_byte_array(given_bytes) - values = stream.read_and_unpack(stream.get_length(), '=q' ) - assert values == [-1] - - - @pytest.mark.parametrize( - "given_bytes", - [ - (bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F])), - ], - ) - class TestFloats: - '''Set of tests which verify decoding of float values from a fit file.''' - def test_read_float_32(self, given_bytes): - stream = Stream.from_byte_array(given_bytes) - values = stream.read_and_unpack(stream.get_length(), '=2f' ) - assert values == [0.0, 1.875] - - def test_read_double_64(self, given_bytes): - stream = Stream.from_byte_array(given_bytes) - values = stream.read_and_unpack(stream.get_length(), '=d' ) - assert values == [1] - - - class TestStrings: - '''Set of tests which verify decoding of strings from a fit file.''' - @pytest.mark.parametrize( - "given_bytes,expected_value", - [ - (bytearray([0x2E, 0x46, 0x49, 0x54]), ".FIT"), - (bytearray([0x2E, 0x46, 0x49, 0x54, 0x00, 0x00]), ".FIT"), - (bytearray([0xe8, 0xbf, 0x99, 0xe5, 0xa5, 0x97, 0xe5, 0x8a, 0xa8, 0xe4, 0xbd, - 0x9c, 0xe7, 0x94, 0xb1, 0xe4, 0xb8, 0xa4, 0xe7, 0xbb, 0x84]), "这套动作由两组"), - (bytearray([0xe8, 0xbf, 0x99, 0xe5, 0xa5, 0x97, 0xe5, 0x8a, 0xa8, 0xe4, 0xbd, - 0x9c, 0xe7, 0x94, 0xb1, 0xe4, 0xb8, 0xa4, 0xe7, 0xbb, 0x84, 0x00]), "这套动作由两组"), - ], ids=["Regular String", "String w/ Null Terminator", "Multibyte String w/o Null Terminator", "Multibyte String w/ Null Terminator"], - ) - def test_read_string(self, given_bytes, expected_value): - '''Tests reading any given string from the stream.''' - stream = Stream.from_byte_array(given_bytes) - value = stream.read_string(stream.get_length()) - assert util._convert_string(value[0]) == expected_value - - def test_read_string_array(self): - '''Tests reading an array of strings from the stream.''' - stream = Stream.from_byte_array(bytearray([0x2E, 0x46, 0x49, 0x54, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x00])) - string = stream.read_string(stream.get_length()) - strings = util._convert_string(string[0]) - for string in strings: - assert string == '.FIT' - - def test_read_string_bad_utf8_characters(self): - '''Tests correctly reading bad utf8 characters after decoding from the stream.''' - stream = Stream.from_byte_array(bytearray([ - 0x37, 0x35, 0x25, 0x20, 0x65, 0x66, 0x66, 0x6F, 0x72, 0x74, 0x2E, 0x00, 0x65, 0x66, 0x66, 0x6F, - 0x72, 0x74, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0x75, 0x6E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x03, 0x40, 0x00, 0x01, 0x00, 0x1B, 0x07, - 0xFE, 0x02, 0x84, 0x07, 0x01, 0x00, 0x03, 0x01, 0x00, 0x04, 0x04, 0x86, 0x01, 0x01, - 0x00, 0x02, 0x04, 0x86, 0x08, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x01, 0xD7, 0x7C, 0x37, 0x35, 0x25, 0x20, 0x65, 0x66, 0x66, 0x6F, 0x72, 0x74, 0x2E, - 0x00, 0x40, 0x00, 0x01, 0x00, 0x1B, 0x0B, 0xFE, 0x02, 0x84, 0x07, 0x01, 0x00, 0x03, 0x01, - 0x00, 0x05, 0x04, 0x86, 0x06, 0x04, 0x86, 0x04, 0x04, 0x86, 0x01, 0x01, 0x00, 0x02, - 0x04, 0x86, 0x08, 0x10, 0x07, 0x0A, 0x02, 0x84, 0x0B, 0x02, 0x84, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x08, 0xEB, 0x00, 0x03, 0x7B, 0xD7, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x03, 0xAE, 0xF8, 0x52, 0x61, 0x63, 0x65, 0x20, 0x67, 0x6F, 0x61, 0x6C, 0x20, 0x70, - 0x61, 0x63, 0x65, 0x2E, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x02, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x01, 0xD7, 0x7C, 0x37, 0x35, 0x25, 0x20, 0x65, 0x66])) - string = stream.read_string(stream.get_length()) - strings = util._convert_string(string[0]) - assert len(strings) == 54 - assert strings[0] == "75% effort." - assert strings[6] == "un" # Not '����un' - assert strings[13] == "" # Not '��' - assert strings[42] == "Race goal pace." # Not '��Race goal pace.' - assert strings[53] == "|75% ef" # Not '�|75% ef' +'''test_stream.py: Contains the set of tests for the Stream class in the Python FIT SDK''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### + + +import io + +import pytest +from garmin_fit_sdk import Stream, util + + +def test_stream_from_buffered_reader(): + '''Tests creating a stream from a buffered reader object''' + buffered_reader = io.BufferedReader( + io.BytesIO(bytearray([0x0E, 0x20, 0x8B]))) + stream = Stream.from_buffered_reader(buffered_reader) + assert stream.get_buffered_reader() is not None + assert stream.peek_byte() == 0x0E + +def test_stream_from_bytes_io(): + '''Tests creating a stream from a BytesIO object''' + bytes_io = io.BytesIO(bytearray([0x0E, 0x20, 0x8B])) + stream = Stream.from_bytes_io(bytes_io) + assert stream.get_buffered_reader() is not None + assert stream.peek_byte() == 0x0E + +def test_stream_from_byte_array(): + '''Tests creating a stream from a bytearray object''' + byte_array = bytearray([0x0E, 0x20, 0x8B]) + stream = Stream.from_byte_array(byte_array) + assert stream.get_buffered_reader() is not None + assert stream.peek_byte() == 0x0E + +def test_stream_from_file(): + '''Tests creating a stream from a binary fit file''' + stream = Stream.from_file("tests/fits/ActivityDevFields.fit") + assert stream.get_buffered_reader() is not None + assert stream.peek_byte() == 0x0E + + +@pytest.mark.parametrize( + "given_bytes,position,expected_value", + [ + (bytearray([0x0E, 0x20, 0x8B]), 0, 0x0E), + (bytearray([0x0E, 0x20, 0x8B]), 1, 0x20), + (bytearray([0x0E, 0x20, 0x8B]), 2, 0x8B), + ], +) +class TestParametrizedByByte: + '''Group of tests for testing read and peek by byte''' + def test_peek_byte(self, given_bytes, position, expected_value): + '''Tests peeking a single byte from the stream and returning its value''' + stream = Stream.from_byte_array(given_bytes) + stream.seek(position) + assert stream.peek_byte() == expected_value + assert stream.peek_byte() == stream.read_byte() + + def test_read_byte(self, given_bytes, position, expected_value): + '''Tests reading a single byte from the stream and returning its value''' + stream = Stream.from_byte_array(given_bytes) + stream.seek(position) + assert stream.read_byte() == expected_value + stream.seek(position) + assert stream.peek_byte() == stream.read_byte() + + +@pytest.mark.parametrize( + "given_bytes,num_bytes,expected_value", + [ + (bytearray([0x0E, 0x20, 0x8B]), 0, bytearray([])), + (bytearray([0x0E, 0x20, 0x8B]), 1, bytearray([0x0E])), + (bytearray([0x0E, 0x20, 0x8B]), 2, bytearray([0x0E, 0x20])), + (bytearray([0x0E, 0x20, 0x8B]), 3, bytearray([0x0E, 0x20, 0x8B])), + ], +) +class TestParametrizedByBytes: + '''Set of tests for verifying reads and peeks greater than one byte''' + def test_peek_bytes(self, given_bytes, num_bytes, expected_value): + '''Tests peeking a number of bytes from a stream''' + stream = Stream.from_byte_array(given_bytes) + assert stream.peek_bytes(num_bytes) == expected_value + assert stream.peek_bytes(num_bytes) == stream.read_bytes(num_bytes) + + def test_read_bytes(self, given_bytes, num_bytes, expected_value): + '''Tests peeking a number of bytes from a stream''' + stream = Stream.from_byte_array(given_bytes) + assert stream.read_bytes(num_bytes) == expected_value + stream.reset() + assert stream.peek_bytes(num_bytes) == stream.read_bytes(num_bytes) + + +@pytest.mark.parametrize( + "given_bytes,start,end,expected_value", + [ + (bytearray([0x0E, 0x20, 0x8B]), 0, 1, bytearray([0x0E])), + (bytearray([0x0E, 0x20, 0x8B]), 1, 2, bytearray([0x20])), + (bytearray([0x0E, 0x20, 0x8B]), 0, 2, bytearray([0x0E, 0x20])), + (bytearray([0x0E, 0x20, 0x8B]), 0, 3, bytearray([0x0E, 0x20, 0x8B])), + ], +) +def test_slice(given_bytes, start, end, expected_value): + '''Tests taking an array values from the stream from the start index to the end''' + stream = Stream.from_byte_array(given_bytes) + starting_position = stream.position() + assert stream.slice(start, end) == expected_value + assert stream.position() == starting_position + + +class TestReadValues: + '''Set of tests which validate correct reading of numeric values and strings from the stream.''' + @pytest.mark.parametrize( + "given_bytes", + [ + (bytearray([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])), + ], + ) + class TestInts: + '''Set of tests which verify decoding of int values from a fit file.''' + def test_read_unint8(self, given_bytes): + stream = Stream.from_byte_array(given_bytes) + values = stream.read_and_unpack(stream.get_length(), '=8B' ) + assert values == [255, 255, 255, 255, 255, 255, 255, 255] + + def test_read_sint8(self, given_bytes): + stream = Stream.from_byte_array(given_bytes) + values = stream.read_and_unpack(stream.get_length(), '=8b' ) + assert values == [-1, -1, -1, -1, -1, -1, -1, -1] + + def test_read_unint16(self, given_bytes): + stream = Stream.from_byte_array(given_bytes) + values = stream.read_and_unpack(stream.get_length(), '=4H' ) + assert values == [65535, 65535, 65535, 65535] + + def test_read_sint16(self, given_bytes): + stream = Stream.from_byte_array(given_bytes) + values = stream.read_and_unpack(stream.get_length(), '=4h' ) + assert values == [-1, -1, -1, -1] + + def test_read_uint32(self, given_bytes): + stream = Stream.from_byte_array(given_bytes) + values = stream.read_and_unpack(stream.get_length(), '=2I' ) + assert values == [4294967295, 4294967295] + + def test_read_sint32(self, given_bytes): + stream = Stream.from_byte_array(given_bytes) + values = stream.read_and_unpack(stream.get_length(), '=2i' ) + assert values == [-1, -1] + + def test_read_uint64(self, given_bytes): + stream = Stream.from_byte_array(given_bytes) + values = stream.read_and_unpack(stream.get_length(), '=Q' ) + assert values == [18446744073709551615] + def test_read_sint64(self, given_bytes): + stream = Stream.from_byte_array(given_bytes) + values = stream.read_and_unpack(stream.get_length(), '=q' ) + assert values == [-1] + + + @pytest.mark.parametrize( + "given_bytes", + [ + (bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F])), + ], + ) + class TestFloats: + '''Set of tests which verify decoding of float values from a fit file.''' + def test_read_float_32(self, given_bytes): + stream = Stream.from_byte_array(given_bytes) + values = stream.read_and_unpack(stream.get_length(), '=2f' ) + assert values == [0.0, 1.875] + + def test_read_double_64(self, given_bytes): + stream = Stream.from_byte_array(given_bytes) + values = stream.read_and_unpack(stream.get_length(), '=d' ) + assert values == [1] + + + class TestStrings: + '''Set of tests which verify decoding of strings from a fit file.''' + @pytest.mark.parametrize( + "given_bytes,expected_value", + [ + (bytearray([0x2E, 0x46, 0x49, 0x54]), ".FIT"), + (bytearray([0x2E, 0x46, 0x49, 0x54, 0x00, 0x00]), ".FIT"), + (bytearray([0xe8, 0xbf, 0x99, 0xe5, 0xa5, 0x97, 0xe5, 0x8a, 0xa8, 0xe4, 0xbd, + 0x9c, 0xe7, 0x94, 0xb1, 0xe4, 0xb8, 0xa4, 0xe7, 0xbb, 0x84]), "这套动作由两组"), + (bytearray([0xe8, 0xbf, 0x99, 0xe5, 0xa5, 0x97, 0xe5, 0x8a, 0xa8, 0xe4, 0xbd, + 0x9c, 0xe7, 0x94, 0xb1, 0xe4, 0xb8, 0xa4, 0xe7, 0xbb, 0x84, 0x00]), "这套动作由两组"), + ], ids=["Regular String", "String w/ Null Terminator", "Multibyte String w/o Null Terminator", "Multibyte String w/ Null Terminator"], + ) + def test_read_string(self, given_bytes, expected_value): + '''Tests reading any given string from the stream.''' + stream = Stream.from_byte_array(given_bytes) + value = stream.read_string(stream.get_length()) + assert util._convert_string(value[0]) == expected_value + + def test_read_string_array(self): + '''Tests reading an array of strings from the stream.''' + stream = Stream.from_byte_array(bytearray([0x2E, 0x46, 0x49, 0x54, 0x00, 0x2E, 0x46, 0x49, 0x54, 0x00])) + string = stream.read_string(stream.get_length()) + strings = util._convert_string(string[0]) + for string in strings: + assert string == '.FIT' + + def test_read_string_bad_utf8_characters(self): + '''Tests correctly reading bad utf8 characters after decoding from the stream.''' + stream = Stream.from_byte_array(bytearray([ + 0x37, 0x35, 0x25, 0x20, 0x65, 0x66, 0x66, 0x6F, 0x72, 0x74, 0x2E, 0x00, 0x65, 0x66, 0x66, 0x6F, + 0x72, 0x74, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0x75, 0x6E, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x03, 0x40, 0x00, 0x01, 0x00, 0x1B, 0x07, + 0xFE, 0x02, 0x84, 0x07, 0x01, 0x00, 0x03, 0x01, 0x00, 0x04, 0x04, 0x86, 0x01, 0x01, + 0x00, 0x02, 0x04, 0x86, 0x08, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x01, 0xD7, 0x7C, 0x37, 0x35, 0x25, 0x20, 0x65, 0x66, 0x66, 0x6F, 0x72, 0x74, 0x2E, + 0x00, 0x40, 0x00, 0x01, 0x00, 0x1B, 0x0B, 0xFE, 0x02, 0x84, 0x07, 0x01, 0x00, 0x03, 0x01, + 0x00, 0x05, 0x04, 0x86, 0x06, 0x04, 0x86, 0x04, 0x04, 0x86, 0x01, 0x01, 0x00, 0x02, + 0x04, 0x86, 0x08, 0x10, 0x07, 0x0A, 0x02, 0x84, 0x0B, 0x02, 0x84, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x08, 0xEB, 0x00, 0x03, 0x7B, 0xD7, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x03, 0xAE, 0xF8, 0x52, 0x61, 0x63, 0x65, 0x20, 0x67, 0x6F, 0x61, 0x6C, 0x20, 0x70, + 0x61, 0x63, 0x65, 0x2E, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x02, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x01, 0xD7, 0x7C, 0x37, 0x35, 0x25, 0x20, 0x65, 0x66])) + string = stream.read_string(stream.get_length()) + strings = util._convert_string(string[0]) + assert len(strings) == 54 + assert strings[0] == "75% effort." + assert strings[6] == "un" # Not '����un' + assert strings[13] == "" # Not '��' + assert strings[42] == "Race goal pace." # Not '��Race goal pace.' + assert strings[53] == "|75% ef" # Not '�|75% ef' diff --git a/tests/test_util.py b/tests/test_util.py index e421b1f..c3e5756 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -1,30 +1,30 @@ -'''test_util.py: Contains the set of tests for the util module in the Python FIT SDK''' - -########################################################################################### -# Copyright 2025 Garmin International, Inc. -# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you -# may not use this file except in compliance with the Flexible and Interoperable Data -# Transfer (FIT) Protocol License. -########################################################################################### - - -from datetime import datetime, timezone - -import pytest -from garmin_fit_sdk import util - - -@pytest.mark.parametrize( - "given_timestamp,expected_datetime", - [ - (1029086357, datetime.fromtimestamp(1029086357 + 631065600, timezone.utc)), - (0, datetime.fromtimestamp(631065600, timezone.utc)), - (None, datetime.fromtimestamp(631065600, timezone.utc)), - ], ids=["Regular timestamp", "0 timestamp defaults to FITEPOCH", "Null timestamp defaults to FITEPOCH"], -) -def test_convert_datetime(given_timestamp, expected_datetime): - '''Tests converting a FIT timestamp to a python utc datetime''' - expected_datetime = expected_datetime.replace(tzinfo=timezone.utc) - - actual_datetime = util.convert_timestamp_to_datetime(given_timestamp) - assert str(actual_datetime) == str(expected_datetime) +'''test_util.py: Contains the set of tests for the util module in the Python FIT SDK''' + +########################################################################################### +# Copyright 2026 Garmin International, Inc. +# Licensed under the Flexible and Interoperable Data Transfer (FIT) Protocol License; you +# may not use this file except in compliance with the Flexible and Interoperable Data +# Transfer (FIT) Protocol License. +########################################################################################### + + +from datetime import datetime, timezone + +import pytest +from garmin_fit_sdk import util + + +@pytest.mark.parametrize( + "given_timestamp,expected_datetime", + [ + (1029086357, datetime.fromtimestamp(1029086357 + 631065600, timezone.utc)), + (0, datetime.fromtimestamp(631065600, timezone.utc)), + (None, datetime.fromtimestamp(631065600, timezone.utc)), + ], ids=["Regular timestamp", "0 timestamp defaults to FITEPOCH", "Null timestamp defaults to FITEPOCH"], +) +def test_convert_datetime(given_timestamp, expected_datetime): + '''Tests converting a FIT timestamp to a python utc datetime''' + expected_datetime = expected_datetime.replace(tzinfo=timezone.utc) + + actual_datetime = util.convert_timestamp_to_datetime(given_timestamp) + assert str(actual_datetime) == str(expected_datetime)