]> Piment Noir Git Repositories - e-mobility-charging-stations-simulator.git/commitdiff
refactor: move ConfigurationValueSize, ReportingValueSize, ValueSize to OCPP20Optiona...
authorJérôme Benoit <jerome.benoit@sap.com>
Sat, 28 Mar 2026 14:21:35 +0000 (15:21 +0100)
committerJérôme Benoit <jerome.benoit@sap.com>
Sat, 28 Mar 2026 14:21:35 +0000 (15:21 +0100)
Per OCPP 2.0.1 appendices CSV (dm_components_vars.csv), these three
DeviceDataCtrlr variables are required=no. Move them from
OCPP20RequiredVariableName to OCPP20OptionalVariableName to match
the spec classification.

src/charging-station/ocpp/2.0/OCPP20VariableManager.ts
src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts
src/types/ocpp/2.0/Variables.ts
tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-GetVariables.test.ts
tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-SetVariables.test.ts
tests/charging-station/ocpp/2.0/OCPP20TestUtils.ts
tests/charging-station/ocpp/2.0/OCPP20VariableManager.test.ts

index f1410a3dc1b7f40af7b9044a7324618148cdd1ee..0e164f790f094a733a395215ea7bcf2ec4ae575e 100644 (file)
@@ -268,9 +268,9 @@ export class OCPP20VariableManager {
         // Allow size limit variables to remain intentionally unset.
         if (
           variableMetadata.variable ===
-            (OCPP20RequiredVariableName.ConfigurationValueSize as string) ||
-          variableMetadata.variable === (OCPP20RequiredVariableName.ValueSize as string) ||
-          variableMetadata.variable === (OCPP20RequiredVariableName.ReportingValueSize as string)
+            (OCPP20OptionalVariableName.ConfigurationValueSize as string) ||
+          variableMetadata.variable === (OCPP20OptionalVariableName.ValueSize as string) ||
+          variableMetadata.variable === (OCPP20OptionalVariableName.ReportingValueSize as string)
         ) {
           continue
         }
@@ -506,20 +506,20 @@ export class OCPP20VariableManager {
     const reportingValueSizeKey = buildCaseInsensitiveCompositeKey(
       OCPP20ComponentName.DeviceDataCtrlr,
       undefined,
-      OCPP20RequiredVariableName.ReportingValueSize
+      OCPP20OptionalVariableName.ReportingValueSize
     )
     // ValueSize truncation applied before ReportingValueSize if present
     const valueSizeKey = buildCaseInsensitiveCompositeKey(
       OCPP20ComponentName.DeviceDataCtrlr,
       undefined,
-      OCPP20RequiredVariableName.ValueSize
+      OCPP20OptionalVariableName.ValueSize
     )
     let valueSize: string | undefined
     let reportingValueSize: string | undefined
     if (!invalidVariables.has(valueSizeKey)) {
       valueSize = getConfigurationKey(
         chargingStation,
-        buildConfigKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20RequiredVariableName.ValueSize)
+        buildConfigKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20OptionalVariableName.ValueSize)
       )?.value
     }
     if (!invalidVariables.has(reportingValueSizeKey)) {
@@ -527,7 +527,7 @@ export class OCPP20VariableManager {
         chargingStation,
         buildConfigKey(
           OCPP20ComponentName.DeviceDataCtrlr,
-          OCPP20RequiredVariableName.ReportingValueSize
+          OCPP20OptionalVariableName.ReportingValueSize
         )
       )?.value
     }
@@ -879,12 +879,12 @@ export class OCPP20VariableManager {
       const configurationValueSizeKey = buildCaseInsensitiveCompositeKey(
         OCPP20ComponentName.DeviceDataCtrlr,
         undefined,
-        OCPP20RequiredVariableName.ConfigurationValueSize
+        OCPP20OptionalVariableName.ConfigurationValueSize
       )
       const valueSizeKey = buildCaseInsensitiveCompositeKey(
         OCPP20ComponentName.DeviceDataCtrlr,
         undefined,
-        OCPP20RequiredVariableName.ValueSize
+        OCPP20OptionalVariableName.ValueSize
       )
       let configurationValueSizeRaw: string | undefined
       let valueSizeRaw: string | undefined
@@ -893,14 +893,14 @@ export class OCPP20VariableManager {
           chargingStation,
           buildConfigKey(
             OCPP20ComponentName.DeviceDataCtrlr,
-            OCPP20RequiredVariableName.ConfigurationValueSize
+            OCPP20OptionalVariableName.ConfigurationValueSize
           )
         )?.value
       }
       if (!invalidVariables.has(valueSizeKey)) {
         valueSizeRaw = getConfigurationKey(
           chargingStation,
-          buildConfigKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20RequiredVariableName.ValueSize)
+          buildConfigKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20OptionalVariableName.ValueSize)
         )?.value
       }
       const cfgLimit = convertToIntOrNaN(configurationValueSizeRaw ?? '')
