unsubbed.co

Fitbit Health Dashboard

Self-hosted fitness & health tracking tool that provides script for FitBit data retrieval, storage, and visualization.

Overview

A script to fetch data from Fitbit servers using their API and store the data in a local influxdb database and visualize them with Grafana A script to fetch data from Fitbit servers using their API and store the data in a local influxdb database and visualize them with Grafana - arpanghosh8453/fitbit-grafana The project has 838 GitHub stars and is licensed under BSD-4-Clause.

Key Features

Source: GitHub README

  • Automatic data collection from Fitbit API
  • Support for both InfluxDB 1.x and 2.x (limited support for 2.x)
  • Collects comprehensive health metrics including:
  • Heart Rate Data (including intraday)
  • Hourly steps Heatmap
  • Daily Step Count
  • Sleep Data and patterns
  • Sleep regularity heatmap
  • Breathing Rate
  • Activity Minutes

Getting Started

Source: GitHub README

services:
  fitbit-fetch-data:
    restart: unless-stopped
    image: thisisarpanghosh/fitbit-fetch-data:latest
    container_name: fitbit-fetch-data
    volumes:
      - ./logs:/app/logs
      - ./tokens:/app/tokens
      - /etc/timezone:/etc/timezone:ro
    environment:
      - FITBIT_LOG_FILE_PATH=/app/logs/fitbit.log
      - TOKEN_FILE_PATH=/app/tokens/fitbit.token
      - AUTO_DATE_RANGE=True # Used for bulk update, read Historical Data Update section in README
      - INFLUXDB_VERSION=1
      - INFLUXDB_HOST=influxdb
      - INFLUXDB_PORT=8086
      - INFLUXDB_USERNAME=fitbit_user
      - INFLUXDB_PASSWORD=fitbit_password
      - INFLUXDB_DATABASE=FitbitHealthStats
      - CLIENT_ID=your_application_client_ID # Change this to your client ID
      - CLIENT_SECRET=your_application_client_secret # Change this to your client Secret
      - DEVICENAME=Your_Device_Name # Change this to your device name - e.g. "Charge5" without quotes
      - LOCAL_TIMEZONE=Automatic
    depends_on:
      - influxdb


  influxdb:
    restart: unless-stopped
    container_name: influxdb
    hostname: influxdb
    environment:
      - INFLUXDB_DB=FitbitHealthStats
      - INFLUXDB_USER=fitbit_user
      - INFLUXDB_USER_PASSWORD=fitbit_password
      - INFLUXDB_DATA_INDEX_VERSION=tsi1
      ###############################################################################
      # The following ENV variables are applicable for InfluxDB V3 - No effect for V1
      ###############################################################################
      # - INFLUXDB3_MAX_HTTP_REQUEST_SIZE=10485760
      # - INFLUXDB3_NODE_IDENTIFIER_PREFIX=Influxdb-node1
      # - INFLUXDB3_BUCKET=GarminStats
      # - INFLUXDB3_OBJECT_STORE=file
      # - INFLUXDB3_DB_DIR=/data
      # - INFLUXDB3_QUERY_FILE_LIMIT=5000 # this set to be a very high value if you want to view long term data
    ports:
      - '8086:8086' # Influxdb V3 should map as "8181:8181" (Change INFLUXDB_PORT to 8181 on fitbit-fetch-data appropriately for InfluxDB V3)
    volumes:
      - ./influxdb:/var/lib/influxdb # InfluxDB V3 bind mount should be set like - ./influxdb:/data if you set INFLUXDB3_DB_DIR=/data (instead of /var/lib/influxdb)
    image: 'influxdb:1.11' # You must change this to 'quay.io/influxdb/influxdb3-core:latest' for influxdb V3

  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:/var/lib/grafana'
    ports:
      - '3000:3000'
    image: 'grafana/grafana:latest'

Normalized Features

Source: tool-features-normalized.json

docker, docker compose, influxdb, metrics, plugins, rate limiting, rest api, sso.

Features

Authentication & Access

  • Single Sign-On (SSO)

Integrations & APIs

  • Plugin / Extension System
  • REST API

Analytics & Reporting

  • Metrics & KPIs

Security & Privacy

  • Rate Limiting