Linuxword Global
当前位置: Linux技术 > 快报,更新,Garmin,Grafana

这也太炫酷了吧,一个 Docker 容器,自动采集 Garmin 数据并存入 InfluxDB 数据库的 Python 脚本。将 Garmin 智能设备数据(心率、睡眠、运动轨迹等),通过 Grafana 可视化图表追踪健康趋势,像私人健康仪表盘一样炫酷呈现身体状况,Github地址:https://github.com/arpanghosh8453/garmin-grafana

Garmin Grafana

一個 docker 容器,用於從 Garmin 伺服器取得資料並將資料儲存在本機 influxdb 資料庫中,以便使用 Garfana 進行視覺化。

如果您是Fitbit 用戶,請查看為 Fitbit 製作的姊妹項目

儀表板範例

Garmin-Grafana-Dashboard-Preview

特徵

  • 自動從 Garmin 收集數據
  • 收集全面的健康指標,包括:
    • 心率數據
    • 每小時步數熱圖
    • 每日步數
    • 睡眠數據和模式(SpO2、呼吸頻率、睡眠動作、HRV)
    • 睡眠規律熱圖(可視化睡眠規律)
    • 壓力數據
    • 機身電池數據
    • 卡路里
    • 睡眠評分
    • 活動分鐘數和心率區間
    • 活動時間表(運動)
    • 鍛鍊中的 GPS 資料(軌跡、步速、海拔、心率)
    • 還有更多...
  • 定期自動取得資料(設定後即可忘記)
  • 歷史資料回填

使用 Docker 安裝(建議)

  1. 如果尚未安裝 docker,請安裝它。所有主流平台/作業系統都支援 Docker。請查看docker安裝指南。

  2. 建立一個名為的資料夾garmin-fetch-data,然後進入該資料夾。然後使用指令garminconnect-tokens在目前資料夾內建立一個名為的資料夾() 。運行以更改 garminconnect-tokens 資料夾的所有權(以便容器的內部使用者可以使用它來儲存身份驗證令牌)garmin-fetch-datamkdir garminconnect-tokenschown -R 1000:1000 garminconnect-tokensgarmin-fetch-data

  3. 使用給定的compose-example.yml內容compose.yml在目前資料夾中建立一個檔案(相應地更改環境變數)garmin-fetch-data

  4. 您可以使用兩個附加環境變數GARMINCONNECT_EMAIL並GARMINCONNECT_BASE64_PASSWORD直接新增登入資訊。否則,您將需要在初始設定階段出現提示時輸入它們。請注意,使用 ENV 變數時,密碼必須以Base64GARMINCONNECT_BASE64_PASSWORD編碼。這是為了確保您的 Garmin Connect 密碼不是以純文字形式存在於撰寫文件中。腳本將對其進行解碼並在需要時使用它。如果您設定了這兩個 ENV 變數並且沒有雙重認證(透過簡訊或電子郵件),則可以直接跳到step 5

  5. 如果您沒有設定電子郵件和密碼 ENV 變數或啟用 2FA,則必須先執行以下命令以互動方式取得電子郵件、密碼和 2FA 代碼提示:docker pull thisisarpanghosh/garmin-fetch-data:latest && docker compose run --rm garmin-fetch-data。輸入電子郵件、密碼(輸入時字元將可見以避免混淆,因此請注意隱私。如果貼上密碼,請確保沒有尾隨空格或不需要的字元)和 2FA 代碼(如果已啟用)。一旦您在 stdout 日誌中看到成功的身份驗證訊息以及隨後的成功資料提取,請使用 退出ctrl + c。這將自動刪除這個孤立容器,因為它是使用該標誌啟動的--rm。您只需像這樣登入一次即可。該腳本將會話身份驗證令牌保存在容器的內部/home/appuser/.garminconnect資料夾中以供將來使用。只要該令牌有效,它就可以用於所有未來的請求(預期會話令牌壽命約為一年,因為 Garmin 似乎使用長期有效的存取權杖而不是短期有效的 {存取權杖 + 刷新令牌} 對)。這有助於在容器啟動時重複使用身份驗證,而無需每次登錄,因為429 Client Error從相同 IP 位址重複嘗試登入時,這會導致。如果您第一次嘗試使用此腳本登入時遇到問題429 Client Error,請參閱下面的故障排除部分。

  6. 最後運行:(docker compose up -d以分離模式啟動完整堆疊)。此後,您應該檢查日誌以docker compose logs --follow查看容器中的任何潛在錯誤。如果有任何問題(特別是讀取/寫入權限問題),這將幫助您除錯問題。如果您正在使用 docker 卷,則發生這種情況的可能性很小,因為檔案權限將由 docker 管理。對於綁定掛載,如果您遇到權限問題,請檢查故障排除部分。

  7. 現在您可以檢查如何http://localhost:3000存取 Grafana(預設),使用預設使用者名稱admin和密碼進行初始設置admin,並新增 influxdb 作為資料來源。請注意,influxdb 主機名稱設定為influxdb端口,8086因此您應該http://influxdb:8086在資料來源設定期間使用該位址,而不是http://localhost:8086因為 influxdb 作為單獨的容器運行,而是同一 docker 網路和堆疊的一部分。此處的資料庫名稱應GarminStats與 docker compose 中的 influxdb DB 名稱相符。使用與 influxdb 容器相同的使用者名稱和密碼(檢查 influxdb 容器的 docker compose 配置,這裡我們使用了influxdb_user預設influxdb_secret_password配置)測試連接以確保 influxdb 已啟動並可存取(如果在測試連接時找到測量值,則可以繼續操作)

  8. 若要使用 Grafana 儀表板,請使用直接從 GitHub 下載的JSON 文件,或使用導入代碼23245直接從 Grafana 儀表板雲中提取它們。

  9. 在 Grafana 儀表板中,熱圖面板需要安裝額外的插件。這可以透過使用GF_PLUGINS_PREINSTALL=marcusolsson-hourly-heatmap-panel環境變數(如在compose-example.yml檔案中)來完成,或者在建立容器後使用 docker 命令輕鬆完成。只需運行docker exec -it grafana grafana cli plugins install marcusolsson-hourly-heatmap-panel,然後運行docker restart grafana即可應用該插件更新。現在,您應該可以看到儀表板上的熱圖面板已成功載入。


