Skip to content

Commit 0035623

Browse files
authored
Merge pull request #13 from c-jimenez/dev/smart_charging_setpoint_full
Dev/smart charging setpoint full
2 parents eab7f7f + 866d777 commit 0035623

File tree

8 files changed

+163
-112
lines changed

8 files changed

+163
-112
lines changed

examples/remote_chargepoint/SetpointManager.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,8 @@ float SetpointManager::getSetpoint(unsigned int connector_id)
6363
/** @brief Periodically update the setpoints */
6464
void SetpointManager::update()
6565
{
66-
Optional<float> charge_point_setpoint;
67-
Optional<float> connector_setpoint;
68-
unsigned int charge_point_number_phases = 0u;
69-
unsigned int connector_number_phases = 0u;
66+
Optional<SmartChargingSetpoint> charge_point_setpoint;
67+
Optional<SmartChargingSetpoint> connector_setpoint;
7068

7169
std::lock_guard<std::mutex> lock(m_mutex);
7270

@@ -93,14 +91,14 @@ void SetpointManager::update()
9391
}
9492

9593
// Get the smart charging setpoint
96-
if (m_charge_point.getSetpoint(id, charge_point_setpoint, charge_point_number_phases, connector_setpoint, connector_number_phases))
94+
if (m_charge_point.getSetpoint(id, charge_point_setpoint, connector_setpoint))
9795
{
9896
// Apply setpoints
9997
if (charge_point_setpoint.isSet())
10098
{
101-
if (charge_point_setpoint < static_cast<float>(m_max_charge_point_current))
99+
if (charge_point_setpoint.value().value < static_cast<float>(m_max_charge_point_current))
102100
{
103-
m_setpoints[0] = charge_point_setpoint;
101+
m_setpoints[0] = charge_point_setpoint.value().value;
104102
}
105103
else
106104
{
@@ -109,9 +107,9 @@ void SetpointManager::update()
109107
}
110108
if (connector_setpoint.isSet())
111109
{
112-
if (connector_setpoint < static_cast<float>(m_max_connector_current))
110+
if (connector_setpoint.value().value < static_cast<float>(m_max_connector_current))
113111
{
114-
m_setpoints[id] = connector_setpoint;
112+
m_setpoints[id] = connector_setpoint.value().value;
115113
}
116114
else
117115
{

src/chargepoint/ChargePoint.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -525,22 +525,19 @@ bool ChargePoint::sendMeterValues(unsigned int connector_id, const std::vector<o
525525
}
526526

527527
/** @copydoc bool IChargePoint::getSetpoint(unsigned int,
528-
ocpp::types::Optional<float>&,
529-
unsigned int&,
530-
ocpp::types::Optional<float>&,
531-
unsigned int&) */
532-
bool ChargePoint::getSetpoint(unsigned int connector_id,
533-
ocpp::types::Optional<float>& charge_point_setpoint,
534-
unsigned int& charge_point_number_phases,
535-
ocpp::types::Optional<float>& connector_setpoint,
536-
unsigned int& connector_number_phases)
528+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>&,
529+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>&,
530+
ocpp::types::ChargingRateUnitType) */
531+
bool ChargePoint::getSetpoint(unsigned int connector_id,
532+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& charge_point_setpoint,
533+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& connector_setpoint,
534+
ocpp::types::ChargingRateUnitType unit)
537535
{
538536
bool ret = false;
539537

540538
if (m_smart_charging_manager.get())
541539
{
542-
ret = m_smart_charging_manager->getSetpoint(
543-
connector_id, charge_point_setpoint, charge_point_number_phases, connector_setpoint, connector_number_phases);
540+
ret = m_smart_charging_manager->getSetpoint(connector_id, charge_point_setpoint, connector_setpoint, unit);
544541
}
545542
else
546543
{

src/chargepoint/ChargePoint.h

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -135,15 +135,13 @@ class ChargePoint : public IChargePoint,
135135
bool sendMeterValues(unsigned int connector_id, const std::vector<ocpp::types::MeterValue>& values) override;
136136

137137
/** @copydoc bool IChargePoint::getSetpoint(unsigned int,
138-
ocpp::types::Optional<float>&,
139-
unsigned int&,
140-
ocpp::types::Optional<float>&,
141-
unsigned int&) */
142-
bool getSetpoint(unsigned int connector_id,
143-
ocpp::types::Optional<float>& charge_point_setpoint,
144-
unsigned int& charge_point_number_phases,
145-
ocpp::types::Optional<float>& connector_setpoint,
146-
unsigned int& connector_number_phases) override;
138+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>&,
139+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>&,
140+
ocpp::types::ChargingRateUnitType) */
141+
bool getSetpoint(unsigned int connector_id,
142+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& charge_point_setpoint,
143+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& connector_setpoint,
144+
ocpp::types::ChargingRateUnitType unit) override;
147145

148146
/** @copydoc bool IChargePoint::notifyFirmwareUpdateStatus(bool) */
149147
bool notifyFirmwareUpdateStatus(bool success) override;

src/chargepoint/interface/IChargePoint.h

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ along with OpenOCPP. If not, see <http://www.gnu.org/licenses/>.
2222
#include "IChargePointConfig.h"
2323
#include "IChargePointEventsHandler.h"
2424
#include "IOcppConfig.h"
25+
#include "SmartChargingSetpoint.h"
2526

2627
#include <memory>
2728

@@ -164,17 +165,15 @@ class IChargePoint
164165
/**
165166
* @brief Get the smart charging setpoints for a connector and the whole charge point
166167
* @param connector_id Id of the connector
167-
* @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
169-
* @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
168+
* @param charge_point_setpoint Setpoint of the whole charge point (not set if no active profile)
169+
* @param connector_setpoint Setpoint of the given connector (not set if no active profile)
170+
* @param unit Setpoint unit (A or W)
171171
* @return true if the setpoints have been computed, false otherwise
172172
*/
173-
virtual bool getSetpoint(unsigned int connector_id,
174-
ocpp::types::Optional<float>& charge_point_setpoint,
175-
unsigned int& charge_point_number_phases,
176-
ocpp::types::Optional<float>& connector_setpoint,
177-
unsigned int& connector_number_phases) = 0;
173+
virtual bool getSetpoint(unsigned int connector_id,
174+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& charge_point_setpoint,
175+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& connector_setpoint,
176+
ocpp::types::ChargingRateUnitType unit = ocpp::types::ChargingRateUnitType::A) = 0;
178177

179178
/**
180179
* @brief Notify the end of a firmware update operation

src/chargepoint/smartcharging/ISmartChargingManager.h

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ along with OpenOCPP. If not, see <http://www.gnu.org/licenses/>.
2020
#define ISMARTCHARGINGMANAGER_H
2121

2222
#include "ChargingProfile.h"
23+
#include "SmartChargingSetpoint.h"
2324

2425
namespace ocpp
2526
{
@@ -36,17 +37,15 @@ class ISmartChargingManager
3637
/**
3738
* @brief Get the smart charging setpoints for a connector and the whole charge point
3839
* @param connector_id Id of the connector
39-
* @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
41-
* @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
40+
* @param charge_point_setpoint Setpoint of the whole charge point (not set if no active profile)
41+
* @param connector_setpoint Setpoint of the given connector (not set if no active profile)
42+
* @param unit Setpoint unit (A or W)
4343
* @return true if the setpoints have been computed, false otherwise
4444
*/
45-
virtual bool getSetpoint(unsigned int connector_id,
46-
ocpp::types::Optional<float>& charge_point_setpoint,
47-
unsigned int& charge_point_number_phases,
48-
ocpp::types::Optional<float>& connector_setpoint,
49-
unsigned int& connector_number_phases) = 0;
45+
virtual bool getSetpoint(unsigned int connector_id,
46+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& charge_point_setpoint,
47+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& connector_setpoint,
48+
ocpp::types::ChargingRateUnitType unit = ocpp::types::ChargingRateUnitType::A) = 0;
5049

5150
/**
5251
* @brief Install a TxProfile charging profile on a connector

src/chargepoint/smartcharging/SmartChargingManager.cpp

Lines changed: 62 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,13 @@ SmartChargingManager::SmartChargingManager(const ocpp::config::IChargePointConfi
7171
SmartChargingManager::~SmartChargingManager() { }
7272

7373
/** @copydoc bool ISmartChargingManager::getSetpoint(unsigned int,
74-
ocpp::types::Optional<float>&,
75-
unsigned int&,
76-
ocpp::types::Optional<float>&,
77-
unsigned int&) */
78-
bool SmartChargingManager::getSetpoint(unsigned int connector_id,
79-
ocpp::types::Optional<float>& charge_point_setpoint,
80-
unsigned int& charge_point_number_phases,
81-
ocpp::types::Optional<float>& connector_setpoint,
82-
unsigned int& connector_number_phases)
74+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>&,
75+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>&,
76+
ocpp::types::ChargingRateUnitType) */
77+
bool SmartChargingManager::getSetpoint(unsigned int connector_id,
78+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& charge_point_setpoint,
79+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& connector_setpoint,
80+
ocpp::types::ChargingRateUnitType unit)
8381
{
8482
bool ret = false;
8583

@@ -92,57 +90,36 @@ bool SmartChargingManager::getSetpoint(unsigned int connector_i
9290
{
9391
// Compute charge point setpoint
9492
charge_point_setpoint.clear();
95-
charge_point_number_phases = 3u; // Default, if not set is 3 phases charging
9693
for (const auto& profile : m_profile_db.chargePointMaxProfiles())
9794
{
9895
// Check if the profile is active
9996
const ChargingSchedulePeriod* period = nullptr;
10097
if (isProfileActive(connector, profile.second, period))
10198
{
10299
// Apply setpoint
103-
if (period->numberPhases.isSet())
104-
{
105-
charge_point_number_phases = period->numberPhases;
106-
}
107-
if (profile.second.chargingSchedule.chargingRateUnit == ChargingRateUnitType::A)
108-
{
109-
charge_point_setpoint = period->limit;
110-
}
111-
else
112-
{
113-
charge_point_setpoint =
114-
period->limit / (static_cast<float>(charge_point_number_phases) * m_stack_config.operatingVoltage());
115-
}
100+
fillSetpoint(charge_point_setpoint, unit, profile.second, *period);
116101
break;
117102
}
118103
}
119104

120105
// Compute connector setpoint if a transaction is active on the connector
121-
ocpp::types::ChargingRateUnitType connector_setpoint_unit = ChargingRateUnitType::A;
122106
connector_setpoint.clear();
123-
connector_number_phases = 3u; // Default, if not set is 3 phases charging
124107
if (connector->transaction_id != 0)
125108
{
126-
computeSetpoint(connector, connector_setpoint, connector_setpoint_unit, connector_number_phases, m_profile_db.txProfiles());
109+
computeSetpoint(connector, connector_setpoint, unit, m_profile_db.txProfiles());
127110
if (!connector_setpoint.isSet())
128111
{
129-
computeSetpoint(
130-
connector, connector_setpoint, connector_setpoint_unit, connector_number_phases, m_profile_db.txDefaultProfiles());
112+
computeSetpoint(connector, connector_setpoint, unit, m_profile_db.txDefaultProfiles());
131113
}
132114
}
133-
if (connector_setpoint.isSet() && (connector_setpoint_unit == ChargingRateUnitType::W))
134-
{
135-
connector_setpoint /= (static_cast<float>(connector_number_phases) * m_stack_config.operatingVoltage());
136-
}
137115

138116
// Connector setpoint cannot be greater than charge point setpoint
139117
if (charge_point_setpoint.isSet())
140118
{
141-
if (!connector_setpoint.isSet() || (connector_setpoint > charge_point_setpoint))
119+
if (!connector_setpoint.isSet() || (connector_setpoint.value().value > charge_point_setpoint.value().value))
142120
{
143121
// Connector setpoint becomes charge point setpoint
144-
connector_setpoint = charge_point_setpoint;
145-
connector_number_phases = charge_point_number_phases;
122+
connector_setpoint = charge_point_setpoint;
146123
}
147124
}
148125

@@ -445,11 +422,10 @@ void SmartChargingManager::cleanupProfiles()
445422
}
446423

447424
/** @brief Compute the setpoint of a given connector with a profile list */
448-
void SmartChargingManager::computeSetpoint(Connector* connector,
449-
ocpp::types::Optional<float>& connector_setpoint,
450-
ocpp::types::ChargingRateUnitType& connector_setpoint_unit,
451-
unsigned int& connector_number_phases,
452-
const ProfileDatabase::ChargingProfileList& profiles_list)
425+
void SmartChargingManager::computeSetpoint(Connector* connector,
426+
ocpp::types::Optional<ocpp::types::SmartChargingSetpoint>& connector_setpoint,
427+
ocpp::types::ChargingRateUnitType unit,
428+
const ProfileDatabase::ChargingProfileList& profiles_list)
453429
{
454430
unsigned int level = 0;
455431
for (const auto& profile : profiles_list)
@@ -469,16 +445,7 @@ void SmartChargingManager::computeSetpoint(Connector*
469445
if (isProfileActive(connector, profile.second, period))
470446
{
471447
// Apply setpoint
472-
connector_setpoint = period->limit;
473-
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-
}
448+
fillSetpoint(connector_setpoint, unit, profile.second, *period);
482449
}
483450

484451
// Check connector type
@@ -507,7 +474,7 @@ bool SmartChargingManager::isProfileActive(Connector*
507474

508475
// Check profile validity
509476
DateTime now = DateTime::now();
510-
if ((!profile.validFrom.isSet() || (now >= profile.validFrom)) && (!profile.validTo.isSet() || (now >= profile.validTo)))
477+
if ((!profile.validFrom.isSet() || (now >= profile.validFrom)) && (!profile.validTo.isSet() || (now <= profile.validTo)))
511478
{
512479
// Check profile kind
513480
ChargingProfileKindType kind = profile.chargingProfileKind;
@@ -611,5 +578,49 @@ bool SmartChargingManager::isProfileActive(Connector*
611578
return ret;
612579
}
613580

581+
/** @brief Fill a setpoint structure with a charging profile and a charging schedule period */
582+
void SmartChargingManager::fillSetpoint(ocpp::types::SmartChargingSetpoint& setpoint,
583+
ocpp::types::ChargingRateUnitType unit,
584+
const ocpp::types::ChargingProfile& profile,
585+
const ocpp::types::ChargingSchedulePeriod& period)
586+
{
587+
setpoint.min_charging_rate = profile.chargingSchedule.minChargingRate;
588+
if (period.numberPhases.isSet())
589+
{
590+
setpoint.number_phases = period.numberPhases;
591+
}
592+
else
593+
{
594+
setpoint.number_phases = 3u; // Default, if not set is 3 phases charging
595+
}
596+
if (profile.chargingSchedule.chargingRateUnit == unit)
597+
{
598+
setpoint.value = period.limit;
599+
}
600+
else
601+
{
602+
setpoint.value = convertToUnit(period.limit, unit, setpoint.number_phases);
603+
if (setpoint.min_charging_rate.isSet())
604+
{
605+
setpoint.min_charging_rate = convertToUnit(setpoint.min_charging_rate, unit, setpoint.number_phases);
606+
}
607+
}
608+
}
609+
610+
/** @brief Convert charging rate units */
611+
float SmartChargingManager::convertToUnit(float value, ocpp::types::ChargingRateUnitType unit, unsigned int number_phases)
612+
{
613+
float ret;
614+
if (unit == ChargingRateUnitType::A)
615+
{
616+
ret = value / (static_cast<float>(number_phases) * m_stack_config.operatingVoltage());
617+
}
618+
else
619+
{
620+
ret = value * static_cast<float>(number_phases) * m_stack_config.operatingVoltage();
621+
}
622+
return ret;
623+
}
624+
614625
} // namespace chargepoint
615626
} // namespace ocpp

0 commit comments

Comments
 (0)