Skip to content

Commit 849d267

Browse files
authored
Merge pull request #8 from c-jimenez/dev/smart_charging_number_phases
Dev/smart charging number phases
2 parents 7a4c2ec + 783bd9b commit 849d267

File tree

10 files changed

+71
-18
lines changed

10 files changed

+71
-18
lines changed

README.md

Lines changed: 1 addition & 1 deletion
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

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: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -526,16 +526,21 @@ bool ChargePoint::sendMeterValues(unsigned int connector_id, const std::vector<o
526526

527527
/** @copydoc bool IChargePoint::getSetpoint(unsigned int,
528528
ocpp::types::Optional<float>&,
529-
ocpp::types::Optional<float>&) */
529+
unsigned int&,
530+
ocpp::types::Optional<float>&,
531+
unsigned int&) */
530532
bool ChargePoint::getSetpoint(unsigned int connector_id,
531533
ocpp::types::Optional<float>& charge_point_setpoint,
532-
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)
533537
{
534538
bool ret = false;
535539

536540
if (m_smart_charging_manager.get())
537541
{
538-
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);
539544
}
540545
else
541546
{

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/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: 26 additions & 5 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,13 +92,18 @@ 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;
@@ -110,12 +119,14 @@ bool SmartChargingManager::getSetpoint(unsigned int connector_i
110119
// Compute connector setpoint if a transaction is active on the connector
111120
ocpp::types::ChargingRateUnitType connector_setpoint_unit = ChargingRateUnitType::A;
112121
connector_setpoint.clear();
122+
connector_number_phases = 3u; // Default, if not set is 3 phases charging
113123
if (connector->transaction_id != 0)
114124
{
115-
computeSetpoint(connector, connector_setpoint, connector_setpoint_unit, m_profile_db.txProfiles());
125+
computeSetpoint(connector, connector_setpoint, connector_setpoint_unit, connector_number_phases, m_profile_db.txProfiles());
116126
if (!connector_setpoint.isSet())
117127
{
118-
computeSetpoint(connector, connector_setpoint, connector_setpoint_unit, m_profile_db.txDefaultProfiles());
128+
computeSetpoint(
129+
connector, connector_setpoint, connector_setpoint_unit, connector_number_phases, m_profile_db.txDefaultProfiles());
119130
}
120131
}
121132
if (connector_setpoint.isSet() && (connector_setpoint_unit == ChargingRateUnitType::W))
@@ -129,7 +140,8 @@ bool SmartChargingManager::getSetpoint(unsigned int connector_i
129140
if (!connector_setpoint.isSet() || (connector_setpoint > charge_point_setpoint))
130141
{
131142
// Connector setpoint becomes charge point setpoint
132-
connector_setpoint = charge_point_setpoint;
143+
connector_setpoint = charge_point_setpoint;
144+
connector_number_phases = charge_point_number_phases;
133145
}
134146
}
135147

@@ -435,6 +447,7 @@ void SmartChargingManager::cleanupProfiles()
435447
void SmartChargingManager::computeSetpoint(Connector* connector,
436448
ocpp::types::Optional<float>& connector_setpoint,
437449
ocpp::types::ChargingRateUnitType& connector_setpoint_unit,
450+
unsigned int& connector_number_phases,
438451
const ProfileDatabase::ChargingProfileList& profiles_list)
439452
{
440453
unsigned int level = 0;
@@ -457,6 +470,14 @@ void SmartChargingManager::computeSetpoint(Connector*
457470
// Apply setpoint
458471
connector_setpoint = period->limit;
459472
connector_setpoint_unit = profile.second.chargingSchedule.chargingRateUnit;
473+
if (period->numberPhases.isSet())
474+
{
475+
connector_number_phases = period->numberPhases;
476+
}
477+
else
478+
{
479+
connector_number_phases = 3u; // Default, if not set is 3 phases charging
480+
}
460481
}
461482

462483
// Check connector type

src/chargepoint/smartcharging/SmartChargingManager.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,14 @@ class SmartChargingManager
8282

8383
/** @copydoc bool ISmartChargingManager::getSetpoint(unsigned int,
8484
ocpp::types::Optional<float>&,
85-
ocpp::types::Optional<float>&) */
85+
unsigned int&,
86+
ocpp::types::Optional<float>&,
87+
unsigned int&) */
8688
bool getSetpoint(unsigned int connector_id,
8789
ocpp::types::Optional<float>& charge_point_setpoint,
88-
ocpp::types::Optional<float>& connector_setpoint) override;
90+
unsigned int& charge_point_number_phases,
91+
ocpp::types::Optional<float>& connector_setpoint,
92+
unsigned int& connector_number_phases) override;
8993

9094
/** @copydoc bool ISmartChargingManager::installTxProfile(unsigned int, const ocpp::types::ChargingProfile&) */
9195
bool installTxProfile(unsigned int connector_id, const ocpp::types::ChargingProfile& profile) override;
@@ -153,6 +157,7 @@ class SmartChargingManager
153157
void computeSetpoint(Connector* connector,
154158
ocpp::types::Optional<float>& connector_setpoint,
155159
ocpp::types::ChargingRateUnitType& connector_setpoint_unit,
160+
unsigned int& connector_number_phases,
156161
const ProfileDatabase::ChargingProfileList& profiles_list);
157162

158163
/** @brief Check if the given profile is active */

src/messages/types/ChargingScheduleConverter.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,15 @@ bool ChargingScheduleConverter::fromJson(const rapidjson::Value& json,
4949
ChargingSchedulePeriod& period = chargingSchedulePeriods.back();
5050
extract(*it_period, "startPeriod", period.startPeriod);
5151
extract(*it_period, "limit", period.limit);
52-
extract(*it_period, "numberPhases", period.numberPhases);
52+
ret = ret && extract(*it_period, "numberPhases", period.numberPhases, error_message);
53+
if (ret && period.numberPhases.isSet())
54+
{
55+
if ((period.numberPhases == 0) || (period.numberPhases > 3u))
56+
{
57+
error_message = "numberPhases parameter must be in interval [1;3]";
58+
ret = false;
59+
}
60+
}
5361
}
5462

5563
if (!ret)

src/types/ChargingSchedulePeriod.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ struct ChargingSchedulePeriod
4242
float limit;
4343
/** @brief Optional. The number of phases that can be used for charging. If a number of
4444
phases is needed, numberPhases=3 will be assumed unless another number is given */
45-
Optional<int> numberPhases;
45+
Optional<unsigned int> numberPhases;
4646
};
4747

4848
} // namespace types

0 commit comments

Comments
 (0)