GarminDB - CSDL phân tích dữ liệu lấy từ đầu nối/đồng hồ Garmin
(github.com/tcgoetz)- 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ạygarmindb_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
- 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
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.examplethà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
- Sao chép
- 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.examplethành~/.GarminDb/GarminConnectConfig.jsonvà 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_dbsmộ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
Jupytercủ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.jsonvà chạy tải xuống lại
- Trong
GarminConnectConfig.json, phần tửstepscủacourse_viewslà 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 bugreporthoặcgarmindb_bug_report.py, rồi đính kèmbugreport.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
Ý 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ệ
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ò
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
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/
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
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
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
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
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
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 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 đã 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
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?
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
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
Đị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.