Skip to content

Commit

Permalink
Merge branch 'release/2019.15.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
sfeilmeier committed Nov 8, 2019
2 parents 7bae8c1 + a5483d6 commit cb1dd16
Show file tree
Hide file tree
Showing 88 changed files with 3,406 additions and 1,026 deletions.
2 changes: 1 addition & 1 deletion cnf/pom.xml
Expand Up @@ -14,7 +14,7 @@
<dependency>
<groupId>com.fazecast</groupId>
<artifactId>jSerialComm</artifactId>
<version>2.5.2</version>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.ghgande</groupId>
Expand Down
4 changes: 2 additions & 2 deletions doc/build/package.json
Expand Up @@ -2,8 +2,8 @@
"name": "openems-doc",
"version": "1.0.0",
"dependencies": {
"@antora/cli": "^2.0.0",
"@antora/site-generator-default": "^2.0.0"
"@antora/cli": "^2.2.0",
"@antora/site-generator-default": "^2.2.0"
},
"devDependencies": {}
}
2 changes: 2 additions & 0 deletions doc/build/site.yml
Expand Up @@ -2,10 +2,12 @@ site:
title: Open Energy Management System
url: https://openems.github.io/openems.io/
start_page: openems::introduction.adoc
robots: allow

content:
sources:
- url: ./../../
edit_url: https://github.com/OpenEMS/openems/tree/{refname}/{path}
branches: HEAD
start_path: doc

Expand Down
4 changes: 2 additions & 2 deletions doc/modules/ROOT/pages/edge/controller.adoc.d/_include.adoc
Expand Up @@ -23,12 +23,12 @@ include::io.openems.edge.controller.debug.detailedlog.adoc[leveloffset=+1]

include::io.openems.edge.controller.debug.log.adoc[leveloffset=+1]

include::io.openems.edge.controller.dischargelimitconsideringcellvoltage.adoc[leveloffset=+1]

include::io.openems.edge.controller.ess.acisland.adoc[leveloffset=+1]

include::io.openems.edge.controller.ess.delaycharge.adoc[leveloffset=+1]

include::io.openems.edge.controller.ess.limitdischargecellvoltage.adoc[leveloffset=+1]

include::io.openems.edge.controller.ess.limittotaldischarge.adoc[leveloffset=+1]

include::io.openems.edge.controller.ess.onefullcycle.adoc[leveloffset=+1]
Expand Down
Expand Up @@ -27,6 +27,8 @@ include::io.openems.edge.fenecon.mini.adoc[leveloffset=+1]

include::io.openems.edge.fenecon.pro.adoc[leveloffset=+1]

include::io.openems.edge.goodwe.et.adoc[leveloffset=+1]

include::io.openems.edge.io.kmtronic.adoc[leveloffset=+1]

include::io.openems.edge.io.wago.adoc[leveloffset=+1]
Expand Down Expand Up @@ -70,3 +72,5 @@ include::io.openems.edge.solaredge.adoc[leveloffset=+1]
include::io.openems.edge.tesla.powerwall2.adoc[leveloffset=+1]

include::io.openems.edge.timedata.influxdb.adoc[leveloffset=+1]

include::io.openems.edge.timedata.rrd4j.adoc[leveloffset=+1]
2 changes: 1 addition & 1 deletion doc/modules/ROOT/pages/single_document.adoc
@@ -1,7 +1,7 @@
= OpenEMS - Open Energy Management System
ifndef::toc[]
(c) 2019 OpenEMS Association e.V.
Version 2019.14.0
Version 2019.15.0
:sectnums:
:sectnumlevels: 4
:toc:
Expand Down
24 changes: 12 additions & 12 deletions io.openems.backend.application/BackendApp.bndrun
Expand Up @@ -28,11 +28,13 @@
bnd.identity;id='io.openems.backend.timedata.dummy',\
bnd.identity;id='io.openems.backend.timedata.core',\
bnd.identity;id='io.openems.backend.uiwebsocket.impl'

