Skip to content

Commit f806637

Browse files
authored
Merge pull request #10 from c-jimenez/release/v0.2.0
Release/v0.2.0
2 parents 737daf9 + 3a0f4c5 commit f806637

22 files changed

+206
-81
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ The standard OCPP configuration persistency has to be handled by the user applic
5656
| Firmware Management | Support for firmware update management and diagnostic log file download | Actual file download/upload as well as firmware installation must be handled by the user application in the callbacks provided by **Open OCPP** |
5757
| Local Auth List Management | Features to manage the local authorization list in Charge Points | None |
5858
| Reservation | Support for reservation of a Charge Point. | None |
59-
| Smart Charging | Support for basic Smart Charging, for instance using control pilot | GetCompositeSchedule and number of phases parameter in charging profile are not supported for now |
59+
| Smart Charging | Support for basic Smart Charging, for instance using control pilot | GetCompositeSchedule is not supported for now |
6060
| Remote Trigger | Support for remote triggering of Charge Point initiated messages | None |
6161

6262
### Supported OCPP configuration keys
@@ -98,7 +98,7 @@ In the "Owner" column, "S" means that the configuration key behavior is handled
9898
| TransactionMessageAttempts | S | None |
9999
| TransactionMessageRetryInterval | S | None |
100100
| UnlockConnectorOnEVSideDisconnect | U | None |
101-
| WebSocketPingInterval | S | Not implemented yet, websocket ping interval is set to 3s |
101+
| WebSocketPingInterval | S | Reboot required |
102102
| LocalAuthListEnabled | S | None |
103103
| LocalAuthListMaxLength | S | None |
104104
| SendLocalListMaxLength | S | None |

examples/remote_chargepoint/SetpointManager.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ void SetpointManager::update()
6565
{
6666
Optional<float> charge_point_setpoint;
6767
Optional<float> connector_setpoint;
68+
unsigned int charge_point_number_phases = 0u;
69+
unsigned int connector_number_phases = 0u;
6870

6971
std::lock_guard<std::mutex> lock(m_mutex);
7072

@@ -91,7 +93,7 @@ void SetpointManager::update()
9193
}
9294

9395
// Get the smart charging setpoint
94-
if (m_charge_point.getSetpoint(id, charge_point_setpoint, connector_setpoint))
96+
if (m_charge_point.getSetpoint(id, charge_point_setpoint, charge_point_number_phases, connector_setpoint, connector_number_phases))
9597
{
9698
// Apply setpoints
9799
if (charge_point_setpoint.isSet())

src/chargepoint/ChargePoint.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,8 @@ bool ChargePoint::start()
238238
m_connectors,
239239
*m_msg_sender,
240240
*m_status_manager,
241-
*m_trigger_manager);
241+
*m_trigger_manager,
242+
*m_config_manager);
242243
m_smart_charging_manager = std::make_unique<SmartChargingManager>(
243244
m_stack_config, m_ocpp_config, m_database, m_timer_pool, m_worker_pool, m_connectors, m_messages_converter, *m_msg_dispatcher);
244245
m_transaction_manager = std::make_unique<TransactionManager>(m_ocpp_config,
@@ -525,16 +526,21 @@ bool ChargePoint::sendMeterValues(unsigned int connector_id, const std::vector<o
525526

526527
/** @copydoc bool IChargePoint::getSetpoint(unsigned int,
527528
ocpp::types::Optional<float>&,
528-
ocpp::types::Optional<float>&) */
529+
unsigned int&,
530+
ocpp::types::Optional<float>&,
531+
unsigned int&) */
529532
bool ChargePoint::getSetpoint(unsigned int connector_id,
530533
ocpp::types::Optional<float>& charge_point_setpoint,
531-
ocpp::types::Optional<float>& connector_setpoint)
534+
unsigned int& charge_point_number_phases,
535+
ocpp::types::Optional<float>& connector_setpoint,
536+
unsigned int& connector_number_phases)
532537
{
533538
bool ret = false;
534539

535540
if (m_smart_charging_manager.get())
536541
{
537-
ret = m_smart_charging_manager->getSetpoint(connector_id, charge_point_setpoint, connector_setpoint);
542+
ret = m_smart_charging_manager->getSetpoint(
543+
connector_id, charge_point_setpoint, charge_point_number_phases, connector_setpoint, connector_number_phases);
538544
}
539545
else
540546
{
@@ -805,8 +811,11 @@ bool ChargePoint::doConnect()
805811
credentials.skip_server_name_check = m_stack_config.tlsSkipServerNameCheck();
806812

807813
// Start connection process
808-
return m_rpc_client->start(
809-
connection_url, credentials, m_stack_config.connectionTimeout().count(), m_stack_config.retryInterval().count());
814+
return m_rpc_client->start(connection_url,
815+
credentials,
816+
m_stack_config.connectionTimeout(),
817+
m_stack_config.retryInterval(),
818+
m_ocpp_config.webSocketPingInterval());
810819
}
811820

812821
/** @brief Specific configuration check for parameter : AuthorizationKey */

src/chargepoint/ChargePoint.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,14 @@ class ChargePoint : public IChargePoint,
136136

137137
/** @copydoc bool IChargePoint::getSetpoint(unsigned int,
138138
ocpp::types::Optional<float>&,
139-
ocpp::types::Optional<float>&) */
139+
unsigned int&,
140+
ocpp::types::Optional<float>&,
141+
unsigned int&) */
140142
bool getSetpoint(unsigned int connector_id,
141143
ocpp::types::Optional<float>& charge_point_setpoint,
142-
ocpp::types::Optional<float>& connector_setpoint) override;
144+
unsigned int& charge_point_number_phases,
145+
ocpp::types::Optional<float>& connector_setpoint,
146+
unsigned int& connector_number_phases) override;
143147

