fitbit-cli 1.0.0__tar.gz → 1.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fitbit_cli-1.0.0/fitbit_cli.egg-info → fitbit_cli-1.2.0}/PKG-INFO +50 -18
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/README.md +43 -12
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/fitbit_cli/__init__.py +1 -1
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/fitbit_cli/cli.py +15 -1
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/fitbit_cli/fitbit_setup.py +4 -4
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/fitbit_cli/formatter.py +17 -0
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/fitbit_cli/main.py +5 -1
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0/fitbit_cli.egg-info}/PKG-INFO +50 -18
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/setup.py +5 -4
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/LICENSE +0 -0
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/MANIFEST.in +0 -0
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/fitbit_cli/exceptions.py +0 -0
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/fitbit_cli/fitbit_api.py +0 -0
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/fitbit_cli.egg-info/SOURCES.txt +0 -0
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/fitbit_cli.egg-info/dependency_links.txt +0 -0
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/fitbit_cli.egg-info/entry_points.txt +0 -0
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/fitbit_cli.egg-info/requires.txt +0 -0
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/fitbit_cli.egg-info/top_level.txt +0 -0
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/pyproject.toml +0 -0
- {fitbit_cli-1.0.0 → fitbit_cli-1.2.0}/setup.cfg +0 -0
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fitbit-cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.0
|
|
4
4
|
Summary: Access your Fitbit data at your terminal.
|
|
5
5
|
Home-page: https://github.com/veerendra2/fitbit-cli
|
|
6
|
-
Download-URL: https://github.com/veerendra2/fitbit-cli/archive/1.
|
|
6
|
+
Download-URL: https://github.com/veerendra2/fitbit-cli/archive/1.2.0.tar.gz
|
|
7
7
|
Author: veerendra2
|
|
8
8
|
Author-email: vk.tyk23@simplelogin.com
|
|
9
9
|
License: MIT
|
|
10
10
|
Project-URL: Documentation, https://github.com/veerendra2/fitbit-cli
|
|
11
|
-
Keywords: fitbit,cli,python
|
|
11
|
+
Keywords: fitbit,fitbit-api,cli,python
|
|
12
12
|
Classifier: Development Status :: 5 - Production/Stable
|
|
13
13
|
Classifier: Intended Audience :: End Users/Desktop
|
|
14
14
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
15
15
|
Classifier: Natural Language :: English
|
|
16
|
+
Classifier: Operating System :: MacOS
|
|
16
17
|
Classifier: Operating System :: POSIX :: Linux
|
|
17
|
-
Classifier: Programming Language :: Python
|
|
18
|
-
Classifier: Programming Language :: Python :: 3
|
|
19
18
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
21
19
|
Classifier: Programming Language :: Python :: 3.10
|
|
22
20
|
Classifier: Programming Language :: Python :: 3.11
|
|
23
21
|
Classifier: Programming Language :: Python :: 3.12
|
|
24
22
|
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
24
|
+
Classifier: Programming Language :: Python :: 3
|
|
25
|
+
Classifier: Programming Language :: Python
|
|
25
26
|
Classifier: Topic :: Utilities
|
|
26
27
|
Requires-Python: >=3.9
|
|
27
28
|
Description-Content-Type: text/markdown
|
|
@@ -31,18 +32,20 @@ Requires-Dist: rich==13.9.4
|
|
|
31
32
|
|
|
32
33
|
# Fitbit CLI
|
|
33
34
|
|
|
34
|
-
[](https://github.com/veerendra2/fitbit-cli/actions/workflows/release.yml) [
|
|
35
36
|
](https://pypi.org/project/fitbit-cli/) [
|
|
36
37
|
](https://pypi.org/project/fitbit-cli/)
|
|
37
38
|
|
|
38
|
-
>
|
|
39
|
+
> This is not an official Fitbit CLI
|
|
39
40
|
|
|
40
41
|
Access your Fitbit data directly from your terminal 💻. View 💤 sleep logs, ❤️ heart rate, 🏋️♂️ activity levels, 🩸 SpO2, and more, all presented in a simple, easy-to-read table format!
|
|
41
42
|
|
|
42
43
|
<p align="center">
|
|
43
|
-
<img alt="Fitbit logo", width="250" src="
|
|
44
|
+
<img alt="Fitbit logo", width="250" src="https://raw.githubusercontent.com/veerendra2/fitbit-cli/refs/heads/main/assets/Fitbit_Logo_White_RGB.jpg">
|
|
44
45
|
</p>
|
|
45
46
|
|
|
47
|
+
[](https://asciinema.org/a/696114)
|
|
48
|
+
|
|
46
49
|
## Supported Web APIs
|
|
47
50
|
|
|
48
51
|
> Only `GET` APIs are supported!
|
|
@@ -54,13 +57,19 @@ Access your Fitbit data directly from your terminal 💻. View 💤 sleep logs,
|
|
|
54
57
|
| [SpO2](https://dev.fitbit.com/build/reference/web-api/spo2/) | ✅ |
|
|
55
58
|
| [Heart Rate Time Series](https://dev.fitbit.com/build/reference/web-api/heartrate-timeseries/) | ✅ |
|
|
56
59
|
| [Active Zone Minutes (AZM) Time Series](https://dev.fitbit.com/build/reference/web-api/active-zone-minutes-timeseries/) | ✅ |
|
|
57
|
-
| [Activity](https://dev.fitbit.com/build/reference/web-api/activity/) |
|
|
60
|
+
| [Activity](https://dev.fitbit.com/build/reference/web-api/activity/) | ✅ |
|
|
61
|
+
|
|
62
|
+
## Usage Guide
|
|
58
63
|
|
|
59
|
-
|
|
64
|
+
1. Install the Fitbit CLI
|
|
60
65
|
|
|
61
66
|
```bash
|
|
62
67
|
python -m pip install fitbit-cli
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
2. Help
|
|
63
71
|
|
|
72
|
+
```bash
|
|
64
73
|
fitbit-cli -h
|
|
65
74
|
usage: fitbit-cli [-h] [-i] [-s [DATE[,DATE]]] [-o [DATE[,DATE]]] [-e [DATE[,DATE]]] [-a [DATE[,DATE]]] [-u] [-v]
|
|
66
75
|
|
|
@@ -87,15 +96,38 @@ APIs:
|
|
|
87
96
|
Show user profile data
|
|
88
97
|
```
|
|
89
98
|
|
|
90
|
-
|
|
99
|
+
3. Register Fitbit App
|
|
91
100
|
|
|
92
|
-
1. Go to [https://dev.fitbit.com/apps](https://dev.fitbit.com/apps)
|
|
93
|
-
2. Click on "REGISTER AN APP" tab
|
|
94
|
-
3. Follow below example and register an app
|
|
101
|
+
1. Go to [https://dev.fitbit.com/apps](https://dev.fitbit.com/apps)
|
|
102
|
+
2. Click on "REGISTER AN APP" tab
|
|
103
|
+
3. Follow below example and register an app
|
|
95
104
|
|
|
96
|
-
<p align="left">
|
|
97
|
-
|
|
98
|
-
</p>
|
|
105
|
+
<p align="left">
|
|
106
|
+
<img alt="Fitbit logo", width="700" src="https://raw.githubusercontent.com/veerendra2/fitbit-cli/refs/heads/main/assets/fitbit-app-registration.png">
|
|
107
|
+
</p>
|
|
108
|
+
|
|
109
|
+
4. Run the following command to set up interactive authentication and store the Fitbit token locally
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
fitbit-cli --init-auth
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
For a visual guide, see the Asciinema recording below
|
|
116
|
+
[](https://asciinema.org/a/696115)
|
|
117
|
+
|
|
118
|
+
5. Start using it 😎
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
$ fitbit-cli -s
|
|
122
|
+
Sleep Data Summary 😴
|
|
123
|
+
┏━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
|
|
124
|
+
┃ Date 📆 ┃ Deep Sleep 🛏 ┃ Light Sleep 💤 ┃ REM Sleep 🌙 ┃ Wake Time ⏰ ┃ Efficiency 💯 ┃
|
|
125
|
+
┡━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
|
|
126
|
+
│ 2024-12-25 │ 139 min │ 190 min │ 155 min │ 54 min │ 55% │
|
|
127
|
+
└────────────┴──────────────┴────────────────┴──────────────┴──────────────┴───────────────┘
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
_**NOTE: The token is valid for only 8 hours, `fitbit-cli` automatically refreshes the token when it expires.**_
|
|
99
131
|
|
|
100
132
|
## Local Development
|
|
101
133
|
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
# Fitbit CLI
|
|
2
2
|
|
|
3
|
-
[](https://github.com/veerendra2/fitbit-cli/actions/workflows/release.yml) [
|
|
4
4
|
](https://pypi.org/project/fitbit-cli/) [
|
|
5
5
|
](https://pypi.org/project/fitbit-cli/)
|
|
6
6
|
|
|
7
|
-
>
|
|
7
|
+
> This is not an official Fitbit CLI
|
|
8
8
|
|
|
9
9
|
Access your Fitbit data directly from your terminal 💻. View 💤 sleep logs, ❤️ heart rate, 🏋️♂️ activity levels, 🩸 SpO2, and more, all presented in a simple, easy-to-read table format!
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
|
-
<img alt="Fitbit logo", width="250" src="
|
|
12
|
+
<img alt="Fitbit logo", width="250" src="https://raw.githubusercontent.com/veerendra2/fitbit-cli/refs/heads/main/assets/Fitbit_Logo_White_RGB.jpg">
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
|
+
[](https://asciinema.org/a/696114)
|
|
16
|
+
|
|
15
17
|
## Supported Web APIs
|
|
16
18
|
|
|
17
19
|
> Only `GET` APIs are supported!
|
|
@@ -23,13 +25,19 @@ Access your Fitbit data directly from your terminal 💻. View 💤 sleep logs,
|
|
|
23
25
|
| [SpO2](https://dev.fitbit.com/build/reference/web-api/spo2/) | ✅ |
|
|
24
26
|
| [Heart Rate Time Series](https://dev.fitbit.com/build/reference/web-api/heartrate-timeseries/) | ✅ |
|
|
25
27
|
| [Active Zone Minutes (AZM) Time Series](https://dev.fitbit.com/build/reference/web-api/active-zone-minutes-timeseries/) | ✅ |
|
|
26
|
-
| [Activity](https://dev.fitbit.com/build/reference/web-api/activity/) |
|
|
28
|
+
| [Activity](https://dev.fitbit.com/build/reference/web-api/activity/) | ✅ |
|
|
29
|
+
|
|
30
|
+
## Usage Guide
|
|
27
31
|
|
|
28
|
-
|
|
32
|
+
1. Install the Fitbit CLI
|
|
29
33
|
|
|
30
34
|
```bash
|
|
31
35
|
python -m pip install fitbit-cli
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
2. Help
|
|
32
39
|
|
|
40
|
+
```bash
|
|
33
41
|
fitbit-cli -h
|
|
34
42
|
usage: fitbit-cli [-h] [-i] [-s [DATE[,DATE]]] [-o [DATE[,DATE]]] [-e [DATE[,DATE]]] [-a [DATE[,DATE]]] [-u] [-v]
|
|
35
43
|
|
|
@@ -56,15 +64,38 @@ APIs:
|
|
|
56
64
|
Show user profile data
|
|
57
65
|
```
|
|
58
66
|
|
|
59
|
-
|
|
67
|
+
3. Register Fitbit App
|
|
60
68
|
|
|
61
|
-
1. Go to [https://dev.fitbit.com/apps](https://dev.fitbit.com/apps)
|
|
62
|
-
2. Click on "REGISTER AN APP" tab
|
|
63
|
-
3. Follow below example and register an app
|
|
69
|
+
1. Go to [https://dev.fitbit.com/apps](https://dev.fitbit.com/apps)
|
|
70
|
+
2. Click on "REGISTER AN APP" tab
|
|
71
|
+
3. Follow below example and register an app
|
|
64
72
|
|
|
65
|
-
<p align="left">
|
|
66
|
-
|
|
67
|
-
</p>
|
|
73
|
+
<p align="left">
|
|
74
|
+
<img alt="Fitbit logo", width="700" src="https://raw.githubusercontent.com/veerendra2/fitbit-cli/refs/heads/main/assets/fitbit-app-registration.png">
|
|
75
|
+
</p>
|
|
76
|
+
|
|
77
|
+
4. Run the following command to set up interactive authentication and store the Fitbit token locally
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
fitbit-cli --init-auth
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
For a visual guide, see the Asciinema recording below
|
|
84
|
+
[](https://asciinema.org/a/696115)
|
|
85
|
+
|
|
86
|
+
5. Start using it 😎
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
$ fitbit-cli -s
|
|
90
|
+
Sleep Data Summary 😴
|
|
91
|
+
┏━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
|
|
92
|
+
┃ Date 📆 ┃ Deep Sleep 🛏 ┃ Light Sleep 💤 ┃ REM Sleep 🌙 ┃ Wake Time ⏰ ┃ Efficiency 💯 ┃
|
|
93
|
+
┡━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
|
|
94
|
+
│ 2024-12-25 │ 139 min │ 190 min │ 155 min │ 54 min │ 55% │
|
|
95
|
+
└────────────┴──────────────┴────────────────┴──────────────┴──────────────┴───────────────┘
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
_**NOTE: The token is valid for only 8 hours, `fitbit-cli` automatically refreshes the token when it expires.**_
|
|
68
99
|
|
|
69
100
|
## Local Development
|
|
70
101
|
|
|
@@ -80,6 +80,15 @@ def parse_arguments():
|
|
|
80
80
|
metavar="DATE[,DATE]",
|
|
81
81
|
help="Show Active Zone Minutes (AZM) Time Series data",
|
|
82
82
|
)
|
|
83
|
+
group.add_argument(
|
|
84
|
+
"-b",
|
|
85
|
+
"--breathing-rate",
|
|
86
|
+
type=parse_date_range,
|
|
87
|
+
nargs="?",
|
|
88
|
+
const=(datetime.today().date(), None),
|
|
89
|
+
metavar="DATE[,DATE]",
|
|
90
|
+
help="Show Breathing Rate Summary data",
|
|
91
|
+
)
|
|
83
92
|
group.add_argument(
|
|
84
93
|
"-u",
|
|
85
94
|
"--show-user-profile",
|
|
@@ -95,4 +104,9 @@ def parse_arguments():
|
|
|
95
104
|
help="Show fitbit-cli version",
|
|
96
105
|
)
|
|
97
106
|
|
|
98
|
-
|
|
107
|
+
args = parser.parse_args()
|
|
108
|
+
|
|
109
|
+
if not any(vars(args).values()):
|
|
110
|
+
parser.error("No arguments provided. At least one argument is required.")
|
|
111
|
+
|
|
112
|
+
return args
|
|
@@ -103,7 +103,7 @@ def fitbit_init_setup():
|
|
|
103
103
|
if browser_status:
|
|
104
104
|
CONSOLE.print(
|
|
105
105
|
":satellite: Waiting for authorization... "
|
|
106
|
-
+ "(Check your browser or press 'Ctrl+C',
|
|
106
|
+
+ "(Check your browser or press 'Ctrl+C', authorize the app by opening the"
|
|
107
107
|
+ " above URL in your browser and past the redirect URL manually.)\n"
|
|
108
108
|
)
|
|
109
109
|
authorization_code = start_server()
|
|
@@ -166,7 +166,7 @@ def fitbit_init_setup():
|
|
|
166
166
|
|
|
167
167
|
|
|
168
168
|
def read_fitbit_token():
|
|
169
|
-
"""Read
|
|
169
|
+
"""Read Fitbit token from the file and return as a JSON object."""
|
|
170
170
|
|
|
171
171
|
try:
|
|
172
172
|
with open(FITBIT_TOKEN_PATH, "r", encoding="utf-8") as f:
|
|
@@ -184,7 +184,7 @@ def read_fitbit_token():
|
|
|
184
184
|
|
|
185
185
|
|
|
186
186
|
def write_fitbit_token(token_content):
|
|
187
|
-
"""Write
|
|
187
|
+
"""Write Fitbit token to the file."""
|
|
188
188
|
|
|
189
189
|
Path(FITBIT_TOKEN_PATH).parent.mkdir(parents=True, exist_ok=True)
|
|
190
190
|
with open(FITBIT_TOKEN_PATH, "w", encoding="utf-8") as f:
|
|
@@ -192,7 +192,7 @@ def write_fitbit_token(token_content):
|
|
|
192
192
|
|
|
193
193
|
|
|
194
194
|
def update_fitbit_token(access_token, refresh_token):
|
|
195
|
-
"""Update
|
|
195
|
+
"""Update Fitbit token in the file."""
|
|
196
196
|
|
|
197
197
|
token_content = read_fitbit_token()
|
|
198
198
|
token_content["access_token"] = access_token
|
|
@@ -145,3 +145,20 @@ def display_azm_time_series(azm_data):
|
|
|
145
145
|
)
|
|
146
146
|
|
|
147
147
|
CONSOLE.print(table)
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def display_breathing_rate(breathing_rate_data):
|
|
151
|
+
"""Breathing Rate data formatter"""
|
|
152
|
+
|
|
153
|
+
table = Table(title="Breathing Rate Summary 🫁", show_header=True)
|
|
154
|
+
|
|
155
|
+
table.add_column("Date :calendar:")
|
|
156
|
+
table.add_column("Breaths Per Minute :dash:")
|
|
157
|
+
|
|
158
|
+
for br in breathing_rate_data.get("br", []):
|
|
159
|
+
table.add_row(
|
|
160
|
+
br.get("dateTime", "N/A"),
|
|
161
|
+
str(br.get("value", {}).get("breathingRate", "N/A")),
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
CONSOLE.print(table)
|
|
@@ -14,7 +14,7 @@ def main():
|
|
|
14
14
|
|
|
15
15
|
args = parse_arguments()
|
|
16
16
|
|
|
17
|
-
if args.
|
|
17
|
+
if args.init_auth:
|
|
18
18
|
setup.fitbit_init_setup()
|
|
19
19
|
|
|
20
20
|
credentials = setup.read_fitbit_token()
|
|
@@ -37,3 +37,7 @@ def main():
|
|
|
37
37
|
fmt.display_heart_data(fitbit.get_heart_rate_time_series(*args.heart))
|
|
38
38
|
if args.active_zone:
|
|
39
39
|
fmt.display_azm_time_series(fitbit.get_azm_time_series(*args.active_zone))
|
|
40
|
+
if args.breathing_rate:
|
|
41
|
+
fmt.display_breathing_rate(
|
|
42
|
+
fitbit.get_breathing_rate_summary(*args.breathing_rate)
|
|
43
|
+
)
|
|
@@ -1,27 +1,28 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fitbit-cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.0
|
|
4
4
|
Summary: Access your Fitbit data at your terminal.
|
|
5
5
|
Home-page: https://github.com/veerendra2/fitbit-cli
|
|
6
|
-
Download-URL: https://github.com/veerendra2/fitbit-cli/archive/1.
|
|
6
|
+
Download-URL: https://github.com/veerendra2/fitbit-cli/archive/1.2.0.tar.gz
|
|
7
7
|
Author: veerendra2
|
|
8
8
|
Author-email: vk.tyk23@simplelogin.com
|
|
9
9
|
License: MIT
|
|
10
10
|
Project-URL: Documentation, https://github.com/veerendra2/fitbit-cli
|
|
11
|
-
Keywords: fitbit,cli,python
|
|
11
|
+
Keywords: fitbit,fitbit-api,cli,python
|
|
12
12
|
Classifier: Development Status :: 5 - Production/Stable
|
|
13
13
|
Classifier: Intended Audience :: End Users/Desktop
|
|
14
14
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
15
15
|
Classifier: Natural Language :: English
|
|
16
|
+
Classifier: Operating System :: MacOS
|
|
16
17
|
Classifier: Operating System :: POSIX :: Linux
|
|
17
|
-
Classifier: Programming Language :: Python
|
|
18
|
-
Classifier: Programming Language :: Python :: 3
|
|
19
18
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
21
19
|
Classifier: Programming Language :: Python :: 3.10
|
|
22
20
|
Classifier: Programming Language :: Python :: 3.11
|
|
23
21
|
Classifier: Programming Language :: Python :: 3.12
|
|
24
22
|
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
24
|
+
Classifier: Programming Language :: Python :: 3
|
|
25
|
+
Classifier: Programming Language :: Python
|
|
25
26
|
Classifier: Topic :: Utilities
|
|
26
27
|
Requires-Python: >=3.9
|
|
27
28
|
Description-Content-Type: text/markdown
|
|
@@ -31,18 +32,20 @@ Requires-Dist: rich==13.9.4
|
|
|
31
32
|
|
|
32
33
|
# Fitbit CLI
|
|
33
34
|
|
|
34
|
-
[](https://github.com/veerendra2/fitbit-cli/actions/workflows/release.yml) [
|
|
35
36
|
](https://pypi.org/project/fitbit-cli/) [
|
|
36
37
|
](https://pypi.org/project/fitbit-cli/)
|
|
37
38
|
|
|
38
|
-
>
|
|
39
|
+
> This is not an official Fitbit CLI
|
|
39
40
|
|
|
40
41
|
Access your Fitbit data directly from your terminal 💻. View 💤 sleep logs, ❤️ heart rate, 🏋️♂️ activity levels, 🩸 SpO2, and more, all presented in a simple, easy-to-read table format!
|
|
41
42
|
|
|
42
43
|
<p align="center">
|
|
43
|
-
<img alt="Fitbit logo", width="250" src="
|
|
44
|
+
<img alt="Fitbit logo", width="250" src="https://raw.githubusercontent.com/veerendra2/fitbit-cli/refs/heads/main/assets/Fitbit_Logo_White_RGB.jpg">
|
|
44
45
|
</p>
|
|
45
46
|
|
|
47
|
+
[](https://asciinema.org/a/696114)
|
|
48
|
+
|
|
46
49
|
## Supported Web APIs
|
|
47
50
|
|
|
48
51
|
> Only `GET` APIs are supported!
|
|
@@ -54,13 +57,19 @@ Access your Fitbit data directly from your terminal 💻. View 💤 sleep logs,
|
|
|
54
57
|
| [SpO2](https://dev.fitbit.com/build/reference/web-api/spo2/) | ✅ |
|
|
55
58
|
| [Heart Rate Time Series](https://dev.fitbit.com/build/reference/web-api/heartrate-timeseries/) | ✅ |
|
|
56
59
|
| [Active Zone Minutes (AZM) Time Series](https://dev.fitbit.com/build/reference/web-api/active-zone-minutes-timeseries/) | ✅ |
|
|
57
|
-
| [Activity](https://dev.fitbit.com/build/reference/web-api/activity/) |
|
|
60
|
+
| [Activity](https://dev.fitbit.com/build/reference/web-api/activity/) | ✅ |
|
|
61
|
+
|
|
62
|
+
## Usage Guide
|
|
58
63
|
|
|
59
|
-
|
|
64
|
+
1. Install the Fitbit CLI
|
|
60
65
|
|
|
61
66
|
```bash
|
|
62
67
|
python -m pip install fitbit-cli
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
2. Help
|
|
63
71
|
|
|
72
|
+
```bash
|
|
64
73
|
fitbit-cli -h
|
|
65
74
|
usage: fitbit-cli [-h] [-i] [-s [DATE[,DATE]]] [-o [DATE[,DATE]]] [-e [DATE[,DATE]]] [-a [DATE[,DATE]]] [-u] [-v]
|
|
66
75
|
|
|
@@ -87,15 +96,38 @@ APIs:
|
|
|
87
96
|
Show user profile data
|
|
88
97
|
```
|
|
89
98
|
|
|
90
|
-
|
|
99
|
+
3. Register Fitbit App
|
|
91
100
|
|
|
92
|
-
1. Go to [https://dev.fitbit.com/apps](https://dev.fitbit.com/apps)
|
|
93
|
-
2. Click on "REGISTER AN APP" tab
|
|
94
|
-
3. Follow below example and register an app
|
|
101
|
+
1. Go to [https://dev.fitbit.com/apps](https://dev.fitbit.com/apps)
|
|
102
|
+
2. Click on "REGISTER AN APP" tab
|
|
103
|
+
3. Follow below example and register an app
|
|
95
104
|
|
|
96
|
-
<p align="left">
|
|
97
|
-
|
|
98
|
-
</p>
|
|
105
|
+
<p align="left">
|
|
106
|
+
<img alt="Fitbit logo", width="700" src="https://raw.githubusercontent.com/veerendra2/fitbit-cli/refs/heads/main/assets/fitbit-app-registration.png">
|
|
107
|
+
</p>
|
|
108
|
+
|
|
109
|
+
4. Run the following command to set up interactive authentication and store the Fitbit token locally
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
fitbit-cli --init-auth
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
For a visual guide, see the Asciinema recording below
|
|
116
|
+
[](https://asciinema.org/a/696115)
|
|
117
|
+
|
|
118
|
+
5. Start using it 😎
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
$ fitbit-cli -s
|
|
122
|
+
Sleep Data Summary 😴
|
|
123
|
+
┏━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
|
|
124
|
+
┃ Date 📆 ┃ Deep Sleep 🛏 ┃ Light Sleep 💤 ┃ REM Sleep 🌙 ┃ Wake Time ⏰ ┃ Efficiency 💯 ┃
|
|
125
|
+
┡━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
|
|
126
|
+
│ 2024-12-25 │ 139 min │ 190 min │ 155 min │ 54 min │ 55% │
|
|
127
|
+
└────────────┴──────────────┴────────────────┴──────────────┴──────────────┴───────────────┘
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
_**NOTE: The token is valid for only 8 hours, `fitbit-cli` automatically refreshes the token when it expires.**_
|
|
99
131
|
|
|
100
132
|
## Local Development
|
|
101
133
|
|
|
@@ -29,22 +29,23 @@ setup(
|
|
|
29
29
|
project_urls={
|
|
30
30
|
"Documentation": "https://github.com/veerendra2/fitbit-cli",
|
|
31
31
|
},
|
|
32
|
-
keywords=["fitbit", "cli", "python"],
|
|
32
|
+
keywords=["fitbit", "fitbit-api", "cli", "python"],
|
|
33
33
|
license="MIT",
|
|
34
34
|
classifiers=[
|
|
35
35
|
"Development Status :: 5 - Production/Stable",
|
|
36
36
|
"Intended Audience :: End Users/Desktop",
|
|
37
37
|
"License :: OSI Approved :: Apache Software License",
|
|
38
38
|
"Natural Language :: English",
|
|
39
|
+
"Operating System :: MacOS",
|
|
39
40
|
"Operating System :: POSIX :: Linux",
|
|
40
|
-
"Programming Language :: Python",
|
|
41
|
-
"Programming Language :: Python :: 3",
|
|
42
41
|
"Programming Language :: Python :: 3 :: Only",
|
|
43
|
-
"Programming Language :: Python :: 3.9",
|
|
44
42
|
"Programming Language :: Python :: 3.10",
|
|
45
43
|
"Programming Language :: Python :: 3.11",
|
|
46
44
|
"Programming Language :: Python :: 3.12",
|
|
47
45
|
"Programming Language :: Python :: 3.13",
|
|
46
|
+
"Programming Language :: Python :: 3.9",
|
|
47
|
+
"Programming Language :: Python :: 3",
|
|
48
|
+
"Programming Language :: Python",
|
|
48
49
|
"Topic :: Utilities",
|
|
49
50
|
],
|
|
50
51
|
install_requires=[
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|