diff --git a/cnf/build.bnd b/cnf/build.bnd index 99091825797..1abe3c9cf6d 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.30',\ com.google.guava;version='30.1.1',\ - com.google.gson;version='2.8.5' + com.google.gson;version='2.8.7' testpath: \ slf4j.simple,\ @@ -95,4 +95,4 @@ testpath: \ Edge_Timedata;member=${filter;${p};io\.openems\.edge\.timedata\..*},\ javac.source: 1.8 -javac.target: 1.8 \ No newline at end of file +javac.target: 1.8 diff --git a/cnf/pom.xml b/cnf/pom.xml index 36b9a5d4f6f..eee944c974c 100644 --- a/cnf/pom.xml +++ b/cnf/pom.xml @@ -29,7 +29,7 @@ com.google.code.gson gson - 2.8.5 + 2.8.7 com.google.guava @@ -89,6 +89,25 @@ commons-fileupload 1.4 + + + + eu.chargetime.ocpp + common + 1.0 + + + + eu.chargetime.ocpp + OCPP-J + 1.0 + + + + eu.chargetime.ocpp + v1_6 + 1.0 + info.faljse @@ -192,7 +211,7 @@ org.eclipse.platform org.eclipse.osgi - 3.16.200 + 3.16.300 org.influxdb @@ -243,7 +262,7 @@ org.postgresql postgresql - 42.2.22 + 42.2.23 diff --git a/doc/modules/ROOT/pages/single_document.adoc b/doc/modules/ROOT/pages/single_document.adoc index f45acd792e7..03f4f9f8828 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.12.0 +Version 2021.13.0 :sectnums: :sectnumlevels: 4 :toc: diff --git a/io.openems.backend.application/BackendApp.bndrun b/io.openems.backend.application/BackendApp.bndrun index 17c548fffa7..498625d1a82 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.5,2.8.6)',\ + com.google.gson;version='[2.8.7,2.8.8)',\ 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)',\ @@ -78,4 +78,4 @@ 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)',\ - org.postgresql.jdbc;version='[42.2.22,42.2.23)' \ No newline at end of file + org.postgresql.jdbc;version='[42.2.23,42.2.24)' \ No newline at end of file diff --git a/io.openems.backend.b2brest/src/io/openems/backend/b2brest/RestHandler.java b/io.openems.backend.b2brest/src/io/openems/backend/b2brest/RestHandler.java index a756a43cd4f..f038015f9c7 100644 --- a/io.openems.backend.b2brest/src/io/openems/backend/b2brest/RestHandler.java +++ b/io.openems.backend.b2brest/src/io/openems/backend/b2brest/RestHandler.java @@ -146,10 +146,12 @@ private void sendErrorResponse(Request baseRequest, HttpServletResponse response * @throws OpenemsException on error */ private static JsonObject parseJson(Request baseRequest) throws OpenemsException { - JsonParser parser = new JsonParser(); try { - return parser.parse(new BufferedReader(new InputStreamReader(baseRequest.getInputStream())).lines() - .collect(Collectors.joining("\n"))).getAsJsonObject(); + return JsonParser.parseString(// + new BufferedReader(new InputStreamReader(baseRequest.getInputStream())) // + .lines() // + .collect(Collectors.joining("\n"))) // + .getAsJsonObject(); } catch (Exception e) { throw new OpenemsException("Unable to parse: " + e.getMessage()); } diff --git a/io.openems.common/src/io/openems/common/OpenemsConstants.java b/io.openems.common/src/io/openems/common/OpenemsConstants.java index cf172b65062..55e3bd30a27 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 = 12; + public final static short VERSION_MINOR = 13; /** * The patch version of OpenEMS. diff --git a/io.openems.common/src/io/openems/common/utils/JsonUtils.java b/io.openems.common/src/io/openems/common/utils/JsonUtils.java index eb4a741cb19..a83016ee0c2 100644 --- a/io.openems.common/src/io/openems/common/utils/JsonUtils.java +++ b/io.openems.common/src/io/openems/common/utils/JsonUtils.java @@ -700,6 +700,21 @@ public static int getAsInt(JsonElement jElement, String memberName) throws Opene throw OpenemsError.JSON_NO_INTEGER_MEMBER.exception(memberName, jPrimitive.toString().replaceAll("%", "%%")); } + /** + * Gets the member with given index of the {@link JsonArray} as int. + * + * @param jArray the {@link JsonArray} + * @param index the index of the member + * @return the int value + * @throws OpenemsNamedException on error + */ + public static int getAsInt(JsonArray jArray, int index) throws OpenemsNamedException { + if (index < 0 || jArray.size() <= index) { + throw OpenemsError.JSON_NO_INTEGER_MEMBER.exception(index, jArray.toString().replaceAll("%", "%%")); + } + return JsonUtils.getAsInt(jArray.get(index)); + } + /** * Gets the {@link JsonElement} as {@link Optional} {@link Integer}. * @@ -1350,8 +1365,7 @@ public static ZonedDateTime getAsZonedDateTime(JsonElement element, String membe */ public static JsonElement parse(String string) throws OpenemsNamedException { try { - JsonParser parser = new JsonParser(); - return parser.parse(string); + return JsonParser.parseString(string); } catch (JsonParseException e) { throw OpenemsError.JSON_PARSE_FAILED.exception(e.getMessage(), string); } @@ -1378,4 +1392,5 @@ public static void prettyPrint(JsonElement j) { String json = gson.toJson(j); System.out.println(json); } + } diff --git a/io.openems.common/src/io/openems/common/websocket/AbstractWebsocketServer.java b/io.openems.common/src/io/openems/common/websocket/AbstractWebsocketServer.java index bbcc3a38cdb..9b7218a5dd4 100644 --- a/io.openems.common/src/io/openems/common/websocket/AbstractWebsocketServer.java +++ b/io.openems.common/src/io/openems/common/websocket/AbstractWebsocketServer.java @@ -1,5 +1,6 @@ package io.openems.common.websocket; +import java.io.IOException; import java.net.BindException; import java.net.InetSocketAddress; import java.util.Collection; @@ -217,7 +218,7 @@ public void stop() { try { this.ws.stop(); return; - } catch (NullPointerException | InterruptedException e) { + } catch (NullPointerException | InterruptedException | IOException e) { this.log.warn("Unable to stop websocket server [" + this.getName() + "]. " + e.getClass().getSimpleName() + ": " + e.getMessage()); try { diff --git a/io.openems.common/test/io/openems/common/utils/JsonUtilsTest.java b/io.openems.common/test/io/openems/common/utils/JsonUtilsTest.java index 904d17d4289..416bf975283 100644 --- a/io.openems.common/test/io/openems/common/utils/JsonUtilsTest.java +++ b/io.openems.common/test/io/openems/common/utils/JsonUtilsTest.java @@ -7,6 +7,7 @@ import org.junit.Test; +import com.google.gson.JsonArray; import com.google.gson.JsonNull; import com.google.gson.JsonPrimitive; @@ -55,4 +56,28 @@ public void testGetAsBoolean() throws OpenemsNamedException { } } + @Test + public void testGetAsInt() throws OpenemsNamedException { + JsonArray arr = JsonUtils.buildJsonArray() // + .add(10) // + .add(20) // + .add(30) // + .build(); + + try { + JsonUtils.getAsInt(arr, -1); + fail(); + } catch (OpenemsNamedException e) { + } + assertEquals(10, JsonUtils.getAsInt(arr, 0)); + assertEquals(20, JsonUtils.getAsInt(arr, 1)); + assertEquals(30, JsonUtils.getAsInt(arr, 2)); + try { + JsonUtils.getAsInt(arr, 3); + fail(); + } catch (OpenemsNamedException e) { + } + + } + } diff --git a/io.openems.edge.application/EdgeApp.bndrun b/io.openems.edge.application/EdgeApp.bndrun index c84c0314420..95bf4a7ffcd 100644 --- a/io.openems.edge.application/EdgeApp.bndrun +++ b/io.openems.edge.application/EdgeApp.bndrun @@ -99,6 +99,7 @@ bnd.identity;id='io.openems.edge.ess.sma',\ bnd.identity;id='io.openems.edge.evcs.cluster',\ bnd.identity;id='io.openems.edge.evcs.core',\ + bnd.identity;id='io.openems.edge.evcs.goe.chargerhome',\ bnd.identity;id='io.openems.edge.evcs.hardybarth',\ bnd.identity;id='io.openems.edge.evcs.keba.kecontact',\ bnd.identity;id='io.openems.edge.evcs.ocpp.abl',\ @@ -148,7 +149,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.5,2.8.6)',\ + com.google.gson;version='[2.8.7,2.8.8)',\ 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)',\ @@ -230,6 +231,7 @@ io.openems.edge.evcs.api;version=snapshot,\ io.openems.edge.evcs.cluster;version=snapshot,\ io.openems.edge.evcs.core;version=snapshot,\ + io.openems.edge.evcs.goe.chargerhome;version=snapshot,\ io.openems.edge.evcs.hardybarth;version=snapshot,\ io.openems.edge.evcs.keba.kecontact;version=snapshot,\ io.openems.edge.evcs.ocpp.abl;version=snapshot,\ 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 2d2ad3bc97d..3f110dd44fa 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 @@ -362,10 +362,12 @@ private boolean handlePost(User user, ChannelAddress channelAddress, Request bas * @throws OpenemsException on error */ private static JsonObject parseJson(Request baseRequest) throws OpenemsException { - JsonParser parser = new JsonParser(); try { - return parser.parse(new BufferedReader(new InputStreamReader(baseRequest.getInputStream())).lines() - .collect(Collectors.joining("\n"))).getAsJsonObject(); + return JsonParser.parseString(// + new BufferedReader(new InputStreamReader(baseRequest.getInputStream())) // + .lines() // + .collect(Collectors.joining("\n"))) // + .getAsJsonObject(); } catch (Exception e) { throw new OpenemsException("Unable to parse: " + e.getMessage()); } diff --git a/io.openems.wrapper.eu.chargetime.ocpp/.classpath b/io.openems.edge.evcs.goe.chargerhome/.classpath similarity index 100% rename from io.openems.wrapper.eu.chargetime.ocpp/.classpath rename to io.openems.edge.evcs.goe.chargerhome/.classpath diff --git a/io.openems.edge.evcs.goe.chargerhome/.gitignore b/io.openems.edge.evcs.goe.chargerhome/.gitignore new file mode 100644 index 00000000000..36b0385c1a5 --- /dev/null +++ b/io.openems.edge.evcs.goe.chargerhome/.gitignore @@ -0,0 +1,2 @@ +/bin_test/ +/generated/ \ No newline at end of file diff --git a/io.openems.wrapper.eu.chargetime.ocpp/.project b/io.openems.edge.evcs.goe.chargerhome/.project similarity index 90% rename from io.openems.wrapper.eu.chargetime.ocpp/.project rename to io.openems.edge.evcs.goe.chargerhome/.project index 377dd1e7f70..13eb07b172f 100644 --- a/io.openems.wrapper.eu.chargetime.ocpp/.project +++ b/io.openems.edge.evcs.goe.chargerhome/.project @@ -1,6 +1,6 @@ - io.openems.wrapper.eu.chargetime.ocpp + io.openems.edge.evcs.keba.kecontact diff --git a/io.openems.edge.evcs.goe.chargerhome/bnd.bnd b/io.openems.edge.evcs.goe.chargerhome/bnd.bnd new file mode 100644 index 00000000000..80e3fed5106 --- /dev/null +++ b/io.openems.edge.evcs.goe.chargerhome/bnd.bnd @@ -0,0 +1,13 @@ +Bundle-Name: OpenEMS Edge EVCS Go-e Charger Home +Bundle-Vendor: FENECON GmbH +Bundle-License: https://opensource.org/licenses/EPL-2.0 +Bundle-Version: 1.0.0.${tstamp} + +-buildpath: \ + ${buildpath},\ + io.openems.common,\ + io.openems.edge.common,\ + io.openems.edge.evcs.api + +-testpath: \ + ${testpath} diff --git a/io.openems.edge.evcs.goe.chargerhome/doc/api_de.pdf b/io.openems.edge.evcs.goe.chargerhome/doc/api_de.pdf new file mode 100644 index 00000000000..97accb3df24 Binary files /dev/null and b/io.openems.edge.evcs.goe.chargerhome/doc/api_de.pdf differ diff --git a/io.openems.edge.evcs.goe.chargerhome/readme.adoc b/io.openems.edge.evcs.goe.chargerhome/readme.adoc new file mode 100644 index 00000000000..1beb374d74e --- /dev/null +++ b/io.openems.edge.evcs.goe.chargerhome/readme.adoc @@ -0,0 +1,8 @@ += Go-e Charger Home Charging Station + +This component implements the go-e charger home charging station, which is controlled and read out using the Rest-API protocol. +It collects all relevant informations into the given Nature Channels and its own Channels and sends charging commands that have been set by another controllers. + +Implemented Natures: +* Evcs (Electric Vehicle Charging Station) +* ManagedEvcs diff --git a/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/Config.java b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/Config.java new file mode 100644 index 00000000000..b07083c3231 --- /dev/null +++ b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/Config.java @@ -0,0 +1,33 @@ +package io.openems.edge.evcs.goe.chargerhome; + +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + +@ObjectClassDefinition(name = "EVCS go-e Charger Home", // + description = "Implements the go-e Charger Home electric vehicle charging station.") +@interface Config { + + @AttributeDefinition(name = "Component-ID", description = "Unique ID of this Component") + String id() default "evcs0"; + + @AttributeDefinition(name = "Alias", description = "Human-readable name " + + "of this Component; defaults to Component-ID") + String alias() default ""; + + @AttributeDefinition(name = "Is enabled?", description = "Is this Component enabled?") + boolean enabled() default true; + + @AttributeDefinition(name = "Debug Mode", description = "Activates the debug mode") + boolean debugMode() default false; + + @AttributeDefinition(name = "IP-Address", description = "The IP address of the charging station.", required = true) + String ip() default "192.168.1.130"; + + @AttributeDefinition(name = "Minimum current", description = "Minimum current of the Charger in mA.", required = true) + int minHwCurrent() default 6000; + + @AttributeDefinition(name = "Maximum current", description = "Maximum current of the Charger in mA.", required = true) + int maxHwCurrent() default 32000; + + String webconsole_configurationFactory_nameHint() default "EVCS go-e Charger Home [{id}]"; +} \ No newline at end of file diff --git a/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/Errors.java b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/Errors.java new file mode 100644 index 00000000000..d1057a4db12 --- /dev/null +++ b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/Errors.java @@ -0,0 +1,34 @@ +package io.openems.edge.evcs.goe.chargerhome; + +import io.openems.common.types.OptionsEnum; + +public enum Errors implements OptionsEnum { + UNDEFINED(0, "Undefined"), // + RCCB(1, "Residual current operated device Error"), // + PHASE(3, "Phase Error"), // + NO_GROUND(8, "No Ground"), // + INTERNAL(10, "Internal error"); // + + private final int value; + private final String name; + + private Errors(int value, String name) { + this.value = value; + this.name = name; + } + + @Override + public int getValue() { + return this.value; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public OptionsEnum getUndefined() { + return UNDEFINED; + } +} \ No newline at end of file diff --git a/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/GoeApi.java b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/GoeApi.java new file mode 100644 index 00000000000..49ee83078b1 --- /dev/null +++ b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/GoeApi.java @@ -0,0 +1,212 @@ +package io.openems.edge.evcs.goe.chargerhome; + +import com.google.gson.JsonObject; +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.exceptions.OpenemsException; +import io.openems.common.utils.JsonUtils; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +public class GoeApi { + private final String ipAddress; + private final int executeEveryCycle = 10; + private int cycle; + private JsonObject jsonStatus; + private GoeChargerHomeImpl parent; + + public GoeApi(GoeChargerHomeImpl p) { + this.ipAddress = p.config.ip(); + this.cycle = 0; + this.jsonStatus = null; + this.parent = p; + } + + /** + * Gets the status from go-e. See https://github.com/goecharger + * + * @return the boolean value + * @throws OpenemsNamedException on error + */ + public JsonObject getStatus() { + + try { + // Execute every x-Cycle + if (this.cycle == 0 || this.cycle % this.executeEveryCycle == 0) { + JsonObject json = new JsonObject(); + String url = "http://" + this.ipAddress + "/status"; + json = this.sendRequest(url, "GET"); + + this.cycle = 1; + this.jsonStatus = json; + return json; + } else { + this.cycle++; + return this.jsonStatus; + } + + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * Sets the activation status for go-e. + * + *

+ * See https://github.com/goecharger. + * + * @param active boolean if the charger should be set to active + * @return JsonObject with new settings + */ + public JsonObject setActive(boolean active) { + + try { + if (active != this.parent.isActive) { + JsonObject json = new JsonObject(); + Integer status = 0; + if (active) { + status = 1; + } + String url = "http://" + this.ipAddress + "/mqtt?payload=alw=" + Integer.toString(status); + json = this.sendRequest(url, "PUT"); + this.parent.isActive = active; + this.jsonStatus = json; + return json; + } else { + return this.jsonStatus; + } + + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * Sets the Current in Ampere for go-e See https://github.com/goecharger. + * + * @param current current in mA + * @return JsonObject with new settings + */ + public JsonObject setCurrent(int current) { + + try { + Integer currentAmpere = current / 1000; + if (currentAmpere != this.parent.activeCurrent / 1000) { + JsonObject json = new JsonObject(); + String url = "http://" + this.ipAddress + "/mqtt?payload=amp=" + Integer.toString(currentAmpere); + json = this.sendRequest(url, "PUT"); + this.parent.activeCurrent = currentAmpere * 1000; + this.jsonStatus = json; + return json; + } else { + return this.jsonStatus; + } + + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * Limit MaxEnergy for go-e See https://github.com/goecharger. + * + * @param limit maximum energy limit enabled + * @return JsonObject with new settings + */ + public boolean limitMaxEnergy(boolean limit) { + + try { + JsonObject json = new JsonObject(); + int stp = 0; + if (limit) { + stp = 2; + } + String url = "http://" + this.ipAddress + "/mqtt?payload=stp=" + Integer.toString(stp); + json = this.sendRequest(url, "PUT"); + if (json != null) { + this.jsonStatus = json; + return true; + } else { + return false; + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * Sets the MaxEnergy in 0.1 kWh for go-e See https://github.com/goecharger. + * + * @param maxEnergy maximum allowed energy + * @return JsonObject with new settings + */ + public boolean setMaxEnergy(int maxEnergy) { + + try { + JsonObject json = new JsonObject(); + if (maxEnergy > 0) { + this.limitMaxEnergy(true); + } else { + this.limitMaxEnergy(false); + } + String url = "http://" + this.ipAddress + "/mqtt?payload=dwo=" + Integer.toString(maxEnergy); + json = this.sendRequest(url, "PUT"); + if (json != null) { + this.jsonStatus = json; + return true; + } else { + return false; + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * Sends a get or set request to the go-e API. + * + * + * @param urlString used URL + * @param requestMethod requested method + * @return a JsonObject or JsonArray + */ + private JsonObject sendRequest(String urlString, String requestMethod) throws OpenemsNamedException { + try { + URL url = new URL(urlString); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod(requestMethod); + con.setConnectTimeout(5000); + con.setReadTimeout(5000); + int status = con.getResponseCode(); + String body; + try (BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) { + // Read HTTP response + StringBuilder content = new StringBuilder(); + String line; + while ((line = in.readLine()) != null) { + content.append(line); + content.append(System.lineSeparator()); + } + body = content.toString(); + } + if (status < 300) { + // Parse response to JSON + return JsonUtils.parseToJsonObject(body); + } else { + throw new OpenemsException("Error while reading from go-e API. Response code: " + status + ". " + body); + } + } catch (OpenemsNamedException | IOException e) { + throw new OpenemsException( + "Unable to read from go-e API. " + e.getClass().getSimpleName() + ": " + e.getMessage()); + } + } + +} diff --git a/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/GoeChannelId.java b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/GoeChannelId.java new file mode 100644 index 00000000000..2bc2d941ea1 --- /dev/null +++ b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/GoeChannelId.java @@ -0,0 +1,39 @@ +package io.openems.edge.evcs.goe.chargerhome; + +import io.openems.common.channel.Level; +import io.openems.common.channel.Unit; +import io.openems.common.types.OpenemsType; +import io.openems.edge.common.channel.Doc; +import io.openems.edge.evcs.api.Status; + +public enum GoeChannelId implements io.openems.edge.common.channel.ChannelId { + + ALIAS(Doc.of(OpenemsType.STRING).text("A human-readable name of this Component")), + PRODUCT(Doc.of(OpenemsType.STRING).text("Model name (variant)")), + SERIAL(Doc.of(OpenemsType.STRING).text("Serial number")), + FIRMWARE(Doc.of(OpenemsType.STRING).text("Firmware version")), + STATUS_GOE(Doc.of(Status.values()).text("Current state of the charging station")), + ERROR(Doc.of(Errors.values()).text("")), + CURR_USER(Doc.of(OpenemsType.INTEGER).unit(Unit.MILLIAMPERE).text("Current preset value of the user")), + VOLTAGE_L1(Doc.of(OpenemsType.INTEGER).unit(Unit.VOLT).text("Voltage on L1")), + VOLTAGE_L2(Doc.of(OpenemsType.INTEGER).unit(Unit.VOLT).text("Voltage on L2")), + VOLTAGE_L3(Doc.of(OpenemsType.INTEGER).unit(Unit.VOLT).text("Voltage on L3")), + CURRENT_L1(Doc.of(OpenemsType.INTEGER).unit(Unit.MILLIAMPERE).text("Current on L1")), + CURRENT_L2(Doc.of(OpenemsType.INTEGER).unit(Unit.MILLIAMPERE).text("Current on L2")), + CURRENT_L3(Doc.of(OpenemsType.INTEGER).unit(Unit.MILLIAMPERE).text("Current on L3")), + ACTUAL_POWER(Doc.of(OpenemsType.INTEGER).unit(Unit.MILLIWATT).text("Total real power")), + ENERGY_TOTAL(Doc.of(OpenemsType.INTEGER).unit(Unit.WATT_HOURS).text("Total power consumption")), + + CHARGINGSTATION_STATE_ERROR(Doc.of(Level.WARNING)); + + private final Doc doc; + + private GoeChannelId(Doc doc) { + this.doc = doc; + } + + @Override + public Doc doc() { + return this.doc; + } +} \ No newline at end of file diff --git a/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/GoeChargerHomeImpl.java b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/GoeChargerHomeImpl.java new file mode 100644 index 00000000000..f206a79fcda --- /dev/null +++ b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/GoeChargerHomeImpl.java @@ -0,0 +1,322 @@ +package io.openems.edge.evcs.goe.chargerhome; + +import java.net.UnknownHostException; +import java.util.Optional; + +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.osgi.service.event.Event; +import org.osgi.service.event.EventConstants; +import org.osgi.service.event.EventHandler; +import org.osgi.service.metatype.annotations.Designate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +import io.openems.common.exceptions.OpenemsError.OpenemsNamedException; +import io.openems.common.utils.JsonUtils; +import io.openems.edge.common.channel.Channel; +import io.openems.edge.common.channel.WriteChannel; +import io.openems.edge.common.channel.value.Value; +import io.openems.edge.common.component.AbstractOpenemsComponent; +import io.openems.edge.common.component.OpenemsComponent; +import io.openems.edge.common.event.EdgeEventConstants; +import io.openems.edge.evcs.api.ChargingType; +import io.openems.edge.evcs.api.Evcs; +import io.openems.edge.evcs.api.EvcsPower; +import io.openems.edge.evcs.api.ManagedEvcs; +import io.openems.edge.evcs.api.Status; + +@Designate(ocd = Config.class, factory = true) +@Component(name = "Evcs.Goe.ChargerHome", // + immediate = true, // + configurationPolicy = ConfigurationPolicy.REQUIRE, // + property = EventConstants.EVENT_TOPIC + "=" + EdgeEventConstants.TOPIC_CYCLE_BEFORE_PROCESS_IMAGE) +public class GoeChargerHomeImpl extends AbstractOpenemsComponent + implements ManagedEvcs, Evcs, OpenemsComponent, EventHandler { + + private final Logger log = LoggerFactory.getLogger(GoeChargerHomeImpl.class); + private GoeApi goeapi = null; + + protected Config config; + + @Reference + private EvcsPower evcsPower; + + // Is charger active + public boolean isActive; + + // Actual current + public int activeCurrent; + + // Minimal current + private int minCurrent; + + // Maximum current + private int maxCurrent; + + // Last energy session + private int lastEnergySession; + + /** + * Constructor. + */ + public GoeChargerHomeImpl() { + super(// + OpenemsComponent.ChannelId.values(), // + ManagedEvcs.ChannelId.values(), // + Evcs.ChannelId.values(), // + GoeChannelId.values() // + ); + } + + @Activate + void activate(ComponentContext context, Config config) throws UnknownHostException { + super.activate(context, config.id(), config.alias(), config.enabled()); + + this.channel(GoeChannelId.ALIAS).setNextValue(config.alias()); + this.config = config; + this.minCurrent = config.minHwCurrent(); + this.maxCurrent = config.maxHwCurrent(); + this._setChargingType(ChargingType.AC); + this._setPowerPrecision(230); + + // start api-Worker + this.goeapi = new GoeApi(this); + } + + @Deactivate + protected void deactivate() { + super.deactivate(); + } + + @Override + public void handleEvent(Event event) { + if (!this.isEnabled()) { + return; + } + switch (event.getTopic()) { + case EdgeEventConstants.TOPIC_CYCLE_BEFORE_PROCESS_IMAGE: + + // handle writes + JsonObject json = this.goeapi.getStatus(); + if (json == null) { + this.channel(Evcs.ChannelId.CHARGINGSTATION_COMMUNICATION_FAILED).setNextValue(true); + + } else { + try { + // Is Active + int alw = JsonUtils.getAsInt(json, "alw"); + if (alw == 1) { + this.isActive = true; + } else { + this.isActive = false; + } + + // General information + this.channel(GoeChannelId.SERIAL).setNextValue(JsonUtils.getAsString(json, "sse")); + this.channel(GoeChannelId.FIRMWARE).setNextValue(JsonUtils.getAsString(json, "fwv")); + + // Current status + int status = JsonUtils.getAsInt(json, "car"); + this.channel(GoeChannelId.STATUS_GOE).setNextValue(status); + this.channel(Evcs.ChannelId.STATUS).setNextValue(this.convertGoeStatus(status)); + + // Detailed charge information + this.activeCurrent = JsonUtils.getAsInt(json, "amp") * 1000; + this.channel(GoeChannelId.CURR_USER).setNextValue(this.activeCurrent); + + JsonArray nrg = JsonUtils.getAsJsonArray(json, "nrg"); + this.channel(GoeChannelId.VOLTAGE_L1).setNextValue(JsonUtils.getAsInt(nrg, 0)); + this.channel(GoeChannelId.VOLTAGE_L2).setNextValue(JsonUtils.getAsInt(nrg, 1)); + this.channel(GoeChannelId.VOLTAGE_L3).setNextValue(JsonUtils.getAsInt(nrg, 2)); + this.channel(GoeChannelId.CURRENT_L1).setNextValue(JsonUtils.getAsInt(nrg, 4) * 100); + this.channel(GoeChannelId.CURRENT_L2).setNextValue(JsonUtils.getAsInt(nrg, 5) * 100); + this.channel(GoeChannelId.CURRENT_L3).setNextValue(JsonUtils.getAsInt(nrg, 6) * 100); + int power = JsonUtils.getAsInt(nrg, 11); + this.channel(GoeChannelId.ACTUAL_POWER).setNextValue(power * 10); + this.channel(Evcs.ChannelId.CHARGE_POWER).setNextValue(power * 10); + + int phases = this.convertGoePhase(JsonUtils.getAsInt(json, "pha")); + this.channel(Evcs.ChannelId.PHASES).setNextValue(phases); + + // Hardware limits + int cableCurrent = JsonUtils.getAsInt(json, "cbl") * 1000; + this.maxCurrent = cableCurrent > 0 && cableCurrent < this.config.maxHwCurrent() // + ? cableCurrent // + : this.config.maxHwCurrent(); + this._setMinimumHardwarePower(this.minCurrent * phases * 230); + this._setMaximumHardwarePower(this.maxCurrent * phases * 230); + + // Energy + this.channel(GoeChannelId.ENERGY_TOTAL).setNextValue(JsonUtils.getAsInt(json, "eto") * 100); + this.channel(Evcs.ChannelId.ENERGY_SESSION) + .setNextValue(JsonUtils.getAsInt(json, "dws") * 10 / 3600); + + // Error + this.channel(GoeChannelId.ERROR).setNextValue(JsonUtils.getAsString(json, "err")); + this.channel(Evcs.ChannelId.CHARGINGSTATION_COMMUNICATION_FAILED).setNextValue(false); + + // Set the power and energy + this.setPower(); + this.setEnergySession(); + + } catch (OpenemsNamedException e) { + this.channel(Evcs.ChannelId.CHARGINGSTATION_COMMUNICATION_FAILED).setNextValue(true); + } + } + break; + default: + break; + } + + } + + private Status convertGoeStatus(int status) { + switch (status) { + case 1: // ready for charging, car unplugged + return Status.NOT_READY_FOR_CHARGING; + case 2: // charging + return Status.CHARGING; + case 3: // waiting for car + return Status.READY_FOR_CHARGING; + case 4: // charging finished, car plugged + return Status.CHARGING_FINISHED; + default: + return Status.UNDEFINED; + } + } + + /** + * Converts the binary input into the amount of phases that are used to charge. + * + * @param phase binary phase input + * @return amount of phases + */ + private int convertGoePhase(int phase) { + int phasen = (byte) phase & 0b00111000; + switch (phasen) { + case 8: // 0b00001000: Phase 1 is active + return 1; + case 24: // 0b00011000: Phase 1+2 is active + return 2; + case 56: // 0b00111000: Phase1-3 are active + return 3; + default: + return 0; + } + } + + /** + * Sets the current from SET_CHARGE_POWER channel. + * + *

+ * Possible charge currents are between MinCurrent and MaxCurrent. Values below + * are set to zero and values above are set to the maximum. + */ + private void setPower() { + WriteChannel energyLimitChannel = this.channel(ManagedEvcs.ChannelId.SET_ENERGY_LIMIT); + int energyLimit = energyLimitChannel.getNextValue().orElse(0); + // Check energy limit + if (energyLimit == 0 || energyLimit > this.getEnergySession().orElse(0)) { + WriteChannel channel = this.channel(ManagedEvcs.ChannelId.SET_CHARGE_POWER_LIMIT); + Optional valueOpt = channel.getNextWriteValueAndReset(); + if (valueOpt.isPresent()) { + Integer power = valueOpt.get(); + Channel minimumHardwarePowerChannel = this.channel(Evcs.ChannelId.MINIMUM_HARDWARE_POWER); + + // Charging under MINIMUM_HARDWARE_POWER isn't possible + if (power < minimumHardwarePowerChannel.value().orElse(0)) { + power = 0; + this.goeapi.setActive(false); + } else { + this.goeapi.setActive(true); + } + Value phases = this.getPhases(); + Integer current = power * 1000 / phases.orElse(3) /* e.g. 3 phases */ / 230; /* voltage */ + + /* + * Limits the charging value because goe knows only values between MinCurrent + * and MaxCurrent + */ + if (current > this.maxCurrent) { + current = this.maxCurrent; + } + if (current < this.minCurrent) { + current = this.minCurrent; + } + JsonObject result = this.goeapi.setCurrent(current); + if (result.isJsonObject()) { + this._setSetChargePowerLimit(power); + this.debugLog(result.toString()); + } + } + } else { + this.goeapi.setActive(false); + this.debugLog("Maximum energy limit reached"); + this._setStatus(Status.ENERGY_LIMIT_REACHED); + } + } + + /** + * Sets the Energy Limit for this session from SET_ENERGY_SESSION channel. + * + *

+ * Allowed values for the command setenergy are 0; 1-65535 the value of the + * command is 0.1 Wh. The charging station will charge till this limit. + */ + private void setEnergySession() { + WriteChannel channel = this.channel(ManagedEvcs.ChannelId.SET_ENERGY_LIMIT); + Optional valueOpt = channel.getNextWriteValueAndReset(); + if (valueOpt.isPresent()) { + Integer energyTarget = valueOpt.get(); + if (energyTarget < 0) { + return; + } + + /* + * limits the target value because go-e knows only values between 0 and 65535 + * 0.1Wh + */ + energyTarget /= 100; + energyTarget = energyTarget > 65535 ? 65535 : energyTarget; + energyTarget = energyTarget > 0 && energyTarget < 1 ? 1 : energyTarget; + if (!energyTarget.equals(this.lastEnergySession)) { + // Set energy limit + this.channel(ManagedEvcs.ChannelId.SET_ENERGY_LIMIT).setNextValue(energyTarget * 100); + this.debugLog("Setting go-e " + this.alias() + " Energy Limit in this Session to [" + energyTarget / 10 + + " kWh]"); + + if (this.goeapi.setMaxEnergy(energyTarget)) { + this.lastEnergySession = energyTarget; + } + } + } + } + + @Override + public EvcsPower getEvcsPower() { + return this.evcsPower; + } + + /** + * Debug Log. + * + *

+ * Logging only if the debug mode is enabled + * + * @param message text that should be logged + */ + public void debugLog(String message) { + if (this.config.debugMode()) { + this.logInfo(this.log, message); + } + } + +} diff --git a/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/Report.java b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/Report.java new file mode 100644 index 00000000000..0acf0dc25ce --- /dev/null +++ b/io.openems.edge.evcs.goe.chargerhome/src/io/openems/edge/evcs/goe/chargerhome/Report.java @@ -0,0 +1,24 @@ +package io.openems.edge.evcs.goe.chargerhome; + +public enum Report { + REPORT1(200), REPORT2(50), REPORT3(10); + + private int requestSeconds; + + private Report(int requestSeconds) { + this.requestSeconds = requestSeconds; + } + + /** + * Get requested seconds. + * + * @return seconds + */ + public int getRequestSeconds() { + return this.requestSeconds; + } + + public void setRequestSeconds(int requestSeconds) { + this.requestSeconds = requestSeconds; + } +} diff --git a/io.openems.wrapper.eu.chargetime.ocpp/src/.gitignore b/io.openems.edge.evcs.goe.chargerhome/test/.gitignore similarity index 100% rename from io.openems.wrapper.eu.chargetime.ocpp/src/.gitignore rename to io.openems.edge.evcs.goe.chargerhome/test/.gitignore diff --git a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg511/MeterJanitzaUmg511Impl.java b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg511/MeterJanitzaUmg511Impl.java index f1d64f5a974..406847f00bb 100644 --- a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg511/MeterJanitzaUmg511Impl.java +++ b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg511/MeterJanitzaUmg511Impl.java @@ -91,14 +91,16 @@ public MeterType getMeterType() { @Override protected ModbusProtocol defineModbusProtocol() throws OpenemsException { - return new ModbusProtocol(this, // + ModbusProtocol modbusProtocol = new ModbusProtocol(this, // new FC3ReadRegistersTask(3845, Priority.HIGH, // m(new FloatDoublewordElement(3845)) .m(AsymmetricMeter.ChannelId.VOLTAGE_L1, ElementToChannelConverter.DIRECT_1_TO_1)// .m(SymmetricMeter.ChannelId.VOLTAGE, ElementToChannelConverter.DIRECT_1_TO_1)// .build(), - m(AsymmetricMeter.ChannelId.VOLTAGE_L2, new FloatDoublewordElement(3847), ElementToChannelConverter.SCALE_FACTOR_3), // - m(AsymmetricMeter.ChannelId.VOLTAGE_L3, new FloatDoublewordElement(3849),ElementToChannelConverter.SCALE_FACTOR_3), //, // + m(AsymmetricMeter.ChannelId.VOLTAGE_L2, new FloatDoublewordElement(3847), + ElementToChannelConverter.SCALE_FACTOR_3), // + m(AsymmetricMeter.ChannelId.VOLTAGE_L3, new FloatDoublewordElement(3849), + ElementToChannelConverter.SCALE_FACTOR_3), // , // new DummyRegisterElement(3851, 3852), m(new FloatDoublewordElement(3853)) // .m(AsymmetricMeter.ChannelId.CURRENT_L1, ElementToChannelConverter.SCALE_FACTOR_3_AND_INVERT_IF_TRUE(this.invert)) // @@ -129,6 +131,20 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { ElementToChannelConverter.INVERT_IF_TRUE(this.invert))), // new FC3ReadRegistersTask(3995, Priority.LOW, // m(SymmetricMeter.ChannelId.FREQUENCY, new FloatDoublewordElement(3995)))); + + if (this.invert) { + modbusProtocol.addTask(new FC3ReadRegistersTask(19068, Priority.LOW, // + m(SymmetricMeter.ChannelId.ACTIVE_CONSUMPTION_ENERGY, new FloatDoublewordElement(19068)), + new DummyRegisterElement(19070, 19075), + m(SymmetricMeter.ChannelId.ACTIVE_PRODUCTION_ENERGY, new FloatDoublewordElement(19076)))); + } else { + modbusProtocol.addTask(new FC3ReadRegistersTask(19068, Priority.LOW, // + m(SymmetricMeter.ChannelId.ACTIVE_PRODUCTION_ENERGY, new FloatDoublewordElement(19068)), + new DummyRegisterElement(19070, 19075), + m(SymmetricMeter.ChannelId.ACTIVE_CONSUMPTION_ENERGY, new FloatDoublewordElement(19076)))); + } + + return modbusProtocol; } @Override diff --git a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg604/MeterJanitzaUmg604Impl.java b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg604/MeterJanitzaUmg604Impl.java index 2040f62bf62..32f024bcd58 100644 --- a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg604/MeterJanitzaUmg604Impl.java +++ b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg604/MeterJanitzaUmg604Impl.java @@ -91,7 +91,7 @@ public MeterType getMeterType() { @Override protected ModbusProtocol defineModbusProtocol() throws OpenemsException { - return new ModbusProtocol(this, // + ModbusProtocol modbusProtocol = new ModbusProtocol(this, // new FC3ReadRegistersTask(1317, Priority.HIGH, // m(new FloatDoublewordElement(1317)) .m(AsymmetricMeter.ChannelId.VOLTAGE_L1, ElementToChannelConverter.SCALE_FACTOR_3)// @@ -134,6 +134,20 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { new FC3ReadRegistersTask(1439, Priority.LOW, // m(SymmetricMeter.ChannelId.FREQUENCY, new FloatDoublewordElement(1439), // ElementToChannelConverter.SCALE_FACTOR_3))); + + if (this.invert) { + modbusProtocol.addTask(new FC3ReadRegistersTask(9851, Priority.LOW, // + m(SymmetricMeter.ChannelId.ACTIVE_CONSUMPTION_ENERGY, new FloatDoublewordElement(9851)), + new DummyRegisterElement(9853, 9862), + m(SymmetricMeter.ChannelId.ACTIVE_PRODUCTION_ENERGY, new FloatDoublewordElement(9863)))); + } else { + modbusProtocol.addTask(new FC3ReadRegistersTask(9851, Priority.LOW, // + m(SymmetricMeter.ChannelId.ACTIVE_PRODUCTION_ENERGY, new FloatDoublewordElement(9851)), + new DummyRegisterElement(9853, 9862), + m(SymmetricMeter.ChannelId.ACTIVE_CONSUMPTION_ENERGY, new FloatDoublewordElement(9863)))); + } + + return modbusProtocol; } @Override diff --git a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg96rme/MeterJanitzaUmg96rme.java b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg96rme/MeterJanitzaUmg96rme.java index 2732d6f8951..cd73242a0c2 100644 --- a/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg96rme/MeterJanitzaUmg96rme.java +++ b/io.openems.edge.meter.janitza/src/io/openems/edge/meter/janitza/umg96rme/MeterJanitzaUmg96rme.java @@ -106,7 +106,7 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { * We are using the FLOAT registers from the modbus table, because they are all * reachable within one ReadMultipleRegistersRequest. */ - return new ModbusProtocol(this, // + ModbusProtocol modbusProtocol = new ModbusProtocol(this, // new FC3ReadRegistersTask(800, Priority.HIGH, // m(SymmetricMeter.ChannelId.FREQUENCY, new FloatDoublewordElement(800), ElementToChannelConverter.SCALE_FACTOR_3), @@ -143,12 +143,21 @@ protected ModbusProtocol defineModbusProtocol() throws OpenemsException { m(AsymmetricMeter.ChannelId.REACTIVE_POWER_L3, new FloatDoublewordElement(880), ElementToChannelConverter.INVERT_IF_TRUE(this.invert)), m(SymmetricMeter.ChannelId.REACTIVE_POWER, new FloatDoublewordElement(882), - ElementToChannelConverter.INVERT_IF_TRUE(this.invert))), + ElementToChannelConverter.INVERT_IF_TRUE(this.invert)))); + + if (this.invert) { + modbusProtocol.addTask(new FC3ReadRegistersTask(5800, Priority.LOW, // + m(SymmetricMeter.ChannelId.ACTIVE_CONSUMPTION_ENERGY, new UnsignedDoublewordElement(5800)), + new DummyRegisterElement(5802, 5815), + m(SymmetricMeter.ChannelId.ACTIVE_PRODUCTION_ENERGY, new UnsignedDoublewordElement(5816)))); + } else { + modbusProtocol.addTask(new FC3ReadRegistersTask(5800, Priority.LOW, // + m(SymmetricMeter.ChannelId.ACTIVE_PRODUCTION_ENERGY, new UnsignedDoublewordElement(5800)), + new DummyRegisterElement(5802, 5815), + m(SymmetricMeter.ChannelId.ACTIVE_CONSUMPTION_ENERGY, new UnsignedDoublewordElement(5816)))); + } - new FC3ReadRegistersTask(5800, Priority.LOW, // - m(SymmetricMeter.ChannelId.ACTIVE_PRODUCTION_ENERGY, new UnsignedDoublewordElement(5800)), - new DummyRegisterElement(5802, 5815), - m(SymmetricMeter.ChannelId.ACTIVE_CONSUMPTION_ENERGY, new UnsignedDoublewordElement(5816)))); + return modbusProtocol; } @Override diff --git a/io.openems.edge.pvinverter.sma/readme.adoc b/io.openems.edge.pvinverter.sma/readme.adoc index 677e413f2c9..038439f6eeb 100644 --- a/io.openems.edge.pvinverter.sma/readme.adoc +++ b/io.openems.edge.pvinverter.sma/readme.adoc @@ -3,6 +3,7 @@ Implementation of the SMA Sunny Tripower PV inverters. Tested on +- https://www.sma.de/produkte/solar-wechselrichter/sunny-tripower-80-100.html[SMA SUNNY TRIPOWER 8.0 / 10.0 ] - https://www.sma.de/produkte/solar-wechselrichter/sunny-tripower-15000tl-20000tl-25000tl.html[SMA SUNNY TRIPOWER 15000TL / 20000TL / 25000TL] Implemented Natures: diff --git a/io.openems.wrapper.eu.chargetime.ocpp/.gitignore b/io.openems.wrapper.eu.chargetime.ocpp/.gitignore deleted file mode 100644 index c68ee61f8aa..00000000000 --- a/io.openems.wrapper.eu.chargetime.ocpp/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/bin_test/ -/generated/ -/git/ \ No newline at end of file diff --git a/io.openems.wrapper.eu.chargetime.ocpp/bnd.bnd b/io.openems.wrapper.eu.chargetime.ocpp/bnd.bnd deleted file mode 100644 index b9f7c5626ad..00000000000 --- a/io.openems.wrapper.eu.chargetime.ocpp/bnd.bnd +++ /dev/null @@ -1,51 +0,0 @@ -Bundle-Name: OpenEMS Wrapper for ChargeTimeEU Java-OCA-OCPP -Bundle-Description: Client and server library of Open Charge-Point Protocol from openchargealliance.org -Bundle-Vendor: ChargeTime.eu, FENECON GmbH -Bundle-License: https://opensource.org/licenses/MIT -Bundle-Version: 1.0.0.${tstamp} - --buildpath: \ - Java-WebSocket,\ - lib/common-0.5-SNAPSHOT.jar;version=file,\ - lib/OCPP-J-0.5-SNAPSHOT.jar;version=file,\ - lib/v1_6-0.5-SNAPSHOT.jar;version=file - --includeresource.ocpp: \ - @lib/common-0.5-SNAPSHOT.jar; lib:=true,\ - @lib/v1_6-0.5-SNAPSHOT.jar; lib:=true,\ - @lib/OCPP-J-0.5-SNAPSHOT.jar; lib:=true,\ - -Import-Package: \ - com.sun.activation.registries;resolution:=optional,\ - com.google.gson,\ - javax.xml.soap,\ - javax.xml.transform,\ - org.java_websocket,\ - org.java_websocket.drafts,\ - org.java_websocket.handshake,\ - org.java_websocket.protocols,\ - org.java_websocket.server,\ - org.slf4j,\ - org.w3c.dom,\ - --dsannotations: * - --metatypeannotations: * - -Export-Package: \ - eu.chargetime.ocpp;-split-package:=merge-first,\ - eu.chargetime.ocpp.feature;-split-package:=merge-first,\ - eu.chargetime.ocpp.feature.profile;-split-package:=merge-first,\ - eu.chargetime.ocpp.model;-split-package:=merge-first,\ - eu.chargetime.ocpp.model.core,\ - eu.chargetime.ocpp.model.firmware,\ - eu.chargetime.ocpp.model.localauthlist,\ - eu.chargetime.ocpp.model.remotetrigger,\ - eu.chargetime.ocpp.model.reservation,\ - eu.chargetime.ocpp.model.smartcharging,\ - eu.chargetime.ocpp.profile,\ - eu.chargetime.ocpp.utilities,\ - eu.chargetime.ocpp.wss,\ - --sources: false - diff --git a/io.openems.wrapper.eu.chargetime.ocpp/lib/OCPP-J-0.5-SNAPSHOT.jar b/io.openems.wrapper.eu.chargetime.ocpp/lib/OCPP-J-0.5-SNAPSHOT.jar deleted file mode 100644 index 094451e265c..00000000000 Binary files a/io.openems.wrapper.eu.chargetime.ocpp/lib/OCPP-J-0.5-SNAPSHOT.jar and /dev/null differ diff --git a/io.openems.wrapper.eu.chargetime.ocpp/lib/common-0.5-SNAPSHOT.jar b/io.openems.wrapper.eu.chargetime.ocpp/lib/common-0.5-SNAPSHOT.jar deleted file mode 100644 index 429b977a015..00000000000 Binary files a/io.openems.wrapper.eu.chargetime.ocpp/lib/common-0.5-SNAPSHOT.jar and /dev/null differ diff --git a/io.openems.wrapper.eu.chargetime.ocpp/lib/v1_6-0.5-SNAPSHOT.jar b/io.openems.wrapper.eu.chargetime.ocpp/lib/v1_6-0.5-SNAPSHOT.jar deleted file mode 100644 index d55289e7f3c..00000000000 Binary files a/io.openems.wrapper.eu.chargetime.ocpp/lib/v1_6-0.5-SNAPSHOT.jar and /dev/null differ diff --git a/io.openems.wrapper.eu.chargetime.ocpp/readme.adoc b/io.openems.wrapper.eu.chargetime.ocpp/readme.adoc deleted file mode 100644 index 95bfdeca369..00000000000 --- a/io.openems.wrapper.eu.chargetime.ocpp/readme.adoc +++ /dev/null @@ -1,3 +0,0 @@ -= OpenEMS Wrapper for ChargeTimeEU Java-OCA-OCPP - -https://github.com/OpenEMS/openems/tree/develop/io.openems.wrapper.eu.chargetime.ocpp[Source Code icon:github[]] \ No newline at end of file diff --git a/io.openems.wrapper.eu.chargetime.ocpp/test/.gitignore b/io.openems.wrapper.eu.chargetime.ocpp/test/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/io.openems.wrapper.eu.chargetime.ocpp/update-jar.bat b/io.openems.wrapper.eu.chargetime.ocpp/update-jar.bat deleted file mode 100644 index 7a74141f30b..00000000000 --- a/io.openems.wrapper.eu.chargetime.ocpp/update-jar.bat +++ /dev/null @@ -1,40 +0,0 @@ - -@echo off -REM -REM Updates the jar files from upstream at https://github.com/ChargeTimeEU/Java-OCA-OCPP.git -REM - -echo # -echo # Clear 'lib' folder -echo # -del lib\*.jar - -IF EXIST git ( - echo # - echo # Update repository in directory 'git' - echo # - cd git - git pull - cd .. - -) ELSE ( - echo # - echo # Cloning repository to directory 'git' - echo # - git clone https://github.com/ChargeTimeEU/Java-OCA-OCPP.git git -) -cd git - -echo # -echo # Compile -echo # -call gradlew build jar - -echo # -echo # Copy jar files -echo # - -copy ocpp-common\build\libs\*.jar ..\lib -copy ocpp-v1_6\build\libs\*.jar ..\lib -REM copy ocpp-v2_0\build\libs\*.jar ..\lib -copy OCPP-J\build\libs ..\lib \ No newline at end of file diff --git a/io.openems.wrapper/bnd.bnd b/io.openems.wrapper/bnd.bnd index e53482de0bb..5fc250746b0 100644 --- a/io.openems.wrapper/bnd.bnd +++ b/io.openems.wrapper/bnd.bnd @@ -10,8 +10,11 @@ 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,\ info.faljse:SDNotify;version='1.3',\ org.dhatim:fastexcel;version='0.12.11',\ org.eclipse.paho.mqttv5.client;version='1.2.5',\ org.influxdb:influxdb-java;version='2.17',\ - org.msgpack:msgpack-core;version='0.9.0' + org.msgpack:msgpack-core;version='0.9.0',\ diff --git a/io.openems.wrapper/eu.chargetime.ocpp.bnd b/io.openems.wrapper/eu.chargetime.ocpp.bnd new file mode 100644 index 00000000000..87939371359 --- /dev/null +++ b/io.openems.wrapper/eu.chargetime.ocpp.bnd @@ -0,0 +1,44 @@ +Bundle-Name: SDNotify +Bundle-Description: SDNotify implements the systemd notification protocol in Java. +Bundle-DocURL: https://github.com/faljse/SDNotify +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, \ + @common-1.0.jar + +-dsannotations: * + +-metatypeannotations: * + +Import-Package: \ + com.sun.activation.registries;resolution:=optional,\ + com.google.gson,\ + javax.xml.soap,\ + javax.xml.transform,\ + org.java_websocket,\ + org.java_websocket.drafts,\ + org.java_websocket.handshake,\ + org.java_websocket.protocols,\ + org.java_websocket.server,\ + org.slf4j,\ + org.w3c.dom,\ + +Export-Package: \ + eu.chargetime.ocpp;-split-package:=merge-first,\ + eu.chargetime.ocpp.feature;-split-package:=merge-first,\ + eu.chargetime.ocpp.feature.profile;-split-package:=merge-first,\ + eu.chargetime.ocpp.model;-split-package:=merge-first,\ + eu.chargetime.ocpp.model.core,\ + eu.chargetime.ocpp.model.firmware,\ + eu.chargetime.ocpp.model.localauthlist,\ + eu.chargetime.ocpp.model.remotetrigger,\ + eu.chargetime.ocpp.model.reservation,\ + eu.chargetime.ocpp.model.smartcharging,\ + eu.chargetime.ocpp.profile,\ + eu.chargetime.ocpp.utilities,\ + eu.chargetime.ocpp.wss,\ + +-sources: false diff --git a/ui/package-lock.json b/ui/package-lock.json index 4e01fda7f0e..8e02273431d 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,12 +1,12 @@ { "name": "openems-ui", - "version": "2021.12.0", + "version": "2021.13.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "openems-ui", - "version": "2021.12.0-SNAPSHOT", + "version": "2021.13.0-SNAPSHOT", "dependencies": { "@angular/animations": "~12.0.1", "@angular/common": "~12.0.1", @@ -17,17 +17,17 @@ "@angular/router": "~12.0.1", "@angular/service-worker": "~12.0.1", "@ionic/angular": "^5.5.2", - "@ngx-formly/core": "^5.10.21", - "@ngx-formly/ionic": "^5.10.21", - "@ngx-formly/schematics": "^5.10.21", + "@ngx-formly/core": "^5.10.22", + "@ngx-formly/ionic": "^5.10.22", + "@ngx-formly/schematics": "^5.10.22", "@ngx-translate/core": "^13.0.0", - "angular-mydatepicker": "^0.11.3", + "angular-mydatepicker": "^0.11.4", "chart.js": "^2.9.4", "classlist.js": "^1.1.20150312", "d3": "^7.0.0", "date-fns": "^2.22.1", "file-saver-es": "^2.0.5", - "ng2-charts": "^2.4.2", + "ng2-charts": "^2.4.3", "ngx-cookie-service": "^12.0.0", "ngx-spinner": "^12.0.0", "roboto-fontface": "^0.10.0", @@ -51,7 +51,7 @@ "@types/jasmine": "~3.6.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", - "@types/uuid": "^8.3.0", + "@types/uuid": "^8.3.1", "@typescript-eslint/eslint-plugin": "4.16.1", "@typescript-eslint/parser": "4.16.1", "eslint": "^7.6.0", @@ -87,15 +87,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.0.4.tgz", - "integrity": "sha512-2GqEWJZleb86zEa9JMeM5BsbgV0Zor4mCaBj2KSjS28+WVJ/Q77LgDEdfidPuPcXzK7n+Mzrt6qLlrX8ORkaEg==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.0.5.tgz", + "integrity": "sha512-rFbaAQPeuWM9KE9lK3J0sF6GB9nKF/s2Z7rtzKux7whGTF3Tlj8NHrcSxZTf4eBm3cnEpaiod1uPBQg8fUWD4w==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1200.4", - "@angular-devkit/build-optimizer": "0.1200.4", - "@angular-devkit/build-webpack": "0.1200.4", - "@angular-devkit/core": "12.0.4", + "@angular-devkit/architect": "0.1200.5", + "@angular-devkit/build-optimizer": "0.1200.5", + "@angular-devkit/build-webpack": "0.1200.5", + "@angular-devkit/core": "12.0.5", "@babel/core": "7.14.3", "@babel/generator": "7.14.3", "@babel/plugin-transform-async-to-generator": "7.13.0", @@ -105,7 +105,7 @@ "@babel/template": "7.12.13", "@discoveryjs/json-ext": "0.5.2", "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "12.0.4", + "@ngtools/webpack": "12.0.5", "ansi-colors": "4.1.1", "babel-loader": "8.2.2", "browserslist": "^4.9.1", @@ -154,7 +154,7 @@ "terser-webpack-plugin": "5.1.2", "text-table": "0.2.0", "tree-kill": "1.2.2", - "webpack": "5.38.1", + "webpack": "5.39.1", "webpack-dev-middleware": "4.1.0", "webpack-dev-server": "3.11.2", "webpack-merge": "5.7.3", @@ -200,6 +200,56 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { + "version": "0.1200.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.5.tgz", + "integrity": "sha512-222VZ4OeaDK3vON8V5m+w15SRWfUs5uOb4H9ij/H9/6tyHD83uWfCDoOGg+ax4wJVdWEFJIS+Vn4ijGcZCq9WQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "12.0.5", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.5.tgz", + "integrity": "sha512-zVSQV+8/vjUjsUKGlj8Kf5LioA6AXJTGI0yhHW9q1dFX4dPpbW63k0R1UoIB2wJ0F/AbYVgpnPGPe9BBm2fvZA==", + "dev": true, + "dependencies": { + "ajv": "8.2.0", + "ajv-formats": "2.0.2", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/copy-webpack-plugin": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-8.1.1.tgz", @@ -225,6 +275,12 @@ "webpack": "^5.1.0" } }, + "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", @@ -259,9 +315,9 @@ } }, "node_modules/@angular-devkit/build-optimizer": { - "version": "0.1200.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1200.4.tgz", - "integrity": "sha512-7lD3oXfQX00nA1FElH2cI0C8Q1rNnqMpFCTB1Bfd/7/SM+ihkL7EjIoFalN5HZuFGR536zrguSKnmv3C6wijrw==", + "version": "0.1200.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1200.5.tgz", + "integrity": "sha512-3XlDVVak3CfIgUjDZMoON7sxnI1vxhzEm2LvVg5yN98Q7ijnfykXiIzryEcplzTMTZwGNkem0361HDs1EX8zNg==", "dev": true, "dependencies": { "source-map": "0.7.3", @@ -286,12 +342,12 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1200.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1200.4.tgz", - "integrity": "sha512-Q7UYBvSsbK4ubsqJIVrnh4Q+EwVqNdRFlhekaM5XN3WH6xRsuZjTMuYDrQh5JSzFYjrKqezau1KzyKs7V1xIJQ==", + "version": "0.1200.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1200.5.tgz", + "integrity": "sha512-cx8DVwOmogzeHS1dsZGWummwA3T1zqsJ6q9NIL0S0ZiOScZuz0j9zAOLjBkyCj5XexOFzHv3TcAVQyzJsi1tIw==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1200.4", + "@angular-devkit/architect": "0.1200.5", "rxjs": "6.6.7" }, "engines": { @@ -304,6 +360,62 @@ "webpack-dev-server": "^3.1.4" } }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { + "version": "0.1200.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.5.tgz", + "integrity": "sha512-222VZ4OeaDK3vON8V5m+w15SRWfUs5uOb4H9ij/H9/6tyHD83uWfCDoOGg+ax4wJVdWEFJIS+Vn4ijGcZCq9WQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "12.0.5", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.5.tgz", + "integrity": "sha512-zVSQV+8/vjUjsUKGlj8Kf5LioA6AXJTGI0yhHW9q1dFX4dPpbW63k0R1UoIB2wJ0F/AbYVgpnPGPe9BBm2fvZA==", + "dev": true, + "dependencies": { + "ajv": "8.2.0", + "ajv-formats": "2.0.2", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/@angular-devkit/core": { "version": "12.0.4", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.4.tgz", @@ -2508,9 +2620,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.0.4.tgz", - "integrity": "sha512-djmXTB7qo35Mw6olJEfVTOFRms/E4rCpcLV0GfQJqhWfUB9K/n+QbxW5cp09J48DpqlMP00C942+POBcUqbg3g==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.0.5.tgz", + "integrity": "sha512-yoKK6qhEm1iWnniz50xzOBqa3U1iUrjZs+SpLOXRZFonpwObz8j4zraR231K4uV4kXcX40qorYk9iOf+ljG4JQ==", "dev": true, "dependencies": { "enhanced-resolve": "5.7.0" @@ -2527,9 +2639,9 @@ } }, "node_modules/@ngx-formly/core": { - "version": "5.10.21", - "resolved": "https://registry.npmjs.org/@ngx-formly/core/-/core-5.10.21.tgz", - "integrity": "sha512-a3A9S0QccEHMMKRMP0+E782w3eSkZk+oenhXGBtO0SVKCeVqZwh3pcWwn+mvW20FW1D3czkHkAZmig3E0wQNqw==", + "version": "5.10.22", + "resolved": "https://registry.npmjs.org/@ngx-formly/core/-/core-5.10.22.tgz", + "integrity": "sha512-HTgVN2xNf3TdPS10ayV4G7dvX1olHvggquhTUY/dzej1x03NVofDQulnPTxKEU1ObN92IQZNq3VL9pm3sBCR7A==", "dependencies": { "tslib": "^1.7.1" }, @@ -2544,15 +2656,15 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@ngx-formly/ionic": { - "version": "5.10.21", - "resolved": "https://registry.npmjs.org/@ngx-formly/ionic/-/ionic-5.10.21.tgz", - "integrity": "sha512-C3CpjrbOPTw1ufKdYRXwFhCI9U5w+9B1SV2myPxuU9DPE9ra2VjKpWj6GZEDHHZB2enZwSgHm0LppNXZgbpQ2Q==", + "version": "5.10.22", + "resolved": "https://registry.npmjs.org/@ngx-formly/ionic/-/ionic-5.10.22.tgz", + "integrity": "sha512-v/aTPhcUdav5WK1FvBm5sBzX8Mnyrne8KNOIOyS2wOBgLDFpQjk+HjaqW7Sng4Y9ojjtniLNEa2zkzl97UfKTQ==", "dependencies": { "tslib": "^1.9.0" }, "peerDependencies": { "@ionic/angular": "^4.0.0 || ^5.0.0", - "@ngx-formly/core": "5.10.21" + "@ngx-formly/core": "5.10.22" } }, "node_modules/@ngx-formly/ionic/node_modules/tslib": { @@ -2561,9 +2673,9 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@ngx-formly/schematics": { - "version": "5.10.21", - "resolved": "https://registry.npmjs.org/@ngx-formly/schematics/-/schematics-5.10.21.tgz", - "integrity": "sha512-nHrfizLilLFD3DgQ6/f1IyCuObjzgzWrBdbGp3PeSC4PPxZz4miJrD3nTp4t4cP9z5ENuHcJH488/+RWxpI66w==", + "version": "5.10.22", + "resolved": "https://registry.npmjs.org/@ngx-formly/schematics/-/schematics-5.10.22.tgz", + "integrity": "sha512-zoRtB0KIrJFkxDxav4IzUa0HxllIz/HWYu66RfgRJx80DtoWvaR/zeFabWkLwBluS/o+8HXU8+E0izUnMNjyug==", "dependencies": { "@angular-devkit/core": ">=7.0.0", "@angular-devkit/schematics": ">=7.0.0", @@ -2818,9 +2930,9 @@ "dev": true }, "node_modules/@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", "dev": true, "dependencies": { "@types/minimatch": "*", @@ -2855,9 +2967,9 @@ "dev": true }, "node_modules/@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "node_modules/@types/node": { @@ -2891,9 +3003,9 @@ "dev": true }, "node_modules/@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", "dev": true }, "node_modules/@types/webpack-sources": { @@ -3633,6 +3745,8 @@ "version": "8.6.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -3647,7 +3761,9 @@ "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "optional": true, + "peer": true }, "node_modules/ajv-keywords": { "version": "3.5.2", @@ -3665,9 +3781,9 @@ "dev": true }, "node_modules/angular-mydatepicker": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/angular-mydatepicker/-/angular-mydatepicker-0.11.3.tgz", - "integrity": "sha512-Mj7z5rtILLqo8bRpNke0bdlSCztBh2vi3QB7sSWHHSOaNDH+F0hYClBeAWOo4M2tk83pESl+GaxCVrUeUJqreQ==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/angular-mydatepicker/-/angular-mydatepicker-0.11.4.tgz", + "integrity": "sha512-TOSK5z38x5ppycAaVUVQDcGWz+XJrMIACoAwbpuLcZOIAMxGBUMgB2JTtFTlhoeVM2J1ZLoz/tepo+ZxlTD+WA==", "dependencies": { "tslib": "^1.9.0" } @@ -11428,9 +11544,9 @@ "dev": true }, "node_modules/ng2-charts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-2.4.2.tgz", - "integrity": "sha512-mY3C2uKCaApHCQizS2YxEOqQ7sSZZLxdV6N1uM9u/VvUgVtYvlPtdcXbKpN52ak93ZE22I73DiLWVDnDNG4/AQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-2.4.3.tgz", + "integrity": "sha512-tPrhHSS2DfVyipXQ0gykOPc8zFNnj2b7sAebUVty392vHnEGYCwsP6YbFfpr1iXu4yBSRm4Gt5lffR5w0uyYSw==", "dependencies": { "@types/chart.js": "^2.9.24", "lodash-es": "^4.17.15", @@ -15147,6 +15263,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "dev": true, "engines": { "node": ">=0.4.x" @@ -17324,15 +17441,15 @@ } }, "node_modules/svgo": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.0.tgz", - "integrity": "sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.1.tgz", + "integrity": "sha512-riDDIQgXpEnn0BEl9Gvhh1LNLIyiusSpt64IR8upJu7MwxnzetmF/Y57pXQD2NMX2lVyMRzXt5f2M5rO4wG7Dw==", "dev": true, "dependencies": { "@trysound/sax": "0.1.1", "chalk": "^4.1.0", "commander": "^7.1.0", - "css-select": "^3.1.2", + "css-select": "^4.1.3", "css-tree": "^1.1.2", "csso": "^4.2.0", "stable": "^0.1.8" @@ -17397,15 +17514,15 @@ } }, "node_modules/svgo/node_modules/css-select": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-3.1.2.tgz", - "integrity": "sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^4.0.0", - "domhandler": "^4.0.0", - "domutils": "^2.4.3", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", "nth-check": "^2.0.0" }, "funding": { @@ -17413,9 +17530,9 @@ } }, "node_modules/svgo/node_modules/css-what": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-4.0.0.tgz", - "integrity": "sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", "dev": true, "engines": { "node": ">= 6" @@ -18491,9 +18608,9 @@ } }, "node_modules/webpack": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.38.1.tgz", - "integrity": "sha512-OqRmYD1OJbHZph6RUMD93GcCZy4Z4wC0ele4FXyYF0J6AxO1vOSuIlU1hkS/lDlR9CDYBz64MZRmdbdnFFoT2g==", + "version": "5.39.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.39.1.tgz", + "integrity": "sha512-ulOvoNCh2PvTUa+zbpRuEb1VPeQnhxpnHleMPVVCq3QqnaFogjsLyps+o42OviQFoaGtTQYrUqDXu1QNkvUPzw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.0", @@ -19800,15 +19917,15 @@ } }, "@angular-devkit/build-angular": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.0.4.tgz", - "integrity": "sha512-2GqEWJZleb86zEa9JMeM5BsbgV0Zor4mCaBj2KSjS28+WVJ/Q77LgDEdfidPuPcXzK7n+Mzrt6qLlrX8ORkaEg==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-12.0.5.tgz", + "integrity": "sha512-rFbaAQPeuWM9KE9lK3J0sF6GB9nKF/s2Z7rtzKux7whGTF3Tlj8NHrcSxZTf4eBm3cnEpaiod1uPBQg8fUWD4w==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1200.4", - "@angular-devkit/build-optimizer": "0.1200.4", - "@angular-devkit/build-webpack": "0.1200.4", - "@angular-devkit/core": "12.0.4", + "@angular-devkit/architect": "0.1200.5", + "@angular-devkit/build-optimizer": "0.1200.5", + "@angular-devkit/build-webpack": "0.1200.5", + "@angular-devkit/core": "12.0.5", "@babel/core": "7.14.3", "@babel/generator": "7.14.3", "@babel/plugin-transform-async-to-generator": "7.13.0", @@ -19818,7 +19935,7 @@ "@babel/template": "7.12.13", "@discoveryjs/json-ext": "0.5.2", "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "12.0.4", + "@ngtools/webpack": "12.0.5", "ansi-colors": "4.1.1", "babel-loader": "8.2.2", "browserslist": "^4.9.1", @@ -19867,13 +19984,51 @@ "terser-webpack-plugin": "5.1.2", "text-table": "0.2.0", "tree-kill": "1.2.2", - "webpack": "5.38.1", + "webpack": "5.39.1", "webpack-dev-middleware": "4.1.0", "webpack-dev-server": "3.11.2", "webpack-merge": "5.7.3", "webpack-subresource-integrity": "1.5.2" }, "dependencies": { + "@angular-devkit/architect": { + "version": "0.1200.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.5.tgz", + "integrity": "sha512-222VZ4OeaDK3vON8V5m+w15SRWfUs5uOb4H9ij/H9/6tyHD83uWfCDoOGg+ax4wJVdWEFJIS+Vn4ijGcZCq9WQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "12.0.5", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/core": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.5.tgz", + "integrity": "sha512-zVSQV+8/vjUjsUKGlj8Kf5LioA6AXJTGI0yhHW9q1dFX4dPpbW63k0R1UoIB2wJ0F/AbYVgpnPGPe9BBm2fvZA==", + "dev": true, + "requires": { + "ajv": "8.2.0", + "ajv-formats": "2.0.2", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + } + } + }, "copy-webpack-plugin": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-8.1.1.tgz", @@ -19889,6 +20044,12 @@ "serialize-javascript": "^5.0.1" } }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "schema-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", @@ -19912,9 +20073,9 @@ } }, "@angular-devkit/build-optimizer": { - "version": "0.1200.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1200.4.tgz", - "integrity": "sha512-7lD3oXfQX00nA1FElH2cI0C8Q1rNnqMpFCTB1Bfd/7/SM+ihkL7EjIoFalN5HZuFGR536zrguSKnmv3C6wijrw==", + "version": "0.1200.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1200.5.tgz", + "integrity": "sha512-3XlDVVak3CfIgUjDZMoON7sxnI1vxhzEm2LvVg5yN98Q7ijnfykXiIzryEcplzTMTZwGNkem0361HDs1EX8zNg==", "dev": true, "requires": { "source-map": "0.7.3", @@ -19923,13 +20084,57 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1200.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1200.4.tgz", - "integrity": "sha512-Q7UYBvSsbK4ubsqJIVrnh4Q+EwVqNdRFlhekaM5XN3WH6xRsuZjTMuYDrQh5JSzFYjrKqezau1KzyKs7V1xIJQ==", + "version": "0.1200.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1200.5.tgz", + "integrity": "sha512-cx8DVwOmogzeHS1dsZGWummwA3T1zqsJ6q9NIL0S0ZiOScZuz0j9zAOLjBkyCj5XexOFzHv3TcAVQyzJsi1tIw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1200.4", + "@angular-devkit/architect": "0.1200.5", "rxjs": "6.6.7" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.1200.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1200.5.tgz", + "integrity": "sha512-222VZ4OeaDK3vON8V5m+w15SRWfUs5uOb4H9ij/H9/6tyHD83uWfCDoOGg+ax4wJVdWEFJIS+Vn4ijGcZCq9WQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "12.0.5", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/core": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.0.5.tgz", + "integrity": "sha512-zVSQV+8/vjUjsUKGlj8Kf5LioA6AXJTGI0yhHW9q1dFX4dPpbW63k0R1UoIB2wJ0F/AbYVgpnPGPe9BBm2fvZA==", + "dev": true, + "requires": { + "ajv": "8.2.0", + "ajv-formats": "2.0.2", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } } }, "@angular-devkit/core": { @@ -21493,18 +21698,18 @@ } }, "@ngtools/webpack": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.0.4.tgz", - "integrity": "sha512-djmXTB7qo35Mw6olJEfVTOFRms/E4rCpcLV0GfQJqhWfUB9K/n+QbxW5cp09J48DpqlMP00C942+POBcUqbg3g==", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.0.5.tgz", + "integrity": "sha512-yoKK6qhEm1iWnniz50xzOBqa3U1iUrjZs+SpLOXRZFonpwObz8j4zraR231K4uV4kXcX40qorYk9iOf+ljG4JQ==", "dev": true, "requires": { "enhanced-resolve": "5.7.0" } }, "@ngx-formly/core": { - "version": "5.10.21", - "resolved": "https://registry.npmjs.org/@ngx-formly/core/-/core-5.10.21.tgz", - "integrity": "sha512-a3A9S0QccEHMMKRMP0+E782w3eSkZk+oenhXGBtO0SVKCeVqZwh3pcWwn+mvW20FW1D3czkHkAZmig3E0wQNqw==", + "version": "5.10.22", + "resolved": "https://registry.npmjs.org/@ngx-formly/core/-/core-5.10.22.tgz", + "integrity": "sha512-HTgVN2xNf3TdPS10ayV4G7dvX1olHvggquhTUY/dzej1x03NVofDQulnPTxKEU1ObN92IQZNq3VL9pm3sBCR7A==", "requires": { "tslib": "^1.7.1" }, @@ -21517,9 +21722,9 @@ } }, "@ngx-formly/ionic": { - "version": "5.10.21", - "resolved": "https://registry.npmjs.org/@ngx-formly/ionic/-/ionic-5.10.21.tgz", - "integrity": "sha512-C3CpjrbOPTw1ufKdYRXwFhCI9U5w+9B1SV2myPxuU9DPE9ra2VjKpWj6GZEDHHZB2enZwSgHm0LppNXZgbpQ2Q==", + "version": "5.10.22", + "resolved": "https://registry.npmjs.org/@ngx-formly/ionic/-/ionic-5.10.22.tgz", + "integrity": "sha512-v/aTPhcUdav5WK1FvBm5sBzX8Mnyrne8KNOIOyS2wOBgLDFpQjk+HjaqW7Sng4Y9ojjtniLNEa2zkzl97UfKTQ==", "requires": { "tslib": "^1.9.0" }, @@ -21532,9 +21737,9 @@ } }, "@ngx-formly/schematics": { - "version": "5.10.21", - "resolved": "https://registry.npmjs.org/@ngx-formly/schematics/-/schematics-5.10.21.tgz", - "integrity": "sha512-nHrfizLilLFD3DgQ6/f1IyCuObjzgzWrBdbGp3PeSC4PPxZz4miJrD3nTp4t4cP9z5ENuHcJH488/+RWxpI66w==", + "version": "5.10.22", + "resolved": "https://registry.npmjs.org/@ngx-formly/schematics/-/schematics-5.10.22.tgz", + "integrity": "sha512-zoRtB0KIrJFkxDxav4IzUa0HxllIz/HWYu66RfgRJx80DtoWvaR/zeFabWkLwBluS/o+8HXU8+E0izUnMNjyug==", "requires": { "@angular-devkit/core": ">=7.0.0", "@angular-devkit/schematics": ">=7.0.0", @@ -21739,9 +21944,9 @@ "dev": true }, "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", "dev": true, "requires": { "@types/minimatch": "*", @@ -21776,9 +21981,9 @@ "dev": true }, "@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "@types/node": { @@ -21812,9 +22017,9 @@ "dev": true }, "@types/uuid": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.0.tgz", - "integrity": "sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", "dev": true }, "@types/webpack-sources": { @@ -22342,14 +22547,13 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.0.2.tgz", "integrity": "sha512-Brah4Uo5/U8v76c6euTwtjVFFaVishwnJrQBYpev1JRh4vjA1F4HY3UzQez41YUCszUCXKagG8v6eVRBHV1gkw==", - "requires": { - "ajv": "^8.0.0" - }, + "requires": {}, "dependencies": { "ajv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", + "version": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz", "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==", + "optional": true, + "peer": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -22360,7 +22564,9 @@ "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "optional": true, + "peer": true } } }, @@ -22378,9 +22584,9 @@ "dev": true }, "angular-mydatepicker": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/angular-mydatepicker/-/angular-mydatepicker-0.11.3.tgz", - "integrity": "sha512-Mj7z5rtILLqo8bRpNke0bdlSCztBh2vi3QB7sSWHHSOaNDH+F0hYClBeAWOo4M2tk83pESl+GaxCVrUeUJqreQ==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/angular-mydatepicker/-/angular-mydatepicker-0.11.4.tgz", + "integrity": "sha512-TOSK5z38x5ppycAaVUVQDcGWz+XJrMIACoAwbpuLcZOIAMxGBUMgB2JTtFTlhoeVM2J1ZLoz/tepo+ZxlTD+WA==", "requires": { "tslib": "^1.9.0" }, @@ -28442,9 +28648,9 @@ "dev": true }, "ng2-charts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-2.4.2.tgz", - "integrity": "sha512-mY3C2uKCaApHCQizS2YxEOqQ7sSZZLxdV6N1uM9u/VvUgVtYvlPtdcXbKpN52ak93ZE22I73DiLWVDnDNG4/AQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/ng2-charts/-/ng2-charts-2.4.3.tgz", + "integrity": "sha512-tPrhHSS2DfVyipXQ0gykOPc8zFNnj2b7sAebUVty392vHnEGYCwsP6YbFfpr1iXu4yBSRm4Gt5lffR5w0uyYSw==", "requires": { "@types/chart.js": "^2.9.24", "lodash-es": "^4.17.15", @@ -32880,15 +33086,15 @@ } }, "svgo": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.0.tgz", - "integrity": "sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.1.tgz", + "integrity": "sha512-riDDIQgXpEnn0BEl9Gvhh1LNLIyiusSpt64IR8upJu7MwxnzetmF/Y57pXQD2NMX2lVyMRzXt5f2M5rO4wG7Dw==", "dev": true, "requires": { "@trysound/sax": "0.1.1", "chalk": "^4.1.0", "commander": "^7.1.0", - "css-select": "^3.1.2", + "css-select": "^4.1.3", "css-tree": "^1.1.2", "csso": "^4.2.0", "stable": "^0.1.8" @@ -32929,22 +33135,22 @@ "dev": true }, "css-select": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-3.1.2.tgz", - "integrity": "sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^4.0.0", - "domhandler": "^4.0.0", - "domutils": "^2.4.3", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", "nth-check": "^2.0.0" } }, "css-what": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-4.0.0.tgz", - "integrity": "sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", "dev": true }, "dom-serializer": { @@ -33774,9 +33980,9 @@ } }, "webpack": { - "version": "5.38.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.38.1.tgz", - "integrity": "sha512-OqRmYD1OJbHZph6RUMD93GcCZy4Z4wC0ele4FXyYF0J6AxO1vOSuIlU1hkS/lDlR9CDYBz64MZRmdbdnFFoT2g==", + "version": "5.39.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.39.1.tgz", + "integrity": "sha512-ulOvoNCh2PvTUa+zbpRuEb1VPeQnhxpnHleMPVVCq3QqnaFogjsLyps+o42OviQFoaGtTQYrUqDXu1QNkvUPzw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", diff --git a/ui/package.json b/ui/package.json index fa14640ff97..a7c773c34fc 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "openems-ui", - "version": "2021.12.0", + "version": "2021.13.0", "author": "OpenEMS Association e.V.", "homepage": "http://openems.io", "scripts": { @@ -24,17 +24,17 @@ "@angular/router": "~12.0.1", "@angular/service-worker": "~12.0.1", "@ionic/angular": "^5.5.2", - "@ngx-formly/core": "^5.10.21", - "@ngx-formly/ionic": "^5.10.21", - "@ngx-formly/schematics": "^5.10.21", + "@ngx-formly/core": "^5.10.22", + "@ngx-formly/ionic": "^5.10.22", + "@ngx-formly/schematics": "^5.10.22", "@ngx-translate/core": "^13.0.0", - "angular-mydatepicker": "^0.11.3", + "angular-mydatepicker": "^0.11.4", "chart.js": "^2.9.4", "classlist.js": "^1.1.20150312", "d3": "^7.0.0", "date-fns": "^2.22.1", "file-saver-es": "^2.0.5", - "ng2-charts": "^2.4.2", + "ng2-charts": "^2.4.3", "ngx-cookie-service": "^12.0.0", "ngx-spinner": "^12.0.0", "roboto-fontface": "^0.10.0", @@ -58,7 +58,7 @@ "@types/jasmine": "~3.6.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", - "@types/uuid": "^8.3.0", + "@types/uuid": "^8.3.1", "@typescript-eslint/eslint-plugin": "4.16.1", "@typescript-eslint/parser": "4.16.1", "eslint": "^7.6.0", @@ -78,4 +78,4 @@ "typescript": "~4.2.4" }, "description": "OpenEMS UI" -} \ No newline at end of file +} diff --git a/ui/src/app/user/user.component.html b/ui/src/app/user/user.component.html index acfc2f90bd8..9f6215a3dd9 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.12.0 (2021-07-01) + + About.build: 2021.13.0 (2021-07-29)