該專案是為 InfluxDB 1.11 製作的,因為 influxDB 2.x 上的 Flux 查詢有時與 Grafana 一起使用會出現問題。事實上,InfluxQL 在 InfluxDB 3.0 中重新引入,反映了使用者的回饋。 Grafana 與 InfluxDB 1.11 中的 InfluxQL 也具有更好的兼容性/穩定性。此外,有統計證據表明,與 influxdb 2.x 相比,Influxdb 1.11 查詢運行速度更快。由於 InfluxDB 2.x 沒有為該專案帶來明顯的好處,因此沒有遷移計劃。

這裡給出了範例compose.yml文件內容,以便快速啟動。

services:
  garmin-fetch-data:
    restart: unless-stopped
    image: thisisarpanghosh/garmin-fetch-data:latest
    container_name: garmin-fetch-data
    depends_on:
      - influxdb
    volumes:
      - ./garminconnect-tokens:/home/appuser/.garminconnect # (persistant tokens storage - garminconnect-tokens folder must be owned by 1000:1000)
    environment:
      - INFLUXDB_HOST=influxdb
      - INFLUXDB_PORT=8086
      - INFLUXDB_USERNAME=influxdb_user # user should have read/write access to INFLUXDB_DATABASE
      - INFLUXDB_PASSWORD=influxdb_secret_password
      - INFLUXDB_DATABASE=GarminStats
      - GARMINCONNECT_EMAIL=your_garminconnect_email # optional, read the setup docs
      - GARMINCONNECT_BASE64_PASSWORD=your_base64_encoded_garminconnect_password # optional, must be Base64 encoded, read setup docs
      - UPDATE_INTERVAL_SECONDS=300 # Default update check interval is set to 5 minutes
      - LOG_LEVEL=INFO # change to DEBUG to get DEBUG logs

  influxdb:
    restart: unless-stopped
    container_name: influxdb
    hostname: influxdb
    environment:
      - INFLUXDB_DB=GarminStats
      - INFLUXDB_USER=influxdb_user
      - INFLUXDB_USER_PASSWORD=influxdb_secret_password
      - INFLUXDB_DATA_INDEX_VERSION=tsi1
    ports:
      - '8086:8086'
    volumes:
      - influxdb_data:/var/lib/influxdb
    image: 'influxdb:1.11'

  grafana:
    restart: unless-stopped
    container_name: grafana
    hostname: grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_PLUGINS_PREINSTALL=marcusolsson-hourly-heatmap-panel
    volumes:
      - grafana_data:/var/lib/grafana
    ports:
      - '3000:3000'
    image: 'grafana/grafana:latest'

