2 điểm bởi GN⁺ 2025-02-04 | 2 bình luận | Chia sẻ qua WhatsApp
  • GarminDB là một bộ script Python giúp tải dữ liệu sức khỏe và hoạt động từ Garmin Connect, phân tích chúng thành cơ sở dữ liệu SQLite, rồi cho phép phân tích và vẽ biểu đồ từ dòng lệnh hoặc Jupyter Notebook
  • Dữ liệu có thể tự động lấy gồm tệp theo dõi hằng ngày, giấc ngủ, cân nặng, nhịp tim lúc nghỉ và tệp hoạt động; một số loại hoạt động còn được lưu chi tiết hơn tới cả lap và mục bản ghi
  • Các tệp JSON và FIT đã tải xuống được giữ lại, nên có thể tái tạo CSDL mà không cần đăng nhập lại Garmin Connect hay tải lại dữ liệu
  • Có thể cài dưới dạng gói PyPI; sau khi cấu hình tài khoản Garmin Connect và ngày bắt đầu trong GarminConnectConfig.json, chạy garmindb_cli.py --all --download --import --analyze để bắt đầu thu thập và phân tích toàn bộ dữ liệu
  • Có thể mở rộng phạm vi xử lý của ứng dụng Connect IQ và trường dữ liệu bên thứ ba thông qua plugin; sau khi cập nhật schema CSDL, có thể cần dựng lại CSDL từ các tệp đã tải trước đó

GarminDB làm gì

  • GarminDB là một bộ script Python để phân tích và thao tác dữ liệu sức khỏe thành cơ sở dữ liệu SQLite
  • SQLite được dùng như một cơ sở dữ liệu nhẹ không cần máy chủ
  • Tính năng được hỗ trợ:
    • Tự động tải xuống và nhập các tệp theo dõi hằng ngày từ trang “Daily Summary” của Garmin Connect
      • Nhịp tim cả ngày
      • Hoạt động
      • Tăng/giảm độ cao
      • Căng thẳng
      • Thời gian cường độ
    • Trích xuất dữ liệu giấc ngủ, cân nặng, nhịp tim lúc nghỉ từ Garmin Connect, lưu thành tệp JSON và nhập vào CSDL
    • Tải xuống và nhập các tệp hoạt động từ Garmin Connect
      • Tạo bảng tóm tắt cho mọi hoạt động
      • Một số loại hoạt động được lưu dữ liệu chi tiết hơn
      • Bao gồm lap và mục bản ghi theo từng hoạt động
    • Tóm tắt dữ liệu vào CSDL có các bảng tổng hợp theo ngày, tuần, tháng và năm
    • Hiển thị dữ liệu dưới dạng biểu đồ bằng dòng lệnh hoặc Jupyter Notebook
    • Giữ lại các tệp JSON và FIT đã tải xuống để có thể tái tạo CSDL mà không cần truy cập lại Garmin Connect hoặc tải lại dữ liệu
    • Có thể xuất hoạt động thành tệp TCX

Khám phá và phân tích dữ liệu

  • Sau khi dữ liệu đã vào CSDL, có thể dùng Jupyter Notebook đi kèm, Jupyter Notebook của bên thứ ba hoặc trình duyệt SQLite để khám phá và làm việc với dữ liệu
  • Ví dụ các trình duyệt SQLite có thể dùng:
  • Script tạo sẵn các view cơ bản trong CSDL để giúp việc khám phá dữ liệu dễ dàng hơn

