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.3.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.3.0
File Size Uploaded
latam_evra_ocpi-0.3.0.tar.gz 15.0 kB Details

Built distribution (wheel)

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

Total release size: 29.1 kB

Release files / latam_evra_ocpi-0.3.0.tar.gz

Download URL latam_evra_ocpi-0.3.0.tar.gz
Size 15.0 kB
Tags Source
SHA-256 checksum
How to use checksums
f9211185c692ae11787bd5e9a6e1527912a0609ae2f2b51d696dcb878253b568
BLAKE2b-256 checksum
How to use checksums
f1caa3fc7a19cd2cf14d0e50f60b8fced16cf44c9cf4d3724b0725aceff74101
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.3.0-py3-none-any.whl

Download URL latam_evra_ocpi-0.3.0-py3-none-any.whl
Size 14.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1b72790785ce3bd551f238dde7a243d29b39c4bf6e34cd5cc36ba9429504c32e
BLAKE2b-256 checksum
How to use checksums
7173c21cd693b08c44c65d78df4195d129baa0bbaae98a2ecade2c40f7c236f2
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

0.4.0

2 release files

This release

0.3.0 This release

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