ocpp 0.24.1
A C++ implementation of the Open Charge Point Protocol
smart_charging.hpp
1// SPDX-License-Identifier: Apache-2.0
2// Copyright Pionix GmbH and Contributors to EVerest
3
4#pragma once
5
6#include <ocpp/v2/message_handler.hpp>
7
8#include <ocpp/v2/evse.hpp>
9
10namespace ocpp::v2 {
11struct FunctionalBlockContext;
12class SmartChargingHandlerInterface;
13
14struct GetChargingProfilesRequest;
15struct SetChargingProfileRequest;
16struct SetChargingProfileResponse;
17struct GetCompositeScheduleResponse;
18struct GetCompositeScheduleRequest;
19struct ClearChargingProfileResponse;
20struct ClearChargingProfileRequest;
21struct ReportChargingProfilesRequest;
22
23enum class ProfileValidationResultEnum {
24 Valid,
25 EvseDoesNotExist,
26 ExistingChargingStationExternalConstraints,
27 InvalidProfileType,
28 TxProfileMissingTransactionId,
29 TxProfileEvseIdNotGreaterThanZero,
30 TxProfileTransactionNotOnEvse,
31 TxProfileEvseHasNoActiveTransaction,
32 TxProfileConflictingStackLevel,
33 ChargingProfileNoChargingSchedulePeriods,
34 ChargingProfileFirstStartScheduleIsNotZero,
35 ChargingProfileMissingRequiredStartSchedule,
36 ChargingProfileExtraneousStartSchedule,
37 ChargingScheduleChargingRateUnitUnsupported,
38 ChargingSchedulePeriodsOutOfOrder,
39 ChargingSchedulePeriodInvalidPhaseToUse,
40 ChargingSchedulePeriodUnsupportedNumberPhases,
41 ChargingSchedulePeriodExtraneousPhaseValues,
42 ChargingSchedulePeriodPhaseToUseACPhaseSwitchingUnsupported,
43 ChargingStationMaxProfileCannotBeRelative,
44 ChargingStationMaxProfileEvseIdGreaterThanZero,
45 DuplicateTxDefaultProfileFound,
46 DuplicateProfileValidityPeriod,
47 RequestStartTransactionNonTxProfile,
48 ChargingProfileEmptyChargingSchedules
49};
50
53enum class AddChargingProfileSource {
54 SetChargingProfile,
55 RequestStartTransactionRequest
56};
57
58namespace conversions {
61std::string profile_validation_result_to_string(ProfileValidationResultEnum e);
62
65std::string profile_validation_result_to_reason_code(ProfileValidationResultEnum e);
66} // namespace conversions
67
68std::ostream& operator<<(std::ostream& os, const ProfileValidationResultEnum validation_result);
69
71public:
72 virtual ~SmartChargingInterface() = default;
73
80 virtual std::vector<CompositeSchedule> get_all_composite_schedules(const int32_t duration,
81 const ChargingRateUnitEnum& unit) = 0;
82
86 virtual void delete_transaction_tx_profiles(const std::string& transaction_id) = 0;
87
93 ChargingProfile& profile, int32_t evse_id,
94 ChargingLimitSourceEnum charging_limit_source = ChargingLimitSourceEnum::CSO,
95 AddChargingProfileSource source_of_request = AddChargingProfileSource::SetChargingProfile) = 0;
96
102 virtual ProfileValidationResultEnum conform_and_validate_profile(
103 ChargingProfile& profile, int32_t evse_id,
104 AddChargingProfileSource source_of_request = AddChargingProfileSource::SetChargingProfile) = 0;
105
111
118 virtual std::optional<CompositeSchedule> get_composite_schedule(int32_t evse_id, std::chrono::seconds duration,
119 ChargingRateUnitEnum unit) = 0;
120};
121
123private: // Members
124 const FunctionalBlockContext& context;
125 std::function<void()> set_charging_profiles_callback;
126
127public:
128 SmartCharging(const FunctionalBlockContext& functional_block_context,
129 std::function<void()> set_charging_profiles_callback);
130 void handle_message(const ocpp::EnhancedMessage<MessageType>& message) override;
132 std::optional<CompositeSchedule> get_composite_schedule(int32_t evse_id, std::chrono::seconds duration,
133 ChargingRateUnitEnum unit) override;
134 std::vector<CompositeSchedule> get_all_composite_schedules(const int32_t duration,
135 const ChargingRateUnitEnum& unit) override;
136
137 void delete_transaction_tx_profiles(const std::string& transaction_id) override;
138
140 ChargingProfile& profile, int32_t evse_id,
141 ChargingLimitSourceEnum charging_limit_source = ChargingLimitSourceEnum::CSO,
142 AddChargingProfileSource source_of_request = AddChargingProfileSource::SetChargingProfile) override;
143 ProfileValidationResultEnum conform_and_validate_profile(
144 ChargingProfile& profile, int32_t evse_id,
145 AddChargingProfileSource source_of_request = AddChargingProfileSource::SetChargingProfile) override;
146
147protected:
152 const int32_t evse_id, ChargingRateUnitEnum charging_rate_unit,
153 bool is_offline, bool simulate_transaction_active);
154
158 ProfileValidationResultEnum validate_evse_exists(int32_t evse_id) const;
159
164 ProfileValidationResultEnum validate_charging_station_max_profile(const ChargingProfile& profile,
165 int32_t evse_id) const;
166
170 ProfileValidationResultEnum validate_tx_default_profile(const ChargingProfile& profile, int32_t evse_id) const;
171
175 ProfileValidationResultEnum validate_tx_profile(
176 const ChargingProfile& profile, int32_t evse_id,
177 AddChargingProfileSource source_of_request = AddChargingProfileSource::SetChargingProfile) const;
178
182 ProfileValidationResultEnum validate_profile_schedules(ChargingProfile& profile,
183 std::optional<EvseInterface*> evse_opt = std::nullopt) const;
184
189 ProfileValidationResultEnum verify_no_conflicting_external_constraints_id(const ChargingProfile& profile) const;
190
195 add_profile(ChargingProfile& profile, int32_t evse_id,
196 ChargingLimitSourceEnum charging_limit_source = ChargingLimitSourceEnum::CSO);
197
202
206 std::vector<ReportedChargingProfile> get_reported_profiles(const GetChargingProfilesRequest& request) const;
207
212 std::vector<ChargingProfile>
213 get_valid_profiles(int32_t evse_id, const std::vector<ChargingProfilePurposeEnum>& purposes_to_ignore = {});
214
215private: // Functions
216 /* OCPP message requests */
217 void report_charging_profile_req(const int32_t request_id, const int32_t evse_id,
218 const ChargingLimitSourceEnum source, const std::vector<ChargingProfile>& profiles,
219 const bool tbc);
220 void report_charging_profile_req(const ReportChargingProfilesRequest& req);
221
222 /* OCPP message handlers */
223 void handle_set_charging_profile_req(Call<SetChargingProfileRequest> call);
224 void handle_clear_charging_profile_req(Call<ClearChargingProfileRequest> call);
225 void handle_get_charging_profiles_req(Call<GetChargingProfilesRequest> call);
226 void handle_get_composite_schedule_req(Call<GetCompositeScheduleRequest> call);
227
228 GetCompositeScheduleResponse get_composite_schedule_internal(const GetCompositeScheduleRequest& request,
229 bool simulate_transaction_active = true);
230
233 ProfileValidationResultEnum validate_request_start_transaction_profile(const ChargingProfile& profile) const;
234
239 bool is_overlapping_validity_period(const ChargingProfile& candidate_profile, int32_t candidate_evse_id) const;
240
241 std::vector<ChargingProfile> get_evse_specific_tx_default_profiles() const;
242 std::vector<ChargingProfile> get_station_wide_tx_default_profiles() const;
243 std::vector<ChargingProfile>
244 get_valid_profiles_for_evse(int32_t evse_id,
245 const std::vector<ChargingProfilePurposeEnum>& purposes_to_ignore = {});
248 void conform_schedule_number_phases(int32_t profile_id, ChargingSchedulePeriod& charging_schedule_period) const;
254 void conform_validity_periods(ChargingProfile& profile) const;
255 CurrentPhaseType get_current_phase_type(const std::optional<EvseInterface*> evse_opt) const;
256};
257} // namespace ocpp::v2
Contains a DateTime implementation that can parse and create RFC 3339 compatible strings.
Definition: types.hpp:109
Interface for handling OCPP2.0.1 CALL messages from the CSMS. Classes implementing a functional block...
Definition: message_handler.hpp:13
Definition: smart_charging.hpp:70
virtual void delete_transaction_tx_profiles(const std::string &transaction_id)=0
for the given transaction_id removes the associated charging profile.
virtual GetCompositeScheduleResponse get_composite_schedule(const GetCompositeScheduleRequest &request)=0
Gets a composite schedule based on the given request.
virtual SetChargingProfileResponse conform_validate_and_add_profile(ChargingProfile &profile, int32_t evse_id, ChargingLimitSourceEnum charging_limit_source=ChargingLimitSourceEnum::CSO, AddChargingProfileSource source_of_request=AddChargingProfileSource::SetChargingProfile)=0
validates the given profile according to the specification, adding it to our stored list of profiles ...
virtual std::optional< CompositeSchedule > get_composite_schedule(int32_t evse_id, std::chrono::seconds duration, ChargingRateUnitEnum unit)=0
Gets a composite schedule based on the given parameters.
virtual std::vector< CompositeSchedule > get_all_composite_schedules(const int32_t duration, const ChargingRateUnitEnum &unit)=0
Gets composite schedules for all evse_ids (including 0) for the given duration and unit ....
virtual ProfileValidationResultEnum conform_and_validate_profile(ChargingProfile &profile, int32_t evse_id, AddChargingProfileSource source_of_request=AddChargingProfileSource::SetChargingProfile)=0
validates the given profile according to the specification. If a profile does not have validFrom or v...
Definition: smart_charging.hpp:122
std::vector< ChargingProfile > get_valid_profiles(int32_t evse_id, const std::vector< ChargingProfilePurposeEnum > &purposes_to_ignore={})
Retrieves all profiles that should be considered for calculating the composite schedule....
Definition: smart_charging.cpp:653
void handle_message(const ocpp::EnhancedMessage< MessageType > &message) override
Handles the given message from the CSMS. This includes dispatching a CALLRESULT as a response to the ...
Definition: smart_charging.cpp:136
ProfileValidationResultEnum verify_no_conflicting_external_constraints_id(const ChargingProfile &profile) const
Checks a given profile does not have an id that conflicts with an existing profile of type ChargingSt...
Definition: smart_charging.cpp:601
SetChargingProfileResponse conform_validate_and_add_profile(ChargingProfile &profile, int32_t evse_id, ChargingLimitSourceEnum charging_limit_source=ChargingLimitSourceEnum::CSO, AddChargingProfileSource source_of_request=AddChargingProfileSource::SetChargingProfile) override
validates the given profile according to the specification, adding it to our stored list of profiles ...
Definition: smart_charging.cpp:201
ProfileValidationResultEnum validate_profile_schedules(ChargingProfile &profile, std::optional< EvseInterface * > evse_opt=std::nullopt) const
validates that the given profile has valid charging schedules. If a profiles charging schedule period...
Definition: smart_charging.cpp:515
std::vector< ReportedChargingProfile > get_reported_profiles(const GetChargingProfilesRequest &request) const
Gets the charging profiles for the given request.
Definition: smart_charging.cpp:647
CompositeSchedule calculate_composite_schedule(const ocpp::DateTime &start_time, const ocpp::DateTime &end_time, const int32_t evse_id, ChargingRateUnitEnum charging_rate_unit, bool is_offline, bool simulate_transaction_active)
Calculates the composite schedule for the given valid_profiles and the given connector_id.
Definition: smart_charging.cpp:344
ProfileValidationResultEnum conform_and_validate_profile(ChargingProfile &profile, int32_t evse_id, AddChargingProfileSource source_of_request=AddChargingProfileSource::SetChargingProfile) override
validates the given profile according to the specification. If a profile does not have validFrom or v...
Definition: smart_charging.cpp:219
ProfileValidationResultEnum validate_evse_exists(int32_t evse_id) const
validates the existence of the given evse_id according to the specification
Definition: smart_charging.cpp:413
GetCompositeScheduleResponse get_composite_schedule(const GetCompositeScheduleRequest &request) override
Gets a composite schedule based on the given request.
Definition: smart_charging.cpp:152
ProfileValidationResultEnum validate_charging_station_max_profile(const ChargingProfile &profile, int32_t evse_id) const
validates requirements that apply only to the ChargingStationMaxProfile profile according to the spec...
Definition: smart_charging.cpp:418
void delete_transaction_tx_profiles(const std::string &transaction_id) override
for the given transaction_id removes the associated charging profile.
Definition: smart_charging.cpp:196
ClearChargingProfileResponse clear_profiles(const ClearChargingProfileRequest &request)
Clears profiles from the system using the given request.
Definition: smart_charging.cpp:634
std::vector< CompositeSchedule > get_all_composite_schedules(const int32_t duration, const ChargingRateUnitEnum &unit) override
Gets composite schedules for all evse_ids (including 0) for the given duration and unit ....
Definition: smart_charging.cpp:172
ProfileValidationResultEnum validate_tx_default_profile(const ChargingProfile &profile, int32_t evse_id) const
validates the given profile and associated evse_id according to the specification
Definition: smart_charging.cpp:439
ProfileValidationResultEnum validate_tx_profile(const ChargingProfile &profile, int32_t evse_id, AddChargingProfileSource source_of_request=AddChargingProfileSource::SetChargingProfile) const
validates the given profile according to the specification
Definition: smart_charging.cpp:458
SetChargingProfileResponse add_profile(ChargingProfile &profile, int32_t evse_id, ChargingLimitSourceEnum charging_limit_source=ChargingLimitSourceEnum::CSO)
Adds a given profile and associated evse_id to our stored list of profiles.
Definition: smart_charging.cpp:615
Contains a OCPP Call message.
Definition: call_types.hpp:60
Contains a OCPP message in json form with additional information.
Definition: message_queue.hpp:54
Definition: ocpp_types.hpp:755
Definition: ocpp_types.hpp:236
Contains a OCPP ClearChargingProfile message.
Definition: ClearChargingProfile.hpp:19
Contains a OCPP ClearChargingProfileResponse message.
Definition: ClearChargingProfile.hpp:40
Definition: ocpp_types.hpp:253
Context / requirements for the functional blocks.
Definition: functional_block_context.hpp:23
Contains a OCPP GetChargingProfiles message.
Definition: GetChargingProfiles.hpp:19
Contains a OCPP GetCompositeSchedule message.
Definition: GetCompositeSchedule.hpp:19
Contains a OCPP GetCompositeScheduleResponse message.
Definition: GetCompositeSchedule.hpp:41
Contains a OCPP ReportChargingProfiles message.
Definition: ReportChargingProfiles.hpp:19
Contains a OCPP SetChargingProfileResponse message.
Definition: SetChargingProfile.hpp:40