Skip to content

Commit 17f862f

Browse files
author
LUCAS DREZET
committed
simu now can have different intensities on each phase
1 parent e17af28 commit 17f862f

File tree

9 files changed

+201
-42
lines changed

9 files changed

+201
-42
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: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -650,17 +650,36 @@ 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+
if (nb_phases == 1)
663+
{
664+
consumption_l1 = std::min(connector.car_consumption_l1, connector.setpoint);
665+
}
666+
else if (nb_phases == 2)
667+
{
668+
consumption_l1 = std::min(connector.car_consumption_l1, connector.setpoint);
669+
consumption_l2 = std::min(connector.car_consumption_l2, connector.setpoint);
670+
}
671+
else if (nb_phases == 3)
672+
{
673+
consumption_l1 = std::min(connector.car_consumption_l1, connector.setpoint);
674+
consumption_l2 = std::min(connector.car_consumption_l2, connector.setpoint);
675+
consumption_l3 = std::min(connector.car_consumption_l3, connector.setpoint);
676+
}
660677
}
661678

662679
// Apply consumption in the meter
663-
std::vector<float> currents(connector.meter->getNumberOfPhases());
664-
currents.assign(currents.size(), connector.consumption);
680+
std::vector<float> currents;
681+
currents.push_back(consumption_l1);
682+
currents.push_back(consumption_l2);
683+
currents.push_back(consumption_l3);
665684
connector.meter->setCurrents(currents);
666685
}

src/chargepoint/mqtt/MqttManager.cpp

Lines changed: 49 additions & 7 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>
@@ -131,12 +132,28 @@ void MqttManager::mqttMessageReceived(const char* topic, const std::string& mess
131132
connector_data.car_ready = ready.GetBool();
132133
}
133134
}
134-
if (payload.HasMember("consumption"))
135+
if (payload.HasMember("consumption_l1"))
135136
{
136-
rapidjson::Value& consumption = payload["consumption"];
137-
if (consumption.IsFloat())
137+
rapidjson::Value& consumption_l1 = payload["consumption_l1"];
138+
if (consumption_l1.IsFloat())
138139
{
139-
connector_data.car_consumption = consumption.GetFloat();
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"))
152+
{
153+
rapidjson::Value& consumption_l3 = payload["consumption_l3"];
154+
if (consumption_l3.IsFloat())
155+
{
156+
connector_data.car_consumption_l3 = consumption_l3.GetFloat();
140157
}
141158
}
142159
}
@@ -270,7 +287,9 @@ void MqttManager::updateData(std::vector<ConnectorData>& connectors) const
270287
const ConnectorData& mqtt_data = m_connectors[connector.id - 1u];
271288
connector.car_cable_capacity = mqtt_data.car_cable_capacity;
272289
connector.car_ready = mqtt_data.car_ready;
273-
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;
274293
connector.fault_pending = mqtt_data.fault_pending;
275294
}
276295
}
@@ -303,6 +322,7 @@ void MqttManager::publishData(const std::vector<ConnectorData>& connectors)
303322
std::stringstream topic;
304323
topic << m_connectors_topic << connector.id << "/status";
305324

325+
306326
// Create the JSON message
307327
rapidjson::Document msg;
308328
msg.Parse("{}");
@@ -315,11 +335,33 @@ void MqttManager::publishData(const std::vector<ConnectorData>& connectors)
315335
msg.AddMember(rapidjson::StringRef("max_setpoint"), rapidjson::Value(connector.max_setpoint), msg.GetAllocator());
316336
msg.AddMember(rapidjson::StringRef("ocpp_setpoint"), rapidjson::Value(connector.ocpp_setpoint), msg.GetAllocator());
317337
msg.AddMember(rapidjson::StringRef("setpoint"), rapidjson::Value(connector.setpoint), msg.GetAllocator());
318-
msg.AddMember(rapidjson::StringRef("consumption"), rapidjson::Value(connector.consumption), msg.GetAllocator());
319-
msg.AddMember(rapidjson::StringRef("car_consumption"), rapidjson::Value(connector.car_consumption), msg.GetAllocator());
338+
msg.AddMember(rapidjson::StringRef("car_consumption_l1"), rapidjson::Value(connector.car_consumption_l1), msg.GetAllocator());
339+
msg.AddMember(rapidjson::StringRef("car_consumption_l2"), rapidjson::Value(connector.car_consumption_l2), msg.GetAllocator());
340+
msg.AddMember(rapidjson::StringRef("car_consumption_l3"), rapidjson::Value(connector.car_consumption_l3), msg.GetAllocator());
320341
msg.AddMember(rapidjson::StringRef("car_cable_capacity"), rapidjson::Value(connector.car_cable_capacity), msg.GetAllocator());
321342
msg.AddMember(rapidjson::StringRef("car_ready"), rapidjson::Value(connector.car_ready), msg.GetAllocator());
322343

344+
std::vector<float> currents = connector.meter->getCurrents();
345+
unsigned int nb_phases = connector.meter->getNumberOfPhases();
346+
if (nb_phases == 1)
347+
{
348+
msg.AddMember(rapidjson::StringRef("consumption_l1"), rapidjson::Value(currents[0]), msg.GetAllocator());
349+
msg.AddMember(rapidjson::StringRef("consumption_l2"), rapidjson::Value(0), msg.GetAllocator());
350+
msg.AddMember(rapidjson::StringRef("consumption_l3"), rapidjson::Value(0), msg.GetAllocator());
351+
}
352+
else if (nb_phases == 2)
353+
{
354+
msg.AddMember(rapidjson::StringRef("consumption_l1"), rapidjson::Value(currents[0]), msg.GetAllocator());
355+
msg.AddMember(rapidjson::StringRef("consumption_l2"), rapidjson::Value(currents[1]), msg.GetAllocator());
356+
msg.AddMember(rapidjson::StringRef("consumption_l3"), rapidjson::Value(0), msg.GetAllocator());
357+
}
358+
else if (nb_phases == 3)
359+
{
360+
msg.AddMember(rapidjson::StringRef("consumption_l1"), rapidjson::Value(currents[0]), msg.GetAllocator());
361+
msg.AddMember(rapidjson::StringRef("consumption_l2"), rapidjson::Value(currents[1]), msg.GetAllocator());
362+
msg.AddMember(rapidjson::StringRef("consumption_l3"), rapidjson::Value(currents[2]), msg.GetAllocator());
363+
}
364+
323365
rapidjson::StringBuffer buffer;
324366
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
325367
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)