Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generate OCPP 2.1 public draft messages #845

Draft
wants to merge 34 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
1abd2bb
Fix code generator to include manual fixes for 2.0.1 VariableAttribute
hikinggrass Oct 7, 2024
780572c
Fix code generator to remove superfluous ; after DateTime conversions
hikinggrass Oct 7, 2024
70e7dd7
Remove SecurityEvent enum from code generator since it is no enum any…
hikinggrass Oct 7, 2024
dd95a43
1.6: retrieveDateTime in SignedUpdateFirmware.firmware is not optional
hikinggrass Oct 7, 2024
a882867
WIP: generate 2.0.1 messages from 2.1 draft schemas
hikinggrass Oct 23, 2024
17b736e
Generate OCPP 2.1 messages from draft schemas with modified code gene…
hikinggrass Oct 23, 2024
0492085
Merge remote-tracking branch 'origin/main' into feature/ocpp2.1-publi…
hikinggrass Oct 23, 2024
59d1361
Fix compilation of smart charging tests
hikinggrass Oct 24, 2024
a3e730f
Attempt to fix unchecked optional access in calculate_composite_schedule
hikinggrass Oct 24, 2024
ab4f806
More fixes for smart charging tests
hikinggrass Oct 28, 2024
ce30fc5
Merge remote-tracking branch 'origin/main' into feature/ocpp2.1-publi…
hikinggrass Oct 28, 2024
cb9e57e
Additional fixes
hikinggrass Oct 28, 2024
ada40cb
ctest: output on failure
hikinggrass Oct 28, 2024
03e55cd
Fix composite schedule calculation
hikinggrass Oct 28, 2024
2f0d9f3
clang-format
hikinggrass Oct 28, 2024
a1cc575
Merge remote-tracking branch 'origin/main' into feature/ocpp2.1-publi…
hikinggrass Oct 30, 2024
5800478
Fix enum usage in tests for enums that turned into strings
hikinggrass Oct 30, 2024
4dfd843
FIXME: re-introduce default limit temporarily
hikinggrass Oct 30, 2024
b14ec4b
Merge remote-tracking branch 'origin/main' into feature/ocpp2.1-publi…
hikinggrass Oct 30, 2024
06b4919
Update tests/lib/ocpp/v201/test_profile.cpp
Pietfried Nov 14, 2024
e41afa7
Fix generated messages based on partially fixed schemas
hikinggrass Nov 18, 2024
5e7f550
Merge remote-tracking branch 'origin/main' into feature/ocpp2.1-publi…
hikinggrass Nov 18, 2024
1a6daa2
Merge remote-tracking branch 'origin/main' into feature/ocpp2.1-publi…
hikinggrass Dec 4, 2024
cdfecbf
ConnectorEnum is now just a string
hikinggrass Dec 4, 2024
979f75a
clang-format
hikinggrass Dec 4, 2024
8346253
clang-format
hikinggrass Dec 4, 2024
e83c5db
Merge remote-tracking branch 'origin/main' into feature/ocpp2.1-publi…
hikinggrass Dec 18, 2024
c89c13d
Merge branch 'main' into feature/ocpp2.1-public-draft-messages
Pietfried Dec 20, 2024
8c5518f
Make supported OCPP protocol version configurable (v201, v21) (#923)
Pietfried Jan 4, 2025
92274c3
Merge remote-tracking branch 'origin/main' into feature/ocpp2.1-publi…
Pietfried Jan 6, 2025
b9992c8
Merge branch 'main' into feature/ocpp2.1-public-draft-messages
Pietfried Jan 17, 2025
43beeb1
Merge branch 'main' into feature/ocpp2.1-public-draft-messages
Pietfried Jan 23, 2025
9927801
clang format
Pietfried Jan 23, 2025
0da58d0
Adjusted to official 2.1 schema files
Pietfried Jan 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion config/v201/component_config/standardized/InternalCtrlr.json
Original file line number Diff line number Diff line change
Expand Up @@ -835,6 +835,24 @@
"description": "If enabled we allow connections using security level 0. This does pose a security risk and is not allowed according to the OCPP spec",
"default": false,
"type": "boolean"
},
"SupportedOcppVersions": {
"variable_name": "SupportedOcppVersions",
"characteristics": {
"supportsMonitoring": true,
"dataType": "SequenceList",
"valuesList": "ocpp2.0.1,ocpp2.1"
},
"attributes": [
{
"type": "Actual",
"mutability": "ReadOnly",
"value": "ocpp2.1,ocpp2.0.1"
}
],
"description": "List of supported OCPP versions in order of preference",
"default": "ocpp2.1,ocpp2.0.1",
"type": "string"
}
},
"required": [
Expand All @@ -847,6 +865,7 @@
"NetworkConnectionProfiles",
"NumberOfConnectors",
"SupportedCiphers12",
"SupportedCiphers13"
"SupportedCiphers13",
"SupportedOcppVersions"
]
}
2 changes: 1 addition & 1 deletion include/ocpp/common/constants.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ constexpr float DEFAULT_LIMIT_WATTS = 33120.0;
constexpr std::int32_t DEFAULT_AND_MAX_NUMBER_PHASES = 3;
constexpr float LOW_VOLTAGE = 230;

