triggerReason,
...options,
offline: true,
- } as unknown as OCPP20TransactionEventRequest)
+ })
logger.info(
`${chargingStation.logPrefix()} ${moduleName}.sendTransactionEvent: Station offline, queueing TransactionEvent with seqNo=${transactionEventRequest.seqNo.toString()}`
)
*/
export function buildTransactionEvent (
chargingStation: ChargingStation,
- commandParams: OCPP20TransactionEventRequest
+ commandParams: OCPP20TransactionEventOptions
): OCPP20TransactionEventRequest {
- const params = commandParams as Record<string, unknown>
- const eventType = params.eventType as OCPP20TransactionEventEnumType
- const triggerReason =
- params.triggerReason != null
- ? (params.triggerReason as OCPP20TriggerReasonEnumType)
- : eventType === OCPP20TransactionEventEnumType.Ended
- ? OCPP20TriggerReasonEnumType.RemoteStop
- : OCPP20TriggerReasonEnumType.Authorized
- const inputEvse = params.evse as undefined | { connectorId?: number; id?: number }
- const connectorId =
- params.connectorId != null
- ? (params.connectorId as number)
- : (inputEvse?.connectorId ?? inputEvse?.id ?? 1)
+ const eventType = commandParams.eventType
+ if (eventType == null) {
+ throw new OCPPError(
+ ErrorType.PROPERTY_CONSTRAINT_VIOLATION,
+ 'eventType is required for TransactionEvent'
+ )
+ }
+ const defaultTriggerReason =
+ eventType === OCPP20TransactionEventEnumType.Ended
+ ? OCPP20TriggerReasonEnumType.RemoteStop
+ : OCPP20TriggerReasonEnumType.Authorized
+ const triggerReason = commandParams.triggerReason ?? defaultTriggerReason
+ const inputEvse = commandParams.evse
+ const connectorId = commandParams.connectorId ?? inputEvse?.connectorId ?? inputEvse?.id ?? 1
const transactionId =
- params.transactionId != null
- ? (params.transactionId as string)
- : eventType === OCPP20TransactionEventEnumType.Ended
- ? (chargingStation.getConnectorStatus(connectorId)?.transactionId?.toString() ??
- generateUUID())
- : generateUUID()
- const options = params as unknown as OCPP20TransactionEventOptions
+ commandParams.transactionId ??
+ (eventType === OCPP20TransactionEventEnumType.Ended
+ ? (chargingStation.getConnectorStatus(connectorId)?.transactionId?.toString() ??
+ generateUUID())
+ : generateUUID())
if (!validateIdentifierString(transactionId, 36)) {
const errorMsg = `Invalid transaction ID format (must be non-empty string ≤36 characters): ${transactionId}`
throw new OCPPError(ErrorType.PROPERTY_CONSTRAINT_VIOLATION, errorMsg)
}
- const evseId = options.evseId ?? chargingStation.getEvseIdByConnectorId(connectorId)
+ const evseId = commandParams.evseId ?? chargingStation.getEvseIdByConnectorId(connectorId)
if (evseId == null) {
const errorMsg = `Cannot find EVSE ID for connector ${connectorId.toString()}`
logger.error(`${chargingStation.logPrefix()} ${moduleName}.buildTransactionEvent: ${errorMsg}`)
transactionId: transactionId as UUIDv4,
}
- if (options.chargingState !== undefined) {
- transactionInfo.chargingState = options.chargingState
+ if (commandParams.chargingState !== undefined) {
+ transactionInfo.chargingState = commandParams.chargingState
}
- if (options.stoppedReason !== undefined) {
- transactionInfo.stoppedReason = options.stoppedReason
+ if (commandParams.stoppedReason !== undefined) {
+ transactionInfo.stoppedReason = commandParams.stoppedReason
}
- if (options.remoteStartId !== undefined) {
- transactionInfo.remoteStartId = options.remoteStartId
+ if (commandParams.remoteStartId !== undefined) {
+ transactionInfo.remoteStartId = commandParams.remoteStartId
}
const transactionEventRequest: OCPP20TransactionEventRequest = {
}
// E03.FR.01: Include idToken only once per transaction
- if (options.idToken !== undefined && connectorStatus.transactionIdTokenSent !== true) {
- transactionEventRequest.idToken = options.idToken
+ if (commandParams.idToken !== undefined && connectorStatus.transactionIdTokenSent !== true) {
+ transactionEventRequest.idToken = commandParams.idToken
connectorStatus.transactionIdTokenSent = true
}
- if (options.meterValue !== undefined && options.meterValue.length > 0) {
- transactionEventRequest.meterValue = options.meterValue
+ if (commandParams.meterValue !== undefined && commandParams.meterValue.length > 0) {
+ transactionEventRequest.meterValue = commandParams.meterValue
}
- if (options.cableMaxCurrent !== undefined) {
- transactionEventRequest.cableMaxCurrent = options.cableMaxCurrent
+ if (commandParams.cableMaxCurrent !== undefined) {
+ transactionEventRequest.cableMaxCurrent = commandParams.cableMaxCurrent
}
- if (options.numberOfPhasesUsed !== undefined) {
- transactionEventRequest.numberOfPhasesUsed = options.numberOfPhasesUsed
+ if (commandParams.numberOfPhasesUsed !== undefined) {
+ transactionEventRequest.numberOfPhasesUsed = commandParams.numberOfPhasesUsed
}
- if (options.offline !== undefined) {
- transactionEventRequest.offline = options.offline
+ if (commandParams.offline !== undefined) {
+ transactionEventRequest.offline = commandParams.offline
}
- if (options.reservationId !== undefined) {
- transactionEventRequest.reservationId = options.reservationId
+ if (commandParams.reservationId !== undefined) {
+ transactionEventRequest.reservationId = commandParams.reservationId
}
- if (options.customData !== undefined) {
- transactionEventRequest.customData = options.customData
+ if (commandParams.customData !== undefined) {
+ transactionEventRequest.customData = commandParams.customData
}
logger.debug(
OCPP20RequestCommand,
OCPP20RequiredVariableName,
OCPP20TransactionEventEnumType,
- type OCPP20TransactionEventRequest,
type OCPP20TransactionType,
OCPP20TriggerReasonEnumType,
OCPPVersion,
eventType: OCPP20TransactionEventEnumType.Started,
transactionId,
triggerReason,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Validate required fields
assert.strictEqual(transactionEvent.eventType, OCPP20TransactionEventEnumType.Started)
eventType: OCPP20TransactionEventEnumType.Started,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Build second event (Updated)
const updateEvent = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.MeterValuePeriodic,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Build third event (Ended)
const endEvent = buildTransactionEvent(mockStation, {
stoppedReason: OCPP20ReasonEnumType.Local,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.StopAuthorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Validate sequence number progression: 0 → 1 → 2
assert.strictEqual(startEvent.seqNo, 0)
reservationId: options.reservationId,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.ChargingStateChanged,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Validate optional fields are included
if (transactionEvent.idToken == null) {
eventType: OCPP20TransactionEventEnumType.Started,
transactionId: invalidTransactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
throw new Error('Should have thrown error for invalid identifier string')
} catch (error) {
assert.ok((error as Error).message.includes('Invalid transaction ID format'))
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason,
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.strictEqual(transactionEvent.triggerReason, triggerReason)
assert.strictEqual(transactionEvent.eventType, OCPP20TransactionEventEnumType.Updated)
eventType: OCPP20TransactionEventEnumType.Started,
transactionId: generateUUID(),
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Verify sequence number is set
const connectorStatus = mockStation.getConnectorStatus(connectorId)
},
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Validate all required fields exist
const requiredFields = [
eventType: OCPP20TransactionEventEnumType.Started,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// For this test setup, EVSE ID should match connector ID
if (transactionEvent.evse == null) {
eventType: OCPP20TransactionEventEnumType.Started,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.strictEqual(oldEvent.eventType, OCPP20TransactionEventEnumType.Started)
assert.strictEqual(oldEvent.triggerReason, OCPP20TriggerReasonEnumType.Authorized)
transactionId,
triggerReason: expectedStartTrigger,
...(idToken != null ? { idToken } : {}),
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.strictEqual(startedEvent.eventType, OCPP20TransactionEventEnumType.Started)
assert.strictEqual(startedEvent.triggerReason, expectedStartTrigger)
transactionId,
triggerReason: expectedStartTrigger,
...(idToken != null ? { idToken } : {}),
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Step 2: Charging state change
const chargingEvent = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.ChargingStateChanged,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Step 3: Ended event
const endedEvent = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Ended,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.StopAuthorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Validate event sequence
assert.strictEqual(startedEvent.seqNo, 0)
eventType: OCPP20TransactionEventEnumType.Started,
transactionId: transaction1Id,
triggerReason: expectedStartTrigger,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Start transaction on connector 2
const conn2Event1 = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Started,
transactionId: transaction2Id,
triggerReason: expectedStartTrigger,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Update connector 1
const conn1Event2 = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId: transaction1Id,
triggerReason: OCPP20TriggerReasonEnumType.ChargingStateChanged,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Update connector 2
const conn2Event2 = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId: transaction2Id,
triggerReason: OCPP20TriggerReasonEnumType.ChargingStateChanged,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Verify independent sequence numbers
assert.strictEqual(conn1Event1.seqNo, 0)
eventType: OCPP20TransactionEventEnumType.Started,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.CablePluggedIn,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Step 2: EV detected (Updated)
const evDetectedEvent = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.EVDetected,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Step 3: Charging starts (Updated with ChargingStateChanged)
const chargingStartedEvent = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.ChargingStateChanged,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Assert sequence numbers follow correct order
assert.strictEqual(cablePluggedEvent.seqNo, 0)
eventType: OCPP20TransactionEventEnumType.Started,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.CablePluggedIn,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// End transaction with EV departure (cable removal)
const endEvent = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Ended,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.EVDeparted,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Assert proper sequencing for cable-initiated start and end
assert.strictEqual(startEvent.seqNo, 0)
eventType: OCPP20TransactionEventEnumType.Started,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.CablePluggedIn,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
buildTransactionEvent(mockStation, {
connectorId,
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.EVDetected,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
buildTransactionEvent(mockStation, {
connectorId,
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
buildTransactionEvent(mockStation, {
chargingState: OCPP20ChargingStateEnumType.Charging,
connectorId,
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.ChargingStateChanged,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
]
// Assert EVDetected comes after CablePluggedIn and before authorization
eventType: OCPP20TransactionEventEnumType.Started,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.CablePluggedIn,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
// 2. Start charging
buildTransactionEvent(mockStation, {
chargingState: OCPP20ChargingStateEnumType.Charging,
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.ChargingStateChanged,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
// 3. Suspended by EV
buildTransactionEvent(mockStation, {
chargingState: OCPP20ChargingStateEnumType.SuspendedEV,
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.ChargingStateChanged,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
// 4. Resume charging
buildTransactionEvent(mockStation, {
chargingState: OCPP20ChargingStateEnumType.Charging,
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.ChargingStateChanged,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
// 5. EV departed
buildTransactionEvent(mockStation, {
connectorId,
eventType: OCPP20TransactionEventEnumType.Ended,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.EVDeparted,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
]
// Verify sequence numbers are continuous through suspend/resume
idToken,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
if (startedEvent.idToken == null) {
assert.fail('Expected idToken to be defined')
idToken,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Second event should NOT include idToken (flag is set after first inclusion)
const updatedEvent = buildTransactionEvent(mockStation, {
idToken,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.ChargingStateChanged,
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.notStrictEqual(startedEvent.idToken, undefined)
assert.strictEqual(updatedEvent.idToken, undefined)
idToken: rfidToken,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.strictEqual(rfidEvent.idToken?.type, OCPP20IdTokenEnumType.ISO14443)
idToken: emaidToken,
transactionId: generateUUID(),
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.strictEqual(emaidEvent.idToken?.type, OCPP20IdTokenEnumType.eMAID)
assert.strictEqual(emaidEvent.idToken.idToken, 'DE*ABC*E123456*1')
idToken,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// E03 Step 2: Cable connected (Updated event)
const cableConnectedEvent = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.CablePluggedIn,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// E03 Step 3: Charging starts
const chargingEvent = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.ChargingStateChanged,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// E03 Step 4: Transaction ends
const endedEvent = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Ended,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.StopAuthorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Validate event sequence
assert.strictEqual(authorizedEvent.eventType, OCPP20TransactionEventEnumType.Started)
idToken,
transactionId: e03TransactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// E02 Cable-First: Starts with CablePluggedIn trigger
OCPP20ServiceUtils.resetTransactionSequenceNumber(mockStation, connectorId)
eventType: OCPP20TransactionEventEnumType.Started,
transactionId: e02TransactionId,
triggerReason: OCPP20TriggerReasonEnumType.CablePluggedIn,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Key difference: E03 starts with Authorized, E02 starts with CablePluggedIn
assert.strictEqual(e03Start.triggerReason, OCPP20TriggerReasonEnumType.Authorized)
idToken,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// E03.FR.06: Cable not connected within timeout - transaction ends with Timeout
const timeoutEvent = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Ended,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.EVConnectTimeout,
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.strictEqual(authorizedEvent.eventType, OCPP20TransactionEventEnumType.Started)
assert.strictEqual(authorizedEvent.triggerReason, OCPP20TriggerReasonEnumType.Authorized)
idToken,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Transaction ended due to deauthorization (e.g., token revoked mid-session)
const revokedEvent = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Ended,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Deauthorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.strictEqual(startEvent.eventType, OCPP20TransactionEventEnumType.Started)
assert.strictEqual(revokedEvent.eventType, OCPP20TransactionEventEnumType.Ended)
idToken,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
buildTransactionEvent(mockStation, {
connectorId,
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.CablePluggedIn,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
buildTransactionEvent(mockStation, {
connectorId,
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.ChargingStateChanged,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
buildTransactionEvent(mockStation, {
connectorId,
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.MeterValuePeriodic,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
buildTransactionEvent(mockStation, {
connectorId,
eventType: OCPP20TransactionEventEnumType.Ended,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.StopAuthorized,
- } as unknown as OCPP20TransactionEventRequest),
+ }),
]
// E03.FR.07: Sequence numbers must be continuous
eventType: OCPP20TransactionEventEnumType.Started,
transactionId: transaction1Id,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
OCPP20ServiceUtils.resetTransactionSequenceNumber(mockStation, connectorId)
eventType: OCPP20TransactionEventEnumType.Started,
transactionId: transaction2Id,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.strictEqual(event1.transactionInfo.transactionId, transaction1Id)
assert.strictEqual(event2.transactionInfo.transactionId, transaction2Id)
eventType: OCPP20TransactionEventEnumType.Started,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.strictEqual(startEvent.seqNo, 0)
// Send multiple periodic events (simulating timer ticks)
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.MeterValuePeriodic,
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.strictEqual(periodicEvent.seqNo, i)
}
eventType: OCPP20TransactionEventEnumType.Started,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.strictEqual(startEvent.seqNo, 0)
// 2. Multiple periodic updates (seqNo: 1, 2, 3)
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.MeterValuePeriodic,
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.strictEqual(updateEvent.seqNo, i)
}
eventType: OCPP20TransactionEventEnumType.Ended,
transactionId,
triggerReason: OCPP20TriggerReasonEnumType.StopAuthorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
assert.strictEqual(endEvent.seqNo, 4)
})
eventType: OCPP20TransactionEventEnumType.Started,
transactionId: transactionId1,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
const event1Update = buildTransactionEvent(mockStation, {
connectorId: 1,
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId: transactionId1,
triggerReason: OCPP20TriggerReasonEnumType.MeterValuePeriodic,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Build events for connector 2
const event2Start = buildTransactionEvent(mockStation, {
eventType: OCPP20TransactionEventEnumType.Started,
transactionId: transactionId2,
triggerReason: OCPP20TriggerReasonEnumType.Authorized,
- } as unknown as OCPP20TransactionEventRequest)
+ })
const event2Update = buildTransactionEvent(mockStation, {
connectorId: 2,
eventType: OCPP20TransactionEventEnumType.Updated,
transactionId: transactionId2,
triggerReason: OCPP20TriggerReasonEnumType.MeterValuePeriodic,
- } as unknown as OCPP20TransactionEventRequest)
+ })
// Verify independent sequence numbers
assert.strictEqual(event1Start.seqNo, 0)