From 1ce9deebbd681c05059abda20d7658a37d418992 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 29 Mar 2026 01:45:59 +0100 Subject: [PATCH] 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 --- src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts | 11 +++++++++-- src/charging-station/ocpp/OCPPServiceUtils.ts | 7 ++++++- 2 files changed, 15 insertions(+), 3 deletions(-) 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 }), } ) -- 2.43.0