From 8c647a5d6edbc20bda1b773c221603566b15d490 Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Thu, 26 Aug 2021 22:32:32 +0200 Subject: [PATCH 01/22] Start development of version 2021.15.0-SNAPSHOT --- doc/modules/ROOT/pages/single_document.adoc | 2 +- io.openems.common/src/io/openems/common/OpenemsConstants.java | 4 ++-- ui/package-lock.json | 2 +- ui/package.json | 2 +- ui/src/app/user/user.component.html | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/modules/ROOT/pages/single_document.adoc b/doc/modules/ROOT/pages/single_document.adoc index c104cb51843..7fba5970518 100644 --- a/doc/modules/ROOT/pages/single_document.adoc +++ b/doc/modules/ROOT/pages/single_document.adoc @@ -1,7 +1,7 @@ = OpenEMS - Open Energy Management System ifndef::toc[] (c) 2020 OpenEMS Association e.V. -Version 2021.14.0 +Version 2021.15.0-SNAPSHOT :sectnums: :sectnumlevels: 4 :toc: diff --git a/io.openems.common/src/io/openems/common/OpenemsConstants.java b/io.openems.common/src/io/openems/common/OpenemsConstants.java index 18d96164dad..bdd931fb441 100644 --- a/io.openems.common/src/io/openems/common/OpenemsConstants.java +++ b/io.openems.common/src/io/openems/common/OpenemsConstants.java @@ -20,7 +20,7 @@ public class OpenemsConstants { * * This is usually the number of the sprint within the year */ - public final static short VERSION_MINOR = 14; + public final static short VERSION_MINOR = 15; /** * The patch version of OpenEMS. @@ -32,7 +32,7 @@ public class OpenemsConstants { /** * The additional version string */ - public final static String VERSION_STRING = ""; + public final static String VERSION_STRING = "SNAPSHOT"; /** * The complete version as a SemanticVersion. diff --git a/ui/package-lock.json b/ui/package-lock.json index 94ffd340c54..54c774908dd 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,6 +1,6 @@ { "name": "openems-ui", - "version": "2021.14.0", + "version": "2021.15.0-SNAPSHOT", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/ui/package.json b/ui/package.json index fd689159224..3d69585d7af 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "openems-ui", - "version": "2021.14.0", + "version": "2021.15.0-SNAPSHOT", "author": "OpenEMS Association e.V.", "homepage": "http://openems.io", "scripts": { diff --git a/ui/src/app/user/user.component.html b/ui/src/app/user/user.component.html index a503242f009..7b94de4d61c 100644 --- a/ui/src/app/user/user.component.html +++ b/ui/src/app/user/user.component.html @@ -96,8 +96,8 @@ About.openEMS
  • - - About.build: 2021.14.0 (2021-08-26) + + About.build: 2021.15.0-SNAPSHOT
  • From 89a334887427abe614ee19701160308e00804404 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Aug 2021 12:45:45 +0200 Subject: [PATCH 02/22] Bump OCPP-J and v1_6 from 1.0 to 1.0.1 in /cnf (#1598) * Bump v1_6 from 1.0 to 1.0.1 in /cnf Bumps [v1_6](https://github.com/ChargeTimeEU/Java-OCA-OCPP) from 1.0 to 1.0.1. - [Release notes](https://github.com/ChargeTimeEU/Java-OCA-OCPP/releases) - [Commits](https://github.com/ChargeTimeEU/Java-OCA-OCPP/commits) --- updated-dependencies: - dependency-name: eu.chargetime.ocpp:v1_6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Bump OCPP-J from 1.0 to 1.0.1 in /cnf Bumps [OCPP-J](https://github.com/ChargeTimeEU/Java-OCA-OCPP) from 1.0 to 1.0.1. - [Release notes](https://github.com/ChargeTimeEU/Java-OCA-OCPP/releases) - [Commits](https://github.com/ChargeTimeEU/Java-OCA-OCPP/commits) --- updated-dependencies: - dependency-name: eu.chargetime.ocpp:OCPP-J dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update bnd files Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 4 ++-- io.openems.wrapper.eu.chargetime.ocpp/generated/buildfiles | 1 - io.openems.wrapper/bnd.bnd | 6 +++--- io.openems.wrapper/eu.chargetime.ocpp.bnd | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) delete mode 100644 io.openems.wrapper.eu.chargetime.ocpp/generated/buildfiles diff --git a/cnf/pom.xml b/cnf/pom.xml index 258eb4d8170..7bfa4e0326a 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -100,13 +100,13 @@ eu.chargetime.ocpp OCPP-J - 1.0 + 1.0.1 eu.chargetime.ocpp v1_6 - 1.0 + 1.0.1 diff --git a/io.openems.wrapper.eu.chargetime.ocpp/generated/buildfiles b/io.openems.wrapper.eu.chargetime.ocpp/generated/buildfiles deleted file mode 100644 index 02e7708a0b2..00000000000 --- a/io.openems.wrapper.eu.chargetime.ocpp/generated/buildfiles +++ /dev/null @@ -1 +0,0 @@ -/mnt/c/Users/stefan.feilmeier/fems/develop2/io.openems.wrapper.eu.chargetime.ocpp/generated/io.openems.wrapper.eu.chargetime.ocpp.jar diff --git a/io.openems.wrapper/bnd.bnd b/io.openems.wrapper/bnd.bnd index 5fc250746b0..0937600b763 100644 --- a/io.openems.wrapper/bnd.bnd +++ b/io.openems.wrapper/bnd.bnd @@ -10,9 +10,9 @@ Bundle-Description: This wraps external java libraries that do not have OSGi hea com.squareup.okio:okio;version='1.17.2',\ com.squareup.retrofit2:converter-moshi;version='2.9.0',\ com.squareup.retrofit2:retrofit;version='2.9.0',\ - eu.chargetime.ocpp:OCPP-J,\ - eu.chargetime.ocpp:common,\ - eu.chargetime.ocpp:v1_6,\ + eu.chargetime.ocpp:OCPP-J;version='1.0.1',\ + eu.chargetime.ocpp:common;version='1.0',\ + eu.chargetime.ocpp:v1_6;version='1.0.1',\ info.faljse:SDNotify;version='1.3',\ org.dhatim:fastexcel;version='0.12.11',\ org.eclipse.paho.mqttv5.client;version='1.2.5',\ diff --git a/io.openems.wrapper/eu.chargetime.ocpp.bnd b/io.openems.wrapper/eu.chargetime.ocpp.bnd index 87939371359..956ffa3b378 100644 --- a/io.openems.wrapper/eu.chargetime.ocpp.bnd +++ b/io.openems.wrapper/eu.chargetime.ocpp.bnd @@ -5,8 +5,8 @@ Bundle-License: https://opensource.org/licenses/LGPL-2.1 Bundle-Version: 1.0 Include-Resource: \ - @v1_6-1.0.jar, \ - @OCPP-J-1.0.jar, \ + @v1_6-1.0.1.jar, \ + @OCPP-J-1.0.1.jar, \ @common-1.0.jar -dsannotations: * From 0931705ccb21437fb9bf645fd39541ec5a4b9690 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Aug 2021 12:34:27 +0200 Subject: [PATCH 03/22] Bump gson from 2.8.7 to 2.8.8 in /cnf (#1600) * Bump gson from 2.8.7 to 2.8.8 in /cnf Bumps [gson](https://github.com/google/gson) from 2.8.7 to 2.8.8. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.8.7...gson-parent-2.8.8) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update bnd and bndrun files Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/build.bnd | 2 +- cnf/pom.xml | 2 +- io.openems.backend.application/BackendApp.bndrun | 2 +- io.openems.edge.application/EdgeApp.bndrun | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cnf/build.bnd b/cnf/build.bnd index 27af124751a..5c01cb780e0 100644 --- a/cnf/build.bnd +++ b/cnf/build.bnd @@ -62,7 +62,7 @@ buildpath: \ osgi.cmpn;version='7.0.0',\ slf4j.api;version='1.7.32',\ com.google.guava;version='30.1.1',\ - com.google.gson;version='2.8.7' + com.google.gson;version='2.8.8' testpath: \ slf4j.simple,\ diff --git a/cnf/pom.xml b/cnf/pom.xml index 7bfa4e0326a..2f91adede3e 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -29,7 +29,7 @@ com.google.code.gson gson - 2.8.7 + 2.8.8 com.google.guava diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index c8c7525b07e..f12f1a52357 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -39,7 +39,7 @@ -runbundles: \ Java-WebSocket;version='[1.5.2,1.5.3)',\ - com.google.gson;version='[2.8.7,2.8.8)',\ + com.google.gson;version='[2.8.8,2.8.9)',\ com.google.guava;version='[30.1.1,30.1.2)',\ com.google.guava.failureaccess;version='[1.0.1,1.0.2)',\ com.zaxxer.HikariCP;version='[4.0.3,4.0.4)',\ diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index cdf28d695c2..29a1f8fb21f 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -151,7 +151,7 @@ Java-WebSocket;version='[1.5.2,1.5.3)',\ com.fazecast.jSerialComm;version='[2.5.1,2.5.2)',\ com.ghgande.j2mod;version='[2.5.5,2.5.6)',\ - com.google.gson;version='[2.8.7,2.8.8)',\ + com.google.gson;version='[2.8.8,2.8.9)',\ com.google.guava;version='[30.1.1,30.1.2)',\ com.google.guava.failureaccess;version='[1.0.1,1.0.2)',\ com.sun.jna;version='[5.8.0,5.8.1)',\ From 1b19e4807c5eccd05ed1ccf9c166f056957d93c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Aug 2021 13:29:50 +0200 Subject: [PATCH 04/22] Bump jna from 5.8.0 to 5.9.0 in /cnf (#1601) * Bump jna from 5.8.0 to 5.9.0 in /cnf Bumps [jna](https://github.com/java-native-access/jna) from 5.8.0 to 5.9.0. - [Release notes](https://github.com/java-native-access/jna/releases) - [Changelog](https://github.com/java-native-access/jna/blob/master/CHANGES.md) - [Commits](https://github.com/java-native-access/jna/compare/5.8.0...5.9.0) --- updated-dependencies: - dependency-name: net.java.dev.jna:jna dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update bndrun Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 2 +- io.openems.edge.application/EdgeApp.bndrun | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index 2f91adede3e..12fcbcac8e5 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -125,7 +125,7 @@ net.java.dev.jna jna - 5.8.0 + 5.9.0 diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index 29a1f8fb21f..f074429694e 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -154,7 +154,7 @@ com.google.gson;version='[2.8.8,2.8.9)',\ com.google.guava;version='[30.1.1,30.1.2)',\ com.google.guava.failureaccess;version='[1.0.1,1.0.2)',\ - com.sun.jna;version='[5.8.0,5.8.1)',\ + com.sun.jna;version='[5.9.0,5.9.1)',\ io.openems.common;version=snapshot,\ io.openems.edge.application;version=snapshot,\ io.openems.edge.battery.api;version=snapshot,\ From 82db3f88104290b6ca41d7ec792242e3bdddc692 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Aug 2021 13:49:49 +0200 Subject: [PATCH 05/22] Bump jsoup from 1.10.2 to 1.14.2 in /cnf (#1609) * Bump jsoup from 1.10.2 to 1.14.2 in /cnf Bumps [jsoup](https://github.com/jhy/jsoup) from 1.10.2 to 1.14.2. - [Release notes](https://github.com/jhy/jsoup/releases) - [Changelog](https://github.com/jhy/jsoup/blob/master/CHANGES) - [Commits](https://github.com/jhy/jsoup/compare/jsoup-1.10.2...jsoup-1.14.2) --- updated-dependencies: - dependency-name: org.jsoup:jsoup dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update bndrun Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 2 +- io.openems.edge.application/EdgeApp.bndrun | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index 12fcbcac8e5..8feb7168a5b 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -228,7 +228,7 @@ org.jsoup jsoup - 1.10.2 + 1.14.2 org.osgi diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index f074429694e..97cda7b907e 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -307,7 +307,7 @@ org.apache.felix.webconsole;version='[4.6.2,4.6.3)',\ org.apache.felix.webconsole.plugins.ds;version='[2.1.0,2.1.1)',\ org.eclipse.paho.mqttv5.client;version='[1.2.5,1.2.6)',\ - org.jsoup;version='[1.10.2,1.10.3)',\ + org.jsoup;version='[1.14.2,1.14.3)',\ org.jsr-305;version='[3.0.2,3.0.3)',\ org.openmuc.jmbus;version='[3.3.0,3.3.1)',\ org.openmuc.jrxtx;version='[1.0.1,1.0.2)',\ From 4c8e04f99a67185a62ef6fa4c66edcd77e6a6f1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Aug 2021 14:19:02 +0200 Subject: [PATCH 06/22] Bump pax-logging-log4j1 from 2.0.9 to 2.0.10 in /cnf (#1607) * Bump pax-logging-log4j1 from 2.0.9 to 2.0.10 in /cnf Bumps [pax-logging-log4j1](https://github.com/ops4j/org.ops4j.pax.logging) from 2.0.9 to 2.0.10. - [Release notes](https://github.com/ops4j/org.ops4j.pax.logging/releases) - [Changelog](https://github.com/ops4j/org.ops4j.pax.logging/blob/main/RELEASE-NOTES.html) - [Commits](https://github.com/ops4j/org.ops4j.pax.logging/compare/logging-2.0.9...logging-2.0.10) --- updated-dependencies: - dependency-name: org.ops4j.pax.logging:pax-logging-log4j1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update pom.xml bndrun * Fix UTF-8 Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- build.gradle | 7 ++++++- cnf/pom.xml | 4 ++-- io.openems.backend.application/BackendApp.bndrun | 4 ++-- io.openems.edge.application/EdgeApp.bndrun | 4 ++-- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index e09eee0df8c..528821d6dd8 100644 --- a/build.gradle +++ b/build.gradle @@ -6,6 +6,11 @@ tasks.named('wrapper') { jarFile = rootProject.file('.gradle-wrapper/gradle-wrapper.jar') } +// UTF-8 +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + /* * Build OpenEMS Edge and Backend Components */ @@ -158,4 +163,4 @@ task buildAntoraDocs(dependsOn: copyBundleReadmes) { into "${buildDir}/www" } } -} \ No newline at end of file +} diff --git a/cnf/pom.xml b/cnf/pom.xml index 8feb7168a5b..c62a8a41d9d 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -248,12 +248,12 @@ org.ops4j.pax.logging pax-logging-api - 2.0.9 + 2.0.10 org.ops4j.pax.logging pax-logging-log4j1 - 2.0.9 + 2.0.10 org.osgi diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index f12f1a52357..06e9faf14fb 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -73,8 +73,8 @@ 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.jsr-305;version='[3.0.2,3.0.3)',\ - org.ops4j.pax.logging.pax-logging-api;version='[2.0.9,2.0.10)',\ - org.ops4j.pax.logging.pax-logging-log4j1;version='[2.0.9,2.0.10)',\ + org.ops4j.pax.logging.pax-logging-api;version='[2.0.10,2.0.11)',\ + org.ops4j.pax.logging.pax-logging-log4j1;version='[2.0.10,2.0.11)',\ org.osgi.service.jdbc;version='[1.0.0,1.0.1)',\ org.osgi.util.function;version='[1.1.0,1.1.1)',\ org.osgi.util.promise;version='[1.1.1,1.1.2)',\ diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index 97cda7b907e..10e0b787997 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -311,8 +311,8 @@ org.jsr-305;version='[3.0.2,3.0.3)',\ org.openmuc.jmbus;version='[3.3.0,3.3.1)',\ org.openmuc.jrxtx;version='[1.0.1,1.0.2)',\ - org.ops4j.pax.logging.pax-logging-api;version='[2.0.9,2.0.10)',\ - org.ops4j.pax.logging.pax-logging-log4j1;version='[2.0.9,2.0.10)',\ + org.ops4j.pax.logging.pax-logging-api;version='[2.0.10,2.0.11)',\ + org.ops4j.pax.logging.pax-logging-log4j1;version='[2.0.10,2.0.11)',\ org.osgi.util.function;version='[1.1.0,1.1.1)',\ org.osgi.util.promise;version='[1.1.1,1.1.2)',\ rrd4j;version='[3.8.0,3.8.1)' \ No newline at end of file From 52a9ef7af7b1b73de263ceae215f5c9cb9710a4b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Aug 2021 17:32:53 +0200 Subject: [PATCH 07/22] Bump org.apache.felix.webconsole from 4.6.2 to 4.6.4 in /cnf (#1608) * Bump org.apache.felix.webconsole from 4.6.2 to 4.6.4 in /cnf Bumps org.apache.felix.webconsole from 4.6.2 to 4.6.4. --- updated-dependencies: - dependency-name: org.apache.felix:org.apache.felix.webconsole dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] * Update bndrun files Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 2 +- io.openems.backend.application/BackendApp.bndrun | 2 +- io.openems.edge.application/EdgeApp.bndrun | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index c62a8a41d9d..809f81f1f79 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -186,7 +186,7 @@ org.apache.felix org.apache.felix.webconsole - 4.6.2 + 4.6.4 org.apache.felix diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index 06e9faf14fb..c3e8b07313c 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -68,7 +68,7 @@ org.apache.felix.inventory;version='[1.1.0,1.1.1)',\ org.apache.felix.metatype;version='[1.2.4,1.2.5)',\ org.apache.felix.scr;version='[2.1.20,2.1.21)',\ - org.apache.felix.webconsole;version='[4.6.2,4.6.3)',\ + org.apache.felix.webconsole;version='[4.6.4,4.6.5)',\ org.apache.felix.webconsole.plugins.ds;version='[2.1.0,2.1.1)',\ 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)',\ diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index 10e0b787997..b0c0b252d18 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -304,7 +304,7 @@ org.apache.felix.inventory;version='[1.1.0,1.1.1)',\ org.apache.felix.metatype;version='[1.2.4,1.2.5)',\ org.apache.felix.scr;version='[2.1.20,2.1.21)',\ - org.apache.felix.webconsole;version='[4.6.2,4.6.3)',\ + org.apache.felix.webconsole;version='[4.6.4,4.6.5)',\ org.apache.felix.webconsole.plugins.ds;version='[2.1.0,2.1.1)',\ org.eclipse.paho.mqttv5.client;version='[1.2.5,1.2.6)',\ org.jsoup;version='[1.14.2,1.14.3)',\ From ef2aeaf7b3686c39c08866945b6ee481d60bf59d Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Tue, 31 Aug 2021 18:11:46 +0200 Subject: [PATCH 08/22] Set UTF-8 for Javadoc (#1610) --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 528821d6dd8..be8a42db8b5 100644 --- a/build.gradle +++ b/build.gradle @@ -74,6 +74,7 @@ task buildAggregatedJavadocs(type: Javadoc, description: 'Generate javadocs from title = "OpenEMS Javadoc" subprojects.each { proj -> proj.tasks.withType(Javadoc).each { javadocTask -> + options.encoding = 'UTF-8' options.addStringOption('Xdoclint:none', '-quiet') source += javadocTask.source classpath += javadocTask.classpath From f25a6262dfd9ad2446a0bd8f4870233dab1c2dbd Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Mon, 6 Sep 2021 21:57:40 +0200 Subject: [PATCH 09/22] Fix build of OpenEMS Docs (#1612) Fixes handling of UTF-8 encoding in OpenEMS Docs --- build.gradle | 2 +- .../edge/bosch/bpts5hybrid/core/BoschBpts5HybridApiClient.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index be8a42db8b5..18dfe332308 100644 --- a/build.gradle +++ b/build.gradle @@ -74,7 +74,7 @@ task buildAggregatedJavadocs(type: Javadoc, description: 'Generate javadocs from title = "OpenEMS Javadoc" subprojects.each { proj -> proj.tasks.withType(Javadoc).each { javadocTask -> - options.encoding = 'UTF-8' + javadocTask.options.encoding = 'UTF-8' options.addStringOption('Xdoclint:none', '-quiet') source += javadocTask.source classpath += javadocTask.classpath diff --git a/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridApiClient.java b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridApiClient.java index a4f8af4f97d..bde63137db6 100644 --- a/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridApiClient.java +++ b/io.openems.edge.bosch.bpts5hybrid/src/io/openems/edge/bosch/bpts5hybrid/core/BoschBpts5HybridApiClient.java @@ -119,7 +119,7 @@ public int retreiveBatterieStatus() throws OpenemsException { Element tableNode = document.select("table").get(0); Element firstRow = tableNode.select("tr").get(0); String firstRowText = firstRow.text(); - if(firstRowText.contains("Strung") && !firstRowText.contains("Keine")) { + if(firstRowText.contains("Störung") && !firstRowText.contains("Keine")) { return 1; } else { From fa31f64bc233bc328eead1440b7da4f7eec41d54 Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Mon, 6 Sep 2021 23:50:37 +0200 Subject: [PATCH 10/22] TypeUtils: fix conversion bugs and improve type safety (#1611) * Fix bugs and improve type safety in TypeUtils * Add JUnit tests --- .../openems/edge/common/type/TypeUtils.java | 68 +++-- .../edge/common/type/TypeUtilsTest.java | 237 ++++++++++++++++++ 2 files changed, 287 insertions(+), 18 deletions(-) diff --git a/io.openems.edge.common/src/io/openems/edge/common/type/TypeUtils.java b/io.openems.edge.common/src/io/openems/edge/common/type/TypeUtils.java index 4249795c2b8..bc2a5f96749 100644 --- a/io.openems.edge.common/src/io/openems/edge/common/type/TypeUtils.java +++ b/io.openems.edge.common/src/io/openems/edge/common/type/TypeUtils.java @@ -122,8 +122,8 @@ public static T getAsType(OpenemsType type, Object value) throws IllegalArgu } else if (value instanceof Double) { double doubleValue = (Double) value; long longValue = Math.round(doubleValue); - if (longValue >= Integer.MIN_VALUE && longValue <= Integer.MAX_VALUE) { - return (T) Integer.valueOf((int) longValue); + if (longValue >= Short.MIN_VALUE && longValue <= Short.MAX_VALUE) { + return (T) Short.valueOf((short) longValue); } else { throw new IllegalArgumentException( "Cannot convert. Double [" + value + "] is not fitting in Short range."); @@ -134,7 +134,11 @@ public static T getAsType(OpenemsType type, Object value) throws IllegalArgu if (stringValue.isEmpty()) { return null; } - return (T) Short.valueOf(Short.parseShort(stringValue)); + try { + return (T) Short.valueOf(Short.parseShort(stringValue)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Cannot convert String [" + stringValue + "] to Short."); + } } break; @@ -163,7 +167,12 @@ public static T getAsType(OpenemsType type, Object value) throws IllegalArgu } else if (value instanceof Float) { float floatValue = (Float) value; - return (T) (Integer) Math.round(floatValue); + if (floatValue >= Integer.MIN_VALUE && floatValue <= Integer.MAX_VALUE) { + return (T) Integer.valueOf((int) floatValue); + } else { + throw new IllegalArgumentException( + "Cannot convert. Float [" + value + "] is not fitting in Integer range."); + } } else if (value instanceof Double) { double doubleValue = (Double) value; @@ -180,7 +189,11 @@ public static T getAsType(OpenemsType type, Object value) throws IllegalArgu if (stringValue.isEmpty()) { return null; } - return (T) Integer.valueOf(Integer.parseInt(stringValue)); + try { + return (T) Integer.valueOf(Integer.parseInt(stringValue)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Cannot convert String [" + stringValue + "] to Integer."); + } } break; @@ -202,17 +215,34 @@ public static T getAsType(OpenemsType type, Object value) throws IllegalArgu return (T) (Long) value; } else if (value instanceof Float) { - return (T) (Long) Math.round(Double.valueOf((Float) value)); + float floatValue = (Float) value; + if (floatValue >= Long.MIN_VALUE && floatValue <= Long.MAX_VALUE) { + return (T) Long.valueOf((long) floatValue); + } else { + throw new IllegalArgumentException( + "Cannot convert. Float [" + value + "] is not fitting in Long range."); + } } else if (value instanceof Double) { - return (T) (Long) Math.round((Double) value); + double doubleValue = (Double) value; + long longValue = Math.round(doubleValue); + if (longValue >= Long.MIN_VALUE && longValue <= Long.MAX_VALUE) { + return (T) Long.valueOf((long) longValue); + } else { + throw new IllegalArgumentException( + "Cannot convert. Double [" + value + "] is not fitting in Long range."); + } } else if (value instanceof String) { String stringValue = (String) value; if (stringValue.isEmpty()) { return null; } - return (T) Long.valueOf(Long.parseLong(stringValue)); + try { + return (T) Long.valueOf(Long.parseLong(stringValue)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Cannot convert String [" + stringValue + "] to Long."); + } } break; @@ -231,13 +261,7 @@ public static T getAsType(OpenemsType type, Object value) throws IllegalArgu return (T) (Float) ((Integer) value).floatValue(); } else if (value instanceof Long) { - long longValue = (Long) value; - if (longValue >= Integer.MIN_VALUE && longValue <= Integer.MAX_VALUE) { - return (T) (Float) Float.valueOf((int) longValue); - } else { - throw new IllegalArgumentException( - "Cannot convert. Long [" + value + "] is not fitting in Float range."); - } + return (T) (Float) ((Long) value).floatValue(); } else if (value instanceof Float) { return (T) (Float) value; @@ -248,7 +272,7 @@ public static T getAsType(OpenemsType type, Object value) throws IllegalArgu return (T) (Float) Float.valueOf((float) doubleValue); } else { throw new IllegalArgumentException( - "Cannot convert. Double [" + value + "] is not fitting in Integer range."); + "Cannot convert. Double [" + value + "] is not fitting in Float range."); } } else if (value instanceof String) { @@ -256,7 +280,11 @@ public static T getAsType(OpenemsType type, Object value) throws IllegalArgu if (stringValue.isEmpty()) { return null; } - return (T) Float.valueOf(Float.parseFloat(stringValue)); + try { + return (T) Float.valueOf(Float.parseFloat(stringValue)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Cannot convert String [" + stringValue + "] to Float."); + } } break; @@ -288,7 +316,11 @@ public static T getAsType(OpenemsType type, Object value) throws IllegalArgu if (stringValue.isEmpty()) { return null; } - return (T) Double.valueOf(Double.parseDouble(stringValue)); + try { + return (T) Double.valueOf(Double.parseDouble(stringValue)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Cannot convert String [" + stringValue + "] to Double."); + } } break; diff --git a/io.openems.edge.common/test/io/openems/edge/common/type/TypeUtilsTest.java b/io.openems.edge.common/test/io/openems/edge/common/type/TypeUtilsTest.java index ed60fdc7ba0..1173a573003 100644 --- a/io.openems.edge.common/test/io/openems/edge/common/type/TypeUtilsTest.java +++ b/io.openems.edge.common/test/io/openems/edge/common/type/TypeUtilsTest.java @@ -2,8 +2,15 @@ import static org.junit.Assert.assertEquals; +import java.util.Optional; + import org.junit.Test; +import io.openems.common.function.ThrowingRunnable; +import io.openems.common.types.OpenemsType; +import io.openems.common.types.OptionsEnum; +import io.openems.edge.common.channel.value.Value; + public class TypeUtilsTest { @Test @@ -47,4 +54,234 @@ public void testMin() { assertEquals(34, (int) TypeUtils.min(null, 34, 40)); } + @Test + public void testGetAsType() { + /* + * Extract values + */ + { + Short expected = Short.valueOf((short) 123); + assertEquals(expected, getAsShort(new Value(null, 123))); + assertEquals(expected, getAsShort(Optional.of(123))); + assertEquals(expected, getAsShort(MyOptionsEnum.E123)); + assertEquals(Short.valueOf((short) 0), getAsShort(MyEnum.E123)); + assertEquals(expected, getAsShort(new Integer[] { 123 })); + assertEquals(null, getAsShort(new Integer[0])); + } + /* + * To BOOLEAN + */ + { + assertEquals(null, getAsBoolean(null)); + assertEquals(true, getAsBoolean(Boolean.TRUE)); + assertEquals(false, getAsBoolean(Boolean.FALSE)); + assertEquals(true, getAsBoolean(Short.valueOf((short) 1))); + assertEquals(false, getAsBoolean(Short.valueOf((short) 0))); + assertEquals(true, getAsBoolean(Integer.valueOf(1))); + assertEquals(false, getAsBoolean(Integer.valueOf(0))); + assertEquals(true, getAsBoolean(Long.valueOf(1))); + assertEquals(false, getAsBoolean(Long.valueOf(0))); + assertEquals(true, getAsBoolean(Float.valueOf(1))); + assertEquals(false, getAsBoolean(Float.valueOf(0))); + assertEquals(true, getAsBoolean(Double.valueOf(1))); + assertEquals(false, getAsBoolean(Double.valueOf(0))); + assertEquals(null, getAsBoolean("")); + assertEquals(false, getAsBoolean("fAlSe")); + assertEquals(true, getAsBoolean("tRuE")); + assertException(() -> getAsBoolean("foo")); + assertException(() -> getAsBoolean(new Object())); + } + /* + * To SHORT + */ + { + Short expected = Short.valueOf((short) 123); + assertEquals(null, getAsShort(null)); + assertEquals(Short.valueOf((short) 1), getAsShort(Boolean.TRUE)); + assertEquals(Short.valueOf((short) 0), getAsShort(Boolean.FALSE)); + assertEquals(expected, getAsShort(expected)); + assertException(() -> getAsShort(Integer.valueOf(Short.MAX_VALUE + 1))); + assertException(() -> getAsShort(Integer.valueOf(Short.MIN_VALUE - 1))); + assertEquals(expected, getAsShort(Integer.valueOf(123))); + assertException(() -> getAsShort(Long.valueOf(Short.MAX_VALUE + 1))); + assertException(() -> getAsShort(Long.valueOf(Short.MIN_VALUE - 1))); + assertEquals(expected, getAsShort(Long.valueOf(123))); + assertException(() -> getAsShort(Float.valueOf(Short.MAX_VALUE + 1))); + assertException(() -> getAsShort(Float.valueOf(Short.MIN_VALUE - 1))); + assertEquals(expected, getAsShort(Float.valueOf(123))); + assertException(() -> getAsShort(Double.valueOf(Short.MAX_VALUE + 1))); + assertException(() -> getAsShort(Double.valueOf(Short.MIN_VALUE - 1))); + assertEquals(expected, getAsShort(Double.valueOf(123))); + assertEquals(null, getAsShort("")); + assertException(() -> getAsShort("foo")); + assertEquals(expected, getAsShort("123")); + assertException(() -> getAsShort(new Object())); + } + + /* + * To INTEGER + */ + { + Integer expected = Integer.valueOf(123); + assertEquals(null, getAsInteger(null)); + assertEquals(Integer.valueOf(0), getAsInteger(Boolean.FALSE)); + assertEquals(Integer.valueOf(1), getAsInteger(Boolean.TRUE)); + assertEquals(expected, getAsInteger(Short.valueOf((short) 123))); + assertEquals(expected, getAsInteger(123)); + assertException(() -> getAsInteger(Long.valueOf(Long.valueOf(Integer.MAX_VALUE) + 1))); + assertException(() -> getAsInteger(Long.valueOf(Long.valueOf(Integer.MIN_VALUE) - 1))); + assertEquals(expected, getAsInteger(Long.valueOf(123))); + assertException(() -> getAsInteger(Float.valueOf(Float.valueOf(Integer.MAX_VALUE) + 1000))); + assertException(() -> getAsInteger(Float.valueOf(Float.valueOf(Integer.MIN_VALUE) - 1000))); + assertEquals(expected, getAsInteger(Float.valueOf(123))); + assertException(() -> getAsInteger(Double.valueOf(Double.valueOf(Integer.MAX_VALUE) + 1000))); + assertException(() -> getAsInteger(Double.valueOf(Double.valueOf(Integer.MIN_VALUE) - 1000))); + assertEquals(expected, getAsInteger(Double.valueOf(123))); + assertEquals(null, getAsInteger("")); + assertException(() -> getAsInteger("foo")); + assertEquals(expected, getAsInteger("123")); + assertException(() -> getAsInteger(new Object())); + } + + /* + * To LONG + */ + { + Long expected = Long.valueOf(123); + assertEquals(null, getAsLong(null)); + assertEquals(Long.valueOf(0), getAsLong(Boolean.FALSE)); + assertEquals(Long.valueOf(1), getAsLong(Boolean.TRUE)); + assertEquals(expected, getAsLong(Short.valueOf((short) 123))); + assertEquals(expected, getAsLong(123)); + assertEquals(expected, getAsLong(Long.valueOf(123))); + assertEquals(expected, getAsLong(Float.valueOf(123))); + assertEquals(expected, getAsLong(Double.valueOf(123))); + assertEquals(null, getAsLong("")); + assertException(() -> getAsLong("foo")); + assertEquals(expected, getAsLong("123")); + assertException(() -> getAsLong(new Object())); + } + + /* + * To FLOAT + */ + { + Float expected = Float.valueOf(123); + assertEquals(null, getAsFloat(null)); + assertEquals(Float.valueOf(0), getAsFloat(Boolean.FALSE)); + assertEquals(Float.valueOf(1), getAsFloat(Boolean.TRUE)); + assertEquals(expected, getAsFloat(Short.valueOf((short) 123))); + assertEquals(expected, getAsFloat(123)); + assertEquals(expected, getAsFloat(Long.valueOf(123))); + assertEquals(expected, getAsFloat(Float.valueOf(123))); + assertEquals(expected, getAsFloat(Double.valueOf(123))); + assertEquals(null, getAsFloat("")); + assertException(() -> getAsFloat("foo")); + assertEquals(expected, getAsFloat("123")); + assertException(() -> getAsFloat(new Object())); + } + + /* + * To DOUBLE + */ + { + Double expected = Double.valueOf(123); + assertEquals(null, getAsDouble(null)); + assertEquals(Double.valueOf(0), getAsDouble(Boolean.FALSE)); + assertEquals(Double.valueOf(1), getAsDouble(Boolean.TRUE)); + assertEquals(expected, getAsDouble(Short.valueOf((short) 123))); + assertEquals(expected, getAsDouble(123)); + assertEquals(expected, getAsDouble(Long.valueOf(123))); + assertEquals(expected, getAsDouble(Float.valueOf(123))); + assertEquals(expected, getAsDouble(Double.valueOf(123))); + assertEquals(null, getAsDouble("")); + assertException(() -> getAsDouble("foo")); + assertEquals(expected, getAsDouble("123")); + assertException(() -> getAsDouble(new Object())); + } + + /* + * To STRING + */ + { + assertEquals(null, getAsString(null)); + assertEquals("", getAsString("")); + assertEquals("[Hello, [World, !]]", getAsString(new Object[] { "Hello", new Object[] { "World", "!" } })); + assertEquals("[true, false]", getAsString(new boolean[] { true, false })); + assertEquals("[1, 2]", getAsString(new byte[] { 1, 2 })); + assertEquals("[f, o, o]", getAsString(new char[] { 'f', 'o', 'o' })); + assertEquals("[0.1, 0.2]", getAsString(new double[] { 0.1, 0.2 })); + assertEquals("[0.1, 0.2]", getAsString(new float[] { 0.1f, 0.2f })); + assertEquals("[1, 2]", getAsString(new int[] { 1, 2 })); + assertEquals("[1, 2]", getAsString(new long[] { 1, 2 })); + assertEquals("[1, 2]", getAsString(new short[] { 1, 2 })); + } + } + + private void assertException(ThrowingRunnable runnable) { + try { + runnable.run(); + assertEquals("Expecting an Exception!", true, false); + } catch (Exception e) { + // ok + } + } + + private Boolean getAsBoolean(Object value) { + return TypeUtils.getAsType(OpenemsType.BOOLEAN, value); + } + + private Short getAsShort(Object value) { + return TypeUtils.getAsType(OpenemsType.SHORT, value); + } + + private Integer getAsInteger(Object value) { + return TypeUtils.getAsType(OpenemsType.INTEGER, value); + } + + private Long getAsLong(Object value) { + return TypeUtils.getAsType(OpenemsType.LONG, value); + } + + private Float getAsFloat(Object value) { + return TypeUtils.getAsType(OpenemsType.FLOAT, value); + } + + private Double getAsDouble(Object value) { + return TypeUtils.getAsType(OpenemsType.DOUBLE, value); + } + + private String getAsString(Object value) { + return TypeUtils.getAsType(OpenemsType.STRING, value); + } + + private static enum MyOptionsEnum implements OptionsEnum { + UNDEFINED(-1), // + E123(123); + + private final int value; + + private MyOptionsEnum(int value) { + this.value = value; + } + + @Override + public int getValue() { + return this.value; + } + + @Override + public OptionsEnum getUndefined() { + return UNDEFINED; + } + + @Override + public String getName() { + return this.name(); + } + } + + private static enum MyEnum { + E123; + } } From fe508aaca3e3c369eb48227edd691538a9d0b4c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Sep 2021 12:41:17 +0200 Subject: [PATCH 11/22] Bump org.apache.felix.webconsole from 4.6.4 to 4.7.0 in /cnf (#1615) * Bump org.apache.felix.webconsole from 4.6.4 to 4.7.0 in /cnf Bumps org.apache.felix.webconsole from 4.6.4 to 4.7.0. --- updated-dependencies: - dependency-name: org.apache.felix:org.apache.felix.webconsole dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Update bndrun files Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefan Feilmeier --- cnf/pom.xml | 2 +- io.openems.backend.application/BackendApp.bndrun | 2 +- io.openems.edge.application/EdgeApp.bndrun | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cnf/pom.xml b/cnf/pom.xml index 809f81f1f79..0b945d27f7b 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -186,7 +186,7 @@ org.apache.felix org.apache.felix.webconsole - 4.6.4 + 4.7.0 org.apache.felix diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index c3e8b07313c..eb9a66bd673 100644 --- a/io.openems.backend.application/BackendApp.bndrun +++ b/io.openems.backend.application/BackendApp.bndrun @@ -68,7 +68,7 @@ org.apache.felix.inventory;version='[1.1.0,1.1.1)',\ org.apache.felix.metatype;version='[1.2.4,1.2.5)',\ org.apache.felix.scr;version='[2.1.20,2.1.21)',\ - org.apache.felix.webconsole;version='[4.6.4,4.6.5)',\ + org.apache.felix.webconsole;version='[4.7.0,4.7.1)',\ org.apache.felix.webconsole.plugins.ds;version='[2.1.0,2.1.1)',\ 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)',\ diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index b0c0b252d18..7df44f4afba 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -304,7 +304,7 @@ org.apache.felix.inventory;version='[1.1.0,1.1.1)',\ org.apache.felix.metatype;version='[1.2.4,1.2.5)',\ org.apache.felix.scr;version='[2.1.20,2.1.21)',\ - org.apache.felix.webconsole;version='[4.6.4,4.6.5)',\ + org.apache.felix.webconsole;version='[4.7.0,4.7.1)',\ org.apache.felix.webconsole.plugins.ds;version='[2.1.0,2.1.1)',\ org.eclipse.paho.mqttv5.client;version='[1.2.5,1.2.6)',\ org.jsoup;version='[1.14.2,1.14.3)',\ From be593664700a4b080ab6cb0e110893898f24dc0a Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Tue, 7 Sep 2021 16:31:20 +0200 Subject: [PATCH 12/22] REST-Api: handle regex pattern syntax exception properly (#1616) --- .../edge/controller/api/rest/RestHandler.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/io.openems.edge.controller.api.rest/src/io/openems/edge/controller/api/rest/RestHandler.java b/io.openems.edge.controller.api.rest/src/io/openems/edge/controller/api/rest/RestHandler.java index 3f110dd44fa..9edf10db375 100644 --- a/io.openems.edge.controller.api.rest/src/io/openems/edge/controller/api/rest/RestHandler.java +++ b/io.openems.edge.controller.api.rest/src/io/openems/edge/controller/api/rest/RestHandler.java @@ -16,6 +16,8 @@ import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; import java.util.stream.Collectors; import javax.servlet.ServletException; @@ -230,10 +232,10 @@ private boolean handleGet(User user, ChannelAddress channelAddress, Request base List ComponentList = this.parent.getComponentManager().getEnabledComponents(); for (OpenemsComponent component : ComponentList) { // Loop over enabled ComponentIds, look for exact or RegExp match - if (component.id().matches(channelAddress.getComponentId())) { + if (matchesSafely(component.id(), channelAddress.getComponentId())) { for (Channel channel : component.channels()) { // Loop over attached channels, look for exact or RegExp match - if (channel.channelId().id().matches(channelAddress.getChannelId())) { + if (matchesSafely(channelAddress.getChannelId(), channel.channelId().id())) { channellist.add(channel); } } @@ -279,6 +281,22 @@ private boolean handleGet(User user, ChannelAddress channelAddress, Request base return this.sendOkResponse(baseRequest, response, result); } + /** + * Safely matches a regular expression against a string. + * + * @param str the string + * @param regex the regular expression + * @return true on match + * @throws OpenemsException on error + */ + private boolean matchesSafely(String str, String regex) throws OpenemsException { + try { + return Pattern.matches(str, regex); + } catch (PatternSyntaxException e) { + throw new OpenemsException("Syntax error in regular expression [" + regex + "]"); + } + } + private void sendErrorResponse(Request baseRequest, HttpServletResponse response, UUID jsonrpcId, Throwable ex) { try { response.setContentType("application/json"); From c13e06f704e6c615ee2caa80e7be19b7aed2b0d9 Mon Sep 17 00:00:00 2001 From: Stefan Feilmeier Date: Wed, 8 Sep 2021 22:51:01 +0200 Subject: [PATCH 13/22] FEMS Backports (#1617) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generic/Build/... * Gradle: activate more detailed logs * Host: allow Network Configuration for Role 'owner' * Test-Framework and Simulator: improvements * Controller SG Ready Heatpump: fix persistence priority * Janitza meters: fix voltage and energy UI * add support for theming * refactoring * Update Github Actions Backend * Backend: handle User Language Batteries/Energy Storage Systems * ManagedEss: add 'isManaged()' method for runtime detection * Generic-ESS is now a Hybrid-ESS * Battery Protection: require BMS data * BYD Battery Box Commercial: set state levels * FENECON Home Battery: numerous improvements * Soltaro Batteries: numerous improvements * Grid-Optimized-Charge-Controller: numerous improvements * GoodWe: numerous improvements Electric Vehicle Charging * EVCS Controller: bugfixes * EVCS Hardy Barth: numerous improvements * EVCS Keba: fix energy limit Co-authored-by: Sebastian Asen <47855186+sebastianasen@users.noreply.github.com> Co-authored-by: Maximilan Lang <35968713+mlang97@users.noreply.github.com> Co-authored-by: Lukas Rieger <73471197+lukasrgr@users.noreply.github.com> Co-authored-by: Hüseyin Sahutoglu <34771592+huseyinsaht@users.noreply.github.com> Co-authored-by: Wolfgang Gerbl <39982944+wgerbl@users.noreply.github.com> Co-authored-by: Pooran Chandrashekaraiah <46567310+pooran-c@users.noreply.github.com> --- .github/workflows/build.yml | 5 +- build.gradle | 19 +- .../backend/common/metadata/Metadata.java | 10 + .../openems/backend/common/metadata/User.java | 15 +- .../backend/metadata/dummy/DummyMetadata.java | 10 +- .../backend/metadata/file/FileMetadata.java | 9 +- .../openems/backend/metadata/odoo/Field.java | 3 +- .../openems/backend/metadata/odoo/MyUser.java | 4 +- .../backend/metadata/odoo/OdooMetadata.java | 13 +- .../metadata/odoo/odoo/OdooHandler.java | 19 +- .../backend/uiwebsocket/impl/OnRequest.java | 21 +- .../request/UpdateUserLanguageRequest.java | 85 + .../response/AuthenticateResponse.java | 7 + .../AbstractMaxCurrentHandler.java | 17 +- .../battery/bydcommercial/BatteryBoxC130.java | 101 +- .../fenecon/home/FeneconHomeBattery.java | 130 +- .../fenecon/home/FeneconHomeBatteryImpl.java | 709 +++--- .../home/FeneconHomeBatteryProtection.java | 5 +- .../home/FeneconHomeBatteryImplTest.java | 31 - .../fenecon/home/FeneconHomeBatteryTest.java | 86 + .../fenecon/home/TowersAndModulesTest.java | 126 ++ .../cluster/versionc/ClusterVersionCImpl.java | 62 +- .../soltaro/cluster/versionc/RackChannel.java | 2 +- .../versionc/SingleRackVersionCImpl.java | 6 +- .../versionc/utils/CellChannelFactory.java | 19 +- .../soltaro/versionc/utils/Constants.java | 9 +- .../api/ManagedSymmetricBatteryInverter.java | 13 + .../modbus/api/AbstractModbusBridge.java | 2 +- .../api/AbstractOpenemsModbusComponent.java | 2 +- .../bridge/modbus/api/ModbusComponent.java | 64 + .../modbus/test/DummyModbusComponent.java | 41 + io.openems.edge.common/bnd.bnd | 2 +- .../common/test/DummyComponentContext.java | 2 +- .../common/test/DummyConfigurationAdmin.java | 19 +- .../controller/api/backend/OnRequest.java | 18 + .../bnd.bnd | 3 +- .../ess/gridoptimizedcharge/Config.java | 5 +- .../ess/gridoptimizedcharge/DelayCharge.java | 133 +- .../DelayChargeRiskLevel.java | 45 + .../gridoptimizedcharge/DelayChargeState.java | 3 +- .../GridOptimizedCharge.java | 373 +++- .../GridOptimizedChargeImpl.java | 184 +- .../gridoptimizedcharge/SellToGridLimit.java | 41 +- .../SellToGridLimitState.java | 3 +- .../ess/gridoptimizedcharge/MyConfig.java | 32 +- .../gridoptimizedcharge/MyControllerTest.java | 522 ++++- .../edge/controller/evcs/EvcsController.java | 35 +- .../controller/evcs/EvcsControllerTest.java | 2 +- .../io/heatpump/sgready/HeatPump.java | 13 +- .../io/heatpump/sgready/HeatPumpImpl.java | 8 +- .../io/heatpump/sgready/StatusDefinition.java | 2 +- .../io/openems/edge/core/host/HostImpl.java | 8 +- .../edge/ess/api/ManagedSymmetricEss.java | 12 + .../edge/ess/power/api/Constraint.java | 4 + .../io/openems/edge/ess/power/api/Power.java | 7 + .../io/openems/edge/ess/test/DummyPower.java | 9 + .../byd/container/EssFeneconBydContainer.java | 5 + .../ess/core/power/PowerComponentImpl.java | 6 + .../openems/edge/ess/core/power/Solver.java | 4 +- .../EssFeneconCommercial40Impl.java | 5 + .../ess/generic/symmetric/ChannelManager.java | 32 + .../GenericManagedSymmetricEssImpl.java | 15 + .../openems/edge/evcs/hardybarth/Config.java | 12 +- .../edge/evcs/hardybarth/HardyBarthImpl.java | 4 +- .../hardybarth/HardyBarthWriteHandler.java | 61 +- .../evcs/keba/kecontact/WriteHandler.java | 137 +- .../fenecon/dess/ess/FeneconDessEssImpl.java | 1 - .../fenecon/mini/ess/FeneconMiniEssImpl.java | 5 + io.openems.edge.goodwe/bnd.bnd | 2 +- .../edge/goodwe/batteryinverter/Config.java | 30 + .../GoodWeBatteryInverter.java | 65 +- .../GoodWeBatteryInverterImpl.java | 345 ++- .../charger/AbstractGoodWeEtCharger.java | 33 +- .../edge/goodwe/charger/GoodWeEtCharger.java | 38 +- .../edge/goodwe/charger/GoodWeEtCharger1.java | 4 + .../edge/goodwe/charger/GoodWeEtCharger2.java | 5 + .../edge/goodwe/common/AbstractGoodWe.java | 1871 ++++++++++++++-- .../edge/goodwe/common/ApplyPowerHandler.java | 122 +- .../io/openems/edge/goodwe/common/GoodWe.java | 1901 ++++++++++++----- .../common/enums/ArcSelfCheckStatus.java | 32 + .../goodwe/common/enums/AutoStartBackup.java | 32 + .../goodwe/common/enums/BackupEnable.java | 32 + .../edge/goodwe/common/enums/BatteryMode.java | 4 +- .../goodwe/common/enums/BatteryProtocol.java | 37 + .../edge/goodwe/common/enums/ComMode.java | 35 + .../edge/goodwe/common/enums/ControlMode.java | 23 + .../goodwe/common/enums/CpldWarningCode.java | 38 + .../common/enums/DiagnosticStatusHigh.java | 35 + .../common/enums/DiagnosticStatusLow.java | 58 + .../edge/goodwe/common/enums/DredCmd.java | 39 + .../goodwe/common/enums/DredOffgridCheck.java | 32 + .../common/enums/EhBatteryFunctionActive.java | 34 + .../edge/goodwe/common/enums/EmsCheck.java | 33 + .../goodwe/common/enums/EmsPowerMode.java | 276 ++- .../edge/goodwe/common/enums/EnableCurve.java | 33 + .../goodwe/common/enums/ExternalEmsFlag.java | 32 + .../common/enums/EzloggerProCommStatus.java | 32 + .../common/enums/FeedInPowerSettings.java | 126 ++ .../goodwe/common/enums/FeedPowerEnable.java | 35 + .../common/enums/GoodweGridMeterType.java | 35 + .../edge/goodwe/common/enums/GoodweType.java | 31 +- .../edge/goodwe/common/enums/GridProtect.java | 33 + .../common/enums/GridWaveCheckLevel.java | 34 + .../edge/goodwe/common/enums/LedState.java | 36 + .../common/enums/LoadRegulationIndex.java | 34 + .../common/enums/MeterConnectStatus.java | 4 +- .../common/enums/MeterReverseEnable.java | 32 + .../common/enums/MpptShadowScanEnable.java | 32 + .../edge/goodwe/common/enums/PvMode.java | 33 + .../goodwe/common/enums/SafetyCountry.java | 40 +- .../common/enums/UpsStandartVoltType.java | 35 + .../edge/goodwe/common/enums/WifiOrLan.java | 33 + .../edge/goodwe/common/enums/WorkMode.java | 4 +- .../edge/goodwe/common/enums/WorkWeek.java | 41 + .../edge/goodwe/common/enums/ZvrtConfig.java | 34 + .../ess/AllowedChargeDischargeHandler.java | 6 +- .../io/openems/edge/goodwe/ess/Config.java | 5 +- .../edge/goodwe/ess/GoodWeEssImpl.java | 40 +- .../goodwe/gridmeter/GoodWeGridMeter.java | 180 +- .../goodwe/gridmeter/GoodWeGridMeterImpl.java | 178 ++ .../goodwe/gridmeter/GridMeterChannelId.java | 37 - .../GoodWeBatteryInverterImplTest.java | 334 ++- .../edge/goodwe/batteryinverter/MyConfig.java | 72 + .../edge/goodwe/ess/GoodWeEssImplTest.java | 5 +- .../io/openems/edge/goodwe/ess/MyConfig.java | 22 +- .../goodwe/gridmeter/GoodWeGridMeterTest.java | 2 +- .../umg511/MeterJanitzaUmg511Impl.java | 7 +- .../umg96rme/MeterJanitzaUmg96rme.java | 17 +- .../simulator/evcs/AsymmetricMeterEvcs.java | 489 +++++ .../edge/simulator/evcs/SimulatedEvcs.java | 48 +- .../api/utils/CalculateActiveTime.java | 27 +- ui/README.md | 43 +- ui/angular.json | 278 +-- ui/build.gradle | 19 - ui/package-lock.json | 5 +- ui/package.json | 20 +- ui/src/android-chrome-192x192.png | Bin 12844 -> 0 bytes ui/src/android-chrome-512x512.png | Bin 37348 -> 0 bytes ui/src/app/app-routing.module.ts | 2 + ui/src/app/app.component.html | 10 +- ui/src/app/app.component.ts | 11 +- ui/src/app/app.module.ts | 19 - .../app/edge/history/abstracthistorychart.ts | 65 +- .../app/edge/history/abstracthistorywidget.ts | 6 +- .../channelthreshold/singlechart.component.ts | 12 +- .../channelthreshold/totalchart.component.ts | 1 + .../channelthreshold/widget.component.ts | 10 +- .../edge/history/chpsoc/widget.component.ts | 10 +- .../consumption/meterchart.component.ts | 12 +- .../consumption/singlechart.component.ts | 12 +- .../delayedselltogrid/chart.component.ts | 22 +- .../edge/history/energy/energy.component.ts | 185 +- .../fixdigitaloutput/singlechart.component.ts | 12 +- .../fixdigitaloutput/totalchart.component.ts | 12 +- .../fixdigitaloutput/widget.component.ts | 10 +- .../app/edge/history/grid/chart.component.ts | 14 +- .../gridoptimizedcharge/chart.component.ts | 268 +++ ...ptimizedchargechartoverview.component.html | 67 + ...doptimizedchargechartoverview.component.ts | 32 + .../sellToGridLimitChart.component.ts | 208 ++ .../gridoptimizedcharge/widget.component.html | 38 + .../gridoptimizedcharge/widget.component.ts | 82 + .../heatingelement/widget.component.ts | 8 +- .../app/edge/history/history.component.html | 4 + ui/src/app/edge/history/history.component.ts | 4 +- ui/src/app/edge/history/history.module.ts | 8 + .../peakshaving/asymmetric/chart.component.ts | 10 +- .../peakshaving/symmetric/chart.component.ts | 10 +- .../peakshaving/timeslot/chart.component.ts | 10 +- .../production/chargerchart.component.ts | 10 +- .../production/productionmeterchart.ts | 10 +- .../edge/history/production/singlechart.ts | 10 +- .../edge/history/production/totalacchart.ts | 10 +- .../app/edge/history/production/totalchart.ts | 10 +- .../edge/history/production/totaldcchart.ts | 10 +- ui/src/app/edge/history/shared.ts | 108 +- .../singlethreshold/chart.component.ts | 13 +- .../singlethreshold/widget.component.ts | 10 +- .../history/storage/chargerchart.component.ts | 10 +- .../history/storage/esschart.component.ts | 10 +- .../history/storage/singlechart.component.ts | 10 +- .../storagechartoverview.component.html | 39 +- .../history/storage/totalchart.component.ts | 10 +- .../Channelthreshold/Channelthreshold.html | 8 + .../Channelthreshold/Channelthreshold.ts | 38 + .../Ess_FixActivePower.html} | 0 .../Ess_FixActivePower/Ess_FixActivePower.ts} | 4 +- .../modal/modal.component.html | 9 +- .../modal/modal.component.ts | 2 +- .../app/edge/live/Controller/Evcs/Evcs.html | 56 + ui/src/app/edge/live/Controller/Evcs/Evcs.ts | 177 ++ .../administration.component.html | 0 .../administration.component.ts | 2 +- .../Evcs}/modal/modal.page.html | 18 +- .../Evcs}/modal/modal.page.ts | 8 +- .../Evcs}/modal/popover/popover.page.html | 0 .../Evcs}/modal/popover/popover.page.ts | 6 +- .../Io_FixDigitalOutput.html} | 0 .../Io_FixDigitalOutput.ts} | 8 +- .../modal/modal.component.html | 4 - .../modal/modal.component.ts | 4 +- .../Io_HeatingElement/Io_HeatingElement.html | 22 + .../Io_HeatingElement/Io_HeatingElement.ts | 93 + .../modal/modal.component.html | 0 .../modal/modal.component.ts | 6 +- .../Api_DigitalInput/Io_Api_DigitalInput.html | 5 + .../Api_DigitalInput/Io_Api_DigitalInput.ts | 45 + .../modal/modal.component.html | 0 .../modal/modal.component.ts | 8 +- .../channelthreshold.component.html | 29 - .../channelthreshold.component.ts | 44 - .../edge/live/chpsoc/chpsoc.component.html | 12 +- .../edge/live/chpsoc/modal/modal.component.ts | 2 +- .../consumption/modal/modal.component.html | 12 +- .../edge/live/common/grid/grid.component.ts | 2 +- .../live/common/storage/storage.component.ts | 7 +- .../digitalinput/digitalinput.component.html | 19 - .../digitalinput/digitalinput.component.ts | 73 - .../chart/section/production.component.ts | 2 +- ui/src/app/edge/live/evcs/evcs.component.html | 126 -- ui/src/app/edge/live/evcs/evcs.component.ts | 147 -- .../modal/evcsCluster-modal.page.html | 2 +- .../flat-widget-line/flat-widget-line.html | 4 +- .../flat/flat-widget-line/flat-widget-line.ts | 4 + .../flat-widget-percentagebar.html | 5 +- .../gridoptimizedcharge.component.html | 116 + .../gridoptimizedcharge.component.ts | 64 + .../modal/modal.component.html | 429 ++++ .../modal/modal.component.ts | 163 ++ .../modal/predictionChart.ts | 261 +++ .../heatingelement.component.html | 60 - .../heatingelement.component.ts | 86 - ui/src/app/edge/live/live.component.html | 13 +- ui/src/app/edge/live/live.component.ts | 2 +- ui/src/app/edge/live/live.module.ts | 103 +- .../settings/channels/channels.component.ts | 4 +- .../settings/component/{shared => }/shared.ts | 0 .../settings/profile/profile.component.html | 18 +- .../settings/profile/profile.component.ts | 4 +- .../app/edge/settings/settings.component.html | 2 +- .../app/edge/settings/settings.component.ts | 8 +- ui/src/app/edge/settings/settings.module.ts | 10 +- ui/src/app/index/index.component.html | 63 +- ui/src/app/index/index.component.ts | 31 +- ui/src/app/index/index.module.ts | 2 +- .../registration/modal/modal.component.html | 43 +- ui/src/app/shared/edge/edgeconfig.ts | 104 +- .../formly}/form-field.wrapper.html | 0 .../formly}/form-field.wrapper.ts | 0 .../formly/input-serial-number-wrapper.html | 32 + .../formly/input-serial-number-wrapper.ts | 8 + .../shared => shared/formly}/input.html | 0 .../shared => shared/formly}/input.ts | 0 .../shared => shared/formly}/repeat.html | 0 .../shared => shared/formly}/repeat.ts | 0 .../app/shared/header/header.component.html | 2 +- ui/src/app/shared/header/header.component.ts | 4 +- .../queryHistoricTimeseriesDataRequest.ts | 7 +- .../jsonrpc/request/setChannelValueRequest.ts | 4 +- ui/src/app/shared/jsonrpc/shared.ts | 4 +- .../percentagebar.component.html | 7 +- .../shared/pickdate/pickdate.component.html | 13 +- .../app/shared/pickdate/pickdate.component.ts | 99 +- .../pickdate/popover/popover.component.html | 12 +- .../pickdate/popover/popover.component.ts | 14 +- ui/src/app/shared/service/defaulttypes.ts | 11 +- ui/src/app/shared/service/service.ts | 3 +- ui/src/app/shared/service/utils.ts | 33 +- ui/src/app/shared/service/websocket.ts | 28 +- ui/src/app/shared/service/wsdata.ts | 5 +- ui/src/app/shared/shared.module.ts | 51 +- .../status/single/status.component.html | 139 +- .../shared/status/single/status.component.ts | 10 +- ui/src/app/shared/translate/cz.ts | 94 +- ui/src/app/shared/translate/de.ts | 86 +- ui/src/app/shared/translate/en.ts | 86 +- ui/src/app/shared/translate/es.ts | 90 +- ui/src/app/shared/translate/fr.ts | 69 +- ui/src/app/shared/translate/nl.ts | 88 +- ui/src/app/shared/type/environment.ts | 8 - ui/src/app/shared/type/widget.ts | 3 +- ui/src/app/user/user.component.html | 15 +- ui/src/app/user/user.component.ts | 6 +- ui/src/apple-touch-icon.png | Bin 6238 -> 0 bytes ui/src/environments/dummy.ts | 3 + ui/src/environments/environment.ts | 18 - ui/src/environments/index.ts | 14 +- .../environments/openems-backend-dev-live.ts | 8 - .../environments/openems-backend-dev-local.ts | 8 - ui/src/environments/openems-backend.ts | 9 - ui/src/environments/openems-edge.ts | 8 - ui/src/favicon-16x16.png | Bin 1030 -> 0 bytes ui/src/favicon-32x32.png | Bin 1593 -> 0 bytes ui/src/global.scss | 111 +- ui/src/index.html | 25 +- ui/src/main.ts | 5 +- ui/src/manifest.json | 20 - ui/src/mstile-150x150.png | Bin 5957 -> 0 bytes ui/src/safari-pinned-tab.svg | 44 - ui/src/theme/variables.scss | 110 - .../openems/environments/backend-dev.ts | 12 + .../openems/environments/backend-prod.ts | 12 + .../themes/openems/environments/edge-dev.ts | 12 + .../themes/openems/environments/edge-prod.ts | 12 + .../openems}/environments/gitpod.ts | 14 +- .../openems/root/android-chrome-192x192.png | Bin 0 -> 12877 bytes .../openems/root/android-chrome-512x512.png | Bin 0 -> 38555 bytes .../themes/openems/root/apple-touch-icon.png | Bin 0 -> 6266 bytes ui/src/themes/openems/root/browserconfig.xml | 9 + ui/src/themes/openems/root/favicon-16x16.png | Bin 0 -> 1029 bytes ui/src/themes/openems/root/favicon-32x32.png | Bin 0 -> 1592 bytes ui/src/{ => themes/openems/root}/favicon.ico | Bin 15086 -> 15086 bytes ui/src/themes/openems/root/mstile-150x150.png | Bin 0 -> 5945 bytes .../themes/openems/root/safari-pinned-tab.svg | 27 + ui/src/themes/openems/root/site.webmanifest | 19 + ui/src/themes/openems/scss/variables.scss | 86 + 316 files changed, 13065 insertions(+), 3751 deletions(-) create mode 100644 io.openems.common/src/io/openems/common/jsonrpc/request/UpdateUserLanguageRequest.java delete mode 100644 io.openems.edge.battery.fenecon.home/test/io/openems/edge/battery/fenecon/home/FeneconHomeBatteryImplTest.java create mode 100644 io.openems.edge.battery.fenecon.home/test/io/openems/edge/battery/fenecon/home/FeneconHomeBatteryTest.java create mode 100644 io.openems.edge.battery.fenecon.home/test/io/openems/edge/battery/fenecon/home/TowersAndModulesTest.java create mode 100644 io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/api/ModbusComponent.java create mode 100644 io.openems.edge.bridge.modbus/src/io/openems/edge/bridge/modbus/test/DummyModbusComponent.java create mode 100644 io.openems.edge.controller.ess.gridoptimizedcharge/src/io/openems/edge/controller/ess/gridoptimizedcharge/DelayChargeRiskLevel.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/ArcSelfCheckStatus.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/AutoStartBackup.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/BackupEnable.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/BatteryProtocol.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/ComMode.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/ControlMode.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/CpldWarningCode.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/DiagnosticStatusHigh.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/DiagnosticStatusLow.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/DredCmd.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/DredOffgridCheck.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/EhBatteryFunctionActive.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/EmsCheck.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/EnableCurve.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/ExternalEmsFlag.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/EzloggerProCommStatus.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/FeedInPowerSettings.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/FeedPowerEnable.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/GoodweGridMeterType.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/GridProtect.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/GridWaveCheckLevel.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/LedState.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/LoadRegulationIndex.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/MeterReverseEnable.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/MpptShadowScanEnable.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/PvMode.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/UpsStandartVoltType.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/WifiOrLan.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/WorkWeek.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/common/enums/ZvrtConfig.java create mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/gridmeter/GoodWeGridMeterImpl.java delete mode 100644 io.openems.edge.goodwe/src/io/openems/edge/goodwe/gridmeter/GridMeterChannelId.java create mode 100644 io.openems.edge.simulator/src/io/openems/edge/simulator/evcs/AsymmetricMeterEvcs.java delete mode 100644 ui/build.gradle delete mode 100644 ui/src/android-chrome-192x192.png delete mode 100644 ui/src/android-chrome-512x512.png create mode 100644 ui/src/app/edge/history/gridoptimizedcharge/chart.component.ts create mode 100644 ui/src/app/edge/history/gridoptimizedcharge/gridoptimizedchargechartoverview/gridoptimizedchargechartoverview.component.html create mode 100644 ui/src/app/edge/history/gridoptimizedcharge/gridoptimizedchargechartoverview/gridoptimizedchargechartoverview.component.ts create mode 100644 ui/src/app/edge/history/gridoptimizedcharge/sellToGridLimitChart.component.ts create mode 100644 ui/src/app/edge/history/gridoptimizedcharge/widget.component.html create mode 100644 ui/src/app/edge/history/gridoptimizedcharge/widget.component.ts create mode 100644 ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.html create mode 100644 ui/src/app/edge/live/Controller/Channelthreshold/Channelthreshold.ts rename ui/src/app/edge/live/{Controller_Ess_FixActivePower/Controller_Ess_FixActivePower.html => Controller/Ess_FixActivePower/Ess_FixActivePower.html} (100%) rename ui/src/app/edge/live/{Controller_Ess_FixActivePower/Controller_Ess_FixActivePower.ts => Controller/Ess_FixActivePower/Ess_FixActivePower.ts} (93%) rename ui/src/app/edge/live/{Controller_Ess_FixActivePower => Controller/Ess_FixActivePower}/modal/modal.component.html (92%) rename ui/src/app/edge/live/{Controller_Ess_FixActivePower => Controller/Ess_FixActivePower}/modal/modal.component.ts (99%) create mode 100644 ui/src/app/edge/live/Controller/Evcs/Evcs.html create mode 100644 ui/src/app/edge/live/Controller/Evcs/Evcs.ts rename ui/src/app/edge/live/{evcs => Controller/Evcs}/modal/administration/administration.component.html (100%) rename ui/src/app/edge/live/{evcs => Controller/Evcs}/modal/administration/administration.component.ts (98%) rename ui/src/app/edge/live/{evcs => Controller/Evcs}/modal/modal.page.html (96%) rename ui/src/app/edge/live/{evcs => Controller/Evcs}/modal/modal.page.ts (98%) rename ui/src/app/edge/live/{evcs => Controller/Evcs}/modal/popover/popover.page.html (100%) rename ui/src/app/edge/live/{evcs => Controller/Evcs}/modal/popover/popover.page.ts (66%) rename ui/src/app/edge/live/{Controller_Io_FixDigitalOutput/Controller_Io_FixDigitalOutput.html => Controller/Io_FixDigitalOutput/Io_FixDigitalOutput.html} (100%) rename ui/src/app/edge/live/{Controller_Io_FixDigitalOutput/Controller_Io_FixDigitalOutput.ts => Controller/Io_FixDigitalOutput/Io_FixDigitalOutput.ts} (86%) rename ui/src/app/edge/live/{Controller_Io_FixDigitalOutput => Controller/Io_FixDigitalOutput}/modal/modal.component.html (84%) rename ui/src/app/edge/live/{Controller_Io_FixDigitalOutput => Controller/Io_FixDigitalOutput}/modal/modal.component.ts (96%) create mode 100644 ui/src/app/edge/live/Controller/Io_HeatingElement/Io_HeatingElement.html create mode 100644 ui/src/app/edge/live/Controller/Io_HeatingElement/Io_HeatingElement.ts rename ui/src/app/edge/live/{heatingelement => Controller/Io_HeatingElement}/modal/modal.component.html (100%) rename ui/src/app/edge/live/{heatingelement => Controller/Io_HeatingElement}/modal/modal.component.ts (96%) create mode 100644 ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.html create mode 100644 ui/src/app/edge/live/Io/Api_DigitalInput/Io_Api_DigitalInput.ts rename ui/src/app/edge/live/{digitalinput => Io/Api_DigitalInput}/modal/modal.component.html (100%) rename ui/src/app/edge/live/{digitalinput => Io/Api_DigitalInput}/modal/modal.component.ts (63%) delete mode 100644 ui/src/app/edge/live/channelthreshold/channelthreshold.component.html delete mode 100644 ui/src/app/edge/live/channelthreshold/channelthreshold.component.ts delete mode 100644 ui/src/app/edge/live/digitalinput/digitalinput.component.html delete mode 100644 ui/src/app/edge/live/digitalinput/digitalinput.component.ts delete mode 100644 ui/src/app/edge/live/evcs/evcs.component.html delete mode 100644 ui/src/app/edge/live/evcs/evcs.component.ts create mode 100644 ui/src/app/edge/live/gridoptimizedcharge/gridoptimizedcharge.component.html create mode 100644 ui/src/app/edge/live/gridoptimizedcharge/gridoptimizedcharge.component.ts create mode 100644 ui/src/app/edge/live/gridoptimizedcharge/modal/modal.component.html create mode 100644 ui/src/app/edge/live/gridoptimizedcharge/modal/modal.component.ts create mode 100644 ui/src/app/edge/live/gridoptimizedcharge/modal/predictionChart.ts delete mode 100644 ui/src/app/edge/live/heatingelement/heatingelement.component.html delete mode 100644 ui/src/app/edge/live/heatingelement/heatingelement.component.ts rename ui/src/app/edge/settings/component/{shared => }/shared.ts (100%) rename ui/src/app/{edge/settings/component/shared => shared/formly}/form-field.wrapper.html (100%) rename ui/src/app/{edge/settings/component/shared => shared/formly}/form-field.wrapper.ts (100%) create mode 100644 ui/src/app/shared/formly/input-serial-number-wrapper.html create mode 100644 ui/src/app/shared/formly/input-serial-number-wrapper.ts rename ui/src/app/{edge/settings/component/shared => shared/formly}/input.html (100%) rename ui/src/app/{edge/settings/component/shared => shared/formly}/input.ts (100%) rename ui/src/app/{edge/settings/component/shared => shared/formly}/repeat.html (100%) rename ui/src/app/{edge/settings/component/shared => shared/formly}/repeat.ts (100%) delete mode 100644 ui/src/app/shared/type/environment.ts delete mode 100644 ui/src/apple-touch-icon.png create mode 100644 ui/src/environments/dummy.ts delete mode 100644 ui/src/environments/environment.ts delete mode 100644 ui/src/environments/openems-backend-dev-live.ts delete mode 100644 ui/src/environments/openems-backend-dev-local.ts delete mode 100644 ui/src/environments/openems-backend.ts delete mode 100644 ui/src/environments/openems-edge.ts delete mode 100644 ui/src/favicon-16x16.png delete mode 100644 ui/src/favicon-32x32.png delete mode 100644 ui/src/manifest.json delete mode 100644 ui/src/mstile-150x150.png delete mode 100644 ui/src/safari-pinned-tab.svg delete mode 100644 ui/src/theme/variables.scss create mode 100644 ui/src/themes/openems/environments/backend-dev.ts create mode 100644 ui/src/themes/openems/environments/backend-prod.ts create mode 100644 ui/src/themes/openems/environments/edge-dev.ts create mode 100644 ui/src/themes/openems/environments/edge-prod.ts rename ui/src/{ => themes/openems}/environments/gitpod.ts (63%) create mode 100644 ui/src/themes/openems/root/android-chrome-192x192.png create mode 100644 ui/src/themes/openems/root/android-chrome-512x512.png create mode 100644 ui/src/themes/openems/root/apple-touch-icon.png create mode 100644 ui/src/themes/openems/root/browserconfig.xml create mode 100644 ui/src/themes/openems/root/favicon-16x16.png create mode 100644 ui/src/themes/openems/root/favicon-32x32.png rename ui/src/{ => themes/openems/root}/favicon.ico (69%) create mode 100644 ui/src/themes/openems/root/mstile-150x150.png create mode 100644 ui/src/themes/openems/root/safari-pinned-tab.svg create mode 100644 ui/src/themes/openems/root/site.webmanifest create mode 100644 ui/src/themes/openems/scss/variables.scss diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dfd5ecccd2d..9ab056c5218 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -56,4 +56,7 @@ jobs: run: git diff --exit-code io.openems.edge.application/EdgeApp.bndrun - name: Build OpenEMS UI - run: ./gradlew buildUiForEdge --continue + run: | + cd ui + npm ci --prefer-offline --cache ~/.npm + node_modules/@angular/cli/bin/ng build -c "openems,openems-edge-prod,prod" \ No newline at end of file diff --git a/build.gradle b/build.gradle index 18dfe332308..96af3f9ed75 100644 --- a/build.gradle +++ b/build.gradle @@ -18,6 +18,11 @@ task buildComponents() { subprojects.each { proj -> if (proj.tasks.findAll { it.name == 'compileJava' }) { dependsOn(proj.compileJava) + proj.test { + testLogging { + events "passed", "skipped", "failed", "standardOut", "standardError" + } + } } } } @@ -52,20 +57,6 @@ task buildBackend() { } } -/* - * Build OpenEMS UI for OpenEMS Backend - */ -task buildUiForBackend() { - dependsOn ":ui:buildForBackend" -} - -/* - * Build OpenEMS UI for OpenEMS Edge - */ -task buildUiForEdge() { - dependsOn ":ui:buildForEdge" -} - /* * Javadoc */ diff --git a/io.openems.backend.common/src/io/openems/backend/common/metadata/Metadata.java b/io.openems.backend.common/src/io/openems/backend/common/metadata/Metadata.java index afaa47d046c..abac6f29180 100644 --- a/io.openems.backend.common/src/io/openems/backend/common/metadata/Metadata.java +++ b/io.openems.backend.common/src/io/openems/backend/common/metadata/Metadata.java @@ -15,6 +15,7 @@ import io.openems.common.channel.Level; import io.openems.common.exceptions.OpenemsError; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.jsonrpc.request.UpdateUserLanguageRequest.Language; import io.openems.common.exceptions.OpenemsException; import io.openems.common.types.ChannelAddress; import io.openems.common.types.EdgeConfig; @@ -270,4 +271,13 @@ public static String activeStateChannelsToString( */ public void registerUser(JsonObject jsonObject) throws OpenemsNamedException; + /** + * Update language from given user. + * + * @param user {@link User} the current user + * @param language to set language + * @throws OpenemsNamedException on error + */ + public void updateUserLanguage(User user, Language language) throws OpenemsNamedException; + } diff --git a/io.openems.backend.common/src/io/openems/backend/common/metadata/User.java b/io.openems.backend.common/src/io/openems/backend/common/metadata/User.java index c6e886b8e0a..9fbee5b8d8d 100644 --- a/io.openems.backend.common/src/io/openems/backend/common/metadata/User.java +++ b/io.openems.backend.common/src/io/openems/backend/common/metadata/User.java @@ -22,9 +22,13 @@ public class User extends AbstractUser { */ private final String token; - public User(String id, String name, String token, Role globalRole, NavigableMap roles) { + private final String language; + + public User(String id, String name, String token, Role globalRole, NavigableMap roles, + String language) { super(id, name, globalRole, roles); this.token = token; + this.language = language; } /** @@ -36,6 +40,15 @@ public String getToken() { return this.token; } + /** + * Gets the user language. + * + * @return the language + */ + public String getLanguage() { + return language; + } + /** * Gets the information whether the Users Role for the given Edge is equal or * more privileged than the given Role. diff --git a/io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/DummyMetadata.java b/io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/DummyMetadata.java index 8b9be0bfc93..827139ae300 100644 --- a/io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/DummyMetadata.java +++ b/io.openems.backend.metadata.dummy/src/io/openems/backend/metadata/dummy/DummyMetadata.java @@ -30,6 +30,7 @@ import io.openems.common.exceptions.NotImplementedException; import io.openems.common.exceptions.OpenemsError; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.jsonrpc.request.UpdateUserLanguageRequest.Language; import io.openems.common.session.Role; import io.openems.common.types.EdgeConfig; import io.openems.common.types.EdgeConfigDiff; @@ -52,6 +53,8 @@ public class DummyMetadata extends AbstractMetadata implements Metadata { private final Map users = new HashMap<>(); private final Map edges = new HashMap<>(); + private Language defaultLanguage = Language.DE; + public DummyMetadata() { super("Metadata.Dummy"); this.setInitialized(); @@ -75,7 +78,7 @@ public User authenticate(String username, String password) throws OpenemsNamedEx for (String edgeId : this.edges.keySet()) { roles.put(edgeId, Role.ADMIN); } - User user = new User(username, name, token, Role.ADMIN, roles); + User user = new User(username, name, token, Role.ADMIN, roles, this.defaultLanguage.name()); this.users.put(user.getId(), user); return user; } @@ -201,4 +204,9 @@ public void registerUser(JsonObject jsonObject) throws OpenemsNamedException { throw new IllegalArgumentException("DummyMetadata.registerUser() is not implemented"); } + @Override + public void updateUserLanguage(User user, Language language) throws OpenemsNamedException { + this.defaultLanguage = language; + } + } diff --git a/io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/FileMetadata.java b/io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/FileMetadata.java index 900cf2aecc0..e6b669615e0 100644 --- a/io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/FileMetadata.java +++ b/io.openems.backend.metadata.file/src/io/openems/backend/metadata/file/FileMetadata.java @@ -35,6 +35,7 @@ import io.openems.common.exceptions.NotImplementedException; import io.openems.common.exceptions.OpenemsError; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.jsonrpc.request.UpdateUserLanguageRequest.Language; import io.openems.common.session.Role; import io.openems.common.types.EdgeConfig; import io.openems.common.utils.JsonUtils; @@ -74,6 +75,7 @@ public class FileMetadata extends AbstractMetadata implements Metadata { private User user; private String path = ""; + private static Language LANGUAGE = Language.DE; public FileMetadata() { super("Metadata.File"); @@ -207,7 +209,7 @@ private synchronized void refreshData() { private static User generateUser() { return new User(FileMetadata.USER_ID, FileMetadata.USER_NAME, UUID.randomUUID().toString(), - FileMetadata.USER_GLOBAL_ROLE, new TreeMap<>()); + FileMetadata.USER_GLOBAL_ROLE, new TreeMap<>(), LANGUAGE.name()); } @Override @@ -240,4 +242,9 @@ public void registerUser(JsonObject jsonObject) throws OpenemsNamedException { throw new IllegalArgumentException("FileMetadata.registerUser() is not implemented"); } + @Override + public void updateUserLanguage(User user, Language locale) throws OpenemsNamedException { + LANGUAGE = locale; + } + } diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Field.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Field.java index 2f940210394..04581fa4e6e 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Field.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/Field.java @@ -237,7 +237,8 @@ public enum User implements Field { PASSWORD("password", true), // PARTNER("partner_id", true), // GLOBAL_ROLE("global_role", true), // - GROUPS("groups_id", true); + GROUPS("groups_id", true), // + OPENEMS_LANGUAGE("openems_language", true); public static final String ODOO_MODEL = "res.users"; public static final String ODOO_TABLE = ODOO_MODEL.replace(".", "_"); diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/MyUser.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/MyUser.java index fb76d18748d..e004fa73d5a 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/MyUser.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/MyUser.java @@ -10,8 +10,8 @@ public class MyUser extends User { private final int odooId; public MyUser(int odooId, String login, String name, String token, Role globalRole, - NavigableMap roles) { - super(login, name, token, globalRole, roles); + NavigableMap roles, String language) { + super(login, name, token, globalRole, roles, language); this.odooId = odooId; } diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/OdooMetadata.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/OdooMetadata.java index e577befe02d..f3133bab0b3 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/OdooMetadata.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/OdooMetadata.java @@ -28,6 +28,7 @@ import io.openems.backend.metadata.odoo.odoo.OdooUserRole; import io.openems.backend.metadata.odoo.postgres.PostgresHandler; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.jsonrpc.request.UpdateUserLanguageRequest.Language; import io.openems.common.exceptions.OpenemsException; import io.openems.common.session.Role; import io.openems.common.utils.JsonUtils; @@ -104,13 +105,16 @@ public User authenticate(String sessionId) throws OpenemsNamedException { roles.put(edgeId, role); } JsonObject jUser = JsonUtils.getAsJsonObject(result, "user"); + int odooUserId = JsonUtils.getAsInt(jUser, "id"); + MyUser user = new MyUser(// - JsonUtils.getAsInt(jUser, "id"), // + odooUserId, // JsonUtils.getAsString(jUser, "login"), // JsonUtils.getAsString(jUser, "name"), // sessionId, // Role.getRole(JsonUtils.getAsString(jUser, "global_role")), // - roles); + roles, // + JsonUtils.getAsString(jUser, "language")); this.users.put(user.getId(), user); return user; @@ -225,4 +229,9 @@ public void registerUser(JsonObject jsonObject) throws OpenemsNamedException { this.odooHandler.registerUser(jsonObject, role); } + @Override + public void updateUserLanguage(User user, Language language) throws OpenemsNamedException { + this.odooHandler.updateUserLanguage((MyUser) user, language); + } + } diff --git a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooHandler.java b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooHandler.java index 088b9809e63..39d3c24bd10 100644 --- a/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooHandler.java +++ b/io.openems.backend.metadata.odoo/src/io/openems/backend/metadata/odoo/odoo/OdooHandler.java @@ -27,6 +27,7 @@ import io.openems.backend.metadata.odoo.OdooMetadata; import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; import io.openems.common.exceptions.OpenemsException; +import io.openems.common.jsonrpc.request.UpdateUserLanguageRequest.Language; import io.openems.common.utils.JsonUtils; import io.openems.common.utils.ObjectUtils; import io.openems.common.utils.PasswordUtils; @@ -102,7 +103,7 @@ public Optional getEdgeIdBySetupPassword(String setupPassword) { return Optional.of(name); } catch (OpenemsException e) { - this.parent.logInfo(this.log, "Unable to find edge by setup passowrd [" + setupPassword + "]"); + this.parent.logInfo(this.log, "Unable to find Edge by setup password [" + setupPassword + "]"); } return Optional.empty(); @@ -739,4 +740,20 @@ private void sendRegistrationMail(int odooUserId, String password) throws Openem .build()); } + /** + * Update language for the given user. + * + * @param user {@link MyUser} the current user + * @param language to set + * @throws OpenemsException on error + */ + public void updateUserLanguage(MyUser user, Language language) throws OpenemsException { + try { + OdooUtils.write(this.credentials, Field.User.ODOO_MODEL, new Integer[] { user.getOdooId() }, // + new FieldValue(Field.User.OPENEMS_LANGUAGE, language.name())); + } catch (OpenemsNamedException ex) { + throw new OpenemsException("Unable to set language [" + language.name() + "] for current user", ex); + } + } + } diff --git a/io.openems.backend.uiwebsocket/src/io/openems/backend/uiwebsocket/impl/OnRequest.java b/io.openems.backend.uiwebsocket/src/io/openems/backend/uiwebsocket/impl/OnRequest.java index 5cc4b44232e..841c55f8375 100644 --- a/io.openems.backend.uiwebsocket/src/io/openems/backend/uiwebsocket/impl/OnRequest.java +++ b/io.openems.backend.uiwebsocket/src/io/openems/backend/uiwebsocket/impl/OnRequest.java @@ -32,6 +32,7 @@ import io.openems.common.jsonrpc.request.LogoutRequest; import io.openems.common.jsonrpc.request.SubscribeChannelsRequest; import io.openems.common.jsonrpc.request.SubscribeSystemLogRequest; +import io.openems.common.jsonrpc.request.UpdateUserLanguageRequest; import io.openems.common.jsonrpc.response.AuthenticateResponse; import io.openems.common.jsonrpc.response.Base64PayloadResponse; import io.openems.common.jsonrpc.response.EdgeRpcResponse; @@ -90,6 +91,9 @@ public CompletableFuture run(WebSocket ws, Jso case SubmitSetupProtocolRequest.METHOD: result = this.handleSubmitSetupProtocolRequest(user, SubmitSetupProtocolRequest.from(request)); break; + case UpdateUserLanguageRequest.METHOD: + result = this.handleUpdateUserLanguageRequest(user, UpdateUserLanguageRequest.from(request)); + break; } if (result != null) { @@ -151,7 +155,7 @@ private CompletableFuture handleAuthentication(WsData ws wsData.setUserId(user.getId()); wsData.setToken(user.getToken()); return CompletableFuture.completedFuture(new AuthenticateResponse(requestId, user.getToken(), user, - User.generateEdgeMetadatas(user, this.parent.metadata))); + User.generateEdgeMetadatas(user, this.parent.metadata), user.getLanguage())); } /** @@ -374,4 +378,19 @@ private CompletableFuture handleGetSetupProtocolRequest(U return CompletableFuture.completedFuture(new Base64PayloadResponse(request.getId(), protocol)); } + /** + * Handles a {@link UpdateUserLanguageRequest}. + * + * @param user the {@link User}r + * @param request the {@link UpdateUserLanguageRequest} + * @return the JSON-RPC Success Response Future + * @throws OpenemsNamedException on error + */ + private CompletableFuture handleUpdateUserLanguageRequest(User user, + UpdateUserLanguageRequest request) throws OpenemsNamedException { + this.parent.metadata.updateUserLanguage(user, request.getLanguage()); + + return CompletableFuture.completedFuture(new GenericJsonrpcResponseSuccess(request.getId())); + } + } diff --git a/io.openems.common/src/io/openems/common/jsonrpc/request/UpdateUserLanguageRequest.java b/io.openems.common/src/io/openems/common/jsonrpc/request/UpdateUserLanguageRequest.java new file mode 100644 index 00000000000..86a47df9a07 --- /dev/null +++ b/io.openems.common/src/io/openems/common/jsonrpc/request/UpdateUserLanguageRequest.java @@ -0,0 +1,85 @@ +package io.openems.common.jsonrpc.request; + +import com.google.gson.JsonObject; + +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.exceptions.OpenemsException; +import io.openems.common.jsonrpc.base.JsonrpcRequest; +import io.openems.common.utils.JsonUtils; + +/** + *

    + * {
    + *   "jsonrpc": "2.0",
    + *   "id": UUID,
    + *   "method": "updateUserLanguage",
    + *   "params": {
    + *      "language": {@link Language}
    + *   }
    + * }
    + * 
    + */ +public class UpdateUserLanguageRequest extends JsonrpcRequest { + + public static enum Language { + EN, // + DE, // + CZ, // + NL, // + ES, // + FR; + + /** + * Get {@link Language} for given key of the language or throws an exception. + * The given key is removed all leading and trailing whitespaces and converts + * all characters to upper case. + * + * @param languageKey to get the {@link Language} + * @return the founded {@link Language} or throws an exception + * @throws OpenemsException on error + */ + public static Language from(String languageKey) throws OpenemsException { + try { + return Language.valueOf(languageKey.trim().toUpperCase()); + } catch (IllegalArgumentException ex) { + throw new OpenemsException("Language [" + languageKey + "] not supported"); + } + } + + } + + public static final String METHOD = "updateUserLanguage"; + + /** + * Create {@link UpdateUserLanguageRequest} from a template + * {@link JsonrpcRequest}. + * + * @param request the template {@link JsonrpcRequest} + * @return the {@link UpdateUserLanguageRequest} + * @throws OpenemsNamedException on parse error + */ + public static UpdateUserLanguageRequest from(JsonrpcRequest request) throws OpenemsNamedException { + JsonObject params = request.getParams(); + String language = JsonUtils.getAsString(params, "language"); + return new UpdateUserLanguageRequest(request, Language.from(language)); + } + + private final Language language; + + private UpdateUserLanguageRequest(JsonrpcRequest request, Language language) throws OpenemsException { + super(request, METHOD); + this.language = language; + } + + @Override + public JsonObject getParams() { + return JsonUtils.buildJsonObject() // + .addProperty("language", this.language.name()) // + .build(); + } + + public Language getLanguage() { + return this.language; + } + +} diff --git a/io.openems.common/src/io/openems/common/jsonrpc/response/AuthenticateResponse.java b/io.openems.common/src/io/openems/common/jsonrpc/response/AuthenticateResponse.java index aa6874debba..b6da923abeb 100644 --- a/io.openems.common/src/io/openems/common/jsonrpc/response/AuthenticateResponse.java +++ b/io.openems.common/src/io/openems/common/jsonrpc/response/AuthenticateResponse.java @@ -92,12 +92,18 @@ protected JsonObject toJsonObject() { private final String token; private final AbstractUser user; private final List edges; + private final String language; public AuthenticateResponse(UUID id, String token, AbstractUser user, List edges) { + this(id, token, user, edges, null); + } + + public AuthenticateResponse(UUID id, String token, AbstractUser user, List edges, String language) { super(id); this.token = token; this.user = user; this.edges = edges; + this.language = language; } /** @@ -111,6 +117,7 @@ public JsonObject getResult() { .add("user", JsonUtils.buildJsonObject() // .addProperty("id", this.user.getId()) // .addProperty("name", this.user.getName()) // + .addProperty("language", this.language) // .add("globalRole", this.user.getGlobalRole().asJson()) // .build()) // .add("edges", EdgeMetadata.toJson(this.edges)) // diff --git a/io.openems.edge.battery.api/src/io/openems/edge/battery/protection/currenthandler/AbstractMaxCurrentHandler.java b/io.openems.edge.battery.api/src/io/openems/edge/battery/protection/currenthandler/AbstractMaxCurrentHandler.java index d5d47a53476..e7a96a5789f 100644 --- a/io.openems.edge.battery.api/src/io/openems/edge/battery/protection/currenthandler/AbstractMaxCurrentHandler.java +++ b/io.openems.edge.battery.api/src/io/openems/edge/battery/protection/currenthandler/AbstractMaxCurrentHandler.java @@ -188,6 +188,7 @@ protected AbstractMaxCurrentHandler(ClockProvider clockProvider, int initialBmsM * *