Skip to content

Charging Profiles

This tutorial demonstrates how to manage charging profiles for smart charging (OCPI 2.2.1+).

Overview

Charging profiles allow control of charging power over time, enabling: - Load balancing - Grid optimization - Cost optimization - Renewable energy integration

Setup

Include the charging profiles module:

from ocpi import get_application
from ocpi.core.enums import ModuleID, RoleEnum
from ocpi.modules.versions.enums import VersionNumber

app = get_application(
    version_numbers=[VersionNumber.v_2_3_0],
    roles=[RoleEnum.cpo],
    modules=[ModuleID.charging_profile, ModuleID.sessions],
    authenticator=YourAuthenticator,
    crud=YourCrud,
)

Setting a Charging Profile

Basic Charging Profile

charging_profile_data = {
    "charging_profile": {
        "start_date_time": "2024-01-01T10:00:00Z",
        "charging_rate_unit": "A",
        "charging_schedule": {
            "start_schedule": "2024-01-01T10:00:00Z",
            "charging_rate_unit": "A",
            "charging_periods": [
                {
                    "start_period": 0,
                    "limit": 16.0
                }
            ]
        }
    },
    "response_url": "https://emsp.example.com/chargingprofiles/response"
}

Advanced Charging Profile

charging_profile_data = {
    "charging_profile": {
        "start_date_time": "2024-01-01T10:00:00Z",
        "duration": 7200,  # 2 hours
        "charging_rate_unit": "A",
        "charging_schedule": {
            "start_schedule": "2024-01-01T10:00:00Z",
            "charging_rate_unit": "A",
            "charging_periods": [
                {
                    "start_period": 0,
                    "limit": 16.0,
                    "number_phases": 3
                },
                {
                    "start_period": 1800,  # After 30 minutes
                    "limit": 32.0,
                    "number_phases": 3
                }
            ]
        }
    },
    "response_url": "https://emsp.example.com/chargingprofiles/response"
}

Charging Rate Units

  • A - Amperes (current)
  • W - Watts (power)

Implementing Charging Profile Handling

from ocpi.core.enums import Action, ModuleID, RoleEnum

class YourCrud(Crud):
    @classmethod
    async def do(
        cls,
        module: ModuleID,
        role: RoleEnum | None,
        action: Action,
        *args,
        data: dict | None = None,
        **kwargs,
    ) -> dict:
        """Handle charging profile actions."""
        if module == ModuleID.charging_profile:
            session_id = kwargs.get("session_id")
            duration = kwargs.get("duration")

            if action == Action.send_update_charging_profile:
                # Set or update charging profile
                charging_profile = data.get("charging_profile") if data else None

                if charging_profile and session_id:
                    # Store charging profile
                    # Send to charge point via OCPP SetChargingProfile
                    result = await send_ocpp_set_charging_profile(
                        session_id, charging_profile
                    )

                    return {
                        "result": "ACCEPTED" if result else "REJECTED"
                    }

            elif action == Action.send_get_chargingprofile:
                # Get active charging profile
                profile = await get_active_charging_profile(session_id, duration)

                return {
                    "result": "ACCEPTED",
                    "charging_profile": profile
                }

            elif action == Action.send_delete_chargingprofile:
                # Clear charging profile
                result = await clear_charging_profile(session_id)

                return {
                    "result": "ACCEPTED" if result else "REJECTED"
                }

        return {}

Charging Profile Results

Possible results:

  • ACCEPTED - Profile was accepted
  • NOT_SUPPORTED - Not supported by charge point
  • REJECTED - Profile was rejected
  • UNKNOWN_SESSION - Session not found

API Usage

Set Charging Profile (PUT)

curl -X PUT 'http://127.0.0.1:8000/ocpi/cpo/2.3.0/chargingprofiles/SESS001' \
  -H 'Authorization: Token your-token' \
  -H 'Content-Type: application/json' \
  -d @charging_profile.json

Get Active Charging Profile (GET)

curl 'http://127.0.0.1:8000/ocpi/cpo/2.3.0/chargingprofiles/SESS001?duration=3600' \
  -H 'Authorization: Token your-token'

Clear Charging Profile (DELETE)

curl -X DELETE 'http://127.0.0.1:8000/ocpi/cpo/2.3.0/chargingprofiles/SESS001' \
  -H 'Authorization: Token your-token'

Charging Periods

Charging periods define power limits over time:

charging_periods = [
    {
        "start_period": 0,  # Start immediately
        "limit": 16.0,  # 16A limit
        "number_phases": 3  # 3-phase charging
    },
    {
        "start_period": 1800,  # After 30 minutes (1800 seconds)
        "limit": 32.0,  # Increase to 32A
        "number_phases": 3
    }
]

Best Practices

  1. Validate profiles - Check profile validity before applying
  2. Handle timeouts - Set appropriate timeouts for profile operations
  3. Monitor sessions - Ensure session is active before setting profiles
  4. Send responses - Always send results to response_url
  5. Error handling - Handle OCPP communication errors
  6. Profile persistence - Store profiles for session duration

Complete Example

See the Charging Profiles Example for a complete working implementation.