constexpr float NO_LIMIT_SPECIFIED = -1.0;
// constexpr float NO_LIMIT_SPECIFIED = -1.0;
constexpr std::int32_t NO_START_PERIOD = -1;
constexpr std::int32_t EVSEID_NOT_SET = -1;

Expand Down
18 changes: 10 additions & 8 deletions include/ocpp/v201/charge_point.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ class ChargePointInterface {
/// \param certificate
/// \param ocsp_request_data
/// \return AuthorizeResponse containing the result of the validation
virtual AuthorizeResponse validate_token(const IdToken id_token, const std::optional<CiString<5500>>& certificate,
virtual AuthorizeResponse validate_token(const IdToken id_token, const std::optional<CiString<10000>>& certificate,
const std::optional<std::vector<OCSPRequestData>>& ocsp_request_data) = 0;

/// \brief Data transfer mechanism initiated by charger
Expand Down Expand Up @@ -418,6 +418,8 @@ class ChargePoint : public ChargePointInterface, private ocpp::ChargingStationBa

// states
std::atomic<RegistrationStatusEnum> registration_status;
std::atomic<OcppProtocolVersion> ocpp_version =
OcppProtocolVersion::Unknown; // version that is currently in use, selected by CSMS in websocket handshake
FirmwareStatusEnum firmware_status;
// The request ID in the last firmware update status received
std::optional<int32_t> firmware_status_id;
Expand Down Expand Up @@ -472,7 +474,8 @@ class ChargePoint : public ChargePointInterface, private ocpp::ChargingStationBa
void scheduled_check_client_certificate_expiration();
void scheduled_check_v2g_certificate_expiration();
void websocket_connected_callback(const int configuration_slot,
const NetworkConnectionProfile& network_connection_profile);
const NetworkConnectionProfile& network_connection_profile,
const OcppProtocolVersion ocpp_version);
void websocket_disconnected_callback(const int configuration_slot,
const NetworkConnectionProfile& network_connection_profile);
void websocket_connection_failed(ConnectionFailedReason reason);
Expand Down Expand Up @@ -555,15 +558,15 @@ class ChargePoint : public ChargePointInterface, private ocpp::ChargingStationBa
/// \param connector_type The connector type.
/// \return True when a connector is available and the evse id exists.
///
bool is_connector_available(const uint32_t evse_id, std::optional<ConnectorEnum> connector_type);
bool is_connector_available(const uint32_t evse_id, std::optional<CiString<20>> connector_type);

///
/// \brief Check if the connector exists on the given evse id.
/// \param evse_id The evse id to check for.
/// \param connector_type The connector type.
/// \return False if evse id does not exist or evse does not have the given connector type.
///
bool does_connector_exist(const uint32_t evse_id, std::optional<ConnectorEnum> connector_type);
bool does_connector_exist(const uint32_t evse_id, std::optional<CiString<20>> connector_type);

/// \brief Get the value optional offline flag
/// \return true if the charge point is offline. std::nullopt if it is online;
Expand Down Expand Up @@ -652,9 +655,8 @@ class ChargePoint : public ChargePointInterface, private ocpp::ChargingStationBa
const bool initiated_by_trigger_message = false);

