+ * 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
+ * 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
+ * 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