Cài đặt và quy trình sử dụng cơ bản

  • Bản phát hành GarminDb có trên PyPI và yêu cầu Python 3.x
  • Cài bản phát hành mới nhất:
    • pip install garmindb
  • Thiết lập ban đầu:
    • Sao chép GarminConnectConfig.json.example thành ~/.GarminDb/GarminConnectConfig.json
    • Chỉnh sửa tệp để thêm tên người dùng và mật khẩu Garmin Connect
    • Điều chỉnh ngày bắt đầu cho khớp với thời điểm có dữ liệu trên Garmin Connect
  • Lệnh tải toàn bộ dữ liệu và tạo CSDL khi bắt đầu lần đầu:
    • garmindb_cli.py --all --download --import --analyze
  • Sau đó, lệnh cập nhật gia tăng chỉ tải và nhập dữ liệu mới nhất:
    • garmindb_cli.py --all --download --import --analyze --latest
  • Thỉnh thoảng sao lưu CSDL bằng lệnh sau
    • garmindb_cli.py --backup
  • Cập nhật lên bản phát hành mới nhất:
    • pip install --upgrade garmindb

Chạy từ mã nguồn

  • Các script trong cây mã nguồn được tự động hóa bằng Make
  • Quy trình sử dụng dựa trên mã nguồn:
    • Clone kho lưu trữ GarminDB bằng SSH
    • Phải dùng SSH thay vì HTTPS do có submodule
    • Trong cây mã đã clone, chạy make setup để chuẩn bị cho script xử lý dữ liệu
    • Sao chép GarminConnectConfig.json.example thành ~/.GarminDb/GarminConnectConfig.json và cấu hình tài khoản cùng ngày bắt đầu
    • Với lần nhập và xử lý dữ liệu đầu tiên, chạy make create_dbs một lần
    • Sau đó, để giữ dữ liệu cục bộ luôn mới, chỉ cần chạy make định kỳ
  • Cách dùng bổ sung có trong tài liệu sử dụng trên wiki

Jupyter Notebook và plugin

  • Các Jupyter Notebook để phân tích dữ liệu trong cơ sở dữ liệu nằm trong thư mục Jupyter của cây mã nguồn
  • Liên kết tới các Notebook do người dùng gửi có trong trang dự án liên quan trên wiki
  • Plugin cho phép mở rộng các loại dữ liệu được xử lý và lưu vào CSDL
  • GarminDb đã có sẵn nhiều plugin để xử lý dữ liệu từ ứng dụng Connect IQ và trường dữ liệu của bên thứ ba
  • Thông tin chi tiết về plugin có trong GarminDbPlugins

Những điểm cần lưu ý khi vận hành

  • Sau khi cập nhật mã, có thể phát sinh ngoại lệ về phiên bản CSDL
    • Điều này có nghĩa là schema CSDL đã được cập nhật
    • Cần dựng lại CSDL bằng garmindb_cli.py --rebuild_db
    • CSDL sẽ được tạo lại từ các tệp dữ liệu đã tải trước đó, không tải lại toàn bộ dữ liệu từ Garmin
  • Script được phát triển trên MacOS và chấp nhận thông tin sử dụng hay bản vá cho các nền tảng khác
  • Khi cập nhật cơ sở dữ liệu hoàn tất, bản tóm tắt dữ liệu CSDL sẽ được lưu vào stats.txt
    • Bao gồm khoảng ngày của các tệp theo dõi hằng ngày và hoạt động đã tải về
    • Bao gồm số lượng bản ghi như theo dõi hằng ngày, hoạt động, giấc ngủ, nhịp tim lúc nghỉ, cân nặng
    • Có thể dùng để xác minh rằng mọi dữ liệu đã được tải từ Garmin Connect
    • Nếu bị thiếu, hãy điều chỉnh ngày trong GarminConnectConfig.json và chạy tải xuống lại
  • Trong GarminConnectConfig.json, phần tử steps của course_views là danh sách ID khóa học/tuyến đường để tạo view CSDL theo từng course
    • Các view CSDL đó cho phép so sánh mọi hoạt động trên cùng một course

