Skip to main content

python-openei

PyPI version License: MIT

An asynchronous Python library for consuming utility rate data from the OpenEI.org API and outputting it into an easy-to-use format.

Features

  • Asynchronous API: Fully built on aiohttp for non-blocking network calls.
  • Auto Caching: Automatically caches API responses locally (24-hour expiration) to stay within rate limits.
  • Utility Plan Lookup: Find utility rate plans by coordinates (latitude/longitude) or street address.
  • Rate Schedule Queries: Calculates current and upcoming energy rates, demand rates, adjustments, and tier/sell rates for any given date and time.

Installation

Install using pip:

pip install python-openei

Quick Start

You will need an API key from OpenEI.org.

Basic Usage

Here is a quick example of how to retrieve and query energy rates for a specific plan:

import asyncio
from openeihttp import Rates

async def main():
    # Initialize Rates helper
    # Retrieve a specific plan (e.g. "539fca56ec12157c50403bf6")
    api = Rates(
        api="YOUR_OPENEI_API_KEY",
        plan="539fca56ec12157c50403bf6",
        cache_file="my_rate_cache.json"  # Optional local cache file
    )

    # Fetch/update the rate plan details
    await api.update()

    print(f"Rate Plan Name: {api.rate_name}")
    print(f"Current Energy Rate: ${api.current_rate}/kWh")
    print(f"Current Sell Rate: ${api.current_sell_rate}/kWh")

    # Check what the next rate will be and when it changes
    next_time = api.next_energy_rate_structure_time
    next_rate = api.next_energy_rate_structure
    print(f"Next rate change at: {next_time} (structure ID: {next_rate})")

asyncio.run(main())

Plan Lookup

If you do not know the plan ID, you can look up available plans using a latitude/longitude pair or a physical address:

import asyncio
from openeihttp import Rates

async def lookup():
    # Set up lookup using latitude and longitude
    api = Rates(
        api="YOUR_OPENEI_API_KEY",
        lat=37.7749,
        lon=-122.4194,
        radius=5.0  # Optional search radius in miles
    )

    plans = await api.lookup_plans()

    # plans will be grouped by utility name
    for utility, plan_list in plans.items():
        print(f"\nUtility: {utility}")
        for plan in plan_list:
            print(f"  - {plan['name']} (Plan Label: {plan['label']})")

asyncio.run(lookup())

API Reference

Properties

The Rates object exposes the following properties after a successful update():

Property Return Type Description
rate_name str Name of the utility rate plan.
approval bool Approval status of the rate plan on OpenEI.
current_rate float | None Current active energy rate in $/kWh.
current_sell_rate float | None Current net-metering / sell rate in $/kWh.
current_adjustment float | None Current rate adjustment value in $/kWh.
next_energy_rate_structure int | None Upcoming energy rate structure ID.
next_energy_rate_structure_time datetime | None The time at which the next energy rate structure starts.
current_demand_rate float | None Current demand rate.
current_demand_adjustment float | None Current demand rate adjustment.
demand_unit str | None The unit of the demand rate.
monthly_tier_rate float | None Current tier rate based on monthly meter reading.
distributed_generation str | None Distributed generation rules / net-metering type.
mincharge tuple[float, str] | None Minimum charge amount and units (e.g. (10.0, "$/month")).
fixedchargefirstmeter tuple[float, str] | None Fixed charge amount and units for the first meter.

Methods

  • await api.update(): Updates the internal data. Loads from cache if fresh, otherwise fetches from API and caches locally.
  • await api.update_data(): Forces a fresh API call (bypassing cache) and rewrites the cache file.
  • await api.clear_cache(): Deletes the cache file if one was configured.
  • api.rate(date: datetime): Look up the energy rate for a specific date and time.
  • api.sell_rate(date: datetime): Look up the sell/net-metering rate for a specific date and time.
  • api.demand_rate(date: datetime): Look up the demand rate for a specific date and time.

Development

This project uses tox to run checks and tests across Python versions.

Run Tests and Linters

Make sure you have tox installed, then run:

tox

Metadata

Release files for python-openei 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for python-openei 0.3.0
File Size Uploaded
python_openei-0.3.0.tar.gz 19.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for python-openei 0.3.0
File Interpreter ABI Platform
python_openei-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 32.3 kB

Release files / python_openei-0.3.0.tar.gz

Download URL python_openei-0.3.0.tar.gz
Size 19.2 kB
Tags Source
SHA-256 checksum
How to use checksums
655c51366732993fe9420c3d6a2ed982b0bc1816bbddfd7ed2ef810a619847eb
BLAKE2b-256 checksum
How to use checksums
adee98158871b1db6ef749f4f67348a98d988125b8b76d37fc7b1560bd7b8e9a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 22, 2026.

Transparency log

Release files / python_openei-0.3.0-py3-none-any.whl

Download URL python_openei-0.3.0-py3-none-any.whl
Size 13.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c7aa7e0367840f46351a34fabd8c0be00bf0c355630d3201de7d97104bf1836f
BLAKE2b-256 checksum
How to use checksums
8cd5a2da734f85c5a3ba917fa8c4da748e6056a21df1463db8f63e89f7bba1a6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 22, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.23

2 release files

0.1.21

2 release files

0.1.20

2 release files

0.1.18

2 release files

0.1.17

2 release files

0.1.16

2 release files

0.1.15

2 release files

0.1.14

2 release files

0.1.13

2 release files

0.1.12

2 release files

0.1.11

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page