// Functional Block K: Smart Charging
void report_charging_profile_req(const int32_t request_id, const int32_t evse_id,
const ChargingLimitSourceEnum source, const std::vector<ChargingProfile>& profiles,
const bool tbc);
void report_charging_profile_req(const int32_t request_id, const int32_t evse_id, const CiString<20> source,
const std::vector<ChargingProfile>& profiles, const bool tbc);
void report_charging_profile_req(const ReportChargingProfilesRequest& req);

// Functional Block N: Diagnostics
Expand Down Expand Up @@ -871,7 +873,7 @@ class ChargePoint : public ChargePointInterface, private ocpp::ChargingStationBa

std::optional<std::string> get_evse_transaction_id(int32_t evse_id) override;

AuthorizeResponse validate_token(const IdToken id_token, const std::optional<CiString<5500>>& certificate,
AuthorizeResponse validate_token(const IdToken id_token, const std::optional<CiString<10000>>& certificate,
const std::optional<std::vector<OCSPRequestData>>& ocsp_request_data) override;

void on_event(const std::vector<EventData>& events) override;
Expand Down
7 changes: 4 additions & 3 deletions include/ocpp/v201/charge_point_callbacks.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ struct Callbacks {
/// \brief Check if the current reservation for the given evse id is made for the id token / group id token.
/// \return The reservation check status of this evse / id token.
///
std::function<ocpp::ReservationCheckStatus(const int32_t evse_id, const CiString<36> idToken,
const std::optional<CiString<36>> groupIdToken)>
std::function<ocpp::ReservationCheckStatus(const int32_t evse_id, const CiString<255> idToken,
const std::optional<CiString<255>> groupIdToken)>
is_reservation_for_token_callback;
std::function<UpdateFirmwareResponse(const UpdateFirmwareRequest& request)> update_firmware_request_callback;
// callback to be called when a variable has been changed by the CSMS
Expand Down Expand Up @@ -145,7 +145,8 @@ struct Callbacks {

/// \brief Callback function is called when the websocket connection status changes
std::optional<std::function<void(const bool is_connected, const int configuration_slot,
const NetworkConnectionProfile& network_connection_profile)>>
const NetworkConnectionProfile& network_connection_profile,
const OcppProtocolVersion ocpp_version)>>
connection_state_changed_callback;

/// \brief Callback functions called for get / set / clear display messages
Expand Down
11 changes: 9 additions & 2 deletions include/ocpp/v201/connectivity_manager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,15 @@

class DeviceModel;

using WebsocketConnectionCallback = std::function<void(
int configuration_slot, const NetworkConnectionProfile& network_connection_profile, OcppProtocolVersion version)>;
/// \brief The result of a configuration of a network profile.
struct ConfigNetworkResult {
std::optional<std::string> interface_address; ///< ip address or interface string
bool success; ///< true if the configuration was successful

Check notice on line 21 in include/ocpp/v201/connectivity_manager.hpp

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

include/ocpp/v201/connectivity_manager.hpp#L21

struct member 'ConfigNetworkResult::success' is never used.
};

using WebsocketConnectionCallback =
std::function<void(int configuration_slot, const NetworkConnectionProfile& network_connection_profile,
const OcppProtocolVersion version)>;
using WebsocketConnectionFailedCallback = std::function<void(ConnectionFailedReason reason)>;
using ConfigureNetworkConnectionProfileCallback = std::function<std::future<ConfigNetworkResult>(
const int32_t configuration_slot, const NetworkConnectionProfile& network_connection_profile)>;
Expand Down
3 changes: 2 additions & 1 deletion include/ocpp/v201/constants.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ namespace v201 {

/// \brief OCPP 2.0.1 defines this as 5600 but it can be set to a higher value, which we do here, if it's reported via
/// the device model, which we do as well
constexpr std::size_t ISO15118_GET_EV_CERTIFICATE_EXI_RESPONSE_SIZE = 7500;
/// 17000 is the vminimum alue from OCPP 2.1
constexpr std::size_t ISO15118_GET_EV_CERTIFICATE_EXI_RESPONSE_SIZE = 17000;

} // namespace v201
} // namespace ocpp
1 change: 1 addition & 0 deletions include/ocpp/v201/ctrlr_component_variables.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ extern const ComponentVariable MessageQueueSizeThreshold;
extern const ComponentVariable MaxMessageSize;
extern const ComponentVariable ResumeTransactionsOnBoot;
extern const ComponentVariable AllowSecurityLevelZeroConnections;
extern const RequiredComponentVariable SupportedOcppVersions;
extern const ComponentVariable AlignedDataCtrlrEnabled;
extern const ComponentVariable AlignedDataCtrlrAvailable;
extern const RequiredComponentVariable AlignedDataInterval;
Expand Down
8 changes: 4 additions & 4 deletions include/ocpp/v201/database_handler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ class DatabaseHandlerInterface {
/// \brief Inserts or updates the given \p profile to CHARGING_PROFILES table
virtual void insert_or_update_charging_profile(
const int evse_id, const v201::ChargingProfile& profile,
const ChargingLimitSourceEnum charging_limit_source = ChargingLimitSourceEnum::CSO) = 0;
const CiString<20> charging_limit_source = ChargingLimitSourceEnumStringType::CSO) = 0;

/// \brief Deletes the profile with the given \p profile_id
virtual bool delete_charging_profile(const int profile_id) = 0;
Expand Down Expand Up @@ -196,7 +196,7 @@ class DatabaseHandlerInterface {
/// \brief Retrieves all ChargingProfiles grouped by EVSE ID
virtual std::map<int32_t, std::vector<v201::ChargingProfile>> get_all_charging_profiles_group_by_evse() = 0;

virtual ChargingLimitSourceEnum get_charging_limit_source_for_profile(const int profile_id) = 0;
virtual CiString<20> get_charging_limit_source_for_profile(const int profile_id) = 0;

virtual std::unique_ptr<common::SQLiteStatementInterface> new_statement(const std::string& sql) = 0;
};
Expand Down Expand Up @@ -270,7 +270,7 @@ class DatabaseHandler : public DatabaseHandlerInterface, public common::Database
/// charging profiles
void insert_or_update_charging_profile(
const int evse_id, const v201::ChargingProfile& profile,
const ChargingLimitSourceEnum charging_limit_source = ChargingLimitSourceEnum::CSO) override;
const CiString<20> charging_limit_source = ChargingLimitSourceEnumStringType::CSO) override;
bool delete_charging_profile(const int profile_id) override;
void delete_charging_profile_by_transaction_id(const std::string& transaction_id) override;
bool clear_charging_profiles() override;
Expand All @@ -282,7 +282,7 @@ class DatabaseHandler : public DatabaseHandlerInterface, public common::Database
std::vector<v201::ChargingProfile> get_charging_profiles_for_evse(const int evse_id) override;
std::vector<v201::ChargingProfile> get_all_charging_profiles() override;
virtual std::map<int32_t, std::vector<v201::ChargingProfile>> get_all_charging_profiles_group_by_evse() override;
ChargingLimitSourceEnum get_charging_limit_source_for_profile(const int profile_id) override;
CiString<20> get_charging_limit_source_for_profile(const int profile_id) override;

