From: Jérôme Benoit Date: Fri, 20 Mar 2026 18:23:38 +0000 (+0100) Subject: fix(ocpp2.0): align VARIABLE_REGISTRY spec conformance and log severity X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=3c1c342fd9a082cebe832393eceed749f4dd7555;p=e-mobility-charging-stations-simulator.git fix(ocpp2.0): align VARIABLE_REGISTRY spec conformance and log severity Distinguish required vs optional variables per OCPP 2.0.1 spec (dm_components_vars.csv). Missing required variables log as error, missing optional ones as warning. Tag 58 spec-required entries with required: true and 6 non-spec entries with vendorSpecific: true. --- diff --git a/src/charging-station/ocpp/2.0/OCPP20VariableManager.ts b/src/charging-station/ocpp/2.0/OCPP20VariableManager.ts index 94a59a27..4a152be5 100644 --- a/src/charging-station/ocpp/2.0/OCPP20VariableManager.ts +++ b/src/charging-station/ocpp/2.0/OCPP20VariableManager.ts @@ -293,9 +293,15 @@ export class OCPP20VariableManager { ) } else { invalidVariables.add(variableKey) - logger.error( - `${chargingStation.logPrefix()} Missing configuration key mapping and no default for variable '${configurationKeyName}'` - ) + if (variableMetadata.required === true) { + logger.error( + `${chargingStation.logPrefix()} Missing required configuration key mapping and no default for variable '${configurationKeyName}'` + ) + } else { + logger.warn( + `${chargingStation.logPrefix()} Missing optional configuration key mapping and no default for variable '${configurationKeyName}'` + ) + } } } } diff --git a/src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts b/src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts index c4eaa2aa..c1082191 100644 --- a/src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts +++ b/src/charging-station/ocpp/2.0/OCPP20VariableRegistry.ts @@ -67,6 +67,12 @@ export interface VariableMetadata { positive?: boolean postProcess?: (value: string, ctx: { chargingStation: ChargingStation }) => string rebootRequired?: boolean + /** + * Whether this variable is required per OCPP 2.0.1 spec (dm_components_vars.csv Required? column). + * When true, a missing configuration key with no default triggers an error; + * when false or omitted (default), it triggers a warning. + */ + required?: boolean supportedAttributes: AttributeEnumType[] supportsTarget?: boolean unit?: OCPP20UnitEnumType @@ -131,6 +137,7 @@ export const VARIABLE_REGISTRY: Record = { min: 1, mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.SECONDS, variable: 'Interval', @@ -165,6 +172,7 @@ export const VARIABLE_REGISTRY: Record = { ], mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'Measurands', }, @@ -199,6 +207,7 @@ export const VARIABLE_REGISTRY: Record = { min: 1, mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.SECONDS, variable: 'TxEndedInterval', @@ -233,6 +242,7 @@ export const VARIABLE_REGISTRY: Record = { ], mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.TxEndedMeasurands, }, @@ -378,6 +388,7 @@ export const VARIABLE_REGISTRY: Record = { description: 'Whether remote start requires authorization.', mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Volatile, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.AuthorizeRemoteStart as string, }, @@ -391,6 +402,7 @@ export const VARIABLE_REGISTRY: Record = { description: 'Start transaction offline for locally authorized identifiers.', mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.LocalAuthorizeOffline as string, }, @@ -404,6 +416,7 @@ export const VARIABLE_REGISTRY: Record = { description: 'Start transaction locally without waiting for CSMS authorization.', mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.LocalPreAuthorize as string, }, @@ -503,6 +516,7 @@ export const VARIABLE_REGISTRY: Record = { description: 'Component exists (ChargingStation level).', mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'Available', }, @@ -525,6 +539,7 @@ export const VARIABLE_REGISTRY: Record = { min: 1, mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'SupplyPhases', }, @@ -548,6 +563,7 @@ export const VARIABLE_REGISTRY: Record = { enumeration: ['Operative', 'Inoperative'], mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20DeviceInfoVariableName.AvailabilityState as string, }, @@ -569,6 +585,7 @@ export const VARIABLE_REGISTRY: Record = { supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.SECONDS, variable: OCPP20OptionalVariableName.WebSocketPingInterval as string, + vendorSpecific: true, }, [buildRegistryKey( OCPP20ComponentName.ChargingStation as string, @@ -656,6 +673,7 @@ export const VARIABLE_REGISTRY: Record = { dynamicValueResolver: () => new Date().toISOString(), mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Volatile, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.DateTime as string, }, @@ -677,6 +695,7 @@ export const VARIABLE_REGISTRY: Record = { ], mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.TimeSource as string, }, @@ -697,6 +716,7 @@ export const VARIABLE_REGISTRY: Record = { positive: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.BytesPerMessage as string, + vendorSpecific: true, }, [buildRegistryKey( OCPP20ComponentName.DeviceDataCtrlr as string, @@ -713,6 +733,7 @@ export const VARIABLE_REGISTRY: Record = { mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, positive: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.BytesPerMessage as string, }, @@ -731,6 +752,7 @@ export const VARIABLE_REGISTRY: Record = { mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, positive: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.BytesPerMessage as string, }, @@ -749,6 +771,7 @@ export const VARIABLE_REGISTRY: Record = { mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, positive: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.BytesPerMessage as string, }, @@ -786,6 +809,7 @@ export const VARIABLE_REGISTRY: Record = { mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, positive: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.ItemsPerMessage as string, }, @@ -804,6 +828,7 @@ export const VARIABLE_REGISTRY: Record = { mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, positive: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.ItemsPerMessage as string, }, @@ -822,6 +847,7 @@ export const VARIABLE_REGISTRY: Record = { mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, positive: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.ItemsPerMessage as string, }, @@ -881,6 +907,7 @@ export const VARIABLE_REGISTRY: Record = { enumeration: ['Operative', 'Inoperative'], mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Volatile, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20DeviceInfoVariableName.AvailabilityState, }, @@ -891,6 +918,7 @@ export const VARIABLE_REGISTRY: Record = { description: 'Component exists', mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'Available', }, @@ -926,6 +954,7 @@ export const VARIABLE_REGISTRY: Record = { description: 'The maximum power that this EVSE can provide and instantaneous power', mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Volatile, + required: true, supportedAttributes: [AttributeEnumType.Actual, AttributeEnumType.MaxSet], supportsTarget: false, unit: OCPP20UnitEnumType.WATT, @@ -940,6 +969,7 @@ export const VARIABLE_REGISTRY: Record = { min: 1, mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'SupplyPhases', }, @@ -981,6 +1011,7 @@ export const VARIABLE_REGISTRY: Record = { 'If this variable is true, then Charging Station will try to validate a contract certificate when it is offline', mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'ContractValidationOffline', }, @@ -1102,6 +1133,7 @@ export const VARIABLE_REGISTRY: Record = { min: 1, mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.BytesPerMessage, }, @@ -1135,6 +1167,7 @@ export const VARIABLE_REGISTRY: Record = { min: 0, mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Volatile, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'Entries', }, @@ -1146,6 +1179,7 @@ export const VARIABLE_REGISTRY: Record = { min: 1, mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.ItemsPerMessage, }, @@ -1231,6 +1265,7 @@ export const VARIABLE_REGISTRY: Record = { min: 1, mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.BytesPerMessage, }, @@ -1274,6 +1309,7 @@ export const VARIABLE_REGISTRY: Record = { min: 1, mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.ItemsPerMessage, }, @@ -1433,6 +1469,7 @@ export const VARIABLE_REGISTRY: Record = { enumeration: ['HTTP', 'HTTPS', 'FTP', 'FTPS', 'SFTP'], mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.FileTransferProtocols as string, }, @@ -1451,6 +1488,7 @@ export const VARIABLE_REGISTRY: Record = { mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, positive: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.SECONDS, variable: OCPP20RequiredVariableName.MessageAttemptInterval as string, @@ -1470,6 +1508,7 @@ export const VARIABLE_REGISTRY: Record = { mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, positive: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.MessageAttempts as string, }, @@ -1488,6 +1527,7 @@ export const VARIABLE_REGISTRY: Record = { mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, positive: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.SECONDS, variable: OCPP20RequiredVariableName.MessageTimeout as string, @@ -1503,6 +1543,7 @@ export const VARIABLE_REGISTRY: Record = { enumeration: ['1', '2', '3'], mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.NetworkConfigurationPriority as string, }, @@ -1518,6 +1559,7 @@ export const VARIABLE_REGISTRY: Record = { min: 1, mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.NetworkProfileConnectionAttempts as string, }, @@ -1534,6 +1576,7 @@ export const VARIABLE_REGISTRY: Record = { mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, positive: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.SECONDS, variable: OCPP20RequiredVariableName.OfflineThreshold as string, @@ -1551,6 +1594,7 @@ export const VARIABLE_REGISTRY: Record = { min: 0, mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.ResetRetries as string, }, @@ -1564,6 +1608,7 @@ export const VARIABLE_REGISTRY: Record = { description: 'Unlock cable when unplugged at EV side.', mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.UnlockOnEVSideDisconnect as string, }, @@ -1654,6 +1699,7 @@ export const VARIABLE_REGISTRY: Record = { min: 1, mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.SECONDS, variable: 'TxEndedInterval', @@ -1671,6 +1717,7 @@ export const VARIABLE_REGISTRY: Record = { supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.AMP, variable: OCPP20MeasurandEnumType.CURRENT_IMPORT, + vendorSpecific: true, }, [buildRegistryKey( OCPP20ComponentName.SampledDataCtrlr as string, @@ -1685,6 +1732,7 @@ export const VARIABLE_REGISTRY: Record = { supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.WATT_HOUR, variable: OCPP20MeasurandEnumType.ENERGY_ACTIVE_IMPORT_REGISTER, + vendorSpecific: true, }, [buildRegistryKey( OCPP20ComponentName.SampledDataCtrlr as string, @@ -1699,6 +1747,7 @@ export const VARIABLE_REGISTRY: Record = { supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.WATT, variable: OCPP20MeasurandEnumType.POWER_ACTIVE_IMPORT, + vendorSpecific: true, }, [buildRegistryKey( OCPP20ComponentName.SampledDataCtrlr as string, @@ -1713,6 +1762,7 @@ export const VARIABLE_REGISTRY: Record = { supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.VOLT, variable: OCPP20MeasurandEnumType.VOLTAGE, + vendorSpecific: true, }, [buildRegistryKey( OCPP20ComponentName.SampledDataCtrlr as string, @@ -1741,6 +1791,7 @@ export const VARIABLE_REGISTRY: Record = { ], mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.TxEndedMeasurands as string, }, @@ -1770,6 +1821,7 @@ export const VARIABLE_REGISTRY: Record = { ], mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.TxStartedMeasurands as string, }, @@ -1788,6 +1840,7 @@ export const VARIABLE_REGISTRY: Record = { mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Volatile, positive: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.SECONDS, variable: OCPP20RequiredVariableName.TxUpdatedInterval as string, @@ -1818,6 +1871,7 @@ export const VARIABLE_REGISTRY: Record = { ], mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.TxUpdatedMeasurands as string, }, @@ -1900,6 +1954,7 @@ export const VARIABLE_REGISTRY: Record = { min: 0, mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.CertificateEntries as string, }, @@ -1915,6 +1970,7 @@ export const VARIABLE_REGISTRY: Record = { mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, rebootRequired: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.OrganizationName as string, }, @@ -1935,6 +1991,7 @@ export const VARIABLE_REGISTRY: Record = { persistence: PersistenceEnumType.Persistent, positive: true, rebootRequired: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.SecurityProfile as string, }, @@ -2001,6 +2058,7 @@ export const VARIABLE_REGISTRY: Record = { min: 0, mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Volatile, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'Entries', }, @@ -2028,6 +2086,7 @@ export const VARIABLE_REGISTRY: Record = { min: 0.0, mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.PERCENT, variable: 'LimitChangeSignificance', @@ -2054,6 +2113,7 @@ export const VARIABLE_REGISTRY: Record = { min: 1, mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'PeriodsPerSchedule', }, @@ -2077,6 +2137,7 @@ export const VARIABLE_REGISTRY: Record = { min: 0, mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'ProfileStackLevel', }, @@ -2089,6 +2150,7 @@ export const VARIABLE_REGISTRY: Record = { enumeration: ['A', 'W'], mutability: MutabilityEnumType.ReadOnly, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'RateUnit', }, @@ -2124,6 +2186,7 @@ export const VARIABLE_REGISTRY: Record = { maxLength: 3, mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'Currency', }, @@ -2158,6 +2221,7 @@ export const VARIABLE_REGISTRY: Record = { maxLength: 512, mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'TariffFallbackMessage', }, @@ -2170,6 +2234,7 @@ export const VARIABLE_REGISTRY: Record = { maxLength: 512, mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: 'TotalCostFallbackMessage', }, @@ -2222,6 +2287,7 @@ export const VARIABLE_REGISTRY: Record = { mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, positive: true, + required: true, supportedAttributes: [AttributeEnumType.Actual], unit: OCPP20UnitEnumType.SECONDS, variable: OCPP20RequiredVariableName.EVConnectionTimeOut as string, @@ -2236,6 +2302,7 @@ export const VARIABLE_REGISTRY: Record = { description: 'Deauthorize transaction when cable unplugged at EV.', mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.StopTxOnEVSideDisconnect as string, }, @@ -2249,6 +2316,7 @@ export const VARIABLE_REGISTRY: Record = { description: 'Deauthorize transaction on invalid id token status.', mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.StopTxOnInvalidId as string, }, @@ -2270,6 +2338,7 @@ export const VARIABLE_REGISTRY: Record = { ], mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.TxStartPoint as string, }, @@ -2288,6 +2357,7 @@ export const VARIABLE_REGISTRY: Record = { ], mutability: MutabilityEnumType.ReadWrite, persistence: PersistenceEnumType.Persistent, + required: true, supportedAttributes: [AttributeEnumType.Actual], variable: OCPP20RequiredVariableName.TxStopPoint as string, },