From: Jérôme Benoit Date: Sun, 29 Mar 2026 00:45:59 +0000 (+0100) Subject: fix: improve OCPP 2.0.1 TransactionEvent spec compliance X-Git-Tag: ocpp-server@v4.0.1~1 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=1ce9deebbd681c05059abda20d7658a37d418992;p=e-mobility-charging-stations-simulator.git fix: improve OCPP 2.0.1 TransactionEvent spec compliance - Auto-derive chargingState in buildTransactionEvent when not explicitly provided (E02.FR.13: Started always has chargingState) - Use idToken type Local instead of hardcoded Central in startTransactionOnConnector for ATG local tag consistency (E02.FR.01) - Add TimeLimitReached mapping in mapStopReasonToOCPP20 for stations that need to report time-limited transaction stops --- diff --git a/src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts b/src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts index 015bfe15..34bbab14 100644 --- a/src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts +++ b/src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts @@ -1018,8 +1018,15 @@ export function buildTransactionEvent ( transactionId: transactionId as UUIDv4, } - if (commandParams.chargingState !== undefined) { - transactionInfo.chargingState = commandParams.chargingState + const chargingState = + commandParams.chargingState ?? + (eventType === OCPP20TransactionEventEnumType.Ended + ? undefined + : connectorStatus.transactionStarted === true + ? OCPP20ChargingStateEnumType.Charging + : OCPP20ChargingStateEnumType.EVConnected) + if (chargingState !== undefined) { + transactionInfo.chargingState = chargingState } if (commandParams.stoppedReason !== undefined) { transactionInfo.stoppedReason = commandParams.stoppedReason diff --git a/src/charging-station/ocpp/OCPPServiceUtils.ts b/src/charging-station/ocpp/OCPPServiceUtils.ts index cd95c258..68eb372c 100644 --- a/src/charging-station/ocpp/OCPPServiceUtils.ts +++ b/src/charging-station/ocpp/OCPPServiceUtils.ts @@ -397,6 +397,11 @@ export const mapStopReasonToOCPP20 = ( stoppedReason: OCPP20ReasonEnumType.Remote, triggerReason: OCPP20TriggerReasonEnumType.RemoteStop, } + case OCPP20ReasonEnumType.TimeLimitReached: + return { + stoppedReason: OCPP20ReasonEnumType.TimeLimitReached, + triggerReason: OCPP20TriggerReasonEnumType.TimeLimitReached, + } case OCPP16StopTransactionReason.LOCAL: case OCPP20ReasonEnumType.Local: case undefined: @@ -447,7 +452,7 @@ export const startTransactionOnConnector = async ( transactionId, { idToken: - idTag != null ? { idToken: idTag, type: OCPP20IdTokenEnumType.Central } : undefined, + idTag != null ? { idToken: idTag, type: OCPP20IdTokenEnumType.Local } : undefined, ...(startedMeterValues.length > 0 && { meterValue: startedMeterValues }), } )