Skip to content

Commit c3ebf8c

Browse files
Niklas Hildebrandtclaude
authored andcommitted
feat: add SCSP role (2.2.1 sessions + chargingprofiles receiver)
The SCSP (Smart Charging Service Provider) is a receiver of Sessions and ChargingProfiles, so it reuses the existing eMSP receiver-side module routers. get_application now mounts them under the /scsp/ prefix when RoleEnum.scsp is enabled, e.g. /ocpi/scsp/2.2.1/sessions/{country_code}/{party_id}/{session_id}. Mirrors the PTP role wiring; no behaviour change for existing roles. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 34749c3 commit c3ebf8c

4 files changed

Lines changed: 37 additions & 1 deletion

File tree

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
from ocpi.modules.versions import versions_v_2_2_1_router
2-
from ocpi.routers import v_2_2_1_cpo_router, v_2_2_1_emsp_router
2+
from ocpi.routers import (
3+
v_2_2_1_cpo_router,
4+
v_2_2_1_emsp_router,
5+
v_2_2_1_scsp_router,
6+
)
37

48
ROUTERS_DICT = {
59
"version_router": versions_v_2_2_1_router,
610
"cpo_router": v_2_2_1_cpo_router,
711
"emsp_router": v_2_2_1_emsp_router,
12+
"scsp_router": v_2_2_1_scsp_router,
813
}

ocpi/main.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,16 @@ def get_application(
271271
tags=[f"PTP {version.value}"],
272272
)
273273

274+
if RoleEnum.scsp in roles:
275+
for module in modules:
276+
scsp_router = mapped_version.get("scsp_router", {}).get(module) # type: ignore[attr-defined]
277+
if scsp_router:
278+
_app.include_router(
279+
scsp_router, # type: ignore[arg-type]
280+
prefix=f"/{settings.OCPI_PREFIX}/scsp/{version.value}",
281+
tags=[f"SCSP {version.value}"],
282+
)
283+
274284
def override_get_crud():
275285
return crud
276286

ocpi/routers/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from .v_2_1_1.emsp import router as v_2_1_1_emsp_router
33
from .v_2_2_1.cpo import router as v_2_2_1_cpo_router
44
from .v_2_2_1.emsp import router as v_2_2_1_emsp_router
5+
from .v_2_2_1.scsp import router as v_2_2_1_scsp_router
56
from .v_2_3_0.cpo import router as v_2_3_0_cpo_router
67
from .v_2_3_0.emsp import router as v_2_3_0_emsp_router
78
from .v_2_3_0.ptp import router as v_2_3_0_ptp_router

ocpi/routers/v_2_2_1/scsp.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
"""SCSP routers for OCPI 2.2.1.
2+
3+
The SCSP (Smart Charging Service Provider) is a *receiver* of Sessions and
4+
ChargingProfiles, so it reuses the eMSP receiver-side module routers (the
5+
receiver interface is identical). Mounted under the ``/scsp/`` prefix by
6+
``get_application``.
7+
"""
8+
9+
from ocpi.core.enums import ModuleID
10+
from ocpi.modules.chargingprofiles.v_2_2_1.api import (
11+
emsp_router as chargingprofiles_emsp_2_2_1_router,
12+
)
13+
from ocpi.modules.sessions.v_2_2_1.api import (
14+
emsp_router as sessions_emsp_2_2_1_router,
15+
)
16+
17+
router = {
18+
ModuleID.sessions: sessions_emsp_2_2_1_router,
19+
ModuleID.charging_profile: chargingprofiles_emsp_2_2_1_router,
20+
}

0 commit comments

Comments
 (0)