)]: {
component: OCPP20ComponentName.TxCtrlr as string,
dataType: DataEnumType.MemberList,
- defaultValue: 'CablePluggedIn,EnergyTransfer',
+ // Spec-aligned default (exclude EnergyTransfer & DataSigned due to measurement skew and signed data optionality)
+ defaultValue: 'Authorized,EVConnected',
description: 'Trigger conditions for starting a transaction.',
- enumeration: ['CablePluggedIn', 'EnergyTransfer', 'Authorized', 'PowerPathClosed'],
+ // Spec-aligned enumeration per errata: Authorized, EVConnected, PowerPathClosed, EnergyTransfer, ParkingBayOccupancy plus DataSigned (start only)
+ enumeration: [
+ 'Authorized',
+ 'EVConnected',
+ 'PowerPathClosed',
+ 'EnergyTransfer',
+ 'ParkingBayOccupancy',
+ 'DataSigned',
+ ],
mutability: MutabilityEnumType.ReadWrite,
persistence: PersistenceEnumType.Persistent,
supportedAttributes: [AttributeEnumType.Actual],
{
component: OCPP20ComponentName.TxCtrlr as string,
dataType: DataEnumType.MemberList,
- defaultValue: 'EVSEIdle,CableUnplugged',
+ // Spec-aligned default stop triggers (exclude Authorized by default to avoid id re-presentation auto-stop)
+ defaultValue: 'EVConnected,PowerPathClosed',
description: 'Trigger conditions for ending a transaction.',
- enumeration: ['EVSEIdle', 'CableUnplugged', 'Deauthorized', 'PowerPathOpened'],
+ // Spec-aligned enumeration per errata: Authorized, EVConnected, PowerPathClosed, EnergyTransfer, ParkingBayOccupancy (DataSigned excluded as invalid stop point)
+ enumeration: [
+ 'Authorized',
+ 'EVConnected',
+ 'PowerPathClosed',
+ 'EnergyTransfer',
+ 'ParkingBayOccupancy',
+ ],
mutability: MutabilityEnumType.ReadWrite,
persistence: PersistenceEnumType.Persistent,
supportedAttributes: [AttributeEnumType.Actual],
variable: { name: OCPP20RequiredVariableName.TimeSource },
},
{
- attributeValue: 'CablePluggedIn,EnergyTransfer,Authorized',
+ attributeValue: 'Authorized,EVConnected,PowerPathClosed',
component: { name: OCPP20ComponentName.TxCtrlr },
variable: { name: OCPP20RequiredVariableName.TxStartPoint },
},
{
- attributeValue: 'EVSEIdle,CableUnplugged', // keep same
+ attributeValue: 'EVConnected,PowerPathClosed', // updated default
component: { name: OCPP20ComponentName.TxCtrlr },
variable: { name: OCPP20RequiredVariableName.TxStopPoint },
},
})
})
+ await it('Should reject DataSigned in TxStopPoint list value', () => {
+ const manager = OCPP20VariableManager.getInstance()
+ const res = manager.setVariables(mockChargingStation, [
+ {
+ attributeValue: 'Authorized,EVConnected,DataSigned', // DataSigned invalid for stop point enumeration
+ component: { name: OCPP20ComponentName.TxCtrlr },
+ variable: { name: OCPP20RequiredVariableName.TxStopPoint },
+ },
+ ])[0]
+ expect(res.attributeStatus).toBe(SetVariableStatusEnumType.Rejected)
+ expect(res.attributeStatusInfo?.reasonCode).toBe(ReasonCodeEnumType.InvalidValue)
+ expect(res.attributeStatusInfo?.additionalInfo).toContain('Member not in enumeration')
+ })
+
await describe('Unsupported MinSet/MaxSet attribute tests', async () => {
const manager = OCPP20VariableManager.getInstance()
const station = createChargingStation({