ocpp 0.24.1
A C++ implementation of the Open Charge Point Protocol
evse.hpp
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2020 - 2023 Pionix GmbH and Contributors to EVerest
3
4#pragma once
5
6#include <functional>
7#include <map>
8#include <memory>
9
10#include <ocpp/v2/average_meter_values.hpp>
11#include <ocpp/v2/component_state_manager.hpp>
12#include <ocpp/v2/connector.hpp>
13#include <ocpp/v2/database_handler.hpp>
14#include <ocpp/v2/device_model.hpp>
15#include <ocpp/v2/ocpp_types.hpp>
16#include <ocpp/v2/transaction.hpp>
17
18namespace ocpp {
19namespace v2 {
20
21enum class CurrentPhaseType {
22 AC,
23 DC,
24 Unknown,
25};
26
28public:
29 virtual ~EvseInterface();
30
33 virtual int32_t get_id() const = 0;
34
37 virtual uint32_t get_number_of_connectors() const = 0;
38
44 virtual bool does_connector_exist(ConnectorEnum connector_type) const = 0;
45
57 virtual std::optional<ConnectorStatusEnum> get_connector_status(std::optional<ConnectorEnum> connector_type) = 0;
58
69 virtual void open_transaction(const std::string& transaction_id, const int32_t connector_id,
70 const DateTime& timestamp, const MeterValue& meter_start,
71 const std::optional<IdToken>& id_token, const std::optional<IdToken>& group_id_token,
72 const std::optional<int32_t> reservation_id,
73 const ChargingStateEnum charging_state) = 0;
74
79 virtual void close_transaction(const DateTime& timestamp, const MeterValue& meter_stop,
80 const ReasonEnum& reason) = 0;
81
85
88 virtual bool has_active_transaction() const = 0;
89
93 virtual bool has_active_transaction(const int32_t connector_id) const = 0;
94
96 virtual void release_transaction() = 0;
97
100 virtual std::unique_ptr<EnhancedTransaction>& get_transaction() = 0;
101
106 virtual void submit_event(const int32_t connector_id, ConnectorEvent event) = 0;
107
110 virtual void on_meter_value(const MeterValue& meter_value) = 0;
111
115
119
121 virtual void clear_idle_meter_values() = 0;
122
124 virtual Connector* get_connector(int32_t connector_id) const = 0;
125
127 virtual OperationalStatusEnum get_effective_operational_status() = 0;
128
132 virtual void set_evse_operative_status(OperationalStatusEnum new_status, bool persist) = 0;
133
138 virtual void set_connector_operative_status(int32_t connector_id, OperationalStatusEnum new_status,
139 bool persist) = 0;
140
143 virtual void restore_connector_operative_status(int32_t connector_id) = 0;
144
148 virtual OperationalStatusEnum get_connector_effective_operational_status(const int32_t connector_id) = 0;
149
151 virtual CurrentPhaseType get_current_phase_type() = 0;
152
162 std::optional<double> trigger_metervalue_on_power_kw, std::optional<double> trigger_metervalue_on_energy_kwh,
163 std::optional<DateTime> trigger_metervalue_at_time,
164 std::function<void(const std::vector<MeterValue>& meter_values)> send_metervalue_function,
165 boost::asio::io_service& io_service) = 0;
166};
167
170class Evse : public EvseInterface {
171
172private:
173 int32_t evse_id;
174 DeviceModel& device_model;
175 std::map<int32_t, std::unique_ptr<Connector>> id_connector_map;
176 std::function<void(const MeterValue& meter_value, EnhancedTransaction& transaction)> transaction_meter_value_req;
177 std::function<void(int32_t evse_id)> pause_charging_callback;
178 std::unique_ptr<EnhancedTransaction> transaction; // pointer to active transaction (can be nullptr)
179 MeterValue meter_value; // represents current meter value
180 std::recursive_mutex meter_value_mutex;
181 Everest::SteadyTimer sampled_meter_values_timer;
182 std::shared_ptr<DatabaseHandler> database_handler;
183
184 std::optional<double> trigger_metervalue_on_power_kw;
185 std::optional<double> trigger_metervalue_on_energy_kwh;
186 std::unique_ptr<Everest::SystemTimer> trigger_metervalue_at_time_timer;
187 std::optional<double> last_triggered_metervalue_power_kw;
188 std::function<void(const std::vector<MeterValue>& meter_values)> send_metervalue_function;
189 boost::asio::io_service io_service;
190
192 std::optional<float> get_active_import_register_meter_value();
193
195 void check_max_energy_on_invalid_id();
196
199 void start_metering_timers(const DateTime& timestamp);
200
205 void send_meter_value_on_pricing_trigger(const MeterValue& meter_value);
206
212 void reset_pricing_triggers(void);
213
214 AverageMeterValues aligned_data_updated;
215 AverageMeterValues aligned_data_tx_end;
216
218 void try_resume_transaction();
219
221 void delete_database_transaction();
222
224 std::shared_ptr<ComponentStateManagerInterface> component_state_manager;
225
231 std::optional<ConnectorEnum> get_evse_connector_type(const uint32_t connector_id) const;
232
233public:
243 Evse(const int32_t evse_id, const int32_t number_of_connectors, DeviceModel& device_model,
244 std::shared_ptr<DatabaseHandler> database_handler,
245 std::shared_ptr<ComponentStateManagerInterface> component_state_manager,
246 const std::function<void(const MeterValue& meter_value, EnhancedTransaction& transaction)>&
247 transaction_meter_value_req,
248 const std::function<void(int32_t evse_id)>& pause_charging_callback);
249
250 virtual ~Evse();
251
252 int32_t get_id() const;
253
254 uint32_t get_number_of_connectors() const;
255 bool does_connector_exist(const ConnectorEnum connector_type) const override;
256 std::optional<ConnectorStatusEnum> get_connector_status(std::optional<ConnectorEnum> connector_type) override;
257
258 void open_transaction(const std::string& transaction_id, const int32_t connector_id, const DateTime& timestamp,
259 const MeterValue& meter_start, const std::optional<IdToken>& id_token,
260 const std::optional<IdToken>& group_id_token, const std::optional<int32_t> reservation_id,
261 const ChargingStateEnum charging_state);
262 void close_transaction(const DateTime& timestamp, const MeterValue& meter_stop, const ReasonEnum& reason);
263
267
268 bool has_active_transaction() const;
269 bool has_active_transaction(const int32_t connector_id) const;
270 void release_transaction();
271 std::unique_ptr<EnhancedTransaction>& get_transaction();
272
273 void submit_event(const int32_t connector_id, ConnectorEvent event);
274
275 void on_meter_value(const MeterValue& meter_value);
277
280
281 Connector* get_connector(int32_t connector_id) const;
282
283 OperationalStatusEnum get_effective_operational_status();
284 void set_evse_operative_status(OperationalStatusEnum new_status, bool persist);
285 void set_connector_operative_status(int32_t connector_id, OperationalStatusEnum new_status, bool persist);
286 void restore_connector_operative_status(int32_t connector_id);
287 OperationalStatusEnum get_connector_effective_operational_status(const int32_t connector_id) override;
288
289 CurrentPhaseType get_current_phase_type();
290
300 std::optional<double> trigger_metervalue_on_power_kw, std::optional<double> trigger_metervalue_on_energy_kwh,
301 std::optional<DateTime> trigger_metervalue_at_time,
302 std::function<void(const std::vector<MeterValue>& meter_values)> send_metervalue_function,
303 boost::asio::io_service& io_service);
304};
305
306} // namespace v2
307} // namespace ocpp
Contains a DateTime implementation that can parse and create RFC 3339 compatible strings.
Definition: types.hpp:109
Definition: average_meter_values.hpp:16
Represents a Connector, thus electrical outlet on a Charging Station. Single physical Connector.
Definition: connector.hpp:36
This class manages access to the device model representation and to the device model interface and pr...
Definition: device_model.hpp:96
Definition: evse.hpp:27
virtual void on_meter_value(const MeterValue &meter_value)=0
Event handler that should be called when a new meter_value for this evse is present.
virtual uint32_t get_number_of_connectors() const =0
Returns the number of connectors of this EVSE.
virtual void set_evse_operative_status(OperationalStatusEnum new_status, bool persist)=0
Switches the operative status of the EVSE.
virtual OperationalStatusEnum get_effective_operational_status()=0
Gets the effective Operative/Inoperative status of this EVSE.
virtual MeterValue get_meter_value()=0
Returns the last present meter value for this evse.
virtual 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, const std::optional< IdToken > &group_id_token, const std::optional< int32_t > reservation_id, const ChargingStateEnum charging_state)=0
Opens a new transaction.
virtual std::optional< ConnectorStatusEnum > get_connector_status(std::optional< ConnectorEnum > connector_type)=0
Get connector status.
virtual bool has_active_transaction(const int32_t connector_id) const =0
Indicates if a transaction is active at this evse at the given connector_id.
virtual CurrentPhaseType get_current_phase_type()=0
Returns the phase type for the EVSE based on its SupplyPhases. It can be AC, DC, or Unknown.
virtual Connector * get_connector(int32_t connector_id) const =0
Returns a pointer to the connector with ID.
virtual void submit_event(const int32_t connector_id, ConnectorEvent event)=0
Submits the given event to the state machine controller of the connector with the given connector_id.
virtual std::unique_ptr< EnhancedTransaction > & get_transaction()=0
Returns a pointer to the EnhancedTransaction of this evse.
virtual void restore_connector_operative_status(int32_t connector_id)=0
Restores the operative status of a connector within this EVSE to the persisted status and recomputes ...
virtual void set_connector_operative_status(int32_t connector_id, OperationalStatusEnum new_status, bool persist)=0
Switches the operative status of a connector within this EVSE.
virtual bool does_connector_exist(ConnectorEnum connector_type) const =0
Check if the given connector type exists on this evse.
virtual void set_meter_value_pricing_triggers(std::optional< double > trigger_metervalue_on_power_kw, std::optional< double > trigger_metervalue_on_energy_kwh, std::optional< DateTime > trigger_metervalue_at_time, std::function< void(const std::vector< MeterValue > &meter_values)> send_metervalue_function, boost::asio::io_service &io_service)=0
Set metervalue triggers for California Pricing.
virtual void start_checking_max_energy_on_invalid_id()=0
Start checking if the max energy on invalid id has exceeded. Will call pause_charging_callback when t...
virtual void clear_idle_meter_values()=0
Clear the idle meter values for this evse.
virtual MeterValue get_idle_meter_value()=0
Return the idle meter values for this evse.
virtual OperationalStatusEnum get_connector_effective_operational_status(const int32_t connector_id)=0
Get the operational status of a connector within this evse.
virtual int32_t get_id() const =0
Return the evse_id of this EVSE.
virtual bool has_active_transaction() const =0
Indicates if a transaction is active at this evse.
virtual void release_transaction()=0
Releases the reference of the transaction on this evse.
virtual void close_transaction(const DateTime &timestamp, const MeterValue &meter_stop, const ReasonEnum &reason)=0
Closes the transaction on this evse by adding the given timestamp meter_stop and reason .
Represents an EVSE. An EVSE can contain multiple Connector objects, but can only supply energy to one...
Definition: evse.hpp:170
uint32_t get_number_of_connectors() const
Returns the number of connectors of this EVSE.
Definition: evse.cpp:85
MeterValue get_idle_meter_value()
Return the idle meter values for this evse.
Definition: evse.cpp:363
CurrentPhaseType get_current_phase_type()
Returns the phase type for the EVSE based on its SupplyPhases. It can be AC, DC, or Unknown.
Definition: evse.cpp:684
Evse(const int32_t evse_id, const int32_t number_of_connectors, DeviceModel &device_model, std::shared_ptr< DatabaseHandler > database_handler, std::shared_ptr< ComponentStateManagerInterface > component_state_manager, const std::function< void(const MeterValue &meter_value, EnhancedTransaction &transaction)> &transaction_meter_value_req, const std::function< void(int32_t evse_id)> &pause_charging_callback)
Construct a new Evse object.
Definition: evse.cpp:48
bool does_connector_exist(const ConnectorEnum connector_type) const override
Check if the given connector type exists on this evse.
Definition: evse.cpp:89
void set_evse_operative_status(OperationalStatusEnum new_status, bool persist)
Switches the operative status of the EVSE.
Definition: evse.cpp:655
void start_checking_max_energy_on_invalid_id()
Start checking if the max energy on invalid id has exceeded. Will call pause_charging_callback when t...
Definition: evse.cpp:303
void set_connector_operative_status(int32_t connector_id, OperationalStatusEnum new_status, bool persist)
Switches the operative status of a connector within this EVSE.
Definition: evse.cpp:659
Connector * get_connector(int32_t connector_id) const
Returns a pointer to the connector with ID.
Definition: evse.cpp:675
MeterValue get_meter_value()
Returns the last present meter value for this evse.
Definition: evse.cpp:358
std::unique_ptr< EnhancedTransaction > & get_transaction()
Returns a pointer to the EnhancedTransaction of this evse.
Definition: evse.cpp:341
void restore_connector_operative_status(int32_t connector_id)
Restores the operative status of a connector within this EVSE to the persisted status and recomputes ...
Definition: evse.cpp:663
void set_meter_value_pricing_triggers(std::optional< double > trigger_metervalue_on_power_kw, std::optional< double > trigger_metervalue_on_energy_kwh, std::optional< DateTime > trigger_metervalue_at_time, std::function< void(const std::vector< MeterValue > &meter_values)> send_metervalue_function, boost::asio::io_service &io_service)
Set pricing triggers to send the meter value.
Definition: evse.cpp:512
std::optional< ConnectorStatusEnum > get_connector_status(std::optional< ConnectorEnum > connector_type) override
Get connector status.
Definition: evse.cpp:122
void submit_event(const int32_t connector_id, ConnectorEvent event)
Submits the given event to the state machine controller of the connector with the given connector_id.
Definition: evse.cpp:345
void release_transaction()
Releases the reference of the transaction on this evse.
Definition: evse.cpp:329
void close_transaction(const DateTime &timestamp, const MeterValue &meter_stop, const ReasonEnum &reason)
Closes the transaction on this evse by adding the given timestamp meter_stop and reason .
Definition: evse.cpp:276
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, const std::optional< IdToken > &group_id_token, const std::optional< int32_t > reservation_id, const ChargingStateEnum charging_state)
Opens a new transaction.
Definition: evse.cpp:232
void on_meter_value(const MeterValue &meter_value)
Event handler that should be called when a new meter_value for this evse is present.
Definition: evse.cpp:349
OperationalStatusEnum get_connector_effective_operational_status(const int32_t connector_id) override
Get the operational status of a connector within this evse.
Definition: evse.cpp:667
bool has_active_transaction() const
Indicates if a transaction is active at this evse.
Definition: evse.cpp:312
OperationalStatusEnum get_effective_operational_status()
Gets the effective Operative/Inoperative status of this EVSE.
Definition: evse.cpp:671
void clear_idle_meter_values()
Clear the idle meter values for this evse.
Definition: evse.cpp:367
int32_t get_id() const
Return the evse_id of this EVSE.
Definition: evse.cpp:81
Struct that enhances the OCPP Transaction by some meta data and functionality.
Definition: transaction.hpp:16
Definition: ocpp_types.hpp:436