std::unique_ptr<common::SQLiteStatementInterface> new_statement(const std::string& sql) override;
};
Expand Down
10 changes: 5 additions & 5 deletions include/ocpp/v201/evse.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class EvseInterface {
/// \param connector_type The connector type to check.
/// \return True if connector type is unknown or this evse has the given connector type.
///
virtual bool does_connector_exist(ConnectorEnum connector_type) const = 0;
virtual bool does_connector_exist(CiString<20> connector_type) const = 0;

///
/// \brief Get connector status.
Expand All @@ -54,7 +54,7 @@ class EvseInterface {
/// \param connector_type The connector type to filter on (optional).
/// \return Connector status. If connector type is given and does not exist, std::nullopt.
///
virtual std::optional<ConnectorStatusEnum> get_connector_status(std::optional<ConnectorEnum> connector_type) = 0;
virtual std::optional<ConnectorStatusEnum> get_connector_status(std::optional<CiString<20>> connector_type) = 0;

/// \brief Opens a new transaction
/// \param transaction_id id of the transaction
Expand Down Expand Up @@ -223,7 +223,7 @@ class Evse : public EvseInterface {
/// \param connector_id Connector id
/// \return The connector type. If evse or connector id is not correct: std::nullopt.
///
std::optional<ConnectorEnum> get_evse_connector_type(const uint32_t connector_id) const;
std::optional<CiString<20>> get_evse_connector_type(const uint32_t connector_id) const;

public:
/// \brief Construct a new Evse object
Expand All @@ -247,8 +247,8 @@ class Evse : public EvseInterface {
int32_t get_id() const;

uint32_t get_number_of_connectors() const;
bool does_connector_exist(const ConnectorEnum connector_type) const override;
std::optional<ConnectorStatusEnum> get_connector_status(std::optional<ConnectorEnum> connector_type) override;
bool does_connector_exist(const CiString<20> connector_type) const override;
std::optional<ConnectorStatusEnum> get_connector_status(std::optional<CiString<20>> connector_type) override;

void open_transaction(const std::string& transaction_id, const int32_t connector_id, const DateTime& timestamp,
const MeterValue& meter_start, const std::optional<IdToken>& id_token,
Expand Down
4 changes: 2 additions & 2 deletions include/ocpp/v201/evse_manager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class EvseManagerInterface {
/// \param evse_id The evse id to check for.
/// \param connector_type The connector type.
/// \return False if evse id does not exist or evse does not have the given connector type.
virtual bool does_connector_exist(const int32_t evse_id, ConnectorEnum connector_type) const = 0;
virtual bool does_connector_exist(const int32_t evse_id, const CiString<20> connector_type) const = 0;

/// \brief Check if an evse with \p id exists
virtual bool does_evse_exist(int32_t id) const = 0;
Expand Down Expand Up @@ -65,7 +65,7 @@ class EvseManager : public EvseManagerInterface {
EvseInterface& get_evse(int32_t id) override;
const EvseInterface& get_evse(const int32_t id) const override;

virtual bool does_connector_exist(const int32_t evse_id, const ConnectorEnum connector_type) const override;
virtual bool does_connector_exist(const int32_t evse_id, const CiString<20> connector_type) const override;
bool does_evse_exist(const int32_t id) const override;

size_t get_number_of_evses() const override;
Expand Down
8 changes: 4 additions & 4 deletions include/ocpp/v201/functional_blocks/authorization.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class AuthorizationInterface : public MessageHandlerInterface {
}

virtual void start_auth_cache_cleanup_thread() = 0;
virtual AuthorizeResponse authorize_req(const IdToken id_token, const std::optional<CiString<5500>>& certificate,
virtual AuthorizeResponse authorize_req(const IdToken id_token, const std::optional<CiString<10000>>& certificate,
const std::optional<std::vector<OCSPRequestData>>& ocsp_request_data) = 0;
virtual void trigger_authorization_cache_cleanup() = 0;
///\brief Calculate and update the authorization cache size in the device model
Expand All @@ -36,7 +36,7 @@ class AuthorizationInterface : public MessageHandlerInterface {
/// \param certificate
/// \param ocsp_request_data
/// \return AuthorizeResponse containing the result of the validation
virtual AuthorizeResponse validate_token(const IdToken id_token, const std::optional<CiString<5500>>& certificate,
virtual AuthorizeResponse validate_token(const IdToken id_token, const std::optional<CiString<10000>>& certificate,
const std::optional<std::vector<OCSPRequestData>>& ocsp_request_data) = 0;
};

Expand All @@ -62,7 +62,7 @@ class Authorization : public AuthorizationInterface {
~Authorization();
void start_auth_cache_cleanup_thread() override;
void handle_message(const ocpp::EnhancedMessage<MessageType>& message) override;
AuthorizeResponse authorize_req(const IdToken id_token, const std::optional<ocpp::CiString<5500>>& certificate,
AuthorizeResponse authorize_req(const IdToken id_token, const std::optional<ocpp::CiString<10000>>& certificate,
const std::optional<std::vector<OCSPRequestData>>& ocsp_request_data) override;
void trigger_authorization_cache_cleanup() override;
void update_authorization_cache_size() override;
Expand All @@ -76,7 +76,7 @@ class Authorization : public AuthorizationInterface {
/// \param certificate
/// \param ocsp_request_data
/// \return AuthorizeResponse containing the result of the validation
AuthorizeResponse validate_token(const IdToken id_token, const std::optional<CiString<5500>>& certificate,
AuthorizeResponse validate_token(const IdToken id_token, const std::optional<CiString<10000>>& certificate,
const std::optional<std::vector<OCSPRequestData>>& ocsp_request_data) override;

private: // Functions
Expand Down
4 changes: 2 additions & 2 deletions include/ocpp/v201/functional_blocks/reservation.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ class EvseManagerInterface;

typedef std::function<ReserveNowStatusEnum(const ReserveNowRequest& request)> ReserveNowCallback;
typedef std::function<bool(const int32_t reservationId)> CancelReservationCallback;
typedef std::function<ocpp::ReservationCheckStatus(const int32_t evse_id, const CiString<36> idToken,
const std::optional<CiString<36>> groupIdToken)>
typedef std::function<ocpp::ReservationCheckStatus(const int32_t evse_id, const CiString<255> idToken,
const std::optional<CiString<255>> groupIdToken)>
IsReservationForTokenCallback;

class ReservationInterface : public MessageHandlerInterface {
Expand Down
8 changes: 5 additions & 3 deletions include/ocpp/v201/messages/Authorize.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ namespace v201 {
/// \brief Contains a OCPP Authorize message
struct AuthorizeRequest : public ocpp::Message {
IdToken idToken;
std::optional<CustomData> customData;
std::optional<CiString<5500>> certificate;
std::optional<CiString<10000>> certificate;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could probably be reported via FieldLength variable for the AuthorizeRequest.certificate instance which should make this change backwards-compatible with 2.0.1

std::optional<std::vector<OCSPRequestData>> iso15118CertificateHashData;
std::optional<CustomData> customData;

/// \brief Provides the type of this Authorize message as a human readable string
/// \returns the message type as a human readable string
Expand All @@ -40,8 +40,10 @@ std::ostream& operator<<(std::ostream& os, const AuthorizeRequest& k);
/// \brief Contains a OCPP AuthorizeResponse message
struct AuthorizeResponse : public ocpp::Message {
IdTokenInfo idTokenInfo;
std::optional<CustomData> customData;
std::optional<AuthorizeCertificateStatusEnum> certificateStatus;
std::optional<std::vector<EnergyTransferModeEnum>> allowedEnergyTransfer;
std::optional<Tariff> tariff;
std::optional<CustomData> customData;

/// \brief Provides the type of this AuthorizeResponse message as a human readable string
/// \returns the message type as a human readable string
Expand Down
2 changes: 1 addition & 1 deletion include/ocpp/v201/messages/BootNotification.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ struct BootNotificationResponse : public ocpp::Message {
ocpp::DateTime currentTime;
int32_t interval;
RegistrationStatusEnum status;
std::optional<CustomData> customData;
std::optional<StatusInfo> statusInfo;
std::optional<CustomData> customData;

/// \brief Provides the type of this BootNotificationResponse message as a human readable string
/// \returns the message type as a human readable string
Expand Down
Loading