index ee8c06b5381fdb5044c6dbf2ad2575510b0cb4a3..88b7f0c1063f58be901b6be458cf17fac4da6b23 100644 (file)
@@ -709,6 +709,58 @@ export const VARIABLE_REGISTRY: Record<string, VariableMetadata> = {
     variable: OCPP20RequiredVariableName.TimeSource,
   },
 
+  // Value size family: ValueSize (broadest), ConfigurationValueSize (affects setting), ReportingValueSize (affects reporting). Simulator sets same absolute cap; truncate occurs at reporting step.
+  [buildRegistryKey(
+    OCPP20ComponentName.DeviceDataCtrlr,
+    OCPP20OptionalVariableName.ConfigurationValueSize
+  )]: {
+    component: OCPP20ComponentName.DeviceDataCtrlr,
+    dataType: DataEnumType.integer,
+    defaultValue: Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH.toString(),
+    description: 'Maximum size allowed for configuration values when setting.',
+    max: Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH,
+    maxLength: 5,
+    min: 1,
+    mutability: MutabilityEnumType.ReadOnly,
+    persistence: PersistenceEnumType.Persistent,
+    positive: true,
+    supportedAttributes: [AttributeEnumType.Actual],
+    unit: OCPP20UnitEnumType.CHARS,
+    variable: OCPP20OptionalVariableName.ConfigurationValueSize,
+  },
+  [buildRegistryKey(
+    OCPP20ComponentName.DeviceDataCtrlr,
+    OCPP20OptionalVariableName.ReportingValueSize
+  )]: {
+    component: OCPP20ComponentName.DeviceDataCtrlr,
+    dataType: DataEnumType.integer,
+    defaultValue: Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH.toString(),
+    description: 'Maximum size of reported values.',
+    max: Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH,
+    maxLength: 5,
+    min: 1,
+    mutability: MutabilityEnumType.ReadOnly,
+    persistence: PersistenceEnumType.Persistent,
+    positive: true,
+    supportedAttributes: [AttributeEnumType.Actual],
+    unit: OCPP20UnitEnumType.CHARS,
+    variable: OCPP20OptionalVariableName.ReportingValueSize,
+  },
+  [buildRegistryKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20OptionalVariableName.ValueSize)]: {
+    component: OCPP20ComponentName.DeviceDataCtrlr,
+    dataType: DataEnumType.integer,
+    defaultValue: Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH.toString(),
+    description: 'Unified maximum size for any stored or reported value.',
+    max: Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH,
+    maxLength: 5,
+    min: 1,
+    mutability: MutabilityEnumType.ReadOnly,
+    persistence: PersistenceEnumType.Persistent,
+    positive: true,
+    supportedAttributes: [AttributeEnumType.Actual],
+    unit: OCPP20UnitEnumType.CHARS,
+    variable: OCPP20OptionalVariableName.ValueSize,
+  },
   // DeviceDataCtrlr Component
   [buildRegistryKey(
     OCPP20ComponentName.DeviceDataCtrlr,
@@ -784,25 +836,6 @@ export const VARIABLE_REGISTRY: Record<string, VariableMetadata> = {
     supportedAttributes: [AttributeEnumType.Actual],
     variable: OCPP20RequiredVariableName.BytesPerMessage,
   },
-  // Value size family: ValueSize (broadest), ConfigurationValueSize (affects setting), ReportingValueSize (affects reporting). Simulator sets same absolute cap; truncate occurs at reporting step.
-  [buildRegistryKey(
-    OCPP20ComponentName.DeviceDataCtrlr,
-    OCPP20RequiredVariableName.ConfigurationValueSize
-  )]: {
-    component: OCPP20ComponentName.DeviceDataCtrlr,
-    dataType: DataEnumType.integer,
-    defaultValue: Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH.toString(),
-    description: 'Maximum size allowed for configuration values when setting.',
-    max: Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH,
-    maxLength: 5,
-    min: 1,
-    mutability: MutabilityEnumType.ReadOnly,
-    persistence: PersistenceEnumType.Persistent,
-    positive: true,
-    supportedAttributes: [AttributeEnumType.Actual],
-    unit: OCPP20UnitEnumType.CHARS,
-    variable: OCPP20RequiredVariableName.ConfigurationValueSize,
-  },
   [buildRegistryKey(
     OCPP20ComponentName.DeviceDataCtrlr,
     OCPP20RequiredVariableName.ItemsPerMessage,
@@ -860,39 +893,6 @@ export const VARIABLE_REGISTRY: Record<string, VariableMetadata> = {
     supportedAttributes: [AttributeEnumType.Actual],
     variable: OCPP20RequiredVariableName.ItemsPerMessage,
   },
-  [buildRegistryKey(
-    OCPP20ComponentName.DeviceDataCtrlr,
-    OCPP20RequiredVariableName.ReportingValueSize
-  )]: {
-    component: OCPP20ComponentName.DeviceDataCtrlr,
-    dataType: DataEnumType.integer,
-    defaultValue: Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH.toString(),
-    description: 'Maximum size of reported values.',
-    max: Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH,
-    maxLength: 5,
-    min: 1,
-    mutability: MutabilityEnumType.ReadOnly,
-    persistence: PersistenceEnumType.Persistent,
-    positive: true,
-    supportedAttributes: [AttributeEnumType.Actual],
-    unit: OCPP20UnitEnumType.CHARS,
-    variable: OCPP20RequiredVariableName.ReportingValueSize,
-  },
-  [buildRegistryKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20RequiredVariableName.ValueSize)]: {
-    component: OCPP20ComponentName.DeviceDataCtrlr,
-    dataType: DataEnumType.integer,
-    defaultValue: Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH.toString(),
-    description: 'Unified maximum size for any stored or reported value.',
-    max: Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH,
-    maxLength: 5,
-    min: 1,
-    mutability: MutabilityEnumType.ReadOnly,
-    persistence: PersistenceEnumType.Persistent,
-    positive: true,
-    supportedAttributes: [AttributeEnumType.Actual],
-    unit: OCPP20UnitEnumType.CHARS,
-    variable: OCPP20RequiredVariableName.ValueSize,
-  },
 
   // EVSE Component
   [buildRegistryKey(OCPP20ComponentName.EVSE, 'AllowReset')]: {
index b7ab72aa13a595d9a254c02d79d887f651e1a361..72414c6b4b673ff9806004db670cf7ebc05d908a 100644 (file)
@@ -33,10 +33,13 @@ export enum OCPP20DeviceInfoVariableName {
 }
 
 export enum OCPP20OptionalVariableName {
+  ConfigurationValueSize = 'ConfigurationValueSize',
   HeartbeatInterval = 'HeartbeatInterval',
   MaxCertificateChainSize = 'MaxCertificateChainSize',
   MaxEnergyOnInvalidId = 'MaxEnergyOnInvalidId',
   NonEvseSpecific = 'NonEvseSpecific',
+  ReportingValueSize = 'ReportingValueSize',
+  ValueSize = 'ValueSize',
   WebSocketPingInterval = 'WebSocketPingInterval',
 }
 
@@ -45,7 +48,6 @@ export enum OCPP20RequiredVariableName {
   AuthorizeRemoteStart = 'AuthorizeRemoteStart',
   BytesPerMessage = 'BytesPerMessage',
   CertificateEntries = 'CertificateEntries',
-  ConfigurationValueSize = 'ConfigurationValueSize',
   DateTime = 'DateTime',
   Enabled = 'Enabled',
   EVConnectionTimeOut = 'EVConnectionTimeOut',
@@ -61,7 +63,6 @@ export enum OCPP20RequiredVariableName {
   NetworkProfileConnectionAttempts = 'NetworkProfileConnectionAttempts',
   OfflineThreshold = 'OfflineThreshold',
   OrganizationName = 'OrganizationName',
-  ReportingValueSize = 'ReportingValueSize',
   ResetRetries = 'ResetRetries',
   SecurityProfile = 'SecurityProfile',
   StopTxOnEVSideDisconnect = 'StopTxOnEVSideDisconnect',
@@ -74,7 +75,6 @@ export enum OCPP20RequiredVariableName {
   TxUpdatedInterval = 'TxUpdatedInterval',
   TxUpdatedMeasurands = 'TxUpdatedMeasurands',
   UnlockOnEVSideDisconnect = 'UnlockOnEVSideDisconnect',
-  ValueSize = 'ValueSize',
 }
 
 export enum OCPP20VendorVariableName {
index 95cabf847473e4c426ca8fdf183c50e58a321614..b88adec8a3350de81fbfdbafc5c4cbee6ba2769d 100644 (file)
@@ -237,7 +237,7 @@ await describe('B06 - Get Variables', async () => {
       getVariableData: [
         {
           component: { name: OCPP20ComponentName.DeviceDataCtrlr },
-          variable: { name: OCPP20RequiredVariableName.ReportingValueSize },
+          variable: { name: OCPP20OptionalVariableName.ReportingValueSize },
         },
       ],
     }
index 00acc59b3ab661c759c229f85d099adc5692ead4..1110e073fdc49961c565a053ab6c7db3a1d4b6ed 100644 (file)
@@ -545,7 +545,7 @@ await describe('B05 - Set Variables', async () => {
     setConfigurationValueSize(mockStation, 100)
     upsertConfigurationKey(
       mockStation,
-      buildConfigKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20RequiredVariableName.ValueSize),
+      buildConfigKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20OptionalVariableName.ValueSize),
       ''
     )
     const prefix = 'wss://example.com/'
@@ -585,7 +585,7 @@ await describe('B05 - Set Variables', async () => {
       mockStation,
       buildConfigKey(
         OCPP20ComponentName.DeviceDataCtrlr,
-        OCPP20RequiredVariableName.ConfigurationValueSize
+        OCPP20OptionalVariableName.ConfigurationValueSize
       ),
       ''
     )
index 64971750c1c4abc5ec404de33813f7dbfed2f14d..6f3209e6cfcf08c7121e6035914f4a674c4d5792 100644 (file)
@@ -27,6 +27,7 @@ import {
   HashAlgorithmEnumType,
   OCPP20ComponentName,
   OCPP20IdTokenEnumType,
+  OCPP20OptionalVariableName,
   OCPP20RequiredVariableName,
   OCPPVersion,
 } from '../../../../src/types/index.js'
@@ -280,7 +281,7 @@ export function resetReportingValueSize (chargingStation: ChargingStation) {
     chargingStation,
     buildConfigKey(
       OCPP20ComponentName.DeviceDataCtrlr,
-      OCPP20RequiredVariableName.ReportingValueSize
+      OCPP20OptionalVariableName.ReportingValueSize
     ),
     Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH.toString()
   )
@@ -296,13 +297,13 @@ export function resetValueSizeLimits (chargingStation: ChargingStation) {
     chargingStation,
     buildConfigKey(
       OCPP20ComponentName.DeviceDataCtrlr,
-      OCPP20RequiredVariableName.ConfigurationValueSize
+      OCPP20OptionalVariableName.ConfigurationValueSize
     ),
     Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH.toString()
   )
   upsertConfigurationKey(
     chargingStation,
-    buildConfigKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20RequiredVariableName.ValueSize),
+    buildConfigKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20OptionalVariableName.ValueSize),
     Constants.OCPP_VALUE_ABSOLUTE_MAX_LENGTH.toString()
   )
 }
@@ -317,7 +318,7 @@ export function setConfigurationValueSize (chargingStation: ChargingStation, siz
     chargingStation,
     buildConfigKey(
       OCPP20ComponentName.DeviceDataCtrlr,
-      OCPP20RequiredVariableName.ConfigurationValueSize
+      OCPP20OptionalVariableName.ConfigurationValueSize
     ),
     size.toString()
   )
@@ -333,7 +334,7 @@ export function setReportingValueSize (chargingStation: ChargingStation, size: n
     chargingStation,
     buildConfigKey(
       OCPP20ComponentName.DeviceDataCtrlr,
-      OCPP20RequiredVariableName.ReportingValueSize
+      OCPP20OptionalVariableName.ReportingValueSize
     ),
     size.toString()
   )
@@ -370,7 +371,7 @@ export function setStrictLimits (
 export function setValueSize (chargingStation: ChargingStation, size: number) {
   upsertConfigurationKey(
     chargingStation,
-    buildConfigKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20RequiredVariableName.ValueSize),
+    buildConfigKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20OptionalVariableName.ValueSize),
     size.toString()
   )
 }
index 545368fd69fb07f23f780250d4d075b2d8fb6543..c2accbee28c3fb69fed87824d70084a771742b78 100644 (file)
@@ -1370,7 +1370,7 @@ await describe('B05 - OCPP20VariableManager', async () => {
       // remove ValueSize to simulate unset
       deleteConfigurationKey(
         station,
-        buildConfigKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20RequiredVariableName.ValueSize),
+        buildConfigKey(OCPP20ComponentName.DeviceDataCtrlr, OCPP20OptionalVariableName.ValueSize),
         { save: false }
       )
       const okRes = manager.setVariables(station, [
@@ -1402,7 +1402,7 @@ await describe('B05 - OCPP20VariableManager', async () => {
         station,
         buildConfigKey(
           OCPP20ComponentName.DeviceDataCtrlr,
-          OCPP20RequiredVariableName.ConfigurationValueSize
+          OCPP20OptionalVariableName.ConfigurationValueSize
         ),
         { save: false }
       )
@@ -1764,7 +1764,7 @@ await describe('B05 - OCPP20VariableManager', async () => {
         station,
         buildConfigKey(
           OCPP20ComponentName.DeviceDataCtrlr,
-          OCPP20RequiredVariableName.ReportingValueSize
+          OCPP20OptionalVariableName.ReportingValueSize
         ),
         { save: false }
       )