Skip to content

Commit 6bdb50f

Browse files
committed
feat: add OCPP 1.6 to 2.x configuration key mapping
Introduce mapping layer to reuse OCPP 2.x device model storage for OCPP 1.6 implementations. Adds OCPP16MavericksCtrlr component for 1.6 configuration keys without direct 2.x equivalents. Signed-off-by: Piet Gömpel <pietgoempel@gmail.com> feat: add mapping between OCPP V2 and V16 configuration keys Signed-off-by: James Chapman <james.chapman@pionix.de>
1 parent 1333c3e commit 6bdb50f

File tree

9 files changed

+1221
-198
lines changed

9 files changed

+1221
-198
lines changed
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
// Copyright Pionix GmbH and Contributors to EVerest
3+
4+
#pragma once
5+
6+
#include <map>
7+
#include <optional>
8+
#include <string>
9+
#include <vector>
10+
11+
#include <ocpp/v2/ctrlr_component_variables.hpp>
12+
13+
namespace ocpp {
14+
namespace v16 {
15+
16+
/// \brief Represents a mapping from OCPP 1.6 configuration key to OCPP 2.x ComponentVariable
17+
struct V16ToV2Mapping {
18+
std::string v16_key;
19+
v2::ComponentVariable component_variable;
20+
};
21+
22+
/// \brief Static mappings from OCPP 1.6 configuration keys to OCPP 2.x ComponentVariable
23+
static const std::vector<V16ToV2Mapping> OCPP16_TO_V2_MAPPINGS = {
24+
// ============================================================================
25+
// Standard OCPP 1.6 keys
26+
// ============================================================================
27+
28+
{"AllowOfflineTxForUnknownId", v2::ControllerComponentVariables::OfflineTxForUnknownIdEnabled},
29+
{"AuthorizationCacheEnabled", v2::ControllerComponentVariables::AuthCacheCtrlrEnabled},
30+
{"AuthorizeRemoteTxRequests", v2::ControllerComponentVariables::AuthorizeRemoteStart},
31+
{"ClockAlignedDataInterval", v2::ControllerComponentVariables::AlignedDataInterval},
32+
{"ConnectionTimeOut", v2::ControllerComponentVariables::EVConnectionTimeOut},
33+
{"HeartbeatInterval", v2::ControllerComponentVariables::HeartbeatInterval},
34+
{"LocalAuthorizeOffline", v2::ControllerComponentVariables::LocalAuthorizeOffline},
35+
{"LocalPreAuthorize", v2::ControllerComponentVariables::LocalPreAuthorize},
36+
{"MaxEnergyOnInvalidId", v2::ControllerComponentVariables::MaxEnergyOnInvalidId},
37+
{"MeterValuesAlignedData", v2::ControllerComponentVariables::AlignedDataMeasurands},
38+
{"MeterValuesSampledData", v2::ControllerComponentVariables::SampledDataTxUpdatedMeasurands},
39+
{"MeterValueSampleInterval", v2::ControllerComponentVariables::SampledDataTxUpdatedInterval},
40+
{"ResetRetries", v2::ControllerComponentVariables::ResetRetries},
41+
{"StopTransactionOnInvalidId", v2::ControllerComponentVariables::StopTxOnInvalidId},
42+
{"StopTxnAlignedData", v2::ControllerComponentVariables::AlignedDataTxEndedMeasurands},
43+
{"StopTxnSampledData", v2::ControllerComponentVariables::SampledDataTxEndedMeasurands},
44+
{"TransactionMessageAttempts", v2::ControllerComponentVariables::MessageAttempts},
45+
{"TransactionMessageRetryInterval", v2::ControllerComponentVariables::MessageAttemptInterval},
46+
{"WebSocketPingInterval", v2::ControllerComponentVariables::WebSocketPingInterval},
47+
{"LocalAuthListEnabled", v2::ControllerComponentVariables::LocalAuthListCtrlrEnabled},
48+
{"ChargeProfileMaxStackLevel", v2::ControllerComponentVariables::ChargingProfileMaxStackLevel},
49+
{"ChargingScheduleAllowedChargingRateUnit", v2::ControllerComponentVariables::ChargingScheduleChargingRateUnit},
50+
{"ChargingScheduleMaxPeriods", v2::ControllerComponentVariables::PeriodsPerSchedule},
51+
{"ConnectorSwitch3to1PhaseSupported", v2::ControllerComponentVariables::Phases3to1},
52+
{"SupportedFileTransferProtocols", v2::ControllerComponentVariables::FileTransferProtocols},
53+
54+
// ============================================================================
55+
// Internal configuration keys
56+
// ============================================================================
57+
58+
{"ChargePointId", v2::ControllerComponentVariables::ChargePointId},
59+
{"ChargeBoxSerialNumber", v2::ControllerComponentVariables::ChargeBoxSerialNumber},
60+
{"ChargePointModel", v2::ControllerComponentVariables::ChargePointModel},
61+
{"ChargePointSerialNumber", v2::ControllerComponentVariables::ChargePointSerialNumber},
62+
{"ChargePointVendor", v2::ControllerComponentVariables::ChargePointVendor},
63+
{"FirmwareVersion", v2::ControllerComponentVariables::FirmwareVersion},
64+
{"ICCID", v2::ControllerComponentVariables::ICCID},
65+
{"IFace", v2::ControllerComponentVariables::IFace},
66+
{"IMSI", v2::ControllerComponentVariables::IMSI},
67+
{"MeterSerialNumber", v2::ControllerComponentVariables::MeterSerialNumber},
68+
{"MeterType", v2::ControllerComponentVariables::MeterType},
69+
{"SupportedCiphers12", v2::ControllerComponentVariables::SupportedCiphers12},
70+
{"SupportedCiphers13", v2::ControllerComponentVariables::SupportedCiphers13},
71+
{"UseTPM", v2::ControllerComponentVariables::UseTPM},
72+
{"UseTPMSeccLeafCertificate", v2::ControllerComponentVariables::UseTPMSeccLeafCertificate},
73+
{"RetryBackoffRandomRange", v2::ControllerComponentVariables::RetryBackOffRandomRange},
74+
{"RetryBackoffRepeatTimes", v2::ControllerComponentVariables::RetryBackOffRepeatTimes},
75+
{"AuthorizeConnectorZeroOnConnectorOne", v2::ControllerComponentVariables::AuthorizeConnectorZeroOnConnectorOne},
76+
{"LogMessages", v2::ControllerComponentVariables::LogMessages},
77+
{"LogMessagesRaw", v2::ControllerComponentVariables::LogMessagesRaw},
78+
{"LogMessagesFormat", v2::ControllerComponentVariables::LogMessagesFormat},
79+
{"LogRotation", v2::ControllerComponentVariables::LogRotation},
80+
{"LogRotationDateSuffix", v2::ControllerComponentVariables::LogRotationDateSuffix},
81+
{"LogRotationMaximumFileSize", v2::ControllerComponentVariables::LogRotationMaximumFileSize},
82+
{"LogRotationMaximumFileCount", v2::ControllerComponentVariables::LogRotationMaximumFileCount},
83+
{"SupportedChargingProfilePurposeTypes", v2::ControllerComponentVariables::SupportedChargingProfilePurposeTypes},
84+
{"IgnoredProfilePurposesOffline", v2::ControllerComponentVariables::IgnoredProfilePurposesOffline},
85+
{"MaxCompositeScheduleDuration", v2::ControllerComponentVariables::MaxCompositeScheduleDuration},
86+
{"CompositeScheduleDefaultLimitAmps", v2::ControllerComponentVariables::CompositeScheduleDefaultLimitAmps},
87+
{"CompositeScheduleDefaultLimitWatts", v2::ControllerComponentVariables::CompositeScheduleDefaultLimitWatts},
88+
{"CompositeScheduleDefaultNumberPhases", v2::ControllerComponentVariables::CompositeScheduleDefaultNumberPhases},
89+
{"SupplyVoltage", v2::ControllerComponentVariables::SupplyVoltage},
90+
{"WebsocketPingPayload", v2::ControllerComponentVariables::WebsocketPingPayload},
91+
{"WebsocketPongTimeout", v2::ControllerComponentVariables::WebsocketPongTimeout},
92+
{"UseSslDefaultVerifyPaths", v2::ControllerComponentVariables::UseSslDefaultVerifyPaths},
93+
{"VerifyCsmsCommonName", v2::ControllerComponentVariables::VerifyCsmsCommonName},
94+
{"VerifyCsmsAllowWildcards", v2::ControllerComponentVariables::VerifyCsmsAllowWildcards},
95+
{"OcspRequestInterval", v2::ControllerComponentVariables::OcspRequestInterval},
96+
{"SeccLeafSubjectCommonName", v2::ControllerComponentVariables::ISO15118CtrlrSeccId},
97+
{"SeccLeafSubjectCountry", v2::ControllerComponentVariables::ISO15118CtrlrCountryName},
98+
{"SeccLeafSubjectOrganization", v2::ControllerComponentVariables::ISO15118CtrlrOrganizationName},
99+
{"QueueAllMessages", v2::ControllerComponentVariables::QueueAllMessages},
100+
{"MessageTypesDiscardForQueueing", v2::ControllerComponentVariables::MessageTypesDiscardForQueueing},
101+
{"MessageQueueSizeThreshold", v2::ControllerComponentVariables::MessageQueueSizeThreshold},
102+
{"MaxMessageSize", v2::ControllerComponentVariables::MaxMessageSize},
103+
{"TLSKeylogFile", v2::ControllerComponentVariables::TLSKeylogFile},
104+
{"EnableTLSKeylog", v2::ControllerComponentVariables::EnableTLSKeylog},
105+
{"NumberOfConnectors", v2::ControllerComponentVariables::NumberOfConnectors},
106+
107+
// ============================================================================
108+
// Security Section
109+
// ============================================================================
110+
111+
{"AdditionalRootCertificateCheck", v2::ControllerComponentVariables::AdditionalRootCertificateCheck},
112+
{"AuthorizationKey", v2::ControllerComponentVariables::BasicAuthPassword},
113+
{"CertificateSignedMaxChainSize", v2::ControllerComponentVariables::MaxCertificateChainSize},
114+
{"CpoName", v2::ControllerComponentVariables::OrganizationName},
115+
{"SecurityProfile", v2::ControllerComponentVariables::SecurityProfile},
116+
{"CertSigningWaitMinimum", v2::ControllerComponentVariables::CertSigningWaitMinimum},
117+
{"CertSigningRepeatTimes", v2::ControllerComponentVariables::CertSigningRepeatTimes},
118+
119+
// ============================================================================
120+
// PnC Section
121+
// ============================================================================
122+
123+
{"ISO15118PnCEnabled", v2::ControllerComponentVariables::PnCEnabled},
124+
{"CentralContractValidationAllowed", v2::ControllerComponentVariables::CentralContractValidationAllowed},
125+
{"ContractValidationOffline", v2::ControllerComponentVariables::ContractValidationOffline},
126+
127+
// ============================================================================
128+
// CostAndPrice Section
129+
// ============================================================================
130+
131+
{"NumberOfDecimalsForCostValues", v2::ControllerComponentVariables::NumberOfDecimalsForCostValues},
132+
{"TimeOffset", v2::ControllerComponentVariables::TimeOffset},
133+
{"NextTimeOffsetTransitionDateTime", v2::ControllerComponentVariables::NextTimeOffsetTransitionDateTime},
134+
{"TimeOffsetNextTransition", v2::ControllerComponentVariables::TimeOffsetNextTransition},
135+
136+
// ============================================================================
137+
// Mavericks Section - OCPP 1.6 keys without direct OCPP 2.x equivalents
138+
// ============================================================================
139+
140+
{"BlinkRepeat", v2::ControllerComponentVariables::BlinkRepeat},
141+
{"ConnectorPhaseRotationMaxLength", v2::ControllerComponentVariables::ConnectorPhaseRotationMaxLength},
142+
{"GetConfigurationMaxKeys", v2::ControllerComponentVariables::GetConfigurationMaxKeys},
143+
{"LightIntensity", v2::ControllerComponentVariables::LightIntensity},
144+
{"MinimumStatusDuration", v2::ControllerComponentVariables::MinimumStatusDuration},
145+
{"StopTransactionOnEVSideDisconnect", v2::ControllerComponentVariables::StopTransactionOnEVSideDisconnect},
146+
{"SupportedFeatureProfiles", v2::ControllerComponentVariables::SupportedFeatureProfiles},
147+
{"SupportedFeatureProfilesMaxLength", v2::ControllerComponentVariables::SupportedFeatureProfilesMaxLength},
148+
{"UnlockConnectorOnEVSideDisconnect", v2::ControllerComponentVariables::UnlockConnectorOnEVSideDisconnect},
149+
{"ReserveConnectorZeroSupported", v2::ControllerComponentVariables::ReserveConnectorZeroSupported},
150+
{"HostName", v2::ControllerComponentVariables::HostName},
151+
{"AllowChargingProfileWithoutStartSchedule",
152+
v2::ControllerComponentVariables::AllowChargingProfileWithoutStartSchedule},
153+
{"WaitForStopTransactionsOnResetTimeout", v2::ControllerComponentVariables::WaitForStopTransactionsOnResetTimeout},
154+
{"StopTransactionIfUnlockNotSupported", v2::ControllerComponentVariables::StopTransactionIfUnlockNotSupported},
155+
{"MeterPublicKeys", v2::ControllerComponentVariables::MeterPublicKeys}, // FIXME
156+
{"DisableSecurityEventNotifications", v2::ControllerComponentVariables::DisableSecurityEventNotifications},
157+
{"ISO15118CertificateManagementEnabled", v2::ControllerComponentVariables::ISO15118CertificateManagementEnabled},
158+
{"CustomDisplayCostAndPrice", v2::ControllerComponentVariables::CustomDisplayCostAndPrice},
159+
{"DefaultPrice", v2::ControllerComponentVariables::DefaultPrice},
160+
{"DefaultPriceText", v2::ControllerComponentVariables::DefaultPriceText},
161+
{"CustomIdleFeeAfterStop", v2::ControllerComponentVariables::CustomIdleFeeAfterStop},
162+
{"SupportedLanguages", v2::ControllerComponentVariables::SupportedLanguages},
163+
{"CustomMultiLanguageMessages", v2::ControllerComponentVariables::CustomMultiLanguageMessages},
164+
{"Language", v2::ControllerComponentVariables::Language},
165+
{"WaitForSetUserPriceTimeout", v2::ControllerComponentVariables::WaitForSetUserPriceTimeout},
166+
};
167+
168+
/// \brief Build a lookup map from OCPP 1.6 key to OCPP 2.x ComponentVariable
169+
/// \return Map of v16_key -> ComponentVariable
170+
inline std::map<std::string, v2::ComponentVariable> build_v16_to_v2_lookup() {
171+
std::map<std::string, v2::ComponentVariable> lookup;
172+
for (const auto& mapping : OCPP16_TO_V2_MAPPINGS) {
173+
lookup[mapping.v16_key] = mapping.component_variable;
174+
}
175+
return lookup;
176+
}
177+
178+
/// \brief Get OCPP 2.x ComponentVariable for a given OCPP 1.6 configuration key
179+
/// \param v16_key The OCPP 1.6 configuration key
180+
/// \return Optional ComponentVariable if found
181+
inline std::optional<v2::ComponentVariable> get_v2_component_variable(const std::string& v16_key) {
182+
static const auto lookup = build_v16_to_v2_lookup();
183+
auto it = lookup.find(v16_key);
184+
if (it != lookup.end()) {
185+
return it->second;
186+
}
187+
return std::nullopt;
188+
}
189+
190+
} // namespace v16
191+
} // namespace ocpp

0 commit comments

Comments
 (0)