Báo lỗi và đóng góp

  • Nếu có vấn đề, hãy tạo bug trên tab Issues của dự án
  • Chạy make bugreport hoặc garmindb_bug_report.py, rồi đính kèm bugreport.txt đã tạo vào báo cáo lỗi
  • Ngoài lỗi hiển thị trên màn hình, một trong những nơi đầu tiên nên kiểm tra thêm thông tin là tệp log garmindb.log
  • Nếu vấn đề xảy ra với một tệp dữ liệu cụ thể, hãy cân nhắc chia sẻ tệp đó để phục vụ gỡ lỗi và bổ sung hỗ trợ
  • Đóng góp nên gửi Pull Request nhắm vào nhánh develop
  • Trước khi gửi, cần chạy make flake8 ở thư mục gốc và sửa mọi lỗi

2 bình luận

 
GN⁺ 2025-02-04
Ý kiến trên Hacker News
  • Ai định dùng cái này nên biết rằng phần xác thực dùng Garth(https://github.com/matin/garth)
    Nó thực hiện kiểu xác thực khá hacky: giả làm ứng dụng Android, lại còn giả như một instance duy nhất để lách đăng nhập bằng biểu mẫu web
    Garmin là một công ty cực kỳ khó chịu khi tích hợp, và tôi không hiểu vì sao họ khóa chặt đến vậy. Ngay cả khi được cấp quyền truy cập API hoặc SDK chính thức thì chất lượng cũng thường rất tệ

    • Tôi dùng phần cứng Garmin vì nó rất đáng tin cậy, nhưng thị trường rất cần một giải pháp thay thế mã nguồn mở
      Garmin từng bị tấn công ransomware vào năm 2020, dịch vụ ngừng hoạt động trong vài ngày và cuối cùng đã trả 10 triệu USD, nhưng họ cũng chẳng xử lý vấn đề đó cho ra trò
    • Garmin chẳng là gì so với Strava. Nếu bạn tích hợp với Strava rồi người dùng ngắt kết nối, bạn phải xóa toàn bộ dữ liệu đến từ Strava, nếu không có thể mất quyền truy cập API
      Lý do các công ty khóa dữ liệu thì đều tương tự nhau. Người dùng là sản phẩm, và họ muốn giữ người dùng bị trói buộc để tiếp tục nuôi dữ liệu
      Họ không muốn khi một thiết bị tốt hơn của đối thủ xuất hiện, người dùng có thể mang dữ liệu của mình đi, vì như thế họ sẽ phải cạnh tranh chăm chỉ hơn
      Garmin có lịch sử rất lười biếng cho đến khi có ai đó thực sự cạnh tranh. Khi thị trường smartwatch nóng lên, các tính năng và model tốt hơn đột nhiên xuất hiện ồ ạt; còn máy tính xe đạp thì nhiều năm không được cập nhật cho đến khi Wahoo, Bryton, Coros, Hammerhead gõ cửa
      Strava cũng tương tự. Trước đây dữ liệu ra/vào khá tự do, nhưng sau đó họ khóa lại, khiến việc xuất dữ liệu gần như bất khả thi
    • Tích hợp với Garmin vẫn tệ đến vậy à? Vài năm trước, khi tôi làm một tích hợp để tạo poster từ dữ liệu GPS lộ trình, nó gần như tương tự Strava hay RunKeeper, nhưng sau đó điều khoản sử dụng thay đổi và họ đòi khoảng 10.000 USD phí kết nối
      Bây giờ có vẻ miễn phí, nhưng vẫn cần được phê duyệt
      https://developer.garmin.com/gc-developer-program/overview/
      Nếu dùng dữ liệu cho mục đích cá nhân hoặc gửi từ dịch vụ này sang dịch vụ khác thì tapiriik từng là lựa chọn tốt. Tôi không dùng vài năm rồi nên không biết giờ còn vậy không
      https://tapiriik.com/
    • Trải nghiệm của tôi thì hoàn toàn ngược lại. Tôi đã dùng InReach API vài năm nay, giá hợp lý, không có chi phí thêm ngoài phí thuê bao InReach, việc truy cập cũng dễ: gửi email xong trong vòng một đến ba ngày là nhận được tài liệu API và quyền truy cập
      Thiết kế và độ ổn định cũng rất tốt. Hệ thống báo cáo sự kiện/điểm dựa trên callback rất vững, nếu code của tôi bị lỗi hoặc không ổn định thì phía Garmin sẽ thử lại, và họ còn có giao diện debug tuyệt vời để xem điều gì xảy ra khi webhook thất bại. Hỗ trợ tuy không nhanh nhưng thuộc hàng xuất sắc
      Giai đoạn đầu triển khai, webhook có một lỗi lạ: mọi sự kiện đều đi vào hai lần, và một trong hai cái có timestamp sự kiện bị cắt thành số nguyên theo giây. Nhìn user agent còn thấy phía bị cắt đang chạy phần mềm cũ hơn vài phiên bản
      Tôi gửi phân tích này qua email, khoảng 12 giờ sau thì được sửa, rồi khoảng 12 giờ nữa một kỹ sư thật sự trả lời, cảm ơn phần giải thích và cho biết lỗi xảy ra vì sao, như thế nào, cùng nội dung sửa
      InReach, đặc biệt là InReach Professional API, đúng là gần với sản phẩm chuyên nghiệp hơn là sản phẩm tiêu dùng thuần túy, nhưng Garmin là công ty biết cách làm những việc như vậy
    • Tôi nghĩ mảng tiêu dùng/bán lẻ của Garmin thì rất lộn xộn. Gần đây tôi đặt mua HRM trên website Garmin, trạng thái đơn hàng bị kẹt ở “ordered” hơn một tuần, cuối cùng tôi hủy và mua trên Amazon
  • Một người bạn giới thiệu Intervals(https://intervals.icu) để vọc dữ liệu liên quan đến Garmin/Strava, và tôi đang dùng khá hài lòng
    Với tư cách người chèo thuyền, tôi thích việc có thể tạo báo cáo không chỉ gồm các chỉ số đạp xe/chạy bộ phổ biến mà còn có các chỉ số liên quan đến chèo thuyền

    • Ứng dụng tốt, là dịch vụ trước đây tôi chưa biết. Nhìn có vẻ khá tinh vi cho đạp xe
      Tuy nhiên gần đây tôi gặp một vấn đề khác khi cố theo dõi bài tập Hyrox. Dù có epix gen 2(800 euro), vẫn rất khó theo dõi cho đúng; có thể định nghĩa bài tập, nhưng quá rườm rà và cũng không hoạt động tốt
      Cuối cùng tôi tự làm một ứng dụng. Nó chạy trên mọi đồng hồ Garmin, cho phép định nghĩa các bài tập cố định rồi phân tích thành tích theo từng bài tập
      https://multisports.creatness.studio - vẫn đang chờ Garmin phê duyệt nộp lên app store, nhưng đã có thể tải về và sideload vào đồng hồ Garmin, tôi cũng đã tự dùng vài tuần nay
    • Tôi đã dùng thử vài năm trước, và nhớ là khá bực vì cách nó yêu cầu định dạng interval cho chạy bộ
      Có vẻ khi ghi lại hoạt động interval, tôi muốn một định dạng không ghi kèm các đoạn nghỉ ở giữa, nên thấy bất tiện
      Sửa: Tôi nhầm rồi. Không phải Intervals.icu mà tôi nhầm với runalyze
    • Intervals.icu rất tuyệt, hoàn toàn đáng trả tiền để ủng hộ. Thú vị khi xem sự tiến bộ thay đổi theo thời gian, và khả năng tùy chỉnh biểu đồ cũng tốt
    • Thấy câu “chúng tôi có thể sử dụng dữ liệu cá nhân để gửi bản tin, tài liệu marketing hoặc quảng bá và các thông tin khác mà bạn có thể quan tâm” là tôi thoát ra ngay
  • Nếu muốn lấy toàn bộ dữ liệu thô từ Garmin Connect dưới dạng tệp FIT, có thể dùng tính năng xuất dữ liệu (https://support.garmin.com/en-US/?faq=W1TvTPW8JZ6LfJSfK512Q8)
    Cũng có những thư viện mã nguồn mở tốt để đọc và diễn giải các tệp này. Ví dụ có https://github.com/polyvertex/fitdecode cho Python, https://github.com/tormoder/fit cho Go
    Nếu muốn lấy dữ liệu hiện tại, có thể kết nối thiết bị (đồng hồ, máy tính xe đạp, v.v.) với máy tính, mount nó như một hệ thống tệp rồi lấy các tệp .FIT hiện tại
    Trước đây tôi đã bắt đầu một side project làm đúng việc đó, nhưng bỏ dở giữa chừng
    https://github.com/jo-m/garmin-disconnect

    • Bạn đã từng xuất toàn bộ dữ liệu thô từ Garmin chưa? Tôi có 15 năm dữ liệu ghi lại, nhưng trong bản dump đó không có một tệp fit/gpx/tcx nào
      Có 196 tệp json, tổng cộng 228MB, và tất cả chỉ là các bản tóm tắt cấp cao
      Chỉ khi dùng một trong các thư viện xuất dữ liệu bên thứ ba khá hacky tôi mới lấy được các tệp fit thật: 5708 tệp, 373MB. Ngay cả vậy cũng có tệp bị thiếu, tệp rỗng, tệp trùng lặp, nên rất bực mình
      Bài học rút ra là không nên tin rằng tính năng xuất dữ liệu của dịch vụ online sẽ đầy đủ hoặc ở đúng dạng bạn mong đợi. Nếu đó là dịch vụ bạn phụ thuộc, tôi rất khuyên nên thực sự thử xuất dữ liệu và kiểm tra xem có dữ liệu mình muốn hay không
  • Garmin thật sự nên đón nhận xu hướng này. Nếu lựa chọn thay thế là phụ thuộc vào ứng dụng smartphone thì về dài hạn Garmin sẽ bị tụt lại
    Một lợi thế lớn của việc mua phần cứng chuyên dụng như máy tính xe đạp Garmin là bạn có nhiều quyền kiểm soát dữ liệu hơn

    • Tôi mong Garmin cải thiện SDK và tài liệu. Tôi từng làm một ứng dụng đơn giản cho mục đích cá nhân, và sau đó càng kính trọng hơn rất nhiều những người làm ứng dụng cho đồng hồ Garmin
      Tài liệu tệ đến khó tin, một nửa phải tự mò bằng thử-sai, mà dù vậy tôi vẫn không biết phải build và test trên các đồng hồ khác ngoài chiếc mình có như thế nào
      Tôi sẵn lòng trau chuốt ứng dụng để đưa lên store và nghĩ nó sẽ hữu ích cho một số người, nhưng công sức phải bỏ ra có vẻ lớn hơn giá trị rất nhiều
    • Tôi có hai thiết bị Garmin: một đồng hồ và một máy tính xe đạp, cả hai đều kết nối với cùng một ứng dụng và gom dữ liệu vào một tài khoản Garmin Connect
      Tôi đã kỳ vọng có một mức hiệp lực nào đó, nhưng chẳng có gì cả. Nếu ghi cùng một hoạt động đồng thời bằng hai thiết bị thì chỉ tạo ra bản ghi trùng lặp. Ví dụ, nó tính tổng quãng đường do hai thiết bị đo được
      Thậm chí còn tệ hơn so với việc dùng hai thiết bị từ hai thương hiệu khác nhau
    • Ứng dụng WorkOutDoors và Strava đều cung cấp quyền truy cập đầy đủ vào dữ liệu gpx
    • Có thể xem và tải xuống tất cả trên website
  • Có thiết bị tương tự nào không cản trở người dùng truy cập dữ liệu của chính họ không?

    • Khi Apple khóa mọi thứ, phản ứng từ marketing của Apple hoặc những người bị marketing đó thuyết phục là “thế là an toàn, tốt mà”; còn khi Garmin/Google/các công ty khác làm vậy thì lại thành “ngu ngốc, đồ của tôi thì tôi phải dùng được”
  • Tôi luôn ngạc nhiên vì có quá nhiều dữ liệu bị khóa trong SDK cũ kỹ của Garmin
    Ví dụ, định dạng tệp FIT dùng để tạo bài tập trên mọi máy tính xe đạp chỉ được một hai ứng dụng hỗ trợ
    Cuối cùng có thể đó là lỗi của chúng ta, và có lẽ chúng ta phải tự xây dựng trực tiếp trên SDK

    • Website Garmin Connect có vẻ hoạt động tốt để tạo các bài tập có cấu trúc. Nó cũng có thể đồng bộ với TrainingPeaks. Ngoài ra còn cần gì nữa?
      Nếu không phải cho mục đích lập kế hoạch bài tập, số ứng dụng đọc hoặc ghi tệp FIT nhiều hơn hai rất nhiều. Tôi cũng đã làm một trong số đó
  • Không chỉ là khó truy cập API, Garmin còn không lắng nghe tiếng nói của cộng đồng
    Ví dụ, không thể lọc theo bài tập không có thiết bị. Thỉnh thoảng tôi quên thêm xe đạp hoặc giày, nên nếu có bộ lọc như vậy sẽ rất hữu ích
    Việc thêm bộ lọc đó vào ứng dụng hoặc website Connect chắc hẳn rất dễ, nhưng vì không có community manager nên không thể tham gia đóng góp
    Nếu họ có một tracker công khai để mọi người yêu cầu tính năng, Garmin có thể xem xét chúng, làm ra sản phẩm tốt hơn và kiếm được nhiều tiền hơn

  • Tuần này tôi đã mua một chiếc Garmin Vivoactive5 mới, vì chiếc Vivoactive3 cũ bị hỏng
    Hiện tại tôi khá hài lòng, nhưng tôi mua nó dù biết API và khả năng của Garmin hoàn toàn không tối ưu
    Tôi cũng đã cân nhắc Apple Watch Series 10 nhưng cuối cùng bỏ qua. Vì pin không trụ quá 1,5 ngày, ngoài các tính năng sức khỏe thì tôi không thật sự dùng nhắn tin hay ứng dụng thông minh, và giá thì gấp đôi Vivoactive
    Tôi ước có một chiếc đồng hồ mở có thể hack được, có API tốt, có thể tự host dashboard, và ứng dụng cũng ổn. Tôi cảm thấy có một thị trường cho những người như tôi. Có lẽ sự hồi sinh của Pebble có thể lấp khoảng trống này

  • Tôi đã hy vọng đây là cách lấy dữ liệu trực tiếp từ thiết bị để theo dõi, nhưng xem ra nó giao tiếp với Connect API nên vẫn bị buộc vào ứng dụng chính thức

    • Dữ liệu hoạt động chỉ là các tệp FIT có thể truy cập qua USB
    • Tôi đã bỏ cách đó, và hiện dùng http://www.rungap.com/ để lấy dữ liệu Garmin từ API rồi đưa vào iCloud storage
      Định dạng tệp cũng có thể chọn giữa gpx, fit, tcx
  • Tôi đã thiết lập cái này vài tháng trước. Nó lưu dữ liệu vào cơ sở dữ liệu sqlite cục bộ, và tôi chạy một script mỗi ngày một lần để lấy dữ liệu mới
    Mất khá nhiều thời gian hơn tôi tưởng. Vì đồng hồ chỉ mất khoảng 1 giây để đồng bộ cùng dữ liệu đó với điện thoại, có vẻ bên trong có sự kém hiệu quả nghiêm trọng. Tôi vẫn chưa có dịp xem kỹ bên trong

 

Cảm ơn bạn. Nhờ vậy mà tôi đã áp dụng thành công.