2 Punkte von GN⁺ 2025-02-04 | 2 Kommentare | Auf WhatsApp teilen
  • 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.json startet garmindb_cli.py --all --download --import --analyze die 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

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.example nach ~/.GarminDb/GarminConnectConfig.json kopieren
    • 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 setup ausführen, damit die Skripte Daten verarbeiten können
    • GarminConnectConfig.json.example nach ~/.GarminDb/GarminConnectConfig.json kopieren und Konto sowie Startdatum einrichten
    • Für den ersten Datenimport und die Verarbeitung einmal make create_dbs ausführen
    • Danach regelmäßig nur make ausfü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 Jupyter des 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_db neu 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.txt gespeichert
    • 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.json anpassen und den Download erneut ausführen
  • Das Element steps von course_views in GarminConnectConfig.json ist 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 bugreport oder garmindb_bug_report.py ausführen und die erzeugte bugreport.txt dem 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 flake8 ausführen und alle Fehler beheben

2 Kommentare

 
GN⁺ 2025-02-04
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.

    • Ich nutze Garmin-Hardware, weil sie sehr zuverlässig ist, aber der Markt braucht dringend eine Open-Source-Alternative.
      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.
    • Garmin ist im Vergleich zu Strava gar nichts. Wenn man eine Integration mit Strava hat und der Nutzer die Verbindung trennt, muss man alle von Strava stammenden Daten löschen, sonst kann man den API-Zugriff verlieren.
      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.
    • Ist die Garmin-Integration immer noch so schlecht? Als ich vor ein paar Jahren eine Integration gebaut habe, die aus GPS-Routendaten Poster erstellt, war sie ungefähr auf dem Niveau von Strava oder RunKeeper. Später wurden die Nutzungsbedingungen geändert und man verlangte etwa 10.000 Dollar als Anschlussgebühr.
      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/
    • Meine Erfahrung ist genau das Gegenteil. Ich nutze seit Jahren die InReach API; der Preis war vernünftig, es gab außer dem InReach-Abo keine zusätzlichen Kosten, und der Zugang war unkompliziert: Nach einer E-Mail bekam ich innerhalb von ein bis drei Tagen API-Dokumentation und Zugriff.
      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.
    • Garmins Consumer-/Retail-Seite halte ich für ein Chaos. Ich habe kürzlich auf der Garmin-Website einen HRM bestellt; der Bestellstatus blieb über eine Woche lang auf „ordered“, und am Ende habe ich storniert und bei Amazon gekauft.
  • 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.

    • Gute App, den Dienst kannte ich nicht. Fürs Radfahren wirkt er ziemlich ausgereift.
      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 habe es vor ein paar Jahren ausprobiert und erinnere mich, dass mich die geforderte Struktur für Laufintervalle frustriert hat.
      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.
    • Intervals.icu ist großartig und es absolut wert, es finanziell zu unterstützen. Es macht Spaß, die Entwicklung des Fortschritts über die Zeit zu sehen, und die anpassbaren Charts sind ebenfalls gut.
    • Bei der Formulierung „wir können personenbezogene Daten verwenden, um Newsletter, Marketing- oder Werbematerialien und andere Informationen zu senden, die für Sie von Interesse sein könnten“ war ich sofort wieder weg.
  • 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

    • Hast du schon einmal alle Rohdaten von Garmin exportiert? Ich habe Verlaufsdaten aus 15 Jahren, und in diesem Dump war keine einzige fit/gpx/tcx-Datei
      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

    • Ich wünschte, Garmin würde SDK und Dokumentation verbessern. Ich habe für den Eigengebrauch eine einfache App gebaut und habe dadurch deutlich mehr Respekt vor Leuten bekommen, die Garmin-Uhren-Apps entwickeln
      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 habe zwei Garmin-Geräte: eine Uhr und einen Fahrradcomputer. Beide sind mit derselben App verbunden und sammeln Daten in einem Garmin-Connect-Konto
      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
    • Die WorkOutDoors-App und Strava bieten beide vollständigen Zugriff auf GPX-Daten
    • Auf der Website kann man alles ansehen und herunterladen
  • Gibt es ähnliche Geräte, die Nutzer nicht daran hindern, auf ihre eigenen Daten zuzugreifen?

    • Wenn Apple alles abschottet, kommt von Apples Marketing oder den Leuten, die darauf hereinfallen, die Reaktion: „Gut, weil es sicher ist“; wenn Garmin/Google/andere Firmen das tun, heißt es: „Dumm, ich sollte meine Sachen nutzen können“
  • 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

    • Die Garmin-Connect-Website scheint zum Erstellen strukturierter Workouts gut zu funktionieren. Sie kann auch mit TrainingPeaks synchronisieren. Was braucht man darüber hinaus noch?
      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

    • Aktivitätsdaten sind einfach FIT-Dateien, auf die man per USB zugreifen kann
    • Ich habe diesen Ansatz aufgegeben und nutze jetzt http://www.rungap.com/, um Garmin-Daten über die API herauszuziehen und in iCloud-Speicher zu legen
      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

 
qor0923 3 일 전

Danke. Dank Ihnen konnte ich es gut umsetzen.