From: Jérôme Benoit Date: Thu, 19 Mar 2026 17:29:44 +0000 (+0100) Subject: fix(ocpp2.0): inject offline:true in sendTransactionEvent offline path per E04.FR.03 X-Git-Tag: ocpp-server@v3.2.0~27 X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=2f582de93197aa642029cb372a3441f023665a12;p=e-mobility-charging-stations-simulator.git fix(ocpp2.0): inject offline:true in sendTransactionEvent offline path per E04.FR.03 --- diff --git a/src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts b/src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts index 91d57c85..7f1ef3ec 100644 --- a/src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts +++ b/src/charging-station/ocpp/2.0/OCPP20ServiceUtils.ts @@ -475,13 +475,14 @@ export class OCPP20ServiceUtils extends OCPPServiceUtils { // Offline: build and queue pre-built payload (sent as-is via rawPayload on reconnect) if (!chargingStation.isWebSocketConnectionOpened()) { + // E04.FR.03: offline flag SHALL be TRUE for any TransactionEventRequest that occurred while offline const transactionEventRequest = buildTransactionEvent( chargingStation, eventType, triggerReason, connectorId, transactionId, - options + { ...options, offline: true } ) logger.info( `${chargingStation.logPrefix()} ${moduleName}.sendTransactionEvent: Station offline, queueing TransactionEvent with seqNo=${transactionEventRequest.seqNo.toString()}` diff --git a/tests/charging-station/ocpp/2.0/OCPP20ServiceUtils-TransactionEvent.test.ts b/tests/charging-station/ocpp/2.0/OCPP20ServiceUtils-TransactionEvent.test.ts index 2db7c17a..1ec78532 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20ServiceUtils-TransactionEvent.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20ServiceUtils-TransactionEvent.test.ts @@ -1625,6 +1625,27 @@ await describe('OCPP20 TransactionEvent ServiceUtils', async () => { ) assert.ok(connector.transactionEventQueue[0].timestamp.getTime() <= afterQueue.getTime()) }) + + await it('should set offline flag to true when queueing transaction event while station is offline', async () => { + const connectorId = 1 + const transactionId = generateUUID() + + setOnline(false) + OCPP20ServiceUtils.resetTransactionSequenceNumber(mockStation, connectorId) + + await OCPP20ServiceUtils.sendTransactionEvent( + mockStation, + OCPP20TransactionEventEnumType.Started, + OCPP20TriggerReasonEnumType.Authorized, + connectorId, + transactionId + ) + + const connector = mockStation.getConnectorStatus(connectorId) + assert.ok(connector?.transactionEventQueue != null) + assert.strictEqual(connector.transactionEventQueue.length, 1) + assert.strictEqual(connector.transactionEventQueue[0].request.offline, true) + }) }) await describe('Queue draining when coming online', async () => {