-runbundles: \
com.google.gson;version='[2.8.5,2.8.6)',\
com.google.guava;version='[28.1.0,28.1.1)',\
com.google.guava.failureaccess;version='[1.0.1,1.0.2)',\
io.openems.backend.application;version=snapshot,\
io.openems.backend.b2brest;version=snapshot,\
io.openems.backend.b2bwebsocket;version=snapshot,\
io.openems.backend.common;version=snapshot,\
io.openems.backend.edgewebsocket.impl;version=snapshot,\
Expand All @@ -45,28 +47,26 @@
io.openems.backend.uiwebsocket.impl;version=snapshot,\
io.openems.common;version=snapshot,\
io.openems.shared.influxdb;version=snapshot,\
io.openems.wrapper.fastexcel;version=snapshot,\
io.openems.wrapper.influxdb-java;version=snapshot,\
io.openems.wrapper.opczip;version=snapshot,\
io.openems.wrapper.websocket;version=snapshot,\
org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\
org.apache.servicemix.bundles.ws-commons-util;version='[1.0.2,1.0.3)',\
org.apache.servicemix.bundles.xmlrpc-client;version='[3.1.3,3.1.4)',\
json;version='[20160212.0.0,20160212.0.1)',\
org.apache.commons.fileupload;version='[1.3.2,1.3.3)',\
org.apache.commons.io;version='[2.5.0,2.5.1)',\
org.apache.felix.configadmin;version='[1.8.8,1.8.9)',\
org.apache.felix.http.jetty;version='[3.2.0,3.2.1)',\
org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\
org.apache.felix.log;version='[1.0.1,1.0.2)',\
org.apache.felix.scr;version='[2.0.2,2.0.3)',\
org.apache.felix.webconsole;version='[4.2.16,4.2.17)',\
org.apache.servicemix.bundles.ws-commons-util;version='[1.0.2,1.0.3)',\
org.apache.servicemix.bundles.xmlrpc-client;version='[3.1.3,3.1.4)',\
org.eclipse.equinox.event;version='[1.3.100,1.3.101)',\
org.eclipse.equinox.metatype;version='[1.4.100,1.4.101)',\
org.osgi.service.event;version='[1.3.1,1.3.2)',\
org.osgi.service.metatype;version='[1.3.0,1.3.1)',\
org.jsr-305;version='[3.0.2,3.0.3)',\
io.openems.backend.b2brest;version=snapshot,\
io.openems.wrapper.fastexcel;version=snapshot,\
io.openems.wrapper.opczip;version=snapshot,\
com.google.guava;version='[28.1.0,28.1.1)',\
org.postgresql.jdbc42;version='[42.2.7,42.2.8)',\
org.ops4j.pax.logging.pax-logging-api;version='[1.11.2,1.11.3)',\
org.ops4j.pax.logging.pax-logging-service;version='[1.11.2,1.11.3)'
org.ops4j.pax.logging.pax-logging-service;version='[1.11.2,1.11.3)',\
org.osgi.service.event;version='[1.3.1,1.3.2)',\
org.osgi.service.metatype;version='[1.3.0,1.3.1)',\
org.postgresql.jdbc42;version='[42.2.7,42.2.8)'
Expand Up @@ -44,9 +44,12 @@
import io.openems.common.jsonrpc.base.GenericJsonrpcResponseSuccess;
import io.openems.common.jsonrpc.base.JsonrpcMessage;
import io.openems.common.jsonrpc.base.JsonrpcRequest;
import io.openems.common.jsonrpc.base.JsonrpcResponseError;
import io.openems.common.jsonrpc.base.JsonrpcResponseSuccess;
import io.openems.common.jsonrpc.request.ComponentJsonApiRequest;
import io.openems.common.jsonrpc.request.EdgeRpcRequest;
import io.openems.common.jsonrpc.request.SetGridConnScheduleRequest;
import io.openems.common.jsonrpc.response.EdgeRpcResponse;
import io.openems.common.session.Role;
import io.openems.common.session.User;
import io.openems.common.types.ChannelAddress;
Expand Down Expand Up @@ -132,11 +135,30 @@ private void sendOkResponse(Request baseRequest, HttpServletResponse response, J
}
}

private void sendErrorResponse(Request baseRequest, HttpServletResponse response, UUID jsonrpcId, Throwable ex) {
try {
response.setContentType("application/json");
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
baseRequest.setHandled(true);
JsonrpcResponseError message;
if (ex instanceof OpenemsNamedException) {
// Get Named Exception error response
message = new JsonrpcResponseError(jsonrpcId, (OpenemsNamedException) ex);
} else {
// Get GENERIC error response
message = new JsonrpcResponseError(jsonrpcId, ex.getMessage());
}
response.getWriter().write(message.toString());
} catch (IOException e) {
this.parent.logWarn(this.log, "Unable to send Error-Response: " + e.getMessage());
}
}

