Skip to content

Commit fec64b8

Browse files
JavaIsJavaScriptgoekay
authored andcommitted
Implement TriggerMessage Function (steve-community#43)
* Implement TriggerMessage * TriggerMessage for multiple CP + Code style fix
1 parent a0b2f61 commit fec64b8

8 files changed

Lines changed: 185 additions & 12 deletions

File tree

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,11 @@ public void getCompositeSchedule(ChargePointSelect cp, GetCompositeScheduleTask
6262

6363
@Override
6464
public void triggerMessage(ChargePointSelect cp, TriggerMessageTask task) {
65-
throw new RuntimeException("Not implemented");
65+
if (cp.isSoap()) {
66+
create(cp).triggerMessageAsync(task.getOcpp16Request(), cp.getChargeBoxId(), task.getOcpp16Handler(cp.getChargeBoxId()));
67+
} else {
68+
runPipeline(cp, task);
69+
}
6670
}
6771

6872
@Override
Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,64 @@
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.TriggerMessageParams;
5+
6+
import javax.xml.ws.AsyncHandler;
7+
38
/**
49
* @author Sevket Goekay <goekay@dbis.rwth-aachen.de>
510
* @since 13.03.2018
611
*/
7-
public class TriggerMessageTask {
12+
public class TriggerMessageTask extends CommunicationTask<TriggerMessageParams, String> {
13+
14+
public TriggerMessageTask(OcppVersion ocppVersion, TriggerMessageParams params) {
15+
super(ocppVersion, params);
16+
}
17+
18+
@Override
19+
public OcppCallback<String> defaultCallback() {
20+
return new StringOcppCallback();
21+
}
22+
23+
@Deprecated
24+
@Override
25+
public <T extends RequestType> T getOcpp12Request() {
26+
throw new RuntimeException("Not supported");
27+
}
28+
29+
@Deprecated
30+
@Override
31+
public <T extends RequestType> T getOcpp15Request() {
32+
throw new RuntimeException("Not supported");
33+
}
34+
35+
@Override
36+
public ocpp.cp._2015._10.TriggerMessageRequest getOcpp16Request() {
37+
return new ocpp.cp._2015._10.TriggerMessageRequest()
38+
.withConnectorId(params.getConnectorId())
39+
.withRequestedMessage(params.getTriggerMessage());
40+
}
41+
42+
@Deprecated
43+
@Override
44+
public <T extends ResponseType> AsyncHandler<T> getOcpp12Handler(String chargeBoxId) {
45+
throw new RuntimeException("Not supported");
46+
}
47+
48+
@Deprecated
49+
@Override
50+
public <T extends ResponseType> AsyncHandler<T> getOcpp15Handler(String chargeBoxId) {
51+
throw new RuntimeException("Not supported");
52+
}
53+
54+
@Override
55+
public AsyncHandler<ocpp.cp._2015._10.TriggerMessageResponse> getOcpp16Handler(String chargeBoxId) {
56+
return res -> {
57+
try {
58+
success(chargeBoxId, String.valueOf(res.get().getStatus().value()));
59+
} catch (Exception e) {
60+
failed(chargeBoxId, e);
61+
}
62+
};
63+
}
864
}

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

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

3-
import de.rwth.idsg.steve.ocpp.ChargePointService12_Invoker;
4-
import de.rwth.idsg.steve.ocpp.ChargePointService15_Invoker;
5-
import de.rwth.idsg.steve.ocpp.ChargePointService16_InvokerImpl;
6-
import de.rwth.idsg.steve.ocpp.OcppVersion;
3+
import de.rwth.idsg.steve.ocpp.*;
4+
import de.rwth.idsg.steve.ocpp.task.TriggerMessageTask;
5+
import de.rwth.idsg.steve.web.dto.ocpp.TriggerMessageParams;
76
import lombok.extern.slf4j.Slf4j;
87
import org.springframework.beans.factory.annotation.Autowired;
98
import org.springframework.beans.factory.annotation.Qualifier;
@@ -30,8 +29,26 @@ protected ChargePointService12_Invoker getOcpp12Invoker() {
3029
return invoker16;
3130
}
3231

32+
@Override
3333
protected ChargePointService15_Invoker getOcpp15Invoker() {
3434
return invoker16;
3535
}
3636

37+
protected ChargePointService16_Invoker getOcpp16Invoker() {
38+
return invoker16;
39+
}
40+
41+
// -------------------------------------------------------------------------
42+
// Multiple Execution - since OCPP 1.6
43+
// -------------------------------------------------------------------------
44+
45+
public int triggerMessage(TriggerMessageParams params) {
46+
TriggerMessageTask task = new TriggerMessageTask(getVersion(), params);
47+
48+
BackgroundService.with(executorService)
49+
.forEach(task.getParams().getChargePointSelectList())
50+
.execute(c -> getOcpp16Invoker().triggerMessage(c, task));
51+
52+
return requestTaskStore.add(task);
53+
}
3754
}

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

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +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;
6+
import de.rwth.idsg.steve.web.dto.ocpp.*;
97
import org.springframework.beans.factory.annotation.Autowired;
108
import org.springframework.beans.factory.annotation.Qualifier;
119
import org.springframework.stereotype.Controller;
@@ -85,6 +83,10 @@ protected String getPrefix() {
8583
return "op16";
8684
}
8785

86+
private void setTriggerMessages(Model model) {
87+
model.addAttribute("triggerMessage", TriggerMessageEnum.values());
88+
}
89+
8890
// -------------------------------------------------------------------------
8991
// Old Http methods with changed logic
9092
// -------------------------------------------------------------------------
@@ -140,7 +142,24 @@ public String getSetChargingProfile(Model model) {
140142

141143
@RequestMapping(value = TRIGGER_MESSAGE_PATH, method = RequestMethod.GET)
142144
public String getTriggerMessage(Model model) {
143-
model.addAttribute("opVersion", "v1.6");
145+
setCommonAttributes(model);
146+
setTriggerMessages(model);
147+
model.addAttribute(PARAMS, new TriggerMessageParams());
144148
return getPrefix() + TRIGGER_MESSAGE_PATH;
145149
}
150+
151+
// -------------------------------------------------------------------------
152+
// Http methods (POST)
153+
// -------------------------------------------------------------------------
154+
155+
@RequestMapping(value = TRIGGER_MESSAGE_PATH, method = RequestMethod.POST)
156+
public String postTriggerMessage(@Valid @ModelAttribute(PARAMS) TriggerMessageParams params,
157+
BindingResult result, Model model) {
158+
if (result.hasErrors()) {
159+
setCommonAttributes(model);
160+
setTriggerMessages(model);
161+
return getPrefix() + TRIGGER_MESSAGE_PATH;
162+
}
163+
return REDIRECT_TASKS_PATH + getClient16().triggerMessage(params);
164+
}
146165
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package de.rwth.idsg.steve.web.dto.ocpp;
2+
3+
import lombok.Getter;
4+
5+
/**
6+
* @author David Rerimassie <david@rerimassie.nl>
7+
* @since 20.03.2018
8+
*/
9+
public enum TriggerMessageEnum {
10+
BOOT_NOTIFICATION("BootNotification"),
11+
DIAGNOSTICS_STATUS_NOTIFICATION("DiagnosticsStatusNotification"),
12+
FIRMWARE_STATUS_NOTIFICATION("FirmwareStatusNotification"),
13+
HEARTBEAT("Heartbeat"),
14+
METER_VALUES("MeterValues"),
15+
STATUS_NOTIFICATION("StatusNotification");
16+
17+
private final String value;
18+
@Getter private final String text;
19+
20+
TriggerMessageEnum(String value) {
21+
this.value = value;
22+
this.text = String.format("%s", value);
23+
}
24+
25+
public String value() {
26+
return value;
27+
}
28+
29+
public static TriggerMessageEnum fromValue(String v) {
30+
for (TriggerMessageEnum c: TriggerMessageEnum.values()) {
31+
if (c.value.equals(v)) {
32+
return c;
33+
}
34+
}
35+
throw new IllegalArgumentException(v);
36+
}
37+
}
38+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package de.rwth.idsg.steve.web.dto.ocpp;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
import ocpp.cp._2015._10.MessageTrigger;
6+
7+
import javax.validation.constraints.NotNull;
8+
9+
/**
10+
* @author David Rerimassie <david@rerimassie.nl>
11+
* @since 20.03.2018
12+
*/
13+
@Setter
14+
@Getter
15+
public class TriggerMessageParams extends MultipleChargePointSelect {
16+
@NotNull(message = "Requested Message required")
17+
private MessageTrigger triggerMessage;
18+
19+
private Integer connectorId;
20+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<form:form action="${ctxPath}/manager/operations/${opVersion}/TriggerMessage" 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>Trigger Message :</td>
8+
<td>
9+
<form:select path="triggerMessage">
10+
<form:options items="${triggerMessage}" itemLabel="text" />
11+
</form:select>
12+
</td>
13+
</tr>
14+
<tr>
15+
<td>Connector ID (integer > 0):</td>
16+
<td><form:input path="connectorId" placeholder="optional"/></td>
17+
</tr>
18+
<tr><td></td><td><div class="submit-button"><input type="submit" value="Perform"></div></td></tr>
19+
</table>
20+
</form:form>

src/main/resources/webapp/WEB-INF/views/op16/TriggerMessage.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/TriggerMessage.jsp" %>
3131
</div></div>
32-
</div></div>
3332
<%@ include file="../00-footer.jsp" %>

0 commit comments

Comments
 (0)