diff --git a/include/ocpp/common/incremental_counter.hpp b/include/ocpp/common/incremental_counter.hpp new file mode 100644 index 000000000..0da1e6890 --- /dev/null +++ b/include/ocpp/common/incremental_counter.hpp @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Pionix GmbH and Contributors to EVerest + +#pragma once + +#include + +namespace ocpp { +class IncrementalCounter { +public: + static int get(); + +private: + static std::atomic counter; +}; + +} // namespace ocpp diff --git a/include/ocpp/v201/functional_blocks/diagnostics.hpp b/include/ocpp/v201/functional_blocks/diagnostics.hpp index b359a131d..4c3497f31 100644 --- a/include/ocpp/v201/functional_blocks/diagnostics.hpp +++ b/include/ocpp/v201/functional_blocks/diagnostics.hpp @@ -37,6 +37,8 @@ class DiagnosticsInterface : public MessageHandlerInterface { /* OCPP message requests */ virtual void notify_event_req(const std::vector& events) = 0; + virtual void notify_event_req_connector_status_update(const int32_t evse_id, const int32_t connector_id, + const ConnectorStatusEnum status) = 0; /* Monitoring */ virtual void stop_monitoring() = 0; @@ -53,6 +55,8 @@ class Diagnostics : public DiagnosticsInterface { std::optional clear_customer_information_callback); void handle_message(const ocpp::EnhancedMessage& message) override; void notify_event_req(const std::vector& events) override; + void notify_event_req_connector_status_update(const int32_t evse_id, const int32_t connector_id, + const ConnectorStatusEnum status) override; void stop_monitoring() override; void start_monitoring() override; void process_triggered_monitors() override; diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 4fbaacf02..6c8e25f8a 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -20,6 +20,7 @@ target_sources(ocpp PRIVATE ocpp/common/call_types.cpp ocpp/common/charging_station_base.cpp + ocpp/common/incremental_counter.cpp ocpp/common/ocpp_logging.cpp ocpp/common/schemas.cpp ocpp/common/types.cpp diff --git a/lib/ocpp/common/incremental_counter.cpp b/lib/ocpp/common/incremental_counter.cpp new file mode 100644 index 000000000..668c47d76 --- /dev/null +++ b/lib/ocpp/common/incremental_counter.cpp @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Pionix GmbH and Contributors to EVerest + +#include + +namespace ocpp { + +std::atomic IncrementalCounter::counter{0}; + +int IncrementalCounter::get() { + return ++counter; +} + +} // namespace ocpp \ No newline at end of file diff --git a/lib/ocpp/v201/charge_point.cpp b/lib/ocpp/v201/charge_point.cpp index 8d9697aa2..0cfa172f5 100644 --- a/lib/ocpp/v201/charge_point.cpp +++ b/lib/ocpp/v201/charge_point.cpp @@ -368,8 +368,14 @@ void ChargePoint::initialize(const std::map& evse_connector_st this->registration_status != RegistrationStatusEnum::Accepted) { return false; } else { - this->availability->status_notification_req(evse_id, connector_id, status, + if (this->ocpp_version == OcppProtocolVersion::v201) { + // OCPP2.0.1: B01.FR.05 + this->availability->status_notification_req(evse_id, connector_id, status, initiated_by_trigger_message); + } else { + // OCPP2.1: B01.FR.05 + this->diagnostics->notify_event_req_connector_status_update(evse_id, connector_id, status); + } return true; } }); diff --git a/lib/ocpp/v201/functional_blocks/diagnostics.cpp b/lib/ocpp/v201/functional_blocks/diagnostics.cpp index d8ef0c395..e612c0185 100644 --- a/lib/ocpp/v201/functional_blocks/diagnostics.cpp +++ b/lib/ocpp/v201/functional_blocks/diagnostics.cpp @@ -4,6 +4,8 @@ #include #include +#include + #include #include #include @@ -81,6 +83,21 @@ void Diagnostics::notify_event_req(const std::vector& events) { this->message_dispatcher.dispatch_call(call); } +void Diagnostics::notify_event_req_connector_status_update(const int32_t evse_id, const int32_t connector_id, + const ConnectorStatusEnum status) { + ocpp::v201::EventData event_data; + const auto cv = ConnectorComponentVariables::get_component_variable(evse_id, connector_id, + ConnectorComponentVariables::AvailabilityState); + event_data.eventId = ocpp::IncrementalCounter::get(); + event_data.actualValue = conversions::connector_status_enum_to_string(status); + event_data.trigger = EventTriggerEnum::Delta; + event_data.variable = cv.variable.value(); + event_data.component = cv.component; + event_data.timestamp = ocpp::DateTime(); + event_data.eventNotificationType = EventNotificationEnum::HardWiredNotification; + this->notify_event_req({event_data}); +} + void Diagnostics::stop_monitoring() { monitoring_updater.stop_monitoring(); }