GarminDB – Eine DB zum Importieren und Parsen von Daten von Garmin Connect/Uhren
(github.com/tcgoetz)- GarminDB ist eine Sammlung von Python-Skripten, die Gesundheits- und Aktivitätsdaten aus Garmin Connect herunterladen, in eine SQLite-Datenbank parsen und zur Analyse sowie Visualisierung über die Kommandozeile oder Jupyter Notebook nutzbar machen
- Automatisch importierbare Daten umfassen tägliche Monitoring-Dateien, Schlaf, Gewicht, Ruhepuls und Aktivitätsdateien; einige Aktivitätstypen werden mit zusätzlichen Runden- und Datensatzeinträgen detaillierter gespeichert
- Heruntergeladene JSON- und FIT-Dateien bleiben erhalten, sodass sich die DB neu erstellen lässt, ohne sich erneut bei Garmin Connect anzumelden oder Daten erneut herunterzuladen
- Die Installation ist als PyPI-Paket möglich; nach dem Einrichten des Garmin-Connect-Kontos und des Startdatums in
GarminConnectConfig.jsonstartetgarmindb_cli.py --all --download --import --analyzedie vollständige Datenerfassung und Analyse - Über Plugins lässt sich die Verarbeitung für Drittanbieter-Connect-IQ-Apps und Datenfelder erweitern; nach DB-Schema-Updates kann ein Rebuild der DB aus bereits vorhandenen Download-Dateien nötig sein
Was GarminDB macht
- GarminDB ist eine Sammlung von Python-Skripten zum Parsen und Verarbeiten von Gesundheitsdaten in einer SQLite-Datenbank
- SQLite wird als leichtgewichtige Datenbank ohne Server verwendet
- Unterstützte Funktionen:
- Automatisches Herunterladen und Importieren täglicher Monitoring-Dateien von der „Daily Summary“-Seite von Garmin Connect
- Herzfrequenz über den ganzen Tag
- Aktivitäten
- Aufstieg/Abstieg
- Stress
- Intensitätsminuten
- Extrahiert Schlaf-, Gewichts- und Ruhepulsdaten aus Garmin Connect, speichert sie als JSON-Dateien und importiert sie in die DB
- Lädt Aktivitätsdateien aus Garmin Connect herunter und importiert sie
- Erstellt Übersichtstabellen für alle Aktivitäten
- Speichert für einige Aktivitätstypen detailliertere Daten
- Einschließlich Runden- und Datensatzeinträgen pro Aktivität
- Fasst Daten in einer DB mit täglichen, wöchentlichen, monatlichen und jährlichen Übersichtstabellen zusammen
- Visualisiert Daten über die Kommandozeile oder mit Jupyter Notebook
- Behält heruntergeladene JSON- und FIT-Dateien, sodass sich die DB neu erstellen lässt, ohne sich erneut bei Garmin Connect anzumelden oder Daten erneut herunterzuladen
- Kann Aktivitäten als TCX-Dateien exportieren
- Automatisches Herunterladen und Importieren täglicher Monitoring-Dateien von der „Daily Summary“-Seite von Garmin Connect
Daten erkunden und analysieren
- Sobald Daten in der DB vorhanden sind, können sie mit den mitgelieferten Jupyter Notebooks, Jupyter Notebooks von Drittanbietern oder einem SQLite-Browser erkundet und bearbeitet werden
- Beispiele für nutzbare SQLite-Browser:
- Die Skripte erstellen standardmäßig Views in der DB, um die Datenerkundung zu erleichtern
Installation und grundlegender Ablauf
- GarminDb-Releases sind auf PyPI verfügbar und benötigen Python 3.x
- Installation der neuesten Version:
pip install garmindb
- Ersteinrichtung:
GarminConnectConfig.json.examplenach~/.GarminDb/GarminConnectConfig.jsonkopieren- Die Datei bearbeiten und Garmin-Connect-Benutzername und Passwort eintragen
- Das Startdatum passend zu den in Garmin Connect vorhandenen Daten anpassen
- Befehl zum erstmaligen Herunterladen aller Daten und Erstellen der DB:
garmindb_cli.py --all --download --import --analyze
- Inkrementelles Update zum Herunterladen und Importieren nur der neuesten Daten:
garmindb_cli.py --all --download --import --analyze --latest
- DB-Backups gelegentlich mit folgendem Befehl ausführen:
garmindb_cli.py --backup
- Auf die neueste Version aktualisieren:
pip install --upgrade garmindb
Aus dem Quellcode ausführen
- Die Skripte im Quellbaum sind mit Make automatisiert
- Vorgehen bei quellcodebasierter Nutzung:
- Das GarminDB-Repository per SSH klonen
- Wegen der Submodule muss SSH statt HTTPS verwendet werden
- Im geklonten Baum
make setupausführen, damit die Skripte Daten verarbeiten können GarminConnectConfig.json.examplenach~/.GarminDb/GarminConnectConfig.jsonkopieren und Konto sowie Startdatum einrichten- Für den ersten Datenimport und die Verarbeitung einmal
make create_dbsausführen - Danach regelmäßig nur
makeausführen, um die lokalen Daten aktuell zu halten
- Weitere Nutzungshinweise stehen in der Nutzungsdokumentation im Wiki
Jupyter Notebook und Plugins
- Jupyter Notebooks zur Analyse der Daten in der Datenbank befinden sich im Verzeichnis
Jupyterdes Quellbaums - Von Nutzern eingereichte Notebook-Links finden sich auf der Wiki-Seite zu verwandten Projekten
- Plugins können die verarbeiteten und in der DB gespeicherten Datentypen erweitern
- GarminDb enthält bereits mehrere Plugins zur Verarbeitung von Daten aus Drittanbieter-Connect-IQ-Apps und Datenfeldern
- Weitere Details zu Plugins gibt es in GarminDbPlugins
Wichtige Hinweise im Betrieb
- Nach Code-Updates kann eine DB-Versionsausnahme auftreten
- Das bedeutet, dass das DB-Schema aktualisiert wurde
- Die DB muss mit
garmindb_cli.py --rebuild_dbneu aufgebaut werden - Die DB wird aus zuvor heruntergeladenen Datendateien neu erstellt; alle Daten werden nicht erneut von Garmin heruntergeladen
- Die Skripte wurden unter MacOS entwickelt; Informationen und Patches für andere Plattformen sind willkommen
- Nach Abschluss eines Datenbank-Updates wird eine Zusammenfassung der DB-Daten in
stats.txtgespeichert- Enthält die Datumsbereiche der heruntergeladenen täglichen Monitoring-Dateien und Aktivitäten
- Enthält die Anzahl der Datensätze für tägliches Monitoring, Aktivitäten, Schlaf, Ruhepuls, Gewicht usw.
- Kann verwendet werden, um zu prüfen, ob alle Daten aus Garmin Connect heruntergeladen wurden
- Falls etwas fehlt, das Datum in
GarminConnectConfig.jsonanpassen und den Download erneut ausführen
- Das Element
stepsvoncourse_viewsinGarminConnectConfig.jsonist eine Liste von Kurs-IDs, für die DB-Views pro Kurs erstellt werden- Mit diesen DB-Views lassen sich alle Aktivitäten derselben Strecke vergleichen
Bug-Reports und Beiträge
- Bei Problemen einen Bug im Issues-Tab des Projekts melden
make bugreportodergarmindb_bug_report.pyausführen und die erzeugtebugreport.txtdem Bug-Report beifügen- Einer der ersten Orte für zusätzliche Informationen neben sichtbaren Fehlermeldungen ist die Logdatei
garmindb.log - Wenn ein Problem bei einer bestimmten Datendatei auftritt, sollte für Debugging und zusätzliche Unterstützung erwogen werden, diese Datei zu teilen
- Beiträge erfolgen per Pull Request gegen den Branch
develop - Vor dem Einreichen im Wurzelverzeichnis
make flake8ausführen und alle Fehler beheben
2 Kommentare
Meinungen auf Hacker News
Wer das nutzen will, sollte wissen, dass für die Authentifizierung Garth (https://github.com/matin/garth) verwendet wird.
Das ist eine ziemlich hackige Authentifizierung: Sie gibt sich als Android-App aus, und zwar so, als wäre sie eine einzelne Instanz, um den Login über das Webformular zu umgehen.
Garmin ist ein wirklich mühsames Unternehmen, wenn es um Integrationen geht, und ich verstehe nicht, warum sie alles so stark abschotten. Selbst wenn man Zugriff auf die offizielle API oder das SDK bekommt, ist die Qualität eher miserabel.
Garmin wurde 2020 von Ransomware getroffen, der Dienst war mehrere Tage lahmgelegt, am Ende zahlten sie 10 Millionen Dollar, und sie haben das Problem nicht wirklich aufgearbeitet.
Die Gründe, warum Unternehmen Daten einschließen, sind überall ähnlich: Der Nutzer ist das Produkt, und sie wollen ihn gebunden halten, damit er weiter Daten liefert.
Wenn ein besseres Gerät eines Konkurrenten erscheint, darf der Nutzer nicht einfach mit seinen eigenen Daten gehen können – denn dann müssten sie härter konkurrieren.
Garmin war historisch sehr träge, solange niemand ernsthaft Konkurrenz gemacht hat. Als der Smartwatch-Markt heiß wurde, kamen plötzlich viele Funktionen und bessere Modelle; Fahrradcomputer bekamen jahrelang keine Updates, bis Wahoo, Bryton, Coros und Hammerhead anklopften.
Bei Strava ist es ähnlich. Früher war der Datenimport und -export ziemlich frei, später wurde alles zugesperrt, sodass Datenexport fast unmöglich wurde.
Heute scheint es kostenlos zu sein, braucht aber weiterhin eine Freigabe.
https://developer.garmin.com/gc-developer-program/overview/
Für private Datennutzung oder zum Übertragen von Daten von einem Dienst zu einem anderen war tapiriik gut. Ich habe es seit Jahren nicht mehr benutzt, daher weiß ich nicht, ob das noch gilt.
https://tapiriik.com/
Design und Stabilität waren ebenfalls sehr gut. Das callbackbasierte System für Ereignis-/Punktberichte war robust, Garmin hat erneut versucht zuzustellen, selbst wenn mein Code kaputt oder instabil war, und es gab ein hervorragendes Debug-Interface, mit dem man sehen konnte, was bei Webhook-Fehlern passiert. Auch der Support war, wenn auch nicht schnell, erstklassig.
Zu Beginn der Implementierung gab es einen seltsamen Bug bei den Webhooks: Alle Events kamen doppelt an, und bei einem davon war der Event-Zeitstempel auf eine Ganzzahl in Sekunden abgeschnitten. Am User-Agent konnte man außerdem sehen, dass die abgeschnittene Variante von einer um ein paar Versionen älteren Software kam.
Ich schickte diese Analyse per E-Mail, etwa 12 Stunden später war es behoben, und noch einmal ungefähr 12 Stunden später antwortete ein echter Ingenieur, bedankte sich für die Erklärung und teilte mit, warum und wie es passiert war und was geändert wurde.
InReach, insbesondere die InReach Professional API, ist zwar eher ein professionelles Produkt als ein reines Consumer-Produkt, aber Garmin ist ein Unternehmen, das solche Dinge durchaus kann.
Ein Freund hat mir für Garmin-/Strava-Daten-Nerdkram Intervals (https://intervals.icu) empfohlen, und ich nutze es ziemlich zufrieden.
Aus Sicht eines Ruderers fand ich es gut, dass man Berichte nicht nur mit den üblichen Fahrrad-/Laufmetriken erstellen kann, sondern auch mit ruderspezifischen Metriken.
Allerdings hatte ich zuletzt ein anderes Problem, als ich Hyrox-Workouts tracken wollte. Obwohl ich eine epix gen 2 (800 Euro) habe, war es schwer, das ordentlich zu verfolgen; man kann Workouts definieren, aber es ist viel zu umständlich und funktioniert auch nicht wirklich gut.
Am Ende habe ich selbst eine App gebaut. Sie läuft auf allen Garmin-Uhren, erlaubt das Definieren fester Workouts und analysiert die Leistung pro Übung.
https://multisports.creatness.studio – wartet noch auf die Freigabe für Garmins App Store, kann aber bereits heruntergeladen und auf Garmin-Uhren sideloaded werden; ich nutze sie selbst seit einigen Wochen.
Ich glaube, ich wollte beim Aufzeichnen einer Intervallaktivität die Erholungsabschnitte dazwischen nicht mit aufzeichnen müssen, und das war umständlich.
Edit: Ich habe mich geirrt. Das war nicht Intervals.icu, ich habe es mit runalyze verwechselt.
Um alle Rohdaten aus Garmin Connect als FIT-Dateien herauszubekommen, kann man den Datenexport verwenden (https://support.garmin.com/en-US/?faq=W1TvTPW8JZ6LfJSfK512Q8)
Es gibt auch gute Open-Source-Bibliotheken, die solche Dateien lesen und interpretieren. Zum Beispiel https://github.com/polyvertex/fitdecode für Python und https://github.com/tormoder/fit für Go
Wenn man aktuelle Daten haben möchte, kann man das Gerät (Uhr, Fahrradcomputer usw.) an den Computer anschließen, es als Dateisystem mounten und die aktuellen .FIT-Dateien holen
Ich hatte früher ein Side Project gestartet, das genau das macht, es aber unterwegs aufgegeben
https://github.com/jo-m/garmin-disconnect
Es waren 196 JSON-Dateien mit insgesamt 228 MB, und alles waren nur High-Level-Zusammenfassungen
Erst mit einer der hackigen Third-Party-Exportbibliotheken konnte ich die eigentlichen FIT-Dateien bekommen: 5708 Dateien mit 373 MB. Selbst da gab es fehlende Dateien, leere Dateien und Duplikate, was extrem frustrierend war
Die Lektion war: Man sollte nicht darauf vertrauen, dass der Export eines Online-Dienstes vollständig ist oder in der erwarteten Form kommt. Wenn man von einem Dienst abhängig ist, empfehle ich dringend, den Export tatsächlich auszuprobieren und zu prüfen, ob die gewünschten Daten enthalten sind
Garmin sollte diesen Trend wirklich annehmen. Wenn die Alternative darin besteht, von Smartphone-Apps abhängig zu sein, wird Garmin langfristig ins Hintertreffen geraten
Ein großer Vorteil beim Kauf von dedizierter Hardware wie einem Garmin-Fahrradcomputer ist, dass man mehr Kontrolle über seine Daten hat
Die Dokumentation ist unfassbar schlecht, die Hälfte musste ich per Trial-and-Error herausfinden, und trotzdem weiß ich nicht, wie ich für andere Uhren als meine eigene bauen und testen soll
Ich hätte die App gerne aufpoliert und in den Store gestellt, und ich glaube, sie wäre für manche Leute nützlich, aber der nötige Aufwand wirkt deutlich größer als der Nutzen
Ich hatte eine gewisse Synergie erwartet, aber es gab keine. Wenn man dieselbe Aktivität gleichzeitig mit beiden Geräten aufzeichnet, entstehen nur Duplikate. Zum Beispiel wird die Summe der von beiden Geräten gemessenen Distanzen erfasst
Es ist eher schlechter, als zwei Geräte verschiedener Marken zu verwenden
Gibt es ähnliche Geräte, die Nutzer nicht daran hindern, auf ihre eigenen Daten zuzugreifen?
Es erstaunt mich immer wieder, wie viele Daten in Garmins altem SDK eingeschlossen sind
Zum Beispiel wird das FIT-Dateiformat, das auf allen Fahrradcomputern zum Erstellen von Workouts verwendet wird, nur von ein oder zwei Apps unterstützt
Am Ende ist es vielleicht unsere eigene Schuld, und wir müssen direkt auf dem SDK aufbauen
Für andere Zwecke als Trainingspläne gibt es deutlich mehr als zwei Apps, die FIT-Dateien lesen oder schreiben. Ich habe selbst eine davon gebaut
Es ist nicht nur schwierig, API-Zugriff zu bekommen; Garmin hört auch nicht auf die Community
Zum Beispiel kann man nicht nach Trainings ohne Ausrüstung filtern. Da ich manchmal vergesse, ein Fahrrad oder Schuhe hinzuzufügen, wäre so ein Filter hilfreich
Diesen Filter in der App oder auf der Connect-Website hinzuzufügen, wäre sehr einfach, aber ohne Community-Manager gibt es keine Möglichkeit zur Beteiligung
Hätte Garmin einen öffentlichen Tracker eingerichtet, in dem Leute Features anfragen können, könnte das Unternehmen diese prüfen, ein besseres Produkt bauen und auch mehr Geld verdienen
Ich habe diese Woche eine neue Garmin Vivoactive5 gekauft, weil meine alte Vivoactive3 kaputtgegangen ist
Im Moment bin ich ziemlich zufrieden, aber ich habe sie gekauft, obwohl ich wusste, dass Garmins API und Möglichkeiten keineswegs optimal sind
Ich habe auch die Apple Watch Series 10 in Betracht gezogen, mich aber am Ende dagegen entschieden. Der Akku hält nicht länger als 1,5 Tage, außer den Gesundheitsfunktionen würde ich Messaging oder Smart-Apps kaum nutzen, und sie war doppelt so teuer wie die Vivoactive
Ich wünschte, es gäbe eine offene Uhr, die hackbar ist, eine gute API hat, bei der man das Dashboard selbst hosten kann und die auch ordentliche Apps hat. Ich habe das Gefühl, dass es für Leute wie mich einen Markt gibt. Vielleicht kann die Wiederauferstehung von Pebble diese Lücke füllen
Ich hatte gehofft, es wäre eine Methode, Daten direkt vom Gerät zu holen und zu verfolgen, aber wie ich sehe, kommuniziert es mit der Connect API und hängt damit weiterhin an der offiziellen App
Beim Dateiformat kann man zwischen gpx, fit und tcx wählen
Ich habe das vor ein paar Monaten eingerichtet. Die Daten werden in einer lokalen SQLite-Datenbank gespeichert, und ich lasse einmal täglich ein Skript laufen, das neue Daten abruft
Es dauert deutlich länger, als ich erwartet hatte. Da die Uhr dieselben Daten in ungefähr einer Sekunde mit dem Smartphone synchronisiert, scheint intern etwas massiv ineffizient zu sein. Ich hatte noch keine Gelegenheit, mir das Innenleben genauer anzusehen
Danke. Dank Ihnen konnte ich es gut umsetzen.