Skip to content

Commit f22853c

Browse files
add GetCompositeSchedule without Charging Schedule
1 parent 8784c72 commit f22853c

File tree

8 files changed

+213
-10
lines changed

8 files changed

+213
-10
lines changed

src/main/java/de/rwth/idsg/steve/ocpp/ChargePointService16_InvokerImpl.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,11 @@ public void setChargingProfile(ChargePointSelect cp, SetChargingProfileTask task
5656

5757
@Override
5858
public void getCompositeSchedule(ChargePointSelect cp, GetCompositeScheduleTask task) {
59-
// TODO
60-
throw new RuntimeException("Not implemented");
59+
if (cp.isSoap()) {
60+
create(cp).getCompositeScheduleAsync(task.getOcpp16Request(), cp.getChargeBoxId(), task.getOcpp16Handler(cp.getChargeBoxId()));
61+
} else {
62+
runPipeline(cp, task);
63+
}
6164
}
6265

6366
@Override
Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,103 @@
11
package de.rwth.idsg.steve.ocpp.task;
22

3+
import de.rwth.idsg.steve.ocpp.*;
4+
import de.rwth.idsg.steve.web.dto.ocpp.GetCompositeScheduleParams;
5+
import lombok.Getter;
6+
import lombok.RequiredArgsConstructor;
7+
import ocpp.cp._2015._10.ChargingRateUnitType;
8+
import org.joda.time.DateTime;
9+
10+
import javax.xml.ws.AsyncHandler;
11+
312
/**
413
* @author Sevket Goekay <goekay@dbis.rwth-aachen.de>
14+
* @author David Rerimassie <david@rerimassie.nl>
515
* @since 13.03.2018
616
*/
7-
public class GetCompositeScheduleTask {
17+
public class GetCompositeScheduleTask extends CommunicationTask<GetCompositeScheduleParams, GetCompositeScheduleTask.ResponseWrapper> {
18+
19+
public GetCompositeScheduleTask(OcppVersion ocppVersion, GetCompositeScheduleParams params) {
20+
super(ocppVersion, params);
21+
}
22+
23+
@Override
24+
public OcppCallback<ResponseWrapper> defaultCallback() {
25+
return new DefaultOcppCallback<GetCompositeScheduleTask.ResponseWrapper>() {
26+
@Override
27+
public void success(String chargeBoxId, GetCompositeScheduleTask.ResponseWrapper response) {
28+
String status = response.getStatus();
29+
Integer connectorId = response.getConnectorId();
30+
DateTime scheduleStart = response.getScheduleStart();
31+
32+
StringBuilder builder = new StringBuilder(status);
33+
if (connectorId != null) {
34+
builder.append(" / Connector ID: ").append(connectorId);
35+
}
36+
if (scheduleStart != null) {
37+
builder.append(" / Schedule Start: ").append(scheduleStart);
38+
}
39+
addNewResponse(chargeBoxId, builder.toString());
40+
}
41+
};
42+
}
43+
44+
@Deprecated
45+
@Override
46+
public <T extends RequestType> T getOcpp12Request() {
47+
throw new RuntimeException("Not supported");
48+
}
49+
50+
@Deprecated
51+
@Override
52+
public <T extends RequestType> T getOcpp15Request() {
53+
throw new RuntimeException("Not supported");
54+
}
55+
56+
@Override
57+
public ocpp.cp._2015._10.GetCompositeScheduleRequest getOcpp16Request() {
58+
if (params.isSetChargingRateUnit()) {
59+
return new ocpp.cp._2015._10.GetCompositeScheduleRequest()
60+
.withConnectorId(params.getConnectorId())
61+
.withDuration(params.getDuration())
62+
.withChargingRateUnit(ChargingRateUnitType.fromValue(params.getChargingRateUnit().value()));
63+
} else {
64+
return new ocpp.cp._2015._10.GetCompositeScheduleRequest()
65+
.withConnectorId(params.getConnectorId())
66+
.withDuration(params.getDuration());
67+
}
68+
}
69+
70+
@Deprecated
71+
@Override
72+
public <T extends ResponseType> AsyncHandler<T> getOcpp12Handler(String chargeBoxId) {
73+
throw new RuntimeException("Not supported");
74+
}
75+
76+
@Deprecated
77+
@Override
78+
public <T extends ResponseType> AsyncHandler<T> getOcpp15Handler(String chargeBoxId) {
79+
throw new RuntimeException("Not supported");
80+
}
81+
82+
@Override
83+
public AsyncHandler<ocpp.cp._2015._10.GetCompositeScheduleResponse> getOcpp16Handler(String chargeBoxId) {
84+
return res -> {
85+
try {
86+
ocpp.cp._2015._10.GetCompositeScheduleResponse response = res.get();
87+
success(chargeBoxId, new ResponseWrapper(response.getStatus().value(),
88+
response.getConnectorId(),
89+
response.getScheduleStart()));
90+
} catch (Exception e) {
91+
failed(chargeBoxId, e);
92+
}
93+
};
94+
}
95+
96+
@Getter
97+
@RequiredArgsConstructor
98+
public static class ResponseWrapper {
99+
private final String status;
100+
private final Integer connectorId;
101+
private final DateTime scheduleStart;
102+
}
8103
}

src/main/java/de/rwth/idsg/steve/service/ChargePointService16_Client.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package de.rwth.idsg.steve.service;
22

33
import de.rwth.idsg.steve.ocpp.*;
4+
import de.rwth.idsg.steve.ocpp.task.GetCompositeScheduleTask;
45
import de.rwth.idsg.steve.ocpp.task.TriggerMessageTask;
6+
import de.rwth.idsg.steve.web.dto.ocpp.GetCompositeScheduleParams;
57
import de.rwth.idsg.steve.web.dto.ocpp.TriggerMessageParams;
68
import lombok.extern.slf4j.Slf4j;
79
import org.springframework.beans.factory.annotation.Autowired;
@@ -51,4 +53,14 @@ public int triggerMessage(TriggerMessageParams params) {
5153

5254
return requestTaskStore.add(task);
5355
}
56+
57+
public int getCompositeSchedule(GetCompositeScheduleParams params) {
58+
GetCompositeScheduleTask task = new GetCompositeScheduleTask(getVersion(), params);
59+
60+
BackgroundService.with(executorService)
61+
.forEach(task.getParams().getChargePointSelectList())
62+
.execute(c -> getOcpp16Invoker().getCompositeSchedule(c, task));
63+
64+
return requestTaskStore.add(task);
65+
}
5466
}

src/main/java/de/rwth/idsg/steve/web/controller/Ocpp16Controller.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
import de.rwth.idsg.steve.service.ChargePointService12_Client;
44
import de.rwth.idsg.steve.service.ChargePointService15_Client;
55
import de.rwth.idsg.steve.service.ChargePointService16_Client;
6-
import de.rwth.idsg.steve.web.dto.ocpp.ChangeConfigurationParams;
7-
import de.rwth.idsg.steve.web.dto.ocpp.ConfigurationKeyEnum;
8-
import de.rwth.idsg.steve.web.dto.ocpp.GetConfigurationParams;
9-
import de.rwth.idsg.steve.web.dto.ocpp.TriggerMessageParams;
6+
import de.rwth.idsg.steve.web.dto.ocpp.*;
107
import org.springframework.beans.factory.annotation.Autowired;
118
import org.springframework.beans.factory.annotation.Qualifier;
129
import org.springframework.stereotype.Controller;
@@ -123,7 +120,8 @@ public String postGetConf(@Valid @ModelAttribute(PARAMS) GetConfigurationParams
123120

124121
@RequestMapping(value = GET_COMPOSITE_PATH, method = RequestMethod.GET)
125122
public String getCompositePath(Model model) {
126-
model.addAttribute("opVersion", "v1.6");
123+
setCommonAttributes(model);
124+
model.addAttribute(PARAMS, new GetCompositeScheduleParams());
127125
return getPrefix() + GET_COMPOSITE_PATH;
128126
}
129127

@@ -150,6 +148,16 @@ public String getTriggerMessage(Model model) {
150148
// Http methods (POST)
151149
// -------------------------------------------------------------------------
152150

151+
@RequestMapping(value = GET_COMPOSITE_PATH, method = RequestMethod.POST)
152+
public String postGetCompositePath(@Valid @ModelAttribute(PARAMS) GetCompositeScheduleParams params,
153+
BindingResult result, Model model) {
154+
if (result.hasErrors()) {
155+
setCommonAttributes(model);
156+
return getPrefix() + GET_COMPOSITE_PATH;
157+
}
158+
return REDIRECT_TASKS_PATH + getClient16().getCompositeSchedule(params);
159+
}
160+
153161
@RequestMapping(value = TRIGGER_MESSAGE_PATH, method = RequestMethod.POST)
154162
public String postTriggerMessage(@Valid @ModelAttribute(PARAMS) TriggerMessageParams params,
155163
BindingResult result, Model model) {
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package de.rwth.idsg.steve.web.dto.ocpp;
2+
3+
public enum ChargingRateUnitTypeEnum {
4+
W("W"),
5+
A("A");
6+
7+
private final String value;
8+
9+
ChargingRateUnitTypeEnum(String value) {
10+
this.value = value;
11+
}
12+
13+
public String value() {
14+
return value;
15+
}
16+
17+
public static ChargingRateUnitTypeEnum fromValue(String v) {
18+
for (ChargingRateUnitTypeEnum c : ChargingRateUnitTypeEnum.values()) {
19+
if (c.value.equals(v)) {
20+
return c;
21+
}
22+
}
23+
throw new IllegalArgumentException(v);
24+
}
25+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package de.rwth.idsg.steve.web.dto.ocpp;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
6+
import javax.validation.constraints.NotNull;
7+
8+
/**
9+
* @author David Rerimassie <david@rerimassie.nl>
10+
* @since 20.03.2018
11+
*/
12+
@Setter
13+
@Getter
14+
public class GetCompositeScheduleParams extends MultipleChargePointSelect {
15+
16+
private Integer connectorId;
17+
18+
@NotNull(message = "Duration is required.")
19+
private Integer duration;
20+
21+
private ChargingRateUnitTypeEnum chargingRateUnit;
22+
23+
public void setConnectorId(Integer connectorId) {
24+
if (connectorId == null) {
25+
this.connectorId = 0;
26+
} else {
27+
this.connectorId = connectorId;
28+
}
29+
}
30+
31+
public boolean isSetChargingRateUnit() {
32+
return chargingRateUnit != null && !chargingRateUnit.equals("");
33+
}
34+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<form:form action="${ctxPath}/manager/operations/${opVersion}/GetCompositeSchedule" modelAttribute="params">
2+
<section><span>Charge Points with OCPP ${opVersion}</span></section>
3+
<%@ include file="../00-cp-multiple.jsp" %>
4+
<section><span>Parameters</span></section>
5+
<table class="userInput">
6+
<tr>
7+
<td>Connector ID (integer):</td>
8+
<td><form:input path="connectorId" placeholder="if empty, charge point as a whole" /></td>
9+
</tr>
10+
<tr>
11+
<td>Duration (integer):</td>
12+
<td><form:input path="duration" placeholder="required" /></td>
13+
</tr>
14+
<tr>
15+
<td>Charging Rate Unit :</td>
16+
<td>
17+
<form:select path="chargingRateUnit">
18+
<form:option style="color:gray" value="" label="optional" />
19+
<form:options items="${chargingRateUnit}"/>
20+
</form:select>
21+
</td>
22+
</tr>
23+
<tr>
24+
<td></td><td><div class="submit-button"><input type="submit" value="Perform"></div></td>
25+
</tr>
26+
</table>
27+
</form:form>

src/main/resources/webapp/WEB-INF/views/op16/GetCompositeSchedule.jsp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
</ul>
2828
</div>
2929
<div class="op16-content">
30-
<center><i>Not implemented.</i></center>
30+
<%@ include file="../op-forms/GetCompositeScheduleForm.jsp" %>
3131
</div></div>
32-
</div></div>
3332
<%@ include file="../00-footer.jsp" %>

0 commit comments

Comments
 (0)