Skip to content

Commit 3ee6a27

Browse files
authored
Merge pull request #3 from c-jimenez/phases_intensity
Phases intensity
2 parents 738e91d + 5a367cd commit 3ee6a27

File tree

10 files changed

+198
-45
lines changed

10 files changed

+198
-45
lines changed

README.md

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,12 @@ The status message has the following payload :
305305
"max_setpoint":32.0,
306306
"ocpp_setpoint":32.0,
307307
"setpoint":0.0,
308-
"consumption":0.0,
309-
"car_consumption":0.0,
308+
"consumption_l1":0.0,
309+
"consumption_l2":0.0,
310+
"consumption_l3":0.0,
311+
"car_consumption_l1":0.0,
312+
"car_consumption_l2":0.0,
313+
"car_consumption_l3":0.0,
310314
"car_cable_capacity":0.0,
311315
"car_ready":true
312316
}
@@ -318,9 +322,11 @@ The expected command payload is :
318322

319323
```
320324
{
321-
"cable": 32,
325+
"cable": 32.0,
322326
"ready": true,
323-
"consumption": 10
327+
"consumption_l1": 10.0,
328+
"consumption_l2": 10.0,
329+
"consumption_l3": 10.0
324330
}
325331
```
326332

docker/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ ARG gid=1000
1111
RUN echo "APT::Get::Assume-Yes "true";" >> /etc/apt/apt.conf.d/aptconf
1212

1313

14-
RUN apt-get update && apt-get install build-essential clang cmake python3 python3-pip python3-venv wget libpaho-mqtt-dev git openssl libssl-dev sqlite3 libsqlite3-dev\
14+
RUN apt-get update && apt-get install build-essential clang cmake python3 python3-pip python3-venv wget libpaho-mqtt-dev git openssl libssl-dev sqlite3 libsqlite3-dev zip curl \
1515
&& apt-get -q autoremove && rm -rf "/var/lib/apt/lists/*"
1616

1717
RUN git clone https://github.com/c-jimenez/open-ocpp.git

src/chargepoint/ConnectorData.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ struct ConnectorData
4141
max_setpoint(0.f),
4242
ocpp_setpoint(0.f),
4343
setpoint(0.f),
44-
car_consumption(0.f),
44+
car_consumption_l1(0.f),
45+
car_consumption_l2(0.f),
46+
car_consumption_l3(0.f),
4547
car_cable_capacity(0.f),
4648
car_ready(true),
4749
preparing_start(),
@@ -63,10 +65,10 @@ struct ConnectorData
6365
float ocpp_setpoint;
6466
/** @brief Setpoint */
6567
float setpoint;
66-
/** @brief Consumption */
67-
float consumption;
6868
/** @brief Car consumption */
69-
float car_consumption;
69+
float car_consumption_l1;
70+
float car_consumption_l2;
71+
float car_consumption_l3;
7072
/** @brief Car cable capacity */
7173
float car_cable_capacity;
7274
/** @brief Indicate that the car is ready to charge */

