Files
cariflex/tools/EVerest-main/modules/Examples/CppExamples/OCPPExtensionExample/OCPPExtensionExample.cpp
Eric F d398a6ced2 Add extracted tools: CitrineOS, OpenOCPP, ShapeShifter
- CitrineOS core extracted (CSMS OCPP 2.0.1)
- OpenOCPP extracted (firmware OCPP 1.6J/2.0.1)
- ShapeShifter library installed (pip install -e)
- ShapeShifter specification extracted
- EVerest extracted

TODO updated with progress
2026-06-08 00:38:27 -04:00

94 lines
3.8 KiB
C++

// SPDX-License-Identifier: Apache-2.0
// Copyright Pionix GmbH and Contributors to EVerest
#include "OCPPExtensionExample.hpp"
namespace module {
void OCPPExtensionExample::init() {
invoke_init(*p_data_transfer);
}
void OCPPExtensionExample::ready() {
invoke_ready(*p_data_transfer);
std::istringstream ss(this->config.keys_to_monitor);
std::vector<types::ocpp::ComponentVariable> component_variables;
std::string key;
while (std::getline(ss, key, ',')) {
// Push each token into the vector
component_variables.push_back({{""}, {key}}); // For OCPP1.6 we only need to specify the variable.name
}
// We register monitors for custom configuration keys here
this->r_ocpp->call_monitor_variables(component_variables);
// anytime this configuration key is changed by the CSMS and we have
// registered a monitor, this callback is executed
this->r_ocpp->subscribe_event_data([](types::ocpp::EventData event_data) {
// Add your custom handler here
EVLOG_info << "Configuration key: " << event_data.component_variable.variable.name
<< " has been changed by CSMS to: " << event_data.actual_value;
});
std::vector<types::ocpp::SetVariableRequest> set_variable_requests;
set_variable_requests.push_back({{{""}, {"ExampleConfigurationKey"}}, "ExampleValue"});
EVLOG_info << "Setting custom configuration key...";
const auto set_variable_results = this->r_ocpp->call_set_variables(set_variable_requests, "example");
for (const auto& set_variable_result : set_variable_results) {
if (set_variable_result.status == types::ocpp::SetVariableStatusEnumType::Accepted) {
EVLOG_info << "Successfully set ExampleConfigurationKey";
} else {
EVLOG_info << "Could not set ExampleConfigurationKey: "
<< types::ocpp::set_variable_status_enum_type_to_string(set_variable_result.status);
}
}
// adding a configuration key that does not exist to show that this will be
// part of the unknown keys of the result
component_variables.push_back({{""}, {"KeyThatIsNotConfigured"}});
std::vector<types::ocpp::GetVariableRequest> get_variables_requests;
for (const auto& component_variable : component_variables) {
get_variables_requests.push_back({component_variable});
}
EVLOG_info << "Requesting configuration keys from OCPP...";
const auto get_variables_results = this->r_ocpp->call_get_variables(get_variables_requests);
for (const auto& get_variables_result : get_variables_results) {
if (get_variables_result.status == types::ocpp::GetVariableStatusEnumType::Accepted) {
EVLOG_info << "Key: " << get_variables_result.component_variable.variable.name << ": "
<< get_variables_result.value.value();
} else {
EVLOG_info << "Unknown: " << get_variables_result.component_variable.variable.name;
}
}
types::ocpp::DataTransferRequest data_transfer_request;
data_transfer_request.vendor_id = "EVerest";
data_transfer_request.data.emplace("hi");
auto data_transfer_response = this->r_data_transfer->call_data_transfer(data_transfer_request);
switch (data_transfer_response.status) {
case types::ocpp::DataTransferStatus::Accepted:
EVLOG_info << "Data transfer was accepted";
break;
case types::ocpp::DataTransferStatus::Rejected:
EVLOG_info << "Data transfer was rejected";
break;
case types::ocpp::DataTransferStatus::UnknownVendorId:
EVLOG_info << "Data transfer was rejected (UnknownVendorId)";
break;
case types::ocpp::DataTransferStatus::UnknownMessageId:
EVLOG_info << "Data transfer was rejected (UnknownMessageId)";
break;
default:
break;
}
}
} // namespace module