volumes:
  influxdb_data:
  grafana_data:
 

附加配置和環境變數

✅ 上述撰寫文件建立了一個無需驗證的開放讀/寫存取 influxdb 資料庫。除非你將這個資料庫直接暴露在開放的網路上,否則這不會構成威脅。如果您共享本機網絡,則可以按照influxdb 指南在設定過程中手動啟用身份驗證並授予對 GarminStats 資料庫上的 influxdb_user 適當的讀取/寫入存取權限(如果您願意的話),使用INFLUXDB_ADMIN_ENABLED、INFLUXDB_ADMIN_USER和ENV 變量,但為了簡單起見,這裡不再介紹。INFLUXDB_ADMIN_PASSWORD

FETCH_ADVANCED_TRAINING_DATA=True✅ 您也可以使用撰寫文件中的標誌啟用額外的進階訓練資料擷取。如果您在 Garmin Connect 上可以獲得這些數據,它將獲取並儲存訓練準備、爬坡分數、最大攝氧量和比賽預測等數據。從理論上講,該實現應該可以正常工作,但尚未經過徹底的測試。這目前是一個實驗性功能。提供的 grafana 儀表板上沒有顯示這些數據的面板。您必須創建自己的內容才能在 Grafana 上將其視覺化。

✅ 預設情況下,拉取的 FIT 檔案不會儲存為文件,以節省匯入時的儲存空間(而是使用記憶體中的 IO 緩衝區)。如果您希望保留匯入期間下載的 FIT 檔案以供將來使用Strava或用於支援匯入 FIT 檔案的任何其他應用程序,您可以在撰寫檔案中開啟環境變數KEEP_FIT_FILES=True。garmin-fetch-data要從主機存取文件,您應該在資料夾內fit_filestore建立一個名為的資料夾(您的撰寫文件目前所在的位置),並使用更改所有權,然後必須在的磁碟區部分下設定一個像這樣的磁碟區綁定掛載。這會將容器的內部資料夾對應到您建立的資料夾。一旦腳本開始運行,您將看到您的活動的 FIT 檔案出現在此資料夾中。mkdir fit_filestoregarmin-fetch-datachown 1000:1000 fit_filestore./fit_filestore:/home/appuser/fit_filestoregarmin-fetch-data/home/appuser/fit_filestorefit_filestorefit_filestore

✅ 預設情況下,缺少 GPS 資料的室內活動 FIT 檔案不會被處理(所有活動的活動摘要都會被處理,但不處理詳細的活動內 HR、步速等,這些僅包含在 FIT 檔案中,需要額外的處理能力)以節省每個獲取活動的資源和處理時間。如果您想要處理所有活動而不管與活動相關的 GPS 資料是否可用,您可以ALWAYS_PROCESS_FIT_FILES=True在容器的環境變數部分進行設置garmin-fetch-data,因為這將確保處理所有 FIT 檔案而不管活動的 GPS 資料是否可用。

✅ 如果您在前幾天直到午夜的資料缺失(這些資料在 Garmin Connect 上可用但在儀表板上缺失)或在使用自動定期提取時出現同步問題,請考慮將容器更新到最新版本並使用服務USER_TIMEZONE下的環境變數garmin-fetch-data。此變數是可選的,如果此變數設為空,腳本將嘗試確定時區並自動取得 UTC 偏移量。如果您發現自動識別對您不起作用,則可以使用此變數來覆寫該行為並確保腳本在所有資料提取相關活動中使用硬編碼時區。先前的空白不會被填補(您需要使用歷史批次更新方法來獲取它們),但向前發展,腳本將保持一切同步。