144148
/** @copydoc bool IChargePoint::notifyFirmwareUpdateStatus(bool) */
145149
bool notifyFirmwareUpdateStatus(bool success) override;

src/chargepoint/interface/IChargePoint.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,12 +165,16 @@ class IChargePoint
165165
* @brief Get the smart charging setpoints for a connector and the whole charge point
166166
* @param connector_id Id of the connector
167167
* @param charge_point_setpoint Setpoint of the whole charge point in A (not set if no active profile)
168+
* @param charge_point_number_phases Number of phases allowed to charge for the whole charge point
168169
* @param connector_setpoint Setpoint of the given connector in A (not set if no active profile)
170+
* @param connector_number_phases Number of phases allowed to charge for the given connector
169171
* @return true if the setpoints have been computed, false otherwise
170172
*/
171173
virtual bool getSetpoint(unsigned int connector_id,
172174
ocpp::types::Optional<float>& charge_point_setpoint,
173-
ocpp::types::Optional<float>& connector_setpoint) = 0;
175+
unsigned int& charge_point_number_phases,
176+
ocpp::types::Optional<float>& connector_setpoint,
177+
unsigned int& connector_number_phases) = 0;
174178

175179
/**
176180
* @brief Notify the end of a firmware update operation

src/chargepoint/metervalues/MeterValuesManager.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ MeterValuesManager::MeterValuesManager(ocpp::config::IOcppConfig& ocp
4646
Connectors& connectors,
4747
ocpp::messages::GenericMessageSender& msg_sender,
4848
IStatusManager& status_manager,
49-
ITriggerMessageManager& trigger_manager)
49+
ITriggerMessageManager& trigger_manager,
50+
IConfigManager& config_manager)
5051
: m_ocpp_config(ocpp_config),
5152
m_database(database),
5253
m_events_handler(events_handler),
@@ -66,6 +67,9 @@ MeterValuesManager::MeterValuesManager(ocpp::config::IOcppConfig& ocp
6667
trigger_manager.registerHandler(MessageTrigger::MeterValues, *this);
6768
m_clock_aligned_timer.setCallback(std::bind(&MeterValuesManager::processClockAligned, this));
6869

70+
// Register configuration change handler
71+
config_manager.registerConfigChangedListener("ClockAlignedDataInterval", *this);
72+
6973
// Start clock aligned and sample timers
7074
configureClockAlignedTimer();
7175
for (const Connector* connector : m_connectors.getConnectors())
@@ -194,6 +198,28 @@ bool MeterValuesManager::onTriggerMessage(ocpp::types::MessageTrigger message, u
194198
return ret;
195199
}
196200

201+
/** @copydoc void IConfigChangedListener::configurationValueChanged(const std::string&) */
202+
void MeterValuesManager::configurationValueChanged(const std::string& key)
203+
{
204+
// No need to check key, only ClockAlignedDataInterval is monitored
205+
(void)key;
206+
207+
// Check new value
208+
std::chrono::seconds interval = m_ocpp_config.clockAlignedDataInterval();
209+
if (interval == std::chrono::seconds(0))
210+
{
211+
// Disable clock aligned values
212+
m_clock_aligned_timer.stop();
213+
214+
LOG_INFO << "Clock aligned meter values disabled";
215+
}
216+
else
217+
{
218+
// Reconfigure clock aligned timer
219+
configureClockAlignedTimer();
220+
}
221+
}
222+
197223
/** @brief Configure clock-aligned timer */
198224
void MeterValuesManager::configureClockAlignedTimer(void)
199225
{
@@ -204,6 +230,8 @@ void MeterValuesManager::configureClockAlignedTimer(void)
204230
std::chrono::seconds interval = m_ocpp_config.clockAlignedDataInterval();
205231
if (interval >= std::chrono::seconds(0))
206232
{
233+
LOG_INFO << "Configure clock aligned meter values : interval in seconds = " << interval.count();
234+
207235
// Compute next due date
208236
time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
209237
struct tm aligned_time_tm;

src/chargepoint/metervalues/MeterValuesManager.h

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ along with OpenOCPP. If not, see <http://www.gnu.org/licenses/>.
2121

2222
#include "Database.h"
2323
#include "Enums.h"
24+
#include "IConfigManager.h"
2425
#include "IMeterValuesManager.h"
2526
#include "ITriggerMessageManager.h"
2627
#include "Timer.h"
@@ -50,7 +51,9 @@ class IChargePointEventsHandler;
5051
class IStatusManager;
5152

5253
/** @brief Handle charge point meter values requests */
53-
class MeterValuesManager : public IMeterValuesManager, public ITriggerMessageManager::ITriggerMessageHandler
54+
class MeterValuesManager : public IMeterValuesManager,
55+
public ITriggerMessageManager::ITriggerMessageHandler,
56+
public IConfigManager::IConfigChangedListener
5457
{
5558
public:
5659
/** @brief Constructor */
@@ -62,7 +65,8 @@ class MeterValuesManager : public IMeterValuesManager, public ITriggerMessageMan
6265
Connectors& connectors,
6366
ocpp::messages::GenericMessageSender& msg_sender,
6467
IStatusManager& status_manager,
65-
ITriggerMessageManager& trigger_manager);
68+
ITriggerMessageManager& trigger_manager,
69+
IConfigManager& config_manager);
6670

6771
/** @brief Destructor */
6872
virtual ~MeterValuesManager();
@@ -89,6 +93,11 @@ class MeterValuesManager : public IMeterValuesManager, public ITriggerMessageMan
8993
/** @copydoc bool ITriggerMessageManager::ITriggerMessageHandler::onTriggerMessage(ocpp::types::MessageTrigger message, unsigned int) */
9094
bool onTriggerMessage(ocpp::types::MessageTrigger message, unsigned int connector_id) override;
9195

96+
// IConfigChangedListener interface
97+
98+
/** @copydoc void IConfigChangedListener::configurationValueChanged(const std::string&) */
99+
void configurationValueChanged(const std::string& key) override;
100+
92101
private:
93102
/** @brief Standard OCPP configuration */
94103
ocpp::config::IOcppConfig& m_ocpp_config;

src/chargepoint/smartcharging/ISmartChargingManager.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,16 @@ class ISmartChargingManager
3737
* @brief Get the smart charging setpoints for a connector and the whole charge point
3838
* @param connector_id Id of the connector
3939
* @param charge_point_setpoint Setpoint of the whole charge point in A (not set if no active profile)
40+
* @param charge_point_number_phases Number of phases allowed to charge for the whole charge point
4041
* @param connector_setpoint Setpoint of the given connector in A (not set if no active profile)
42+
* @param connector_number_phases Number of phases allowed to charge for the given connector
4143
* @return true if the setpoints have been computed, false otherwise
4244
*/
4345
virtual bool getSetpoint(unsigned int connector_id,
4446
ocpp::types::Optional<float>& charge_point_setpoint,
45-
ocpp::types::Optional<float>& connector_setpoint) = 0;
47+
unsigned int& charge_point_number_phases,
48+
ocpp::types::Optional<float>& connector_setpoint,
49+
unsigned int& connector_number_phases) = 0;
4650

