Skip to main content

Python client for the UK National Grid Carbon Intensity API

Project description

UK Grid Carbon Intensity API Client

A comprehensive Python client for the UK National Grid Carbon Intensity API. This package provides easy access to carbon intensity data, generation mix information, regional data, and statistics with full type safety using Pydantic models.

License: MIT

Installation

Using pip

pip install uk-grid-intensity

Using UV (recommended for development)

uv add uk-grid-intensity

Quick Start

Basic Usage

from uk_grid_intensity import CarbonIntensityClient

# Create client
client = CarbonIntensityClient()

# Get current carbon intensity
current = client.get_current_intensity()
for data in current:
    print(f"Period: {data.from_} to {data.to}")
    print(f"Intensity: {data.intensity.forecast} gCO2/kWh")
    print(f"Index: {data.intensity.index}")
# close the httpx connection
client.close()

Using Context Manager (Recommended)

from uk_grid_intensity import CarbonIntensityClient

with CarbonIntensityClient() as client:
    # Get current generation mix
    generation = client.get_current_generation_mix()
    for fuel in generation.generationmix:
        print(f"{fuel.fuel}: {fuel.perc}%")

Async Usage

import asyncio
from uk_grid_intensity import CarbonIntensityClient

async def get_data():
    async with CarbonIntensityClient() as client:
        # Get current intensity asynchronously
        current = await client.aget_current_intensity()
        return current

# Run async function
data = asyncio.run(get_data())

API Coverage

The client supports all endpoints from the UK Carbon Intensity API:

Intensity Data

  • Current intensity
  • Intensity by date/date range
  • Intensity by periods
  • Forward forecasts (24h, 48h)
  • Intensity statistics

Generation Mix

  • Current generation mix
  • Generation mix by date/period

Regional Data

  • Regional intensity data
  • Data by region ID
  • Data by postcode/outcode

Additional Data

  • Carbon intensity factors
  • National statistics

Command Line Interface

The package includes a CLI tool for quick access:

# Get current intensity
uk-grid-intensity current

# Get intensity for today
uk-grid-intensity date today

# Get generation mix
uk-grid-intensity generation

# Get regional data
uk-grid-intensity regional --region-id 13

# Get carbon factors
uk-grid-intensity factors

CLI Help

uk-grid-intensity --help
uk-grid-intensity current --help

Advanced Usage

Error Handling

from uk_grid_intensity import CarbonIntensityClient, CarbonIntensityAPIError

try:
    with CarbonIntensityClient() as client:
        data = client.get_intensity_by_region_id(99)  # Invalid region
except CarbonIntensityAPIError as e:
    print(f"API Error: {e.message}")
    print(f"Status Code: {e.status_code}")
except ValueError as e:
    print(f"Validation Error: {e}")

Custom Configuration

from uk_grid_intensity import CarbonIntensityClient

client = CarbonIntensityClient(
    base_url="https://api.carbonintensity.org.uk",  # Custom base URL
    timeout=60,  # Custom timeout in seconds
)

Working with Regions

from uk_grid_intensity import CarbonIntensityClient
from uk_grid_intensity.constants import REGION_NAMES

with CarbonIntensityClient() as client:
    # Get data for all regions
    regional_data = client.get_current_regional_intensity()
    
    for time_data in regional_data:
        for region in time_data.regions:
            region_name = REGION_NAMES.get(region.regionid, f"Region {region.regionid}")
            print(f"{region_name}: {region.intensity.forecast} gCO2/kWh")

Data Models

All API responses are parsed into Pydantic models with full type safety:

from uk_grid_intensity.schemas import IntensityData, GenerationData

# All models include proper typing and validation
intensity: IntensityData = client.get_current_intensity()[0]
print(intensity.intensity.forecast)  # Type-safe access
print(intensity.intensity.index)     # Enum value

# Rich model with all fields
generation: GenerationData = client.get_current_generation_mix()
for fuel in generation.generationmix:
    print(f"{fuel.fuel}: {fuel.perc}%")  # Type-safe iteration

Examples

Find the Cleanest Time Today

from uk_grid_intensity import CarbonIntensityClient

with CarbonIntensityClient() as client:
    today_data = client.get_intensity_today()
    
    if today_data:
        cleanest = min(today_data, key=lambda x: x.intensity.forecast or float('inf'))
        print(f"Cleanest period: {cleanest.from_.strftime('%H:%M')} - {cleanest.to.strftime('%H:%M')}")
        print(f"Intensity: {cleanest.intensity.forecast} gCO2/kWh")

Get Weekly Statistics

from datetime import datetime, timedelta
from uk_grid_intensity import CarbonIntensityClient

with CarbonIntensityClient() as client:
    end_date = datetime.now()
    start_date = end_date - timedelta(days=7)
    
    stats = client.get_intensity_statistics(start_date, end_date)
    for data in stats:
        print(f"Average: {data.intensity.average} gCO2/kWh")
        print(f"Min: {data.intensity.min} gCO2/kWh")
        print(f"Max: {data.intensity.max} gCO2/kWh")

Compare Regional Data

from uk_grid_intensity import CarbonIntensityClient

with CarbonIntensityClient() as client:
    # London (region 13) vs Scotland (region 1)
    london = client.get_intensity_by_region_id(13)
    scotland = client.get_intensity_by_region_id(1)
    
    london_intensity = london[0].data[0].intensity.forecast
    scotland_intensity = scotland[0].data[0].intensity.forecast
    
    print(f"London: {london_intensity} gCO2/kWh")
    print(f"Scotland: {scotland_intensity} gCO2/kWh")

Contributing

  1. Fork the repository
  2. Create a branch
  3. Make your changes
  4. (ideally) Add tests for your changes
  5. Ensure all tests pass
  6. Commit your changes (git commit -m 'Add amazing feature')
  7. Push to the branch (git push origin feature/amazing-feature)
  8. Open a Pull Request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

API Reference

For detailed API documentation, visit the UK Carbon Intensity API documentation.

Supported Regions

Region ID Region Name
1 North Scotland
2 South Scotland
3 North West England
4 North East England
5 Yorkshire
6 North Wales
7 South Wales
8 West Midlands
9 East Midlands
10 East England
11 South West England
12 South England
13 London
14 South East England
15 England
16 Scotland
17 Wales

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

uk_grid_intensity-0.1.1.tar.gz (62.4 kB view details)

Uploaded Source

Built Distribution

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

uk_grid_intensity-0.1.1-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file uk_grid_intensity-0.1.1.tar.gz.

File metadata

  • Download URL: uk_grid_intensity-0.1.1.tar.gz
  • Upload date:
  • Size: 62.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.15

File hashes

Hashes for uk_grid_intensity-0.1.1.tar.gz
Algorithm Hash digest
SHA256 15361597dc3bd3486f6f1070f1bb0abcf8aba190b4d30f1a555af31a5d8a081a
MD5 9497484c80d26f2de0b1587008fe7ca0
BLAKE2b-256 b0bd82d1cd46704a42f8b47db8f7820064bb02a4b00499b645e0e552c758b142

See more details on using hashes here.

File details

Details for the file uk_grid_intensity-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for uk_grid_intensity-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 dec55763cb1beaeca1b37890f3f7604296f395248c380bbf0e6f1913a7f926aa
MD5 6b54dbf3aa16975b5309fe486ac0377f
BLAKE2b-256 f54425e2058baa2c691f34b2a246f8b9a0f074746e01213f4d41d640c8309660

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