Skip to main content

latam-evra-ocpi

Cliente Python no oficial para el Hub de roaming OCPI 2.3.0 de LATAM EV Roaming Alliance (LEA).

Estado: este paquete todavía no está publicado en PyPI. El Hub hoy solo implementa server-side el módulo Credentials & Registration; el resto de los módulos OCPI están tipados como stubs a la espera del roadmap del Hub (ver tabla más abajo).

Instalación

Mientras el paquete no esté en PyPI, instalalo directamente desde este repositorio:

pip install -e sdks/python

Cuando se publique en PyPI, la instalación será simplemente:

pip install latam-evra-ocpi

Requiere Python 3.9+. Dependencias runtime: httpx y pydantic v2.

Para desarrollo (tests):

pip install -e "sdks/python[dev]"
pytest sdks/python

Uso: handshake de Credentials completo

El flujo de Credentials & Registration conecta un CSMS (CPO o eMSP) al Hub: el CSMS recibe un TOKEN_A de un administrador del Hub (fuera de banda), y lo usa para registrarse. El Hub responde con un TOKEN_B que el CSMS debe guardar de forma segura para llamadas futuras (PUT/DELETE).

import asyncio

from latam_evra_ocpi import OcpiClient, OcpiError


async def main() -> None:
    async with OcpiClient(base_url="https://latam-evra.org/api/ocpi/2.3.0") as client:
        # 1. Descubrir qué versiones y endpoints soporta el Hub.
        versions = await client.get_versions()
        details = await client.get_details()
        print("Versiones soportadas:", [v.version for v in versions])
        print("Endpoints del Hub:", [e.identifier for e in details.endpoints])

        # 2. Registrar credenciales con el TOKEN_A recibido del admin del Hub.
        try:
            credentials = await client.register_credentials(
                token_a="TOKEN_A_RECIBIDO_DEL_ADMIN",
                url="https://mi-csms.example.com/ocpi/versions",
                roles=[{"role": "CPO", "party_id": "CHG", "country_code": "CL"}],
            )
        except OcpiError as exc:
            # El Hub responde 200 OK con un status_code de error dentro del sobre.
            print(f"Error OCPI {exc.status_code}: {exc.status_message}")
            return

        token_b = credentials.token
        print("Handshake completo. TOKEN_B:", token_b)

        # 3. Más adelante: renovar el TOKEN_B.
        renewed = await client.renew_credentials(token_b=token_b)
        token_b = renewed.token

        # 4. O terminar la conexión.
        await client.terminate_credentials(token_b=token_b)


asyncio.run(main())

Manejo de errores

El Hub siempre responde con el sobre estándar OCPI ({ data, status_code, status_message, timestamp }). Cuando status_code no es 1000 (éxito), el cliente lanza OcpiError, que expone:

  • status_code: código OCPI (OCPI_STATUS.UNKNOWN_TOKEN, etc.)
  • status_message: mensaje humano devuelto por el Hub
  • http_status: código HTTP de la respuesta
from latam_evra_ocpi import OCPI_STATUS, OcpiError

try:
    await client.register_credentials(token_a="invalido", url="...", roles=[...])
except OcpiError as exc:
    if exc.status_code == OCPI_STATUS.UNKNOWN_TOKEN:
        print("TOKEN_A inválido o ya usado")

Módulos: disponibles vs roadmap

El Hub implementa OCPI 2.3.0 de forma incremental. Este SDK refleja ese estado exactamente — no hay métodos que simulen funcionalidad no soportada por el servidor.

Módulo OCPI Estado en el Hub Métodos del SDK
Credentials & Registration ✅ Disponible get_versions, get_details, register_credentials, renew_credentials, terminate_credentials
Locations ✅ Disponible get_locations, get_location, put_location, patch_location
Tariffs ✅ Disponible get_tariffs, get_tariff, put_tariff, delete_tariff
Hub Client Info ✅ Disponible list_hub_client_info, get_hub_client_info
Sessions 🚧 Roadmap get_active_sessionNotImplementedError
CDRs 🚧 Roadmap get_cdrsNotImplementedError
Tokens & Authorisation 🚧 Roadmap authorize_tokenNotImplementedError
Commands 🚧 Roadmap send_commandNotImplementedError
Invoice Reconciliation (Ed. 2) 🚧 Roadmap get_invoice_reconciliationNotImplementedError
Charging Profiles 🚧 Roadmap set_charging_profileNotImplementedError

Los modelos Pydantic de los módulos en roadmap (latam_evra_ocpi.models, p. ej. Location, Session, Cdr, Tariff, Token, HubClientInfo, InvoiceReconciliation, ChargingProfileRequest) ya están definidos a partir de los payloads de ejemplo publicados en el Hub, para que el tipado esté listo apenas cada módulo se implemente server-side. Cada método lanza OcpiModuleNotAvailableError (subclase de NotImplementedError) con un mensaje que referencia el roadmap (docs/Roaming_hub_Latam.md en el repo del Hub).

Tests de integración

Requieren el Hub real corriendo (npm run dev desde la raíz del repo, o pm2 restart latam-evra). Se corren aparte de la suite normal:

.venv/bin/pytest -m integration tests/integration

Apuntan por defecto a http://localhost:3947; sobreescribir con OCPI_HUB_TEST_URL si hace falta.

Desarrollo

cd sdks/python
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest

Licencia

MIT.

Release files for latam-evra-ocpi 0.4.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 latam-evra-ocpi 0.4.0
File Size Uploaded
latam_evra_ocpi-0.4.0.tar.gz 24.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for latam-evra-ocpi 0.4.0
File Interpreter ABI Platform
latam_evra_ocpi-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 44.8 kB

Release files / latam_evra_ocpi-0.4.0.tar.gz

Download URL latam_evra_ocpi-0.4.0.tar.gz
Size 24.6 kB
Tags Source
SHA-256 checksum
How to use checksums
40bb4915759daa5b1423ac4de3ba22ec658b7a64e80429d006682b3acc092819
BLAKE2b-256 checksum
How to use checksums
5515560d0f367c2cf0fe4a3b56c94a804147c66a0022138d0e87f70a3e21d130
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release files / latam_evra_ocpi-0.4.0-py3-none-any.whl

Download URL latam_evra_ocpi-0.4.0-py3-none-any.whl
Size 20.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8fbbf3b31ea91f670b97c124c6e2789d0520212657c064f9637565ae9cc30dec
BLAKE2b-256 checksum
How to use checksums
395515d51d043000b165525c1b455bc985aae474defb23408041bc254bee37d3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.3

Release history Release notifications | RSS feed

0.5.0

2 release files

This release

0.4.0 This release

2 release files

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