src/chargepoint/SimulatedChargePoint.cpp

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -650,17 +650,41 @@ void SimulatedChargePoint::computeSetpoints(ocpp::chargepoint::IChargePoint& cha
650650
void SimulatedChargePoint::computeCurrentConsumption(ConnectorData& connector)
651651
{
652652
// Default is no consumption
653-
connector.consumption = 0.f;
653+
float consumption_l1 = 0.f;
654+
float consumption_l2 = 0.f;
655+
float consumption_l3 = 0.f;
654656

655657
// Check if charging
656658
if (connector.status == ChargePointStatus::Charging)
657659
{
658660
// Consumption must match both setpoint and car needs
659-
connector.consumption = std::min(connector.car_consumption, connector.setpoint);
661+
unsigned int nb_phases = connector.meter->getNumberOfPhases();
662+
switch (nb_phases)
663+
{
664+
case 1:
665+
consumption_l1 = std::min(connector.car_consumption_l1, connector.setpoint);
666+
break;
667+
668+
case 2:
669+
consumption_l1 = std::min(connector.car_consumption_l1, connector.setpoint);
670+
consumption_l2 = std::min(connector.car_consumption_l2, connector.setpoint);
671+
break;
672+
673+
case 3:
674+
consumption_l1 = std::min(connector.car_consumption_l1, connector.setpoint);
675+
consumption_l2 = std::min(connector.car_consumption_l2, connector.setpoint);
676+
consumption_l3 = std::min(connector.car_consumption_l3, connector.setpoint);
677+
break;
678+
679+
default:
680+
break;
681+
}
660682
}
661683

662684
// Apply consumption in the meter
663-
std::vector<float> currents(connector.meter->getNumberOfPhases());
664-
currents.assign(currents.size(), connector.consumption);
685+
std::vector<float> currents;
686+
currents.push_back(consumption_l1);
687+
currents.push_back(consumption_l2);
688+
currents.push_back(consumption_l3);
665689
connector.meter->setCurrents(currents);
666690
}

src/chargepoint/config/config.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ AuthorizationCacheEnabled=true
4747
AuthorizeRemoteTxRequests=true
4848
BlinkRepeat=10
4949
ClockAlignedDataInterval=0
50-
ConnectionTimeOut=3600
50+
ConnectionTimeOut=30
5151
ConnectorPhaseRotation=1.RST,2.RST,3.RST
5252
ConnectorPhaseRotationMaxLength=3
5353
GetConfigurationMaxKeys=150

src/chargepoint/mqtt/MqttManager.cpp

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ SOFTWARE.
2525
#include "MqttManager.h"
2626
#include "SimulatedChargePointConfig.h"
2727
#include "Topics.h"
28+
#include "MeterSimulator.h"
2829
#include "json.h"
2930

3031
#include <cstring>
@@ -58,6 +59,8 @@ void MqttManager::mqttMessageReceived(const char* topic, const std::string& mess
5859
(void)qos;
5960
(void)retained;
6061

62+
std::cout << "MQTT message received!" << std::endl;
63+
6164
// Decode message
6265
bool valid = false;
6366
rapidjson::Document payload;
@@ -75,6 +78,7 @@ void MqttManager::mqttMessageReceived(const char* topic, const std::string& mess
7578
}
7679
else
7780
{
81+
std::cout << "topic: " << topic << std::endl << "payload: " << message << std::endl;
7882
// Split topic name
7983
std::filesystem::path topic_path(topic);
8084

@@ -128,12 +132,28 @@ void MqttManager::mqttMessageReceived(const char* topic, const std::string& mess
128132
connector_data.car_ready = ready.GetBool();
129133
}
130134
}
131-
if (payload.HasMember("consumption"))
135+
if (payload.HasMember("consumption_l1"))
136+
{
137+
rapidjson::Value& consumption_l1 = payload["consumption_l1"];
138+
if (consumption_l1.IsFloat())
139+
{
140+
connector_data.car_consumption_l1 = consumption_l1.GetFloat();
141+
}
142+
}
143+
if (payload.HasMember("consumption_l2"))
144+
{
145+
rapidjson::Value& consumption_l2 = payload["consumption_l2"];
146+
if (consumption_l2.IsFloat())
147+
{
148+
connector_data.car_consumption_l2 = consumption_l2.GetFloat();
149+
}
150+
}
151+
if (payload.HasMember("consumption_l3"))
132152
{
133-
rapidjson::Value& consumption = payload["consumption"];
134-
if (consumption.IsFloat())
153+
rapidjson::Value& consumption_l3 = payload["consumption_l3"];
154+
if (consumption_l3.IsFloat())
135155
{
136-
connector_data.car_consumption = consumption.GetFloat();
156+
connector_data.car_consumption_l3 = consumption_l3.GetFloat();
137157
}
138158
}
139159
}
@@ -185,10 +205,10 @@ void MqttManager::start(unsigned int nb_phases, unsigned int max_charge_point_cu
185205
std::cout << "Connecting to the broker (" << m_config.mqttConfig().brokerUrl() << ")..." << std::endl;
186206
if (m_mqtt->connect(m_config.mqttConfig().brokerUrl()))
187207
{
188-
std::cout << "Subscribing to charge point's command topic..." << std::endl;
208+
std::cout << "Subscribing to charge point's command topic: " << chargepoint_cmd_topic << std::endl;
189209
if (m_mqtt->subscribe(chargepoint_cmd_topic))
190210
{
191-
std::cout << "Subscribing to charge point's connector topics..." << std::endl;
211+
std::cout << "Subscribing to charge point's connector topics: " << chargepoint_car_topics << " and " << chargepoint_tag_topics << std::endl;
192212
if (m_mqtt->subscribe(chargepoint_car_topics) && m_mqtt->subscribe(chargepoint_tag_topics))
193213
{
194214
// Wait for disconnection or end of application
@@ -267,7 +287,9 @@ void MqttManager::updateData(std::vector<ConnectorData>& connectors) const
267287
const ConnectorData& mqtt_data = m_connectors[connector.id - 1u];
268288
connector.car_cable_capacity = mqtt_data.car_cable_capacity;
269289
connector.car_ready = mqtt_data.car_ready;
270-
connector.car_consumption = mqtt_data.car_consumption;
290+
connector.car_consumption_l1 = mqtt_data.car_consumption_l1;
291+
connector.car_consumption_l2 = mqtt_data.car_consumption_l2;
292+
connector.car_consumption_l3 = mqtt_data.car_consumption_l3;
271293
connector.fault_pending = mqtt_data.fault_pending;
272294
}
273295
}
@@ -312,11 +334,20 @@ void MqttManager::publishData(const std::vector<ConnectorData>& connectors)
312334
msg.AddMember(rapidjson::StringRef("max_setpoint"), rapidjson::Value(connector.max_setpoint), msg.GetAllocator());
313335
msg.AddMember(rapidjson::StringRef("ocpp_setpoint"), rapidjson::Value(connector.ocpp_setpoint), msg.GetAllocator());
314336
msg.AddMember(rapidjson::StringRef("setpoint"), rapidjson::Value(connector.setpoint), msg.GetAllocator());
315-
msg.AddMember(rapidjson::StringRef("consumption"), rapidjson::Value(connector.consumption), msg.GetAllocator());
316-
msg.AddMember(rapidjson::StringRef("car_consumption"), rapidjson::Value(connector.car_consumption), msg.GetAllocator());
337+
msg.AddMember(rapidjson::StringRef("car_consumption_l1"), rapidjson::Value(connector.car_consumption_l1), msg.GetAllocator());
338+
msg.AddMember(rapidjson::StringRef("car_consumption_l2"), rapidjson::Value(connector.car_consumption_l2), msg.GetAllocator());
339+
msg.AddMember(rapidjson::StringRef("car_consumption_l3"), rapidjson::Value(connector.car_consumption_l3), msg.GetAllocator());
317340
msg.AddMember(rapidjson::StringRef("car_cable_capacity"), rapidjson::Value(connector.car_cable_capacity), msg.GetAllocator());
318341
msg.AddMember(rapidjson::StringRef("car_ready"), rapidjson::Value(connector.car_ready), msg.GetAllocator());
319342

343+
static const char* consumption_str[] = {"consumption_l1", "consumption_l2", "consumption_l3"};
344+
std::vector<float> currents = connector.meter->getCurrents();
345+
unsigned int nb_phases = connector.meter->getNumberOfPhases();
346+
for (unsigned int i = 0; i < nb_phases ; i++)
347+
{
348+
msg.AddMember(rapidjson::StringRef(consumption_str[i]), rapidjson::Value(currents[i]), msg.GetAllocator());
349+
}
350+
320351
rapidjson::StringBuffer buffer;
321352
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
322353
msg.Accept(writer);

src/supervisor/ChargePointManager.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,13 @@ def __init__(self, id: int) -> None:
4949
# Setpoint
5050
self.setpoint = 0
5151
# Consumption
52-
self.consumption = 0
52+
self.consumption_l1 = 0
53+
self.consumption_l2 = 0
54+
self.consumption_l3 = 0
5355
# Car consumption
54-
self.car_consumption = 0
56+
self.car_consumption_l1 = 0
57+
self.car_consumption_l2 = 0
58+
self.car_consumption_l3 = 0
5559
# Car cable capacity
5660
self.car_cable_capacity = 0
5761
# Car ready for charging
@@ -138,7 +142,7 @@ def stop(self) -> bool:
138142

139143
return ret
140144

141-
def send_connector_values(self, cp_id: str, con_id: int, car_consumption: float, car_cable: float, car_ready: bool) -> bool:
145+
def send_connector_values(self, cp_id: str, con_id: int, car_consumption_l1: float, car_consumption_l2: float, car_consumption_l3: float, car_cable: float, car_ready: bool) -> bool:
142146
""" Send new connector values for a Charge Point """
143147

144148
ret = False
@@ -150,7 +154,7 @@ def send_connector_values(self, cp_id: str, con_id: int, car_consumption: float,
150154

151155
# Build message
152156
payload = {"cable": car_cable, "ready": car_ready,
153-
"consumption": car_consumption}
157+
"consumption_l1": car_consumption_l1, "consumption_l2": car_consumption_l2, "consumption_l3": car_consumption_l3}
154158

155159
# Publish message
156160
ret = self.__client.publish(topic_name, json.dumps(payload))
@@ -352,8 +356,12 @@ def __on_message_received(self, topic: str, payload: str, qos: int, retained: bo
352356
con.max_setpoint = data["max_setpoint"]
353357
con.ocpp_setpoint = data["ocpp_setpoint"]
354358
con.setpoint = data["setpoint"]
355-
con.consumption = data["consumption"]
356-
con.car_consumption = data["car_consumption"]
359+
con.consumption_l1 = data["consumption_l1"]
360+
con.consumption_l2 = data["consumption_l2"]
361+
con.consumption_l3 = data["consumption_l3"]
362+
con.car_consumption_l1 = data["car_consumption_l1"]
363+
con.car_consumption_l2 = data["car_consumption_l2"]
364+
con.car_consumption_l3 = data["car_consumption_l3"]
357365
con.car_cable_capacity = data["car_cable_capacity"]
358366
con.car_ready = data["car_ready"]
359367

src/supervisor/ui/ConnectorWidget.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,18 @@ class ConnectorWidget(BoxLayout):
3333
con_id = NumericProperty(None)
3434
status = StringProperty(None)
3535
max_current = NumericProperty(None)
36-
car_consumption = NumericProperty(None)
36+
car_consumption_l1 = NumericProperty(None)
37+
car_consumption_l2 = NumericProperty(None)
38+
car_consumption_l3 = NumericProperty(None)
3739
car_cable = NumericProperty(None)
3840
car_ready = BooleanProperty(None)
3941
id_tag = StringProperty(None)
4042

41-
def set_properties(self, car_consumption: float, car_cable: float, car_ready: bool, id_tag: str) -> None:
43+
def set_properties(self, car_consumption_l1: float, car_consumption_l2: float, car_consumption_l3: float, car_cable: float, car_ready: bool, id_tag: str) -> None:
4244
""" Set the properties values """
43-
self.sl_car_consumption.value = car_consumption
45+
self.sl_car_consumption_l1.value = car_consumption_l1
46+
self.sl_car_consumption_l2.value = car_consumption_l2
47+
self.sl_car_consumption_l3.value = car_consumption_l3
4448
self.sl_car_cable.value = car_cable
4549
self.tb_car_ready.active = not car_ready
4650
self.ti_id_tag.text = id_tag

src/supervisor/ui/SupervisorScreen.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,9 @@ def __on_cp_update(self, cp: ChargePoint, deleted: bool) -> None:
234234
connector_widget = self.stk_connectors.children[con_index]
235235
if isinstance(connector_widget, ConnectorWidget) and connector_widget.con_id == con_id:
236236
connector_widget.status = connector.status
237-
connector_widget.consumption = connector.consumption
237+
connector_widget.consumption_l1 = connector.consumption_l1
238+
connector_widget.consumption_l2 = connector.consumption_l2
239+
connector_widget.consumption_l3 = connector.consumption_l3
238240
break
239241

240242
else:
@@ -302,13 +304,19 @@ def on_cp_selection_changed(self, value, *args):
302304
widget.con_id = connector.id
303305
widget.status = connector.status
304306
widget.max_current = connector.max_setpoint
305-
widget.consumption = connector.consumption
306-
widget.set_properties(connector.car_consumption, connector.car_cable_capacity,
307+
widget.consumption_l1 = connector.consumption_l1
308+
widget.consumption_l2 = connector.consumption_l2
309+
widget.consumption_l3 = connector.consumption_l3
310+
widget.set_properties(connector.car_consumption_l1, connector.car_consumption_l2, connector.car_consumption_l3, connector.car_cable_capacity,
307311
connector.car_ready, connector.id_tag)
308312

309313
# Bind to events
310314
widget.bind(
311-
car_consumption=self.on_connector_value_changed)
315+
car_consumption_l1=self.on_connector_value_changed)
316+
widget.bind(
317+
car_consumption_l2=self.on_connector_value_changed)
318+
widget.bind(
319+
car_consumption_l3=self.on_connector_value_changed)
312320
widget.bind(
313321
car_cable=self.on_connector_value_changed)
314322
widget.bind(
@@ -323,7 +331,7 @@ def on_connector_value_changed(self, connector, *args):
323331
""" Called when a value in the connector has changed """
324332
# Send new connector values
325333
self.__cp_mgr.send_connector_values(
326-
self.__selected_cp_id, connector.con_id, connector.car_consumption, connector.car_cable, connector.car_ready)
334+
self.__selected_cp_id, connector.con_id, connector.car_consumption_l1, connector.car_consumption_l2, connector.car_consumption_l3, connector.car_cable, connector.car_ready)
327335

328336
def on_connector_id_tag_passed(self, connector, *args):
329337
""" Called when an id tag has been passed on a connector """

0 commit comments

Comments
 (0)