✅ 想要此儀表板採用英制單位而不是公制單位嗎?我無法同時維護兩個獨立的儀表板,但這裡有一個關於如何在儀表板上自行執行此操作的出色的逐步指南!

歷史資料取得(批次更新)

請注意,此過程有意限制速率,每天更新之間有 5 秒的等待時間,以確保使用批次更新時 Garmin 伺服器不會因請求而超載。您可以使用容器RATE_LIMIT_CALLS_SECONDS中的 ENV 變數更新該值garmin-fetch-data,但不建議降低該值,

程式

  1. 1請先執行上述基於 docker 的安裝步驟4(如果尚未完成,請設定 Garmin Connect 登入會話令牌)。

  2. docker compose down如果正在運行,則停止正在運行的容器並將其刪除

  3. 運行命令docker compose run --rm -e MANUAL_START_DATE=YYYY-MM-DD -e MANUAL_END_DATE=YYYY-MM-DD garmin-fetch-data來更新兩個日期之間的資料。您需要用該格式的實際日期替換YYYY-MM-DD,例如docker compose run --rm -e MANUAL_START_DATE=2025-04-12 -e MANUAL_END_DATE=2025-04-14 garmin-fetch-data。該MANUAL_END_DATE變數是可選的,如果沒有提供,腳本將假定它是當前日期。MANUAL_END_DATE必須與MANUAL_START_DATE傳遞的變數在未來保持一致,如果它們相同,則仍會提取該特定日期的資料。

  4. 請注意,批量資料提取是按照時間倒序進行的。因此,您將首先獲得最近的數據,然後它會不斷回溯直到達到目標為止MANUAL_START_DATE。您可以讓它在背景運行。如果此操作在一段時間後意外終止,您可以從容器標準輸出日誌中檢查上次成功更新的日期,並將其用作MANUAL_END_DATE再次運行批次更新時的日期,因為它是按時間倒序完成的。

  5. 大量獲取成功後,您將看到一則Bulk update success訊息,容器將自動退出並自行刪除。

  6. 現在你可以使用docker compose up -d

更新到新版本

使用 docker 更新非常簡單。只需轉到所在的資料夾compose.yml並運行,docker compose pull然後docker compose down && docker compose up -d。請透過檢查日誌來驗證一切是否正常運作docker compose logs --follow

備份資料庫

無論您使用的是綁定掛載還是 docker 卷,請始終建議建立寶貴的健康資料的可恢復檔案備份。假設您將資料庫命名為GarminStats且 influxdb 容器名稱為influxdb,則可以使用下列腳本為當時 influxdb 資料庫中存在的資料建立靜態檔案備份。此還原點可用於使用存檔資料重新建立 influxdb 資料庫,而無需再次從 Garmin 的伺服器要求它們,這不僅耗時而且耗費資源。

#!/bin/bash
TIMESTAMP=$(date +%F_%H-%M)
BACKUP_DIR="./influxdb_backups/$TIMESTAMP"
mkdir -p "$BACKUP_DIR"
docker exec influxdb influxd backup -portable -db GarminStats /tmp/influxdb_backup
docker cp influxdb:/tmp/influxdb_backup "$BACKUP_DIR"
docker exec influxdb rm -r /tmp/influxdb_backup"
 

上述 bash 腳本將influxdb_backups在您目前的工作目錄中建立一個名為的資料夾,並在其下方建立一個帶有當前日期時間的子資料夾。然後它將創建資料庫備份GarminStats並將備份檔案複製到該位置。

要從備份還原數據,首先需要使檔案在新的 influxdb docker 容器中可用。您可以docker cp為此使用或磁碟區綁定掛載。一旦備份資料在容器內部可用,您只需執行即可docker exec influxdb influxd restore -portable -db GarminStats /path/to/internal-backup-directory恢復備份。

請閱讀influxDB 文件中有關備份和還原的詳細指南

故障排除

  • 發出的會話令牌顯然僅有效 1 年或更短。因此,令牌過期後自動取得將會失敗。如果您使用超過一年,則可能需要停止、刪除並重新部署容器(按照初始設定的相同說明進行操作,系統將再次要求您輸入使用者名稱和密碼 + 2FA 代碼)。如果您沒有使用 MFA/2FA(簡訊或電子郵件一次性代碼),您可以使用撰寫文件中的GARMINCONNECT_EMAIL和GARMINCONNECT_BASE64_PASSWORD(請記住,這是base64 編碼的密碼,而不是純文字)ENV 變數直接提供此資訊,因此腳本將能夠在令牌過期後重新產生令牌。不幸的是,如果您使用 MFA/2FA,則需要在每年令牌過期時重建容器後手動輸入一次性代碼以保持腳本運行(一旦會話令牌再次有效,腳本將自動補填您錯過的資料)

  • 如果您429 Client Error在初始設定期間嘗試登入幾次後仍無法登錄,則表示您的公用 IP 受到速率限制。為了保護您的帳戶,Garmin 對來自相同 IP 位址的重複登入嘗試設定了限制。您可以等待幾個小時或一天,或切換到您家外的其他 wifi 網路(將為您提供一個新的公共 IP)或只是簡單地使用行動熱點(也將為您提供一個新的公共 IP)進行初始登入嘗試。正如這裡所討論的,這在理論上應該可行。

  • 401 Client Error首次嘗試登入時遇到什麼問題?確保您使用的帳戶使用者名稱和密碼正確。如果在運行時輸入它,它應該是純文本,但如果在 docker compose 堆疊中使用環境變數添加它,它必須是Base64 編碼的。如果您 100% 確定您使用的憑證正確,但仍出現此錯誤,則可能是因為您連接到了封鎖登入要求的 VPN 網路(請參閱問題#20)。如果您沒有使用 VPN,請嘗試使用行動熱點網路或 VPN 出口隧道運行容器(兩者都會為您提供不同的公共 IP) - 您需要以某種方式從不同的網路嘗試此操作。

  • 如果您想要為容器綁定掛載 docker 卷garmin-fetch-data,請記住該腳本appuser以 uid 和 gid 設定為 1000 的內部使用者執行。因此,請按照上述說明相應地更改綁定掛載資料夾。此外,grafana容器要求綁定掛載資料夾由 擁有472:472,而influxdb:1.11容器要求綁定掛載資料夾由 擁有1500:1500。如果這些都無法解決您的問題,您可以像下面Permission Denied這樣更改綁定掛載資料夾權限。另一個解決方案可能是在容器配置中添加以 root 身份而不是預設身份運行它(此選項有安全考慮)777chmod -R 777 garminconnect-tokensuser: rootappuser

  • 如果活動詳細資料(GPS、步速、心率、海拔)未出現在儀表板上,請確保選擇儀表板左上角列出的活動(在Activity with GPS變數下拉式選單中)。如果您發現那裡沒有可用的值,但在日誌中看到活動已成功提取,那麼這是由於 Grafana 錯誤造成的。轉到儀表板變數設置,並確保為變數選擇了正確的資料來源並將查詢設為SHOW TAG VALUES FROM "ActivityGPS" WITH KEY = "ActivitySelector" WHERE $timeFilter。在儀表板匯入後正確設定後,值應該在下拉清單中正確顯示,您將能夠選擇特定的活動並在儀表板上查看其統計資料。

 

「梦想一旦被付诸行动,就会变得神圣,如果觉得我的文章对您有用,请帮助本站成长」

赞(0) 打赏
一分也是爱

支付宝扫一扫打赏

微信扫一扫打赏

上一篇:

下一篇:

相关推荐

博客简介

本站CDN采用VmShell免费提供离中国大陆最近的香港CMI高速网络做支撑,ToToTel打造全球最快速的边沿网络支撑服务,具体详情请见 :https://vmshell.com/ 以及 https://tototel.com/,网站所有的文件和内容禁止大陆网站搬迁复制,谢谢,VPS营销投稿邮箱: admin@linuxxword.com,我们免费帮大家发布,不收取任何费用,请提供完整测试文稿!

精彩评论

友情链接

他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!申请交换友链

站点统计

  • 文章总数: 2886 篇
  • 草稿数目: 33 篇
  • 分类数目: 6 个
  • 独立页面: 0 个
  • 评论总数: 2 条
  • 链接总数: 0 个
  • 标签总数: 29995 个
  • 注册用户: 139 人
  • 访问总量: 8,648,093 次
  • 最近更新: 2025年6月19日