4751
/**
4852
* @brief Install a TxProfile charging profile on a connector

src/chargepoint/smartcharging/SmartChargingManager.cpp

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,14 @@ SmartChargingManager::~SmartChargingManager() { }
7272

7373
/** @copydoc bool ISmartChargingManager::getSetpoint(unsigned int,
7474
ocpp::types::Optional<float>&,
75-
ocpp::types::Optional<float>&) */
75+
unsigned int&,
76+
ocpp::types::Optional<float>&,
77+
unsigned int&) */
7678
bool SmartChargingManager::getSetpoint(unsigned int connector_id,
7779
ocpp::types::Optional<float>& charge_point_setpoint,
78-
ocpp::types::Optional<float>& connector_setpoint)
80+
unsigned int& charge_point_number_phases,
81+
ocpp::types::Optional<float>& connector_setpoint,
82+
unsigned int& connector_number_phases)
7983
{
8084
bool ret = false;
8185

@@ -88,20 +92,26 @@ bool SmartChargingManager::getSetpoint(unsigned int connector_i
8892
{
8993
// Compute charge point setpoint
9094
charge_point_setpoint.clear();
95+
charge_point_number_phases = 3u; // Default, if not set is 3 phases charging
9196
for (const auto& profile : m_profile_db.chargePointMaxProfiles())
9297
{
9398
// Check if the profile is active
9499
const ChargingSchedulePeriod* period = nullptr;
95100
if (isProfileActive(connector, profile.second, period))
96101
{
97102
// Apply setpoint
103+
if (period->numberPhases.isSet())
104+
{
105+
charge_point_number_phases = period->numberPhases;
106+
}
98107
if (profile.second.chargingSchedule.chargingRateUnit == ChargingRateUnitType::A)
99108
{
100109
charge_point_setpoint = period->limit;
101110
}
102111
else
103112
{
104-
charge_point_setpoint = period->limit / m_stack_config.operatingVoltage();
113+
charge_point_setpoint =
114+
period->limit / (static_cast<float>(charge_point_number_phases) * m_stack_config.operatingVoltage());
105115
}
106116
break;
107117
}
@@ -110,17 +120,19 @@ bool SmartChargingManager::getSetpoint(unsigned int connector_i
110120
// Compute connector setpoint if a transaction is active on the connector
111121
ocpp::types::ChargingRateUnitType connector_setpoint_unit = ChargingRateUnitType::A;
112122
connector_setpoint.clear();
123+
connector_number_phases = 3u; // Default, if not set is 3 phases charging
113124
if (connector->transaction_id != 0)
114125
{
115-
computeSetpoint(connector, connector_setpoint, connector_setpoint_unit, m_profile_db.txProfiles());
126+
computeSetpoint(connector, connector_setpoint, connector_setpoint_unit, connector_number_phases, m_profile_db.txProfiles());
116127
if (!connector_setpoint.isSet())
117128
{
118-
computeSetpoint(connector, connector_setpoint, connector_setpoint_unit, m_profile_db.txDefaultProfiles());
129+
computeSetpoint(
130+
connector, connector_setpoint, connector_setpoint_unit, connector_number_phases, m_profile_db.txDefaultProfiles());
119131
}
120132
}
121133
if (connector_setpoint.isSet() && (connector_setpoint_unit == ChargingRateUnitType::W))
122134
{
123-
connector_setpoint /= m_stack_config.operatingVoltage();
135+
connector_setpoint /= (static_cast<float>(connector_number_phases) * m_stack_config.operatingVoltage());
124136
}
125137

126138
// Connector setpoint cannot be greater than charge point setpoint
@@ -129,7 +141,8 @@ bool SmartChargingManager::getSetpoint(unsigned int connector_i
129141
if (!connector_setpoint.isSet() || (connector_setpoint > charge_point_setpoint))
130142
{
131143
// Connector setpoint becomes charge point setpoint
132-
connector_setpoint = charge_point_setpoint;
144+
connector_setpoint = charge_point_setpoint;
145+
connector_number_phases = charge_point_number_phases;
133146
}
134147
}
135148

@@ -435,6 +448,7 @@ void SmartChargingManager::cleanupProfiles()
435448
void SmartChargingManager::computeSetpoint(Connector* connector,
436449
ocpp::types::Optional<float>& connector_setpoint,
437450
ocpp::types::ChargingRateUnitType& connector_setpoint_unit,
451+
unsigned int& connector_number_phases,
438452
const ProfileDatabase::ChargingProfileList& profiles_list)
439453
{
440454
unsigned int level = 0;
@@ -457,6 +471,14 @@ void SmartChargingManager::computeSetpoint(Connector*
457471
// Apply setpoint
458472
connector_setpoint = period->limit;
459473
connector_setpoint_unit = profile.second.chargingSchedule.chargingRateUnit;
474+
if (period->numberPhases.isSet())
475+
{
476+
connector_number_phases = period->numberPhases;
477+
}
478+
else
479+
{
480+
connector_number_phases = 3u; // Default, if not set is 3 phases charging
481+
}
460482
}
461483

462484
// Check connector type

0 commit comments

Comments
 (0)