/**
* Parses a Request to JSON.
*
* @param baseRequest the Request
* @return
* @return the {@link JsonObject}
* @throws OpenemsException on error
*/
private static JsonObject parseJson(Request baseRequest) throws OpenemsException {
Expand All @@ -152,78 +174,88 @@ private static JsonObject parseJson(Request baseRequest) throws OpenemsException
/**
* Handles an http request to 'jsonrpc' endpoint.
*
* @param user the User
* @param edgeRpcRequest the EdgeRpcRequest
* @return the JSON-RPC Success Response Future
* @throws OpenemsNamedException on error
* @throws ExecutionException
* @throws InterruptedException
* @param user the User
* @param baseRequest the {@link Request}
* @param httpRequest the {@link HttpServletRequest}
* @param httpResponse the {@link HttpServletResponse}
*/
private void handleJsonRpc(BackendUser user, Request baseRequest, HttpServletRequest httpRequest,
HttpServletResponse httpResponse) throws OpenemsNamedException {
// call handler methods
if (!httpRequest.getMethod().equals("POST")) {
throw new OpenemsException(
"Method [" + httpRequest.getMethod() + "] is not supported for JSON-RPC endpoint");
}
HttpServletResponse httpResponse) {
UUID requestId = new UUID(0L, 0L); /* dummy UUID */
try {
// call handler methods
if (!httpRequest.getMethod().equals("POST")) {
throw new OpenemsException(
"Method [" + httpRequest.getMethod() + "] is not supported for JSON-RPC endpoint");
}

// parse json and add "jsonrpc" and "id" properties if missing
JsonObject json = RestHandler.parseJson(baseRequest);
if (!json.has("jsonrpc")) {
json.addProperty("jsonrpc", "2.0");
}
if (!json.has("id")) {
json.addProperty("id", UUID.randomUUID().toString());
}
if (json.has("params")) {
JsonObject params = JsonUtils.getAsJsonObject(json, "params");
if (params.has("payload")) {
JsonObject payload = JsonUtils.getAsJsonObject(params, "payload");
if (!payload.has("jsonrpc")) {
payload.addProperty("jsonrpc", "2.0");
}
if (!payload.has("id")) {
payload.addProperty("id", UUID.randomUUID().toString());
// parse json and add "jsonrpc" and "id" properties if missing
JsonObject json = RestHandler.parseJson(baseRequest);
if (!json.has("jsonrpc")) {
json.addProperty("jsonrpc", "2.0");
}
if (!json.has("id")) {
json.addProperty("id", UUID.randomUUID().toString());
}
if (json.has("params")) {
JsonObject params = JsonUtils.getAsJsonObject(json, "params");
if (params.has("payload")) {
JsonObject payload = JsonUtils.getAsJsonObject(params, "payload");
if (!payload.has("jsonrpc")) {
payload.addProperty("jsonrpc", "2.0");
}
if (!payload.has("id")) {
payload.addProperty("id", UUID.randomUUID().toString());
}
params.add("payload", payload);
}
params.add("payload", payload);
json.add("params", params);
}
// parse JSON-RPC Request
JsonrpcMessage message = JsonrpcMessage.from(json);
if (!(message instanceof JsonrpcRequest)) {
throw new OpenemsException("Only JSON-RPC Request is supported here.");
}
JsonrpcRequest request = (JsonrpcRequest) message;

// handle the request
CompletableFuture<? extends JsonrpcResponseSuccess> responseFuture = this.handleJsonRpcRequest(user,
request);

// wait for response
JsonrpcResponseSuccess response;
try {
response = responseFuture.get();
} catch (InterruptedException | ExecutionException e) {
this.sendErrorResponse(baseRequest, httpResponse, request.getId(),
new OpenemsException("Unable to get Response: " + e.getMessage()));
return;
}
json.add("params", params);
}

// parse JSON-RPC Request
JsonrpcMessage message = JsonrpcMessage.from(json);
if (!(message instanceof JsonrpcRequest)) {
throw new OpenemsException("Only JSON-RPC Request is supported here.");
}
JsonrpcRequest request = (JsonrpcRequest) message;

// handle the request
CompletableFuture<? extends JsonrpcResponseSuccess> responseFuture = this.handleJsonRpcRequest(user, request);
// send response
this.sendOkResponse(baseRequest, httpResponse, response.toJsonObject());

// wait for response
JsonrpcResponseSuccess response;
try {
response = responseFuture.get();
} catch (InterruptedException | ExecutionException e) {
throw new OpenemsException("Unable to get Response: " + e.getMessage());
} catch (OpenemsNamedException e) {
this.sendErrorResponse(baseRequest, httpResponse, requestId,
new OpenemsException("Unable to get Response: " + e.getMessage()));
}

// send response
this.sendOkResponse(baseRequest, httpResponse, response.toJsonObject());
}

/**
* Handles an JSON-RPC Request.
*
* @param user the User
* @param edgeRpcRequest the EdgeRpcRequest
* @param user the User
* @param request the JsonrpcRequest
* @return the JSON-RPC Success Response Future
* @throws OpenemsException on error
* @throws OpenemsNamedException on error
*/
private CompletableFuture<? extends JsonrpcResponseSuccess> handleJsonRpcRequest(BackendUser user,
JsonrpcRequest request) throws OpenemsException, OpenemsNamedException {
JsonrpcRequest request) throws OpenemsNamedException {
switch (request.getMethod()) {

case EdgeRpcRequest.METHOD:
return this.handleEdgeRpcRequest(user, request.getId(), EdgeRpcRequest.from(request));

case GetEdgesStatusRequest.METHOD:
return this.handleGetStatusOfEdgesRequest(user, request.getId(), GetEdgesStatusRequest.from(request));

Expand All @@ -241,6 +273,64 @@ private CompletableFuture<? extends JsonrpcResponseSuccess> handleJsonRpcRequest
}
}

/**
* Handles an EdgeRpcRequest.
*
* @param backendUser the {@link BackendUser}
* @param edgeRpcRequest the {@link EdgeRpcRequest}
* @param messageId the JSON-RPC Message-ID
* @return the JSON-RPC Success Response Future
* @throws OpenemsNamedException on error
*/
private CompletableFuture<EdgeRpcResponse> handleEdgeRpcRequest(BackendUser backendUser, UUID messageId,
EdgeRpcRequest edgeRpcRequest) throws OpenemsNamedException {
String edgeId = edgeRpcRequest.getEdgeId();
JsonrpcRequest request = edgeRpcRequest.getPayload();
User user = backendUser.getAsCommonUser(edgeId);
user.assertRoleIsAtLeast(EdgeRpcRequest.METHOD, Role.GUEST);

CompletableFuture<JsonrpcResponseSuccess> resultFuture;
switch (request.getMethod()) {

case ComponentJsonApiRequest.METHOD:
resultFuture = this.handleComponentJsonApiRequest(edgeId, user, ComponentJsonApiRequest.from(request));
break;

default:
throw OpenemsError.JSONRPC_UNHANDLED_METHOD.exception(request.getMethod());
}

// Wrap reply in EdgeRpcResponse
CompletableFuture<EdgeRpcResponse> result = new CompletableFuture<EdgeRpcResponse>();
resultFuture.whenComplete((r, ex) -> {
if (ex != null) {
result.completeExceptionally(ex);
} else if (r != null) {
result.complete(new EdgeRpcResponse(edgeRpcRequest.getId(), r));
} else {
result.completeExceptionally(
new OpenemsNamedException(OpenemsError.JSONRPC_UNHANDLED_METHOD, request.getMethod()));
}
});
return result;
}

/**
* Handles a ComponentJsonApiRequest.
*
* @param edgeId the Edge-ID
* @param user the User - Installer-level required
* @param componentJsonApiRequest the ComponentJsonApiRequest
* @return the Future JSON-RPC Response
* @throws OpenemsNamedException on error
*/
private CompletableFuture<JsonrpcResponseSuccess> handleComponentJsonApiRequest(String edgeId, User user,
ComponentJsonApiRequest componentJsonApiRequest) throws OpenemsNamedException {
user.assertRoleIsAtLeast(ComponentJsonApiRequest.METHOD, Role.GUEST);

return this.parent.edgeWebsocket.send(edgeId, user, componentJsonApiRequest);
}

/**
* Handles a GetStatusOfEdgesRequest.
*
Expand Down
Expand Up @@ -173,7 +173,7 @@ private void handleTimestampedDataNotification(TimestampedDataNotification messa
}
}
}
edge.setSumState(levelOpt.orElse(null), activeStateChannels);
edge.setComponentState(activeStateChannels);
}
}
}
Expand Down

0 comments on commit cb1dd16

Please sign in to comment.