tcgoetz / GarminDB

Download and parse data from Garmin Connect or a Garmin watch, FitBit CSV, and MS Health CSV files into and analyze data in Sqlite serverless databases with Jupyter notebooks.
GNU General Public License v2.0
1.18k stars 142 forks source link

TypeError: unsupported operand type(s) for *: 'NoneType' and 'int' #28

Closed sis9 closed 5 years ago

sis9 commented 5 years ago

Hello. Got an error during make create_dbs

Screenshot - 2019-06-11 , 21_38_35

tcgoetz commented 5 years ago

Looks like you have a Garmin device I haven't seen before. Which device do you have?

If you have further issues, you might want to share a fit file with me and I will work through any remaining issues.

sis9 commented 5 years ago

Hi, i have a Garmin 630 Forerunner unit, plus a Stryd Power Meter. Perhaps its that some metrics come from Stryd that are doing it?

I tried to send a fit file here but couldn't, i sent it to email

tcgoetz commented 5 years ago

I received the fit file and will make sure there are no issues supporting it.

tcgoetz commented 5 years ago

Did you use the Stryd Power Meter for the activity that file was from?

I don't see it in the file. I see: GarminProduct.Forerunner_630 GarminProduct.GPS_1619 GarminProduct.HRM4_Run GarminProduct.Accelerometer_16 GarminProduct.fr225_single_byte_product_id

Maybe the Stryd impersonates a HRM run.

sis9 commented 5 years ago

Yes, i did. But i am not sure if this is the reason for not working.

The metrics from Stryd are Connect IQ datafields: Power, Cadence, Ground Time, Vertical Oscilation, Form Power etc.. Note that there are dublets (ex Cadence from 'normal' watch and Cadence from Stryd Connect IQ field)

Screenshot - 2019-06-12 , 15_20_50

tcgoetz commented 5 years ago

Here are the dev fields being parsed form your file:

Power, Cadence, Ground Time, Vertical Oscillation, Elevation, Form Power, and Leg Spring Stiffness

