Files
Mileage-Logger/README.md

220 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Mileage Logger
Small, reliable mileage-logging tool that ingests **Google Maps Timeline** exports from Android (device-local) and produces **one Excel workbook per month** ready for HR (EveryHR).
- Detects ordered work trips between whitelisted sites (schools, HQ, Home)
- Computes per-hop miles (route catalog → fallback straight-line)
- Writes `mileage_YYYY-MM.xlsx` with the exact columns HR needs
- Filters by date (e.g., **last month**), skips weekends, and (by default) assumes each workday starts at **Home**
---
## Quick Start
### 1) Export Timeline on your phone
Android: `Settings → Location → Location Services → Google Timeline → Export`
Copy **`Timeline.json`** to your computer.
### 2) Put it here
```bash
~/Downloads/Mileage Logger/Timeline.json
```
### 3) Install dependencies
```bash
# in your chosen venv/conda env
pip install -r requirements.txt
```
### 4) Run (monthly workflow: previous calendar month, weekdays only)
```bash
cd ~/Downloads/Mileage\ Logger
python -m mileage_logger.cli import "Timeline.json" --sites config/sites.yml --routes tests/data/routes_golden.csv --output ~/Downloads/Mileage\ Logger/output --last-month --weekdays-only
```
### 5) Find your Excel
Look in `output/` for files like `mileage_YYYY-MM.xlsx`.
---
## Oneword alias (Linux/macOS bash/zsh)
Add this to your `~/.bashrc` or `~/.zshrc`:
```bash
alias mileage='( cd ~/Downloads/Mileage\ Logger && python -m mileage_logger.cli import "Timeline.json" --sites config/sites.yml --routes tests/data/routes_golden.csv --output ~/Downloads/Mileage\ Logger/output --last-month --weekdays-only )'
```
Then run:
```bash
mileage
```
---
## Installing
### Windows (PowerShell)
```powershell
# Run in PowerShell (inside your venv):
pip install -r requirements.txt
function mileage {
Set-Location "$HOME\Downloads\Mileage Logger"
python -m mileage_logger.cli import "Timeline.json" `
--sites config\sites.yml `
--routes tests\data
outes_golden.csv `
--output "$HOME\Downloads\Mileage Logger\output" `
--last-month `
--weekdays-only
}
```
### macOS / Linux
```bash
pip install -r requirements.txt
# (optional) add the alias from Quick Start to your shell rc
```
---
## Configuration
### `config/sites.yml`
Define your whitelisted locations.
```yaml
sites:
- canonical: "Home"
label: "Home"
lat: 52.65236
lon: 1.26983
radius_m: 400
aliases: ["home", "inferred_home", "INFERRED_HOME"]
- canonical: "Henderson Green Primary Academy"
label: "Henderson Green Primary Academy"
lat: 52.6565032
lon: 1.2703586
radius_m: 300
aliases: ["Henderson Green", "Henderson Green Primary"]
- canonical: "Unity SP"
label: "Unity SP (HQ)"
lat: 52.6067
lon: 1.2886
radius_m: 350
aliases: ["WORK", "Unity SP HQ"]
# ...other schools...
```
Tips:
- **radius_m**: start at 300600 m for schools (device visits often pin to car parks, not building centroids).
- Add aliases you see in Timeline (e.g., `WORK`, `INFERRED_HOME`).
### `tests/data/routes_golden.csv`
Preapproved driving distances (miles) for common pairs.
```
origin,destination,miles
Home,Henderson Green Primary Academy,2.9
Henderson Green Primary Academy,Home,2.9
Henderson Green Primary Academy,Valley Primary Academy,1.1
Valley Primary Academy,Heartsease Primary Academy,4.7
# ...etc
```
If a pair isnt found, the tool falls back to straightline (haversine) distance and rounds to 0.1 mi.
---
## CLI Usage
```bash
python -m mileage_logger.cli import TIMELINE.json --sites config/sites.yml --routes tests/data/routes_golden.csv --output output [date filter flags] [behavior flags]
```
### Date filter flags (choose one style)
- `--last-month` — previous calendar month (e.g., run on 1 Sep → processes August)
- `--month YYYY-MM` — specific month (e.g., `--month 2025-08`)
- `--since YYYY-MM-DD` / `--until YYYY-MM-DD` — inclusive range
- `--days N` — last N days relative to today (local time)
### Behavior flags
- `--weekdays-only` — exclude Saturday/Sunday hops
- `--no-assume-home-start` — disable synthetic `Home → FirstSite` at start of day (default is ON)
---
## Output
One workbook per month present in the filtered data:
- File: `mileage_YYYY-MM.xlsx`
- Sheet: `YYYY-MM`
- Columns:
- Date (YYYY-MM-DD)
- Purpose (`Travel from {From} to {To} {Miles}mi`)
- Miles (rounded to 0.1)
- Vehicle
- Job Role
- From
- To
- Notes (empty)
---
## For another user/colleague
- Copy the whole folder.
- Edit `config/sites.yml`:
- Update **Home** lat/lon and radius.
- Keep schools the same unless their coverage differs.
- Update/add `tests/data/routes_golden.csv` lines for Home↔Sites if their home is different.
- Confirm the alias points to their own path.
- Run the same monthly command.
---
## Requirements
- Python 3.10+ (tested on 3.103.13)
- Works on Windows, macOS, Linux
### `requirements.txt`
```
python-dateutil>=2.8
pytz>=2023.3
PyYAML>=6.0
openpyxl>=3.1
geopy>=2.4
# Optional: only needed if you enable external routing APIs later
httpx>=0.27
```
---
## Makefile (optional convenience)
```make
install:
pip install -r requirements.txt
run:
python -m mileage_logger.cli import "Timeline.json" \ --sites config/sites.yml \ --routes tests/data/routes_golden.csv \ --output output \ --last-month \ --weekdays-only
# If you add linting/tests later:
lint:
flake8 mileage_logger
test:
pytest
```
Usage:
```bash
make install
make run
```
---
## Troubleshooting
- **No rows appear** — Increase `radius_m` (e.g., 400600 m). Ensure aliases like `INFERRED_HOME`, `WORK` exist for Home/HQ.
- **Trips start midday** — Ensure you didnt pass `--no-assume-home-start`.
- **Only one workbook created** — Likely only one month had hops in the filtered range (expected with `--last-month`).
- **“Module not found” errors** — Activate the same environment you installed deps into (or reinstall with `pip install -r requirements.txt`).
---