mirror of
https://github.com/alexgetmancom/miband-bot.git
synced 2026-07-19 20:20:14 +03:00
197 lines
6.9 KiB
Markdown
197 lines
6.9 KiB
Markdown
# miband-bot
|
|
|
|
[Русский](README.md) | English
|
|
|
|
A personal self-hosted Telegram bot for your Xiaomi Fitness / Mi Band data.
|
|
|
|
Fetches steps, sleep, heart rate, SpO2, stress, daily activity, weight,
|
|
and workouts from the Xiaomi Fitness cloud, stores them in a local SQLite database,
|
|
and provides access to them directly from Telegram —
|
|
without third-party services and without sharing your data with anyone.
|
|
|
|
> **This project is designed for a single owner.**
|
|
> This is not a public bot or a medical service.
|
|
|
|
## Features
|
|
|
|
- View recent steps, sleep, heart rate, SpO2, stress, weight, and workouts in Telegram.
|
|
- Manual and scheduled automatic synchronization.
|
|
- Auto-refresh of the pinned main menu message after background synchronization.
|
|
- History storage in SQLite (`data/`).
|
|
- Export of all tables to a ZIP archive with CSV files directly into the chat.
|
|
- Deployment via Docker Compose.
|
|
- Atomic writing of the Xiaomi token with `0600` permissions.
|
|
- Smart auto-binding to the first user (whitelist).
|
|
|
|
## How it works
|
|
|
|
```text
|
|
Mi Band → Xiaomi Fitness cloud → miband-bot → SQLite → Telegram / CSV
|
|
```
|
|
|
|
Docker Compose runs two processes:
|
|
|
|
- `tracker` — periodically synchronizes data from Xiaomi Fitness;
|
|
- `fitness-bot` — serves the Telegram menu, handles manual sync, and performs exports.
|
|
|
|
Both processes work with the same `./data` folder. Concurrent write access
|
|
is prevented by a file-based lock.
|
|
|
|
## Requirements
|
|
|
|
- Docker and Docker Compose (or installed Python 3.11+).
|
|
- Telegram bot token from [@BotFather](https://t.me/BotFather).
|
|
- A Xiaomi account with Xiaomi Fitness data.
|
|
|
|
## Quick Start
|
|
|
|
### Method 1: Seamless One-Click Installation (Recommended)
|
|
|
|
If you don't have the project files on your machine yet, you can automatically download and set everything up using a single command in your terminal:
|
|
|
|
- **macOS / Linux:**
|
|
```sh
|
|
curl -fsSL https://raw.githubusercontent.com/iAlexeyRu/miband-bot/main/install.sh | bash
|
|
```
|
|
- **Windows (PowerShell):**
|
|
```powershell
|
|
powershell -c "irm https://raw.githubusercontent.com/iAlexeyRu/miband-bot/main/install.ps1 | iex"
|
|
```
|
|
|
|
The installer will automatically create a `miband-bot` directory, download and extract the project files, verify dependencies, and launch the interactive setup!
|
|
Running the same PowerShell command again on an already configured install will update the files and start the bot without asking for the Telegram token again.
|
|
|
|
---
|
|
|
|
### Method 2: Launch from Downloaded Directory
|
|
|
|
If you have already cloned the repository via `git clone` or downloaded the ZIP archive manually:
|
|
|
|
- **macOS / Linux:**
|
|
```sh
|
|
./setup.sh
|
|
```
|
|
- **Windows:**
|
|
Double-click the `setup.bat` file or run it in the console:
|
|
```cmd
|
|
setup.bat
|
|
```
|
|
|
|
The script will automatically check your environment, guide you step-by-step to get your Telegram bot token, create the `secrets.env` configuration, set up the Python virtual environment (if you choose to run without Docker), and let you launch the bot with a single key press!
|
|
After setup, you can start the bot again with `run_local.sh` on macOS/Linux or `run_local.bat` on Windows from the `miband-bot` folder.
|
|
|
|
---
|
|
|
|
### Method 3: Fully Manual Setup:
|
|
|
|
1. Copy the configuration template:
|
|
```sh
|
|
cp secrets.env.example secrets.env
|
|
```
|
|
2. Specify your `TELEGRAM_BOT_TOKEN` in the `secrets.env` file. **Leave the `TELEGRAM_ALLOWED_USER_ID` variable blank** — the bot will automatically bind to you upon the first start.
|
|
3. Start the Docker containers:
|
|
```sh
|
|
docker compose up -d --build
|
|
```
|
|
4. Open your created bot in Telegram and send the `/start` command — the bot will recognize your account, bind it as the sole owner, and begin synchronization!
|
|
|
|
## Settings
|
|
|
|
All variables are in `secrets.env`:
|
|
|
|
| Variable | Default | Description |
|
|
| --- | --- | --- |
|
|
| `TELEGRAM_BOT_TOKEN` | — | Telegram bot token |
|
|
| `TELEGRAM_ALLOWED_USER_ID` | — | Allowed user ID (leave empty for auto-binding) |
|
|
| `SYNC_INTERVAL` | `900` | Background sync interval, in seconds |
|
|
| `QUERY_DURATION` | `2` | Fetch depth during sync, in days |
|
|
| `ENABLE_FDS_SLEEP_DETAILS` | `true` | Download detailed FDS night sleep data |
|
|
|
|
Paths to the database and status files are defined in `compose.yaml`. For running without Docker, refer to `secrets.env.example`.
|
|
|
|
## Data Files
|
|
|
|
Runtime files are created in `./data`:
|
|
|
|
| File | Content |
|
|
| --- | --- |
|
|
| `token_<id>.json` | Xiaomi auth token (**secret**) |
|
|
| `miband_<id>.db` | SQLite database with health data |
|
|
| `status_<id>.json` | Last sync status |
|
|
| `allowed_user.id` | ID of the bound owner |
|
|
| `fitness_bot_state.db` | Telegram menu internal state |
|
|
| `sync_<id>.lock` | Sync lock file |
|
|
|
|
`secrets.env`, `data/`, `*.db`, `token*.json`, and `status*.json`
|
|
are added to `.gitignore` — do not commit them.
|
|
|
|
## Commands
|
|
|
|
| Command | Action |
|
|
| --- | --- |
|
|
| `/start` | Open menu or start Xiaomi login flow |
|
|
| `/sync` | Start manual synchronization |
|
|
| `/status` | Show local database status |
|
|
|
|
## Local Development
|
|
|
|
```sh
|
|
python3 -m venv .venv
|
|
.venv/bin/pip install -r requirements-dev.txt -e mi-fitness-python
|
|
.venv/bin/python -m py_compile fitness_bot.py miband_sync.py \
|
|
$(find miband_tracker -name '*.py' | sort)
|
|
.venv/bin/python -m pytest
|
|
.venv/bin/python -m pytest mi-fitness-python/tests/unit
|
|
.venv/bin/ruff check .
|
|
.venv/bin/python -m pip check
|
|
```
|
|
|
|
Entry points:
|
|
|
|
```sh
|
|
python -u miband_sync.py # or: miband-sync
|
|
python -u fitness_bot.py # or: miband-fitness-bot
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
**The bot does not respond** — check `TELEGRAM_BOT_TOKEN`, check the logs, and make sure you were the first to send `/start` to the bot to bind it. If you need to reset the bound owner, simply delete the file `data/allowed_user.id` and send `/start` again.
|
|
|
|
```sh
|
|
docker compose logs -f fitness-bot
|
|
```
|
|
|
|
**Token not found** — send `/start` and complete the Xiaomi login flow.
|
|
|
|
**Token expired** — start a re-login from the menu; the old file
|
|
can be deleted from `data/`.
|
|
|
|
**No SpO2 or sleep details** — make sure this data is visible
|
|
in the Xiaomi Fitness app itself. Availability depends on the band model
|
|
and data sharing settings.
|
|
|
|
**Everything broke after a Xiaomi update** — this is an expected risk
|
|
when working with unofficial APIs. Check issues and logs, then
|
|
update the code or temporarily disable the problematic module.
|
|
|
|
## Important: Reverse Engineering and Limitations
|
|
|
|
`miband-bot` is an unofficial project, not affiliated with Xiaomi, Zepp,
|
|
Huami, or Telegram.
|
|
|
|
Data access is implemented via reverse engineering of closed APIs,
|
|
therefore:
|
|
|
|
- Xiaomi may change the API without warning;
|
|
- authorization or synchronization may temporarily stop working;
|
|
- use this project only with your own accounts and data;
|
|
- comply with applicable laws and services' terms of use;
|
|
- wristband data is not a medical opinion.
|
|
|
|
## License
|
|
|
|
The project is distributed under the [GNU GPL v3.0 or later](LICENSE).
|
|
|
|
SDK `mi-fitness-python` is included as a vendored source copy under
|
|
[GNU GPL v3.0](mi-fitness-python/LICENSE). Details are in [VENDORED.md](VENDORED.md).
|