Skip to main content

aiodukeenergy

CI Status Documentation Status Test coverage percentage

Poetry Ruff pre-commit

PyPI Version Supported Python versions License


Documentation: https://aiodukeenergy.readthedocs.io

Source Code: https://github.com/hunterjm/aiodukeenergy


Asyncio Duke Energy

Installation

Install this via pip (or your favourite package manager):

pip install aiodukeenergy

Usage

Duke Energy uses Auth0 with CAPTCHA protection which blocks automated logins. Authentication requires a browser-based OAuth flow using a Chrome extension to capture the mobile app's custom redirect URL.

Setup

  1. Install the Chrome extension:

    • Download the latest chrome-extension.zip from releases (or use ./chrome-extension/ from source)
    • Extract the zip file
    • Open Chrome and navigate to chrome://extensions/
    • Enable "Developer mode"
    • Click "Load unpacked" and select the extracted folder
  2. Run the browser authentication script:

    cd examples
    python browser_auth.py
    
  3. The script will:

    • Open your browser to Duke Energy's login page
    • After you log in, the extension captures the authorization code
    • Exchange the code for API tokens
    • Save tokens to duke_tokens.json

Using Tokens

Once you have tokens, use them with the library:

import asyncio
import aiohttp
from aiodukeenergy import Auth0Client, DukeEnergy, DukeEnergyAuth


async def main():
    # Option 1: Load from token file
    import json

    with open("duke_tokens.json") as f:
        tokens = json.load(f)

    async with aiohttp.ClientSession() as session:
        auth0_client = Auth0Client(session)
        auth = DukeEnergyAuth(
            session,
            auth0_client,
            access_token=tokens["access_token"],
            refresh_token=tokens.get("refresh_token"),
            id_token=tokens.get("id_token"),
        )

        client = DukeEnergy(auth)

        accounts = await client.get_accounts()
        print(accounts)

        meters = await client.get_meters()
        for serial, meter in meters.items():
            print(f"Meter: {serial} ({meter['serviceType']})")


asyncio.run(main())

Browser OAuth Flow (Programmatic)

You can also integrate the OAuth flow into your own application:

import asyncio
import webbrowser
import aiohttp
from aiodukeenergy import Auth0Client, DukeEnergy, DukeEnergyAuth


async def main():
    async with aiohttp.ClientSession() as session:
        auth0_client = Auth0Client(session)
        auth = DukeEnergyAuth(session, auth0_client)

        # Step 1: Get authorization URL with PKCE
        auth_url, state, code_verifier = auth0_client.get_authorization_url()

        # Step 2: Open browser for user login
        webbrowser.open(auth_url)

        # Step 3: Get the authorization code (captured by Chrome extension)
        code = input("Enter the authorization code: ")

        # Step 4: Exchange code for tokens
        await auth.authenticate_with_code(code, code_verifier)

        # Now you can make API calls
        client = DukeEnergy(auth)
        accounts = await client.get_accounts()
        print(accounts)


asyncio.run(main())

Available Classes

  • Auth0Client - OAuth2/OIDC client for Duke Energy's Auth0
    • get_authorization_url() - Generate browser OAuth URL with PKCE (returns url, state, code_verifier)
    • exchange_code(code, code_verifier) - Exchange authorization code for tokens
    • refresh_token(refresh_token) - Refresh expired tokens
  • AbstractDukeEnergyAuth - Abstract base class for auth providers
    • async_get_id_token() - Get a valid ID token (abstract)
    • async_get_access_token() - Get a valid access token
    • request(method, url, **kwargs) - Make authenticated requests
  • DukeEnergyAuth - Concrete auth implementation using Auth0Client
    • authenticate_with_code(code, code_verifier) - Complete OAuth flow
    • token - Property to get current token dictionary
  • DukeEnergy - API client for Duke Energy
    • get_accounts() - Get all accounts
    • get_meters() - Get all meters
    • get_energy_usage(meter_serial, interval, view, start_date, end_date) - Get usage data

Contributors ✨

Thanks goes to these wonderful people (emoji key):

This project follows the all-contributors specification. Contributions of any kind welcome!

Credits

This package was created with Copier and the browniebroke/pypackage-template project template.

Metadata

Release files for aiodukeenergy 1.1.1

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

Source distribution (sdist)

Source distribution for aiodukeenergy 1.1.1
File Size Uploaded
aiodukeenergy-1.1.1.tar.gz 15.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for aiodukeenergy 1.1.1
File Interpreter ABI Platform
aiodukeenergy-1.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 31.3 kB

Release files / aiodukeenergy-1.1.1.tar.gz

Download URL aiodukeenergy-1.1.1.tar.gz
Size 15.5 kB
Tags Source
SHA-256 checksum
How to use checksums
ee50832aec849e23cc57ad9d0d4ee3b421af806568b9b25fe2debe2d4f3be204
BLAKE2b-256 checksum
How to use checksums
41cb9e411092865ade9379c9565320c15ca373bbf23c9ffe20a96686c6f08883
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Sep 19, 2026.

Transparency log

Release files / aiodukeenergy-1.1.1-py3-none-any.whl

Download URL aiodukeenergy-1.1.1-py3-none-any.whl
Size 15.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0826d5941547bb166c61f83759c43113117ee3853bbea824c496abf4f392c6b2
BLAKE2b-256 checksum
How to use checksums
119d068c1431fba7936962fab07e4129c7bb155ac2e6da6ae0a3a7443e87ad83
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 Sep 19, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.1.1 This release

2 release files

1.1.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.3.0

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.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