Skip to main content

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

The CLI is published on PyPI as ev-charging-status. Run it with uvx (no install/checkout needed):

uvx ev-charging-status --help

Provide DB credentials and API tokens via a .env file. The CLI loads, in order, the first file found in the current directory: config/.ev.env, .env, then config/.env. Copy the example and fill it in:

cp .env.example .env

.env is ignored by git. Run uvx commands from the directory that holds your env file so it gets picked up.

Developing from a source checkout instead? Run uv sync and use uv run ev-charging-status <command> in place of uvx ev-charging-status <command>.

Database

Initialize schema and seed default sites/statuses/stations:

uvx ev-charging-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:

uvx ev-charging-status init-db

Routine one-time poll:

uvx ev-charging-status poll

You can combine initialization and polling for a safe first run:

uvx ev-charging-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):

uvx ev-charging-status run-loop

For a safe first continuous run:

uvx ev-charging-status run-loop --init-db

Sync historical rows from the public Google Sheet CSV into station_status_events:

uvx ev-charging-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:

uvx ev-charging-status sync-sheet --sheet-name Sheet1
uvx ev-charging-status sync-sheet --url 'https://docs.google.com/spreadsheets/d/{SHEETID}/gviz/tq?tqx=out:csv&sheet=Sheet1'

Optimize station_status_events storage:

uvx ev-charging-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:

uvx ev-charging-status optimize-db --compress-older-than '1 day'

Show total database size:

uvx ev-charging-status db-size
# include table/relation sizes
uvx ev-charging-status db-size --tables

Tables

  • sites: site enable/disable control
  • status_lookup: status IDs; new normalized statuses are inserted automatically
  • stations: station metadata inserted once on first sight
  • station_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

ev_charging_status-0.1.7.tar.gz (20.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ev_charging_status-0.1.7-py3-none-any.whl (23.8 kB view details)

Uploaded Python 3

File details

Details for the file ev_charging_status-0.1.7.tar.gz.

File metadata

  • Download URL: ev_charging_status-0.1.7.tar.gz
  • Upload date:
  • Size: 20.1 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

Hashes for ev_charging_status-0.1.7.tar.gz
Algorithm Hash digest
SHA256 52de8db3ec000b9c2b6b036efd0b0a6f7a697a0663a02a40ec16bf783cc21574
MD5 d3800e89594e1ed01c693823430a0f6d
BLAKE2b-256 ba22f835e804f6c2bf03f9614b5fa3099f841c19c34448ec8e6c1e7f88790b55

See more details on using hashes here.

File details

Details for the file ev_charging_status-0.1.7-py3-none-any.whl.

File metadata

  • Download URL: ev_charging_status-0.1.7-py3-none-any.whl
  • Upload date:
  • Size: 23.8 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

Hashes for ev_charging_status-0.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 9c7a629bb3865e2297205df7819f15f97d7b84386d6a8725661dc54f3f785c63
MD5 2989449107d9350d6db11ec44de06f7b
BLAKE2b-256 5df8bcd302e42b74af34a2bbb8b136bf41823fafc7582b83a99e7c34692ac62c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page