Skip to main content

Async Python client for the Leviton My Leviton cloud API

Project description

aioleviton

Async Python client for the Leviton My Leviton cloud API.

Supports LWHEM and DAU/LDATA Smart Load Centers with WebSocket real-time push and REST API fallback.

Features

  • Pure asyncio with aiohttp -- no blocking calls
  • Accepts an injected aiohttp.ClientSession for connection pooling
  • WebSocket real-time push notifications with automatic subscription management
  • Full REST API coverage: authentication, device discovery, breaker control, energy history
  • Typed data models with PEP 561 py.typed marker
  • Support for both hub types: LWHEM (IotWhem) and DAU/LDATA (ResidentialBreakerPanel)
  • Two-factor authentication (2FA) support

Installation

pip install aioleviton

Quick Start

import aiohttp
from aioleviton import LevitonClient

async def main():
    async with aiohttp.ClientSession() as session:
        # Authenticate
        client = LevitonClient(session)
        auth = await client.login("user@example.com", "password")

        # Discover devices
        permissions = await client.get_permissions()
        for perm in permissions:
            if perm.residential_account_id:
                residences = await client.get_residences(perm.residential_account_id)
                for residence in residences:
                    whems = await client.get_whems(residence.id)
                    panels = await client.get_panels(residence.id)

        # Get breakers for a LWHEM hub
        for whem in whems:
            breakers = await client.get_whem_breakers(whem.id)
            cts = await client.get_cts(whem.id)

        # Connect WebSocket for real-time updates
        ws = client.create_websocket()
        await ws.connect()

        # Subscribe to a hub (delivers all child breaker/CT updates)
        await ws.subscribe("IotWhem", whem.id)

        # Handle notifications
        ws.on_notification(lambda data: print("Update:", data))

Note: On LWHEM firmware 2.0.0+, hub subscriptions no longer deliver individual breaker updates. You must subscribe to each ResidentialBreaker separately. CT updates are still delivered via the hub subscription on all firmware versions.

Debug Logging

from aioleviton import enable_debug_logging

enable_debug_logging()  # sets aioleviton logger to DEBUG

Supported Devices

Device API Model Hub Type
LWHEM (Whole Home Energy Module) IotWhem Wi-Fi hub
DAU / LDATA (Data Acquisition Unit) ResidentialBreakerPanel Wi-Fi hub
Smart Breaker Gen 1 (trip only) ResidentialBreaker Child of LWHEM or DAU
Smart Breaker Gen 2 (on/off) ResidentialBreaker Child of LWHEM or DAU
Current Transformer (CT) IotCt Child of LWHEM only
LSBMA Add-on CT ResidentialBreaker Virtual composite

Breaker Control

# Trip a Gen 1 breaker (cannot turn back on remotely)
await client.trip_breaker(breaker_id)

# Turn on/off a Gen 2 breaker
await client.turn_on_breaker(breaker_id)
await client.turn_off_breaker(breaker_id)

# Blink LED on a breaker (toggle on/off)
await client.blink_led(breaker_id)
await client.stop_blink_led(breaker_id)

# Identify LED on a LWHEM hub (on only, no off)
await client.identify_whem(whem_id)

Energy History

Energy history endpoints return consumption data for all devices in a residence. Data is keyed by hub ID, then by breaker position and CT channel.

# Daily energy (hourly data points)
day = await client.get_energy_for_day(
    residence_id=123456,
    start_day="2026-02-16",
    timezone="America/Los_Angeles",
)

# Weekly energy (daily data points for 7 days)
week = await client.get_energy_for_week(
    residence_id=123456,
    start_day="2026-02-17",
    timezone="America/Los_Angeles",
)

# Monthly energy (daily data points for billing month)
month = await client.get_energy_for_month(
    residence_id=123456,
    billing_day_in_month="2026-02-28",
    timezone="America/Los_Angeles",
)

# Yearly energy (monthly data points for 12 months)
year = await client.get_energy_for_year(
    residence_id=123456,
    billing_day_in_end_month="2026-02-16",
    timezone="America/Los_Angeles",
)

# Response structure:
# {
#   "<hub_id>": {
#     "residentialBreakers": {"<position>": [{x, timestamp, energyConsumption, totalCost, ...}]},
#     "iotCts": {"<channel>": [...]},
#     "totals": [...]
#   },
#   "totals": [...]  # residence-level totals
# }

Firmware Check

# Check for available firmware updates
firmware = await client.check_firmware(
    app_id="LWHEM",
    model="AZ",
    serial="1000_XXXX_XXXX",
    model_type="IotWhem",
)
# Returns list of firmware objects with version, fileUrl, signature, hash, size, notes
for fw in firmware:
    print(f"v{fw['version']}: {fw['fileUrl']}")

Roadmap

  • Future compatibility with other Leviton product lines (Decora smart switches, dimmers, etc.)

Disclaimer

This is a do-it-yourself project for Leviton Load Center product users and is not affiliated with, endorsed by, or sponsored by Leviton Manufacturing Co., Inc. "Leviton" and all related product names are trademarks of Leviton Manufacturing Co., Inc. This library interacts with Leviton's cloud services using your own account credentials. Use at your own risk.

License

MIT

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

aioleviton-0.3.1.tar.gz (27.6 kB view details)

Uploaded Source

Built Distribution

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

aioleviton-0.3.1-py3-none-any.whl (18.0 kB view details)

Uploaded Python 3

File details

Details for the file aioleviton-0.3.1.tar.gz.

File metadata

  • Download URL: aioleviton-0.3.1.tar.gz
  • Upload date:
  • Size: 27.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for aioleviton-0.3.1.tar.gz
Algorithm Hash digest
SHA256 260cc0fdf1ec5ee2b1ebd1f104bf77deb1c776b6a0f2bf29e23099e8ceab7592
MD5 b7cc2964fca754fcb51516a7003e0c6f
BLAKE2b-256 84f2c745bde2422c57360a10c2f8d2ac94981e76454b27adab12a29659840c12

See more details on using hashes here.

Provenance

The following attestation bundles were made for aioleviton-0.3.1.tar.gz:

Publisher: publish.yml on gtxaspec/aioleviton

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aioleviton-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: aioleviton-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 18.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for aioleviton-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e5c98e1de15b9a5aa16178497d8af04c82cdfca4cedfdbd56fa10b3686041436
MD5 8681263917093fa63af2ecc9d351c906
BLAKE2b-256 9b183890ead27c798ac04cff8b1a7ea5383d8575c117c5f1771ff84a071caf7b

See more details on using hashes here.

Provenance

The following attestation bundles were made for aioleviton-0.3.1-py3-none-any.whl:

Publisher: publish.yml on gtxaspec/aioleviton

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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