eBike-SQLite/parseFitFiles.py
2024-06-19 17:10:55 +02:00

146 lines
4.0 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from fitparse import FitFile
from datetime import datetime
import inotify.adapters
import os, sys, shutil
import sqlite3
path = "/home/manuel/Dropbox/Apps/HealthFitExporter/"
#path = "/Users/manuel/Projekte/eBike-Influx-Calculation/test/"
ext = ('.fit')
db_file = "/www/wwwroot/www.manuelw.de/ebike/ebike.db"
#db_file = "/Users/manuel/Projekte/eBike-Influx-Calculation/ebike.db"
fitData = {}
##
### auf neue Files überwachen
def main():
i = inotify.adapters.InotifyTree(path)
for event in i.event_gen(yield_nones=False):
(_, type_names, fpath, filename) = event
if event != None:
#print("PATH=[{}] FILENAME=[{}] EVENT_TYPES={}".format(path, filename, type_names))
if type_names[0] == "IN_MOVED_TO":
if filename.endswith(ext):
processFIT(filename)
#deleteFiles(filename)
else:
os.remove(os.path.join(path, filename))
pass
##
### parse FIT file und bestimme Handling
def processFIT(filename):
file = FitFile(path+filename)
for record in file.get_messages("session"):
## nur wenn Radfahren
if record.get_value("sport") == "cycling" or record.get_value("sport") == "e_biking":
## Verarbeitung starten
doAll(file)
writeDB(filename)
##
### todo on all fit files
def doAll(file):
global fitData
for record in file.get_messages("session"):
fitData["avg_cadence"] = record.get_value("avg_cadence")
#fitData["avg_speed"] += round(float(record.get_value("avg_speed")) / 0.27777777777778, 1)
fitData["avg_speed"] = record.get_value("avg_speed")/1000/(1/3600)
#fitData["total_ascent"] = float(record.get_value("total_ascent")) if record.get_value("total_ascent") != None else 0
fitData["total_distance"] = round(record.get_value("total_distance") / 1000, 1)
#fitData["date"] = record.get_value("start_time").strftime("%d.%m.%Y")
fitData["date"] = record.get_value("start_time")
fitData["total_calories"] = record.get_value("total_calories")
if record.get_value("max_altitude"):
fitData["max_altitude"] = round(float(record.get_value("max_altitude")), 1)
else:
fitData["max_altitude"] = 0
fitData["max_heart_rate"] = record.get_value("max_heart_rate")
fitData["avg_heart_rate"] = record.get_value("avg_heart_rate")
fitData["avg_speed"] = round(float(fitData["avg_speed"]), 1)
doHealthFit(file, record.get_value("min_altitude"))
def doHealthFit(file, min_alt=0.0):
global fitData
### Kadenz
i=0
cadence=0
last_elev=min_alt
ges_elev=0.0
for record in file.get_messages("record"):
## korrekte Kadenz ermitteln
if record.get_value("cadence") != None and record.get_value("cadence") > 0:
i+=1
cadence += record.get_value("cadence")
## korrekte Höhenmeter ermitteln
if record.get_value("altitude") != None:
if record.get_value("altitude") > last_elev:
ges_elev += record.get_value("altitude") - last_elev
last_elev = record.get_value("altitude")
#fitData["avg_cadence"] = int(cadence/i)
fitData["total_ascent"] = round(float(ges_elev), 1)
def writeDB(filename):
global fitData, db_file
try:
db = sqlite3.connect(db_file)
cursor = db.cursor()
print("Connected to SQLite")
sql = '''
INSERT INTO bike_drives
(d_date, d_total_distance, d_total_ascent, d_max_alt, d_avg_speed, d_avg_hr, d_calories)
VALUES (?, ?, ?, ?, ?, ?, ?);
'''
data = (fitData["date"], fitData["total_distance"], fitData["total_ascent"], fitData["max_altitude"], fitData["avg_speed"],
fitData["avg_heart_rate"], fitData["total_calories"])
cursor.execute(sql, data)
db.commit()
print("Data inserted successfully into bike_drives table")
cursor.close()
deleteFiles(filename)
except sqlite3.Error as error:
print("Failed to insert data into sqlite table", error)
finally:
if db:
db.close()
print("The SQLite connection is closed")
def deleteFiles(filename):
try:
os.remove(os.path.join(path, filename))
except Exception as e:
print('Failed to delete %s. Reason: %s' % (path+filename, e))
if __name__ == '__main__':
main()