]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
fix(ocpp20): align TxStartPoint/TxStopPoint defaults and enumerations with OCPP 2...
authorJérôme Benoit <jerome.benoit@sap.com>
Wed, 29 Oct 2025 22:02:33 +0000 (23:02 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Wed, 29 Oct 2025 22:02:33 +0000 (23:02 +0100)
src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts
tests/charging-station/ocpp/2.0/OCPP20VariableManager.test.ts

index d0dec097d38ff2961bd8a6c2342527b7c101aeeb..7bc7aa2a1750599f55421f4b9f1808c2c219db2a 100644 (file)
@@ -844,9 +844,18 @@ export const VARIABLE_REGISTRY: Record<string, VariableMetadata> = {
   )]: {
     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],
@@ -856,9 +865,17 @@ export const VARIABLE_REGISTRY: Record<string, VariableMetadata> = {
     {
       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],
index 8a1fe78a2b29da6eaeac28ce11c7f6e6153fd685..3c9d8e797907a33689934f5e5d4b328dcb2db226 100644 (file)
@@ -1202,12 +1202,12 @@ await describe('OCPP20VariableManager test suite', async () => {
           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 },
         },
@@ -1286,6 +1286,20 @@ await describe('OCPP20VariableManager test suite', async () => {
     })
   })
 
+  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({