Poll EV charging APIs and write station status events to TimescaleDB/PostgreSQL.
Project description
EV Charging Status
Python app that polls charger APIs and writes station status events to TimescaleDB/PostgreSQL.
Setup
uv sync
cp .env.example .env
Put real DB credentials and API tokens in .env. .env is ignored by git.
Run commands through uv run, for example:
uv run ev-status --help
Database
Initialize schema and seed default sites/statuses/stations:
uv run ev-status init-db
Only rows with sites.enabled = true are polled.
Run
First run, or after recreating/changing the database schema, initialize the database once:
uv run ev-status init-db
Routine one-time poll:
uv run ev-status poll
You can combine initialization and polling for a safe first run:
uv run ev-status poll --init-db
--init-db is not required for every poll. It only ensures the database, tables, indexes, default sites, default statuses, default stations, and TimescaleDB setup exist before polling.
Continuous 5-minute loop (or POLL_INTERVAL_SECONDS):
uv run ev-status run-loop
For a safe first continuous run:
uv run ev-status run-loop --init-db
Sync historical rows from the public Google Sheet CSV into station_status_events:
uv run ev-status sync-sheet
Set SYNC_SHEET_ID in .env. By default the command reads Sheet1 using:
https://docs.google.com/spreadsheets/d/<SYNC_SHEET_ID>/gviz/tq?tqx=out:csv&sheet=Sheet1
The sheet must include columns like current_time, station_name, and status. The sync command inserts only rows that do not already exist with the same (time, station_id, status). Rows for station IDs not present in the stations table are ignored.
You can override the tab or full CSV URL:
uv run ev-status sync-sheet --sheet-name Sheet1
uv run ev-status sync-sheet --url 'https://docs.google.com/spreadsheets/d/{SHEETID}/gviz/tq?tqx=out:csv&sheet=Sheet1'
Optimize station_status_events storage:
uv run ev-status optimize-db
This rounds existing event timestamps to second precision, drops the redundant (time DESC, station_id) index, and compresses TimescaleDB chunks older than 7 days. Timestamp precision is also second-level for new polls.
You can change the compression cutoff:
uv run ev-status optimize-db --compress-older-than '1 day'
Show total database size:
uv run ev-status db-size
# include table/relation sizes
uv run ev-status db-size --tables
Tables
sites: site enable/disable controlstatus_lookup: status IDs; new normalized statuses are inserted automaticallystations: station metadata inserted once on first sightstation_status_events: Timescale hypertable with exactly(time, station_id, status)site_latest_snapshot: latest raw JSONB API response per site
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ev_charging_status-0.1.4.tar.gz.
File metadata
- Download URL: ev_charging_status-0.1.4.tar.gz
- Upload date:
- Size: 18.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f55252b16fa665996dd914ba9dbde6975e8519b3a68cf856c97e2dccf7bd0a71
|
|
| MD5 |
f2f2e7b23982a3cef56258a9559e77a4
|
|
| BLAKE2b-256 |
2aed71ecb3ce7475d5bcc8b4d44f38b46c43da99f2ca025d91e1162fb81883f3
|
File details
Details for the file ev_charging_status-0.1.4-py3-none-any.whl.
File metadata
- Download URL: ev_charging_status-0.1.4-py3-none-any.whl
- Upload date:
- Size: 22.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c1295cabc931f4a53fbe56bb60f26ab051759217b6476b681836c3ff755fd54e
|
|
| MD5 |
7591dae7b740828e3a711f1abfc82587
|
|
| BLAKE2b-256 |
7529aa0fc501205c9b106d78a155e5bba37363738b35427867b3741c96462d3d
|