From 1d0814fe5443c3be0322127397ba0a9b09b15042 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sat, 28 Mar 2026 15:21:35 +0100 Subject: [PATCH] refactor: move ConfigurationValueSize, ReportingValueSize, ValueSize to OCPP20OptionalVariableName 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. --- .../ocpp/2.0/OCPP20VariableManager.ts | 22 ++-- .../ocpp/2.0/OCPP20VariableRegistry.ts | 104 +++++++++--------- src/types/ocpp/2.0/Variables.ts | 6 +- ...ncomingRequestService-GetVariables.test.ts | 2 +- ...ncomingRequestService-SetVariables.test.ts | 4 +- .../ocpp/2.0/OCPP20TestUtils.ts | 13 ++- .../ocpp/2.0/OCPP20VariableManager.test.ts | 6 +- 7 files changed, 79 insertions(+), 78 deletions(-) diff --git a/src/charging-station/ocpp/2.0/OCPP20VariableManager.ts b/src/charging-station/ocpp/2.0/OCPP20VariableManager.ts index f1410a3d..0e164f79 100644 --- a/src/charging-station/ocpp/2.0/OCPP20VariableManager.ts +++ b/src/charging-station/ocpp/2.0/OCPP20VariableManager.ts @@ -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 ?? '') diff --git a/src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts b/src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts index ee8c06b5..88b7f0c1 100644 --- a/src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts +++ b/src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts @@ -709,6 +709,58 @@ export const VARIABLE_REGISTRY: Record = { 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 = { 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 = { 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')]: { diff --git a/src/types/ocpp/2.0/Variables.ts b/src/types/ocpp/2.0/Variables.ts index b7ab72aa..72414c6b 100644 --- a/src/types/ocpp/2.0/Variables.ts +++ b/src/types/ocpp/2.0/Variables.ts @@ -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 { diff --git a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-GetVariables.test.ts b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-GetVariables.test.ts index 95cabf84..b88adec8 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-GetVariables.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-GetVariables.test.ts @@ -237,7 +237,7 @@ await describe('B06 - Get Variables', async () => { getVariableData: [ { component: { name: OCPP20ComponentName.DeviceDataCtrlr }, - variable: { name: OCPP20RequiredVariableName.ReportingValueSize }, + variable: { name: OCPP20OptionalVariableName.ReportingValueSize }, }, ], } diff --git a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-SetVariables.test.ts b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-SetVariables.test.ts index 00acc59b..1110e073 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-SetVariables.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20IncomingRequestService-SetVariables.test.ts @@ -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 ), '' ) diff --git a/tests/charging-station/ocpp/2.0/OCPP20TestUtils.ts b/tests/charging-station/ocpp/2.0/OCPP20TestUtils.ts index 64971750..6f3209e6 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20TestUtils.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20TestUtils.ts @@ -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() ) } diff --git a/tests/charging-station/ocpp/2.0/OCPP20VariableManager.test.ts b/tests/charging-station/ocpp/2.0/OCPP20VariableManager.test.ts index 545368fd..c2accbee 100644 --- a/tests/charging-station/ocpp/2.0/OCPP20VariableManager.test.ts +++ b/tests/charging-station/ocpp/2.0/OCPP20VariableManager.test.ts @@ -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 } ) -- 2.43.0