Message: DataMessage: <MessageType.field_description: 206>: {'fit_base_unit_id': fit_base_unit_id([invalid]), 'scale': scale([invalid] (255)), 'native_message_num': native_message_num(20), 'native_field_num': native_field_num(7), 'fit_base_type_id': fit_base_type_id('uint16' (132)), 'field_definition_number': field_definition_number(0), 'developer_data_index': developer_data_index(0), 'offset': offset([invalid] (127)), 'units': units('Watts' ([87, 97, 116, 116, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])), 'field_name': field_name('Power' ([80, 111, 119, 101, 114, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]))} Message: DataMessage: <MessageType.field_description: 206>: {'fit_base_unit_id': fit_base_unit_id([invalid]), 'scale': scale([invalid] (255)), 'native_message_num': native_message_num(20), 'native_field_num': native_field_num(4), 'fit_base_type_id': fit_base_type_id('uint8' (2)), 'field_definition_number': field_definition_number(2), 'developer_data_index': developer_data_index(0), 'offset': offset([invalid] (127)), 'units': units('RPM' ([82, 80, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])), 'field_name': field_name('Cadence' ([67, 97, 100, 101, 110, 99, 101, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]))} Message: DataMessage: <MessageType.field_description: 206>: {'fit_base_unit_id': fit_base_unit_id([invalid]), 'scale': scale([invalid] (255)), 'native_message_num': native_message_num(20), 'native_field_num': native_field_num(41), 'fit_base_type_id': fit_base_type_id('uint16' (132)), 'field_definition_number': field_definition_number(3), 'developer_data_index': developer_data_index(0), 'offset': offset([invalid] (127)), 'units': units('Milliseconds' ([77, 105, 108, 108, 105, 115, 101, 99, 111, 110, 100, 115, 0, 0, 0, 0])), 'field_name': field_name('Ground Time' ([71, 114, 111, 117, 110, 100, 32, 84, 105, 109, 101, 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, 0, 0, 0, 0, 0, 0, 0, 0]))} Message: DataMessage: <MessageType.field_description: 206>: {'fit_base_unit_id': fit_base_unit_id([invalid]), 'scale': scale([invalid] (255)), 'native_message_num': native_message_num(20), 'native_field_num': native_field_num(39), 'fit_base_type_id': fit_base_type_id('float32' (136)), 'field_definition_number': field_definition_number(4), 'developer_data_index': developer_data_index(0), 'offset': offset([invalid] (127)), 'units': units('Centimeters' ([67, 101, 110, 116, 105, 109, 101, 116, 101, 114, 115, 0, 0, 0, 0, 0])), 'field_name': field_name('Vertical Oscillation' ([86, 101, 114, 116, 105, 99, 97, 108, 32, 79, 115, 99, 105, 108, 108, 97, 116, 105, 111, 110, 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]))} Message: DataMessage: <MessageType.field_description: 206>: {'fit_base_unit_id': fit_base_unit_id([invalid]), 'scale': scale([invalid] (255)), 'native_message_num': native_message_num(20), 'native_field_num': native_field_num([invalid] (255)), 'fit_base_type_id': fit_base_type_id('uint16' (132)), 'field_definition_number': field_definition_number(7), 'developer_data_index': developer_data_index(0), 'offset': offset([invalid] (127)), 'units': units('Meters' ([77, 101, 116, 101, 114, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])), 'field_name': field_name('Elevation' ([69, 108, 101, 118, 97, 116, 105, 111, 110, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]))} Message: DataMessage: <MessageType.field_description: 206>: {'fit_base_unit_id': fit_base_unit_id([invalid]), 'scale': scale([invalid] (255)), 'native_message_num': native_message_num(20), 'native_field_num': native_field_num([invalid] (255)), 'fit_base_type_id': fit_base_type_id('uint16' (132)), 'field_definition_number': field_definition_number(8), 'developer_data_index': developer_data_index(0), 'offset': offset([invalid] (127)), 'units': units('Watts' ([87, 97, 116, 116, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])), 'field_name': field_name('Form Power' ([70, 111, 114, 109, 32, 80, 111, 119, 101, 114, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0]))} Message: DataMessage: <MessageType.field_description: 206>: {'fit_base_unit_id': fit_base_unit_id([invalid]), 'scale': scale([invalid] (255)), 'native_message_num': native_message_num(20), 'native_field_num': native_field_num([invalid] (255)), 'fit_base_type_id': fit_base_type_id('float32' (136)), 'field_definition_number': field_definition_number(9), 'developer_data_index': developer_data_index(0), 'offset': offset([invalid] (127)), 'units': units('kN/m' ([107, 78, 47, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])), 'field_name': field_name('Leg Spring Stiffness' ([76, 101, 103, 32, 83, 112, 114, 105, 110, 103, 32, 83, 116, 105, 102, 102, 110, 101, 115, 115, 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]))}

They are currently being parsed from the FIT file and are present in the fit file output, but are not being put into the DB unless they share a name with a field from the HRM-Tri. I have to think about how to store fields that are present for only some users.

tcgoetz commented 5 years ago

Lap messages from your FIT file supply the same fields as the HRM run. Those will appear in the DB already for runs. There are addition stats in the record entries that can be added to the DB. Please file an a new issue if you want those in the DB. If you want these stats to appear for walking activities, please file a separate issue for that.

Example record: Message: DataMessage: <MessageType.record: 20>: {'distance': distance(0.0 (Distance(0.0 meters [0.0]))), 'avg_vertical_oscillation': avg_vertical_oscillation(1.7598425760000003 (Distance(0.0447 meters [44.7]))), 'timestamp': timestamp(datetime.datetime(2019, 6, 11, 3, 58, 44) (929174325)), 'altitude': altitude(19.717847799 (Distance(6.01 meters [601.0]))), 'position_long': xx, 'dev_Vertical Oscillation': dev_Vertical Oscillation(0.0 Centimeters), 'fractional_cadence': fractional_cadence(64), 'vertical_ratio': vertical_ratio(0.1328 % (1328)), 'dev_Leg Spring Stiffness': dev_Leg Spring Stiffness(0.0 kN/m), 'dev_Power': dev_Power(73 Watts), 'heart_rate': heart_rate(86 bpm), 'step_length': step_length(16.45669344 (Distance(0.418 meters [418.0]))), 'dev_Form Power': dev_Form Power(25 Watts), 'dev_Elevation': dev_Elevation(77 Meters), 'position_lat': xx, 'dev_Ground Time': dev_Ground Time(1150 Milliseconds), 'speed': speed(0.23040440799999998 (Speed(0.230404408 mph [103.0]))), 'dev_Cadence': dev_Cadence(52 RPM), 'cadence': cadence(51), 'activity_type': activity_type(<ActivityType.walking: 6> (6))}