GarminDB - Garmin Connectöründen/saatinden veri alıp ayrıştıran veritabanı
(github.com/tcgoetz)- GarminDB, Garmin Connect'in sağlık ve aktivite verilerini indirip SQLite veritabanına ayrıştıran ve bunların komut satırında ya da Jupyter Notebook içinde analiz edilip grafiğe dökülmesini sağlayan bir Python betikleri koleksiyonudur
- Otomatik olarak alınabilen veriler günlük izleme dosyaları, uyku, kilo, dinlenik kalp atış hızı ve aktivite dosyalarıdır; bazı aktivite türlerinde tur ve kayıt girdileri de daha ayrıntılı biçimde saklanır
- İndirilen JSON ve FIT dosyaları korunduğu için Garmin Connect'e yeniden bağlanmadan veya tekrar indirme yapmadan veritabanı yeniden oluşturulabilir
- PyPI paketi olarak kurulabilir;
GarminConnectConfig.jsoniçinde Garmin Connect hesabı ve başlangıç tarihi ayarlandıktan sonragarmindb_cli.py --all --download --import --analyzeile tüm veri toplama ve analiz süreci başlatılır - Eklentiler aracılığıyla üçüncü taraf Connect IQ uygulamaları ve veri alanları için işleme kapsamı genişletilebilir; veritabanı şeması güncellendikten sonra mevcut indirme dosyalarıyla veritabanını yeniden oluşturmak gerekebilir
GarminDB ne yapar
- GarminDB, sağlık verilerini SQLite veritabanına ayrıştırmak ve işlemek için hazırlanmış bir Python betik koleksiyonudur
- SQLite, sunucu gerektirmeyen hafif bir veritabanı olarak kullanılır
- Desteklenen özellikler:
- Garmin Connect'in “Daily Summary” sayfasından günlük izleme dosyalarını otomatik olarak indirir ve içe aktarır
- Gün boyu kalp atış hızı
- Aktiviteler
- Yükselme/alçalma
- Stres
- Yoğunluk süresi
- Garmin Connect'ten uyku, kilo, dinlenik kalp atış hızı verilerini çekip JSON dosyaları olarak kaydeder ve veritabanına aktarır
- Garmin Connect'ten aktivite dosyalarını indirir ve içe aktarır
- Tüm aktiviteler için özet tablo oluşturur
- Bazı aktivite türlerinde daha ayrıntılı veri saklar
- Aktivite bazında tur ve kayıt girdilerini içerir
- Verileri günlük, haftalık, aylık ve yıllık özet tablolar içeren bir veritabanında özetler
- Verileri komut satırı veya Jupyter Notebook ile grafik olarak gösterir
- İndirilen JSON ve FIT dosyalarını saklayarak Garmin Connect'e yeniden bağlanmadan veya tekrar indirme yapmadan veritabanını yeniden oluşturabilir
- Aktiviteleri TCX dosyası olarak dışa aktarabilir
- Garmin Connect'in “Daily Summary” sayfasından günlük izleme dosyalarını otomatik olarak indirir ve içe aktarır
Veri keşfi ve analiz
- Veriler veritabanına girdikten sonra sağlanan Jupyter Notebook'lar, üçüncü taraf Jupyter Notebook'lar veya SQLite tarayıcılarıyla veriler keşfedilip işlenebilir
- Kullanılabilecek SQLite tarayıcı örnekleri:
- Betikler, veri keşfini kolaylaştırmak için veritabanı içinde temel views oluşturur
Kurulum ve temel kullanım akışı
- GarminDb sürümleri PyPI üzerinde yer alır ve Python 3.x gerektirir
- En güncel sürümü kurmak için:
pip install garmindb
- İlk kurulum:
GarminConnectConfig.json.exampledosyasını~/.GarminDb/GarminConnectConfig.jsonkonumuna kopyalayın- Dosyayı düzenleyip Garmin Connect kullanıcı adı ve parolasını ekleyin
- Başlangıç tarihini Garmin Connect'teki veri tarihine göre ayarlayın
- İlk kez tüm verileri indirip veritabanını oluşturmak için komut:
garmindb_cli.py --all --download --import --analyze
- Sonrasında yalnızca en güncel verileri indirip içe aktarmak için artımlı güncelleme komutu:
garmindb_cli.py --all --download --import --analyze --latest
- Veritabanı yedeği ara sıra şu komutla alınır:
garmindb_cli.py --backup
- En son sürüme güncellemek için:
pip install --upgrade garmindb
Kaynaktan çalıştırma
- Kaynak ağacındaki betikler Make ile otomatikleştirilmiştir
- Kaynak tabanlı kullanım süreci:
- GarminDB deposunu SSH ile klonlayın
- Alt modüller nedeniyle HTTPS yerine SSH kullanılmalıdır
- Klonlanan ağaçta
make setupçalıştırarak betikleri veri işlemeye hazır hale getirin GarminConnectConfig.json.exampledosyasını~/.GarminDb/GarminConnectConfig.jsonkonumuna kopyalayın ve hesap ile başlangıç tarihini ayarlayın- İlk veri alma ve işleme için
make create_dbskomutunu bir kez çalıştırın - Sonrasında yerel verileri güncel tutmak için düzenli olarak yalnızca
makeçalıştırın
- Ek kullanım bilgileri wiki'deki kullanım belgelerinde yer alır
Jupyter Notebook ve eklentiler
- Veritabanındaki verileri analiz etmek için Jupyter Notebook dosyaları kaynak ağacındaki
Jupyterdizininde bulunur - Kullanıcıların gönderdiği Notebook bağlantıları wiki'deki ilgili projeler sayfasında yer alır
- Eklentiler, işlenen ve veritabanında saklanan veri türlerini genişletebilir
- GarminDb içinde, üçüncü taraf Connect IQ uygulamaları ve veri alanları verilerini işlemek için halihazırda birden fazla eklenti bulunur
- Eklentilerle ilgili ayrıntılar GarminDbPlugins sayfasında yer alır
Operasyon sırasında dikkat edilmesi gerekenler
- Kod güncellemesinden sonra veritabanı sürümü istisnası oluşabilir
- Bu, veritabanı şemasının güncellendiği anlamına gelir
- Veritabanı
garmindb_cli.py --rebuild_dbile yeniden oluşturulmalıdır - Veritabanı, daha önce indirilen veri dosyalarından yeniden üretilir; tüm veriler Garmin'den yeniden indirilmez
- Betikler MacOS üzerinde geliştirilmiştir; diğer platformlara dair kullanım bilgileri ve yamalar kabul edilir
- Veritabanı güncellemesi tamamlandığında veritabanı veri özeti
stats.txtiçine kaydedilir- İndirilen günlük izleme dosyaları ve aktivitelerin tarih aralığı yer alır
- Günlük izleme, aktivite, uyku, dinlenik kalp atış hızı, kilo gibi kayıtların sayısı yer alır
- Tüm verilerin Garmin Connect'ten indirilip indirilmediğini doğrulamak için kullanılabilir
- Eksik varsa
GarminConnectConfig.jsoniçindeki tarihi ayarlayıp indirmeyi yeniden çalıştırın
GarminConnectConfig.jsoniçindekicourse_viewsbölümününstepsöğesi, kurs bazlı veritabanı görünümleri oluşturulacak kurs kimliklerinin listesidir- Bu veritabanı görünümleriyle aynı kurstaki tüm aktiviteler karşılaştırılabilir
Hata raporları ve katkı
- Sorun yaşanırsa projenin Issues sekmesinde hata kaydı açın
make bugreportveyagarmindb_bug_report.pyçalıştırın ve oluşanbugreport.txtdosyasını hata raporuna ekleyin- Ekranda görünen hatalara ek olarak ilave bilgi kontrol edilecek ilk yerlerden biri log dosyası
garmindb.logolacaktır - Belirli bir veri dosyasında sorun çıkıyorsa hata ayıklama ve destek eklenebilmesi için ilgili dosyayı paylaşmayı değerlendirin
- Katkılar için Pull Request'ler
developdalını hedeflemelidir - Göndermeden önce üst dizinde
make flake8çalıştırılmalı ve tüm hatalar düzeltilmelidir
2 yorum
Hacker News yorumları
Bunu kullanmak isteyenlerin, kimlik doğrulama için Garth(https://github.com/matin/garth) kullandığını bilmesinde fayda var.
Android uygulaması gibi davranıp, üstelik tek bir örnekmiş gibi taklit ederek web formu girişini atlatan epey hacky bir kimlik doğrulama yapıyor.
Garmin entegrasyon yapması gerçekten eziyetli bir şirket ve neden bu kadar sıkı kilitlediklerini bilmiyorum. Resmî API veya SDK erişimi alsanız bile kalitesi genelde berbat.
Garmin 2020’de bir fidye yazılımı saldırısına uğradı; hizmetleri günlerce çöktükten sonra 10 milyon dolar ödedi, ama bu sorunu doğru düzgün ele almadı.
Şirketlerin verileri kilitlemesinin nedeni hep benzer. Ürün kullanıcıdır; onu bağlı tutup verisini beslemeye devam etmek isterler.
Rakibin daha iyi bir cihazı çıktığında kullanıcının verisini alıp gitmemesi gerekir; çünkü öyle olursa daha sıkı rekabet etmeleri gerekir.
Garmin’in, biri gerçekten rekabet edene kadar çok tembel davranma gibi bir geçmişi var. Akıllı saat pazarı kızışınca özellikler ve daha iyi modeller birdenbire yağmaya başladı; bisiklet bilgisayarları da Wahoo, Bryton, Coros ve Hammerhead kapıyı çalana kadar yıllarca güncellenmeden kaldı.
Strava da benzer. Eskiden veri içe/dışa aktarma oldukça serbestti, ama sonra kilitlediler ve veri dışa aktarmayı neredeyse imkânsız hale getirdiler.
Şimdi ücretsiz görünüyor ama hâlâ onay gerekiyor.
https://developer.garmin.com/gc-developer-program/overview/
Verileri kişisel amaçla kullanmak veya bir hizmetten diğerine göndermek için tapiriik iyiydi. Birkaç yıldır kullanmadığım için hâlâ öyle mi bilmiyorum.
https://tapiriik.com/
Tasarımı ve kararlılığı da çok iyiydi. Geri çağrı tabanlı event/point raporlama sistemi sağlamdı; benim kodum bozulsa veya kararsız olsa bile Garmin tarafı yeniden deniyordu ve webhook başarısız olduğunda ne olduğunu görebileceğiniz hata ayıklama arayüzü de harikaydı. Destek de hızlı olmasa bile üst düzeydi.
Uygulamanın ilk aşamalarında webhook’ta garip bir hata vardı: tüm olaylar iki kez geliyordu ve bunlardan birinde olay zaman damgası saniye cinsinden tam sayıya kırpılmıştı. User agent’a bakınca kırpılan tarafın birkaç sürüm eski bir yazılım olduğu da görülüyordu.
Bu analizi e-postayla gönderdim; yaklaşık 12 saat sonra düzeltildi ve yine yaklaşık 12 saat sonra gerçek bir mühendis yanıt yazıp açıklama için teşekkür etti, sorunun neden ve nasıl oluştuğunu ve neyi düzelttiklerini anlattı.
InReach, özellikle InReach Professional API, saf tüketici ürününden çok profesyonel ürüne yakın; ama Garmin bu tür işleri yapmayı bilen bir şirket.
Bir arkadaşım Garmin/Strava verileriyle uğraşmak için Intervals(https://intervals.icu)’i önerdi; oldukça memnun kullanıyorum.
Kürek çeken biri olarak, yalnızca yaygın bisiklet/koşu metrikleri değil kürekle ilgili metrikler içeren raporlar oluşturabilmek hoşuma gitti.
Ancak yakın zamanda Hyrox antrenmanını takip etmeye çalışırken başka bir sorun yaşadım. epix gen 2(800 avro) olmasına rağmen düzgün takip etmek zordu; antrenman tanımlanabiliyor ama çok zahmetli ve iyi de çalışmıyordu.
Sonunda kendi uygulamamı yaptım. Tüm Garmin saatlerde çalışıyor; sabit antrenmanlar tanımlayıp her egzersiz için performansı analiz edebiliyorsunuz.
https://multisports.creatness.studio - hâlâ Garmin’in uygulama mağazası gönderim onayını bekliyor, ama şimdiden indirip Garmin saatinize sideload edebilirsiniz; ben de birkaç haftadır bizzat kullanıyorum.
Interval aktivitesi kaydederken aradaki dinlenme bölümlerinin birlikte kaydedilmediği bir format istiyor gibiydi, bu yüzden rahatsız ediciydi.
Düzenleme: Yanlış hatırlamışım. Bu Intervals.icu değil, runalyze ile karıştırmışım.
Garmin Connect’ten tüm ham verileri FIT dosyası olarak çıkarmak için veri dışa aktarmayı (https://support.garmin.com/en-US/?faq=W1TvTPW8JZ6LfJSfK512Q8) kullanmak yeterli
Bu tür dosyaları okuyup yorumlayan iyi açık kaynak kütüphaneler de var. Örneğin Python için https://github.com/polyvertex/fitdecode, Go için https://github.com/tormoder/fit var
Güncel verileri almak istiyorsanız cihazı (saat, bisiklet bilgisayarı vb.) bilgisayara bağlayıp dosya sistemi olarak mount ettikten sonra mevcut .FIT dosyasını alabilirsiniz
Eskiden tam olarak bunu yapan bir yan proje başlatmıştım ama yarıda bıraktım
https://github.com/jo-m/garmin-disconnect
196 adet json dosyası vardı, toplam 228 MB’tı ve hepsi yalnızca üst düzey özetlerden ibaretti
Ancak hacky üçüncü taraf dışa aktarma kütüphanelerinden birini kullanınca gerçek fit dosyalarını alabildim; 5708 dosya, 373 MB. Onda bile eksik dosyalar, boş dosyalar ve yinelenen dosyalar vardı; çok can sıkıcıydı
Çevrim içi bir hizmetin dışa aktarımının eksiksiz olacağına ya da beklediğiniz biçimde geleceğine güvenmemek gerektiği dersini aldım. Bağımlı olduğunuz bir hizmetse, gerçekten dışa aktarıp istediğiniz verinin içinde olup olmadığını kontrol etmenizi şiddetle öneririm
Garmin’in bu akımı gerçekten benimsemesi gerekiyor. Alternatif akıllı telefon uygulamalarına bağımlı olmaksa, uzun vadede Garmin geri düşer
Garmin bisiklet bilgisayarı gibi özel donanım satın almanın büyük avantajı, veriler üzerinde daha fazla kontrole sahip olmaktır
Dokümantasyon inanılmaz derecede kötü; yarısını deneme yanılmayla çözmek zorunda kaldım ve yine de elimdeki saat dışındaki saatlerde nasıl build edip test edeceğimi bilmiyorum
Uygulamayı memnuniyetle toparlayıp mağazaya koymak isterdim ve bazı insanlara faydalı olacağını düşünüyorum, ama gereken emek sağlayacağı değerden çok daha büyük görünüyor
Bir miktar sinerji bekliyordum ama hiçbir şey yoktu. Aynı aktiviteyi iki cihazla aynı anda kaydederseniz sadece kopya oluşuyor. Örneğin iki cihazın ölçtüğü mesafelerin toplamı kaydediliyor
Hatta farklı markalardan iki cihaz kullanmaktan bile daha kötü
Kullanıcının kendi verilerine erişmesini engellemeyen benzer cihazlar var mı?
Garmin’in eski SDK’sının içinde ne kadar çok verinin kilitli olduğuna her zaman şaşırıyorum
Örneğin tüm bisiklet bilgisayarlarında antrenman programı yazmak için kullanılan FIT dosya biçimi yalnızca bir iki uygulama tarafından destekleniyor
Sonuçta bu bizim hatamız da olabilir; belki de SDK’nın üzerine doğrudan bizim inşa etmemiz gerekiyordur
Antrenman planlaması dışındaki amaçlar için FIT dosyası okuyan ya da yazan uygulama sayısı ikiden çok daha fazla. Ben de bunlardan birini yaptım
Sorun yalnızca API erişiminin zor olması değil; Garmin topluluğun sesini dinlemiyor
Örneğin ekipmansız antrenmanlara göre filtreleme yapılamıyor. Bazen bisiklet ya da ayakkabı eklemeyi unuttuğum için böyle bir filtre yardımcı olurdu
Uygulamaya ya da Connect web sitesine bu filtreyi eklemek çok kolay olurdu, ama bir topluluk yöneticisi olmadığı için katılım mümkün değil
Açık bir takip sistemi koyup insanların özellik talep etmesine izin verseydi, Garmin bunları inceleyip daha iyi bir ürün yapabilir ve daha fazla para kazanabilirdi
Bu hafta yeni bir Garmin Vivoactive5 aldım. Eski Vivoactive3’üm bozulduğu için
Şu an oldukça memnunum ama Garmin’in API’sinin ve sunduğu olanakların hiç de optimum olmadığını bilerek aldım
Apple Watch Series 10’u da düşündüm ama sonunda vazgeçtim. Pili 1,5 günden fazla gitmiyor; sağlık özellikleri dışında mesajlaşma ya da akıllı uygulamaları pek kullanacak değilim ve Vivoactive’in iki katı fiyattaydı
Hacklenebilir, iyi bir API’si olan, panoyu kendi sunucumda barındırabileceğim ve uygulamaları da fena olmayan açık bir saat olsa güzel olurdu. Benim gibi insanlar için bir pazar olduğunu düşünüyorum. Pebble’ın yeniden doğuşu bu boşluğu doldurabilir belki
Verileri doğrudan cihazdan alıp izleyen bir yöntem olmasını ummuştum; ama bakınca Connect API ile iletişim kuran bir yöntemmiş, yani hâlâ resmi uygulamaya bağlı
Dosya biçimi olarak da gpx, fit, tcx arasından seçim yapılabiliyor
Bunu birkaç ay önce kurdum. Verileri yerel bir sqlite veritabanında saklıyor ve günde bir kez yeni verileri alan bir betik çalıştırıyorum
Beklediğimden epey uzun sürüyor. Saatin aynı verileri telefonla senkronize etmesi yaklaşık 1 saniye sürdüğüne göre içeride ciddi bir verimsizlik var gibi. Henüz içini ayrıntılı inceleme fırsatım olmadı
Teşekkürler. Sayenizde sorunsuzca uyguladım.