-
+
-
-
- {{ displayName }}
- |
+
+
+ {{ displayName }}
+ |
-
-
-
- {{ displayValue }}
- |
+
+
+
+ {{ displayValue }}
+ |
-
-
-
+
+
-
- |
+
+
@@ -38,45 +38,65 @@
-
-
-
-
+
+
+
+
-
- {{option.name}}
-
-
-
- |
+
+ {{ option.name }}
+
+
+ |
+
+
+
+ General.onDateAtTime
+
+
+
+
+
+
+
+ |
+
-
+
-
-
-
-
- |
-
-
-
+
+
+
+
+ |
+
+
+
-
-
-
-
-
- {{ control.properties.min | unitvalue:control.properties.unit}}
-
-
- {{ control.properties.max | unitvalue:control.properties.unit}}
-
-
-
- |
-
+
+
+
+
+
+ {{ control.properties.min | unitvalue:control.properties.unit }}
+
+
+ {{ control.properties.max | unitvalue:control.properties.unit }}
+
+
+
+ |
+
diff --git a/ui/src/app/shared/components/modal/modal-line/modal-line.ts b/ui/src/app/shared/components/modal/modal-line/modal-line.ts
index 76e9e187946..cb71bf0c6c4 100644
--- a/ui/src/app/shared/components/modal/modal-line/modal-line.ts
+++ b/ui/src/app/shared/components/modal/modal-line/modal-line.ts
@@ -1,35 +1,39 @@
-import { Component, Input } from "@angular/core";
-import { AbstractModalLine } from "../abstract-modal-line";
-import { ButtonLabel } from "../modal-button/modal-button";
+import {Component, Input} from "@angular/core";
+import {AbstractModalLine} from "../abstract-modal-line";
+import {ButtonLabel} from "../modal-button/modal-button";
@Component({
- selector: "oe-modal-line",
- templateUrl: "./modal-line.html",
+ selector: "oe-modal-line",
+ templateUrl: "./modal-line.html",
})
export class ModalLineComponent extends AbstractModalLine {
- /** ControlName for Form Field */
+ /** ControlName for Form Field */
@Input({ required: true }) public override controlName!: string;
// Width of Left Column, Right Column is (100% - leftColumn)
- @Input({ required: true }) protected leftColumnWidth!: number;
+ @Input({ required: true })
+ protected leftColumnWidth!: number;
- @Input() protected button: ButtonLabel | null = null;
- /** ControlName for Toggle Button */
- @Input({ required: true }) protected control!:
- { type: "TOGGLE" } |
- { type: "INPUT", properties?: { unit: "W" } } |
- /* the available select options*/
- { type: "SELECT", options: { value: string, name: string }[] } |
- /* the properties for range slider*/
- { type: "RANGE", properties: { min: number, max: number, unit: "H", step?: number } };
- /** Fixed indentation of the modal-line */
- @Input() protected textIndent: TextIndentation = TextIndentation.NONE;
+ @Input() protected button: ButtonLabel | null = null;
+ /** ControlName for Toggle Button */
+ @Input({ required: true }) protected control!:
+ { type: 'TOGGLE' } |
+ { type: 'INPUT', properties?: { unit: 'W' | '%' } } |
+ /* the available select options*/
+ { type: 'SELECT', options: { value: string, name: string }[] } |
+ /* the properties for range slider*/
+ { type: 'RANGE', properties: { min: number, max: number, unit: 'H' | '%', step?: number } } |
+ /* the properties for range slider*/
+ { type: 'DATE_PICKER', properties?: { label: string } };
+
+ /** Fixed indentation of the modal-line */
+ @Input() protected textIndent: TextIndentation = TextIndentation.NONE;
}
export enum TextIndentation {
- NONE = "0%",
- SINGLE = "5%",
- DOUBLE = "10%",
+ NONE = "0%",
+ SINGLE = "5%",
+ DOUBLE = "10%",
}
diff --git a/ui/src/app/shared/service/defaulttypes.ts b/ui/src/app/shared/service/defaulttypes.ts
index f9652fb6dbe..e119e1d2b64 100644
--- a/ui/src/app/shared/service/defaulttypes.ts
+++ b/ui/src/app/shared/service/defaulttypes.ts
@@ -14,6 +14,7 @@ export namespace DefaultTypes {
}
export type ManualOnOff = "MANUAL_ON" | "MANUAL_OFF";
+ export type ManualOffAuto = 'MANUAL' | 'OFF' | 'AUTO';
/**
* CurrentData Summary
diff --git a/ui/src/app/shared/service/utils.ts b/ui/src/app/shared/service/utils.ts
index 837e37acc54..63790ba3f8c 100644
--- a/ui/src/app/shared/service/utils.ts
+++ b/ui/src/app/shared/service/utils.ts
@@ -289,6 +289,17 @@ export class Utils {
return new Date(value * 1000).toLocaleTimeString();
};
+ /**
+ * Converts a date to Date and Time string.
+ *
+ * @param value the value from passed value in html
+ * @returns converted value
+ */
+ public static CONVERT_DATE = (value: Date | number | string): string => {
+ const date = new Date(value);
+ return date.toLocaleDateString() + ' ' + date.toLocaleTimeString();
+ };
+
/**
* Adds unit percentage [%] to a value.
*
@@ -337,6 +348,26 @@ export class Utils {
};
};
+ /**
+ * Converts states 'MANUAL', 'AUTO' and 'OFF' to translated strings.
+ *
+ * @param value the value from passed value in html
+ * @returns converted value
+ */
+ public static CONVERT_MANUAL_AUTO_OFF = (translate: TranslateService) => {
+ return (value: DefaultTypes.ManualOffAuto): string => {
+ if (value === 'MANUAL') {
+ return translate.instant('General.manually');
+ } else if (value === 'OFF') {
+ return translate.instant('General.off');
+ } else if (value === 'AUTO') {
+ return translate.instant('General.auto');
+ } else {
+ return '-';
+ }
+ };
+ };
+
/**
* Takes a power value and extracts the information if it represents Charge or Discharge.
*
diff --git a/ui/src/app/shared/type/widget.ts b/ui/src/app/shared/type/widget.ts
index a6f73311e93..b0aea5fb3ae 100644
--- a/ui/src/app/shared/type/widget.ts
+++ b/ui/src/app/shared/type/widget.ts
@@ -22,23 +22,24 @@ export enum WidgetNature {
}
export enum WidgetFactory {
- "Controller.Api.ModbusTcp.ReadWrite",
- "Controller.Asymmetric.PeakShaving",
- "Controller.ChannelThreshold",
- "Controller.CHP.SoC",
- "Controller.Ess.DelayedSellToGrid",
- "Controller.Ess.FixActivePower",
- "Controller.Ess.GridOptimizedCharge",
- "Controller.Ess.Time-Of-Use-Tariff.Discharge",
- "Controller.Ess.Time-Of-Use-Tariff",
- "Controller.IO.ChannelSingleThreshold",
- "Controller.Io.FixDigitalOutput",
- "Controller.IO.HeatingElement",
- "Controller.Io.HeatPump.SgReady",
- "Controller.Symmetric.PeakShaving",
- "Controller.TimeslotPeakshaving",
- "Evcs.Cluster.PeakShaving",
- "Evcs.Cluster.SelfConsumption",
+ "Controller.Api.ModbusTcp.ReadWrite",
+ 'Controller.Asymmetric.PeakShaving',
+ 'Controller.ChannelThreshold',
+ 'Controller.CHP.SoC',
+ 'Controller.Ess.DelayedSellToGrid',
+ 'Controller.Ess.Timeframe',
+ 'Controller.Ess.FixActivePower',
+ 'Controller.Ess.GridOptimizedCharge',
+ 'Controller.Ess.Time-Of-Use-Tariff.Discharge',
+ 'Controller.Ess.Time-Of-Use-Tariff',
+ 'Controller.IO.ChannelSingleThreshold',
+ 'Controller.Io.FixDigitalOutput',
+ 'Controller.IO.HeatingElement',
+ 'Controller.Io.HeatPump.SgReady',
+ 'Controller.Symmetric.PeakShaving',
+ 'Controller.TimeslotPeakshaving',
+ 'Evcs.Cluster.PeakShaving',
+ 'Evcs.Cluster.SelfConsumption',
}
export type Icon = {
diff --git a/ui/src/assets/i18n/cz.json b/ui/src/assets/i18n/cz.json
index 04ac9dd63ec..5f2b4c6edcd 100644
--- a/ui/src/assets/i18n/cz.json
+++ b/ui/src/assets/i18n/cz.json
@@ -5,6 +5,8 @@
"apply": "Aplikovat",
"autarchy": "Soběstačnost",
"automatic": "Automaticky",
+ "auto": "Auto",
+ "onDateAtTime": "dne {{date}} v {{time}}",
"cancel": "zrušení",
"capacity": "Kapacita",
"changeAccepted": "Změna byla přijata",
@@ -217,6 +219,11 @@
"continuousSellToGridPower": "Výboj níže",
"relationError": "Limit poplatku musí být vyšší než limit vybití"
},
+ "Timeframe": {
+ "targetSoc": "Cílový stav nabití",
+ "endTime": "Čas ukončení",
+ "startTime": "Čas začátku"
+ },
"Peakshaving": {
"asymmetricInfo": "Zadané hodnoty výkonu se vztahují k jednotlivým fázím. Je nastavena na nejvíce namáhanou fázi.",
"endDate": "Datum Ukončení",
diff --git a/ui/src/assets/i18n/de.json b/ui/src/assets/i18n/de.json
index 954c76a43ce..c65bf47bb28 100644
--- a/ui/src/assets/i18n/de.json
+++ b/ui/src/assets/i18n/de.json
@@ -61,6 +61,11 @@
"continuousSellToGridPower": "Entladung unter",
"relationError": "Beladungsgrenze muss größer der Entladungsgrenze sein"
},
+ "Timeframe": {
+ "targetSoc": "Ziel-Ladezustand",
+ "endTime": "End-Zeit",
+ "startTime": "Start-Zeit"
+ },
"Peakshaving": {
"asymmetricInfo": "Eingetragene Leistungswerte beziehen sich auf einzelne Phasen. Es wird auf die jeweils am stärksten belastete Phase ausgeregelt.",
"endDate": "End Datum",
@@ -466,6 +471,7 @@
"apply": "Übernehmen",
"autarchy": "Autarkie",
"automatic": "Automatisch",
+ "auto": "Auto",
"cancel": "abbrechen",
"capacity": "Kapazität",
"changeAccepted": "Änderung übernommen",
@@ -508,6 +514,7 @@
"offGrid": "Keine Netzverbindung!",
"ok": "ok",
"on": "An",
+ "onDateAtTime": "{{date}} um {{time}}",
"otherConsumption": "Sonstiger",
"percentage": "Prozent",
"periodFromTo": "{{ value1 }} - {{ value2 }}",
diff --git a/ui/src/assets/i18n/en.json b/ui/src/assets/i18n/en.json
index 0ce4b7372fb..c46df18121b 100644
--- a/ui/src/assets/i18n/en.json
+++ b/ui/src/assets/i18n/en.json
@@ -61,6 +61,11 @@
"continuousSellToGridPower": "Discharge below",
"relationError": "Charge limit must be greater than the Discharge limit"
},
+ "Timeframe": {
+ "targetSoc": "Target state of charge",
+ "endTime": "End Time",
+ "startTime": "Start Time"
+ },
"Peakshaving": {
"asymmetricInfo": "The entered performance values refer to individual phases. It is adjusted to the most stressed phase.",
"endDate": "End date",
@@ -467,6 +472,7 @@
"apply": "Apply",
"autarchy": "Autarchy",
"automatic": "Automatically",
+ "auto": "Auto",
"cancel": "cancel",
"capacity": "Capacity",
"changeAccepted": "Change accepted",
@@ -563,6 +569,7 @@
"netherlands": "Netherlands",
"switzerland": "Switzerland"
},
+ "onDateAtTime": "on {{date}} at {{time}}",
"yes": "Yes",
"no": "No",
"value": "value",
diff --git a/ui/src/assets/i18n/es.json b/ui/src/assets/i18n/es.json
index 251dd41029d..a7d64ef2155 100644
--- a/ui/src/assets/i18n/es.json
+++ b/ui/src/assets/i18n/es.json
@@ -4,6 +4,8 @@
"actualPower": "e-car Carga",
"autarchy": "Autosuficiencia",
"automatic": "Automático",
+ "auto": "Auto",
+ "onDateAtTime": "en {{date}} a las {{time}}",
"cancel": "cancelar",
"capacity": "Capacidad",
"changeAccepted": "Cambio aceptado",
@@ -207,6 +209,11 @@
"continuousSellToGridPower": "Descarga a continuación",
"relationError": "El límite de carga debe ser mayor que el límite de descarga"
},
+ "Timeframe": {
+ "targetSoc": "Estado de carga objetivo",
+ "endTime": "Hora de finalización",
+ "startTime": "Hora de inicio"
+ },
"Peakshaving": {
"asymmetricInfo": "Los valores de rendimiento introducidos se refieren a fases individuales. Se ajusta a la fase más estresada.",
"endDate": "Fecha final",
diff --git a/ui/src/assets/i18n/fr.json b/ui/src/assets/i18n/fr.json
index 2ead4d8e8c0..2d76785ed30 100644
--- a/ui/src/assets/i18n/fr.json
+++ b/ui/src/assets/i18n/fr.json
@@ -5,6 +5,8 @@
"apply": "Apply",
"autarchy": "Autarcie",
"automatic": "Automatiquement",
+ "auto": "Auto",
+ "onDateAtTime": "le {{date}} à {{time}}",
"cancel": "cancel",
"capacity": "Capacité",
"numberOfComponents": "nombre de composants",
@@ -214,6 +216,11 @@
"continuousSellToGridPower": "Décharge ci-dessous",
"relationError": "La limite de charge doit être supérieure à la limite de décharge"
},
+ "Timeframe": {
+ "targetSoc": "État de charge cible",
+ "endTime": "Heure de fin",
+ "startTime": "Heure de début"
+ },
"Peakshaving": {
"asymmetricInfo": "The entered performance values refer to individual phases. It is adjusted to the most stressed phase.",
"endDate": "Date de fin",
diff --git a/ui/src/assets/i18n/ja.json b/ui/src/assets/i18n/ja.json
index 06a7294eb4f..281dc7b9645 100644
--- a/ui/src/assets/i18n/ja.json
+++ b/ui/src/assets/i18n/ja.json
@@ -61,6 +61,11 @@
"continuousSellToGridPower": "以下で放電します",
"relationError": "充電制限は、排出制限よりも大きくなければなりません"
},
+ "Timeframe": {
+ "targetSoc": "目標の充電状態",
+ "endTime": "終了時間",
+ "startTime": "開始時間"
+ },
"Peakshaving": {
"asymmetricInfo": "入力されたパフォーマンス値は、個々のフェーズを指します。最も強調されたフェーズに調整されます。",
"endDate": "終了日",
@@ -405,6 +410,8 @@
"apply": "適用",
"autarchy": "再生可能エネルギー率",
"automatic": "自動",
+ "auto": "自動",
+ "onDateAtTime": "{{date}}の{{time}}に",
"cancel": "キャンセル",
"capacity": "容量",
"changeAccepted": "変更が承認されました",
diff --git a/ui/src/assets/i18n/nl.json b/ui/src/assets/i18n/nl.json
index 77d013c0482..a750798c06e 100644
--- a/ui/src/assets/i18n/nl.json
+++ b/ui/src/assets/i18n/nl.json
@@ -4,6 +4,8 @@
"actualPower": "e-car Laad vermogen",
"autarchy": "Autarkie",
"automatic": "Automatisch",
+ "auto": "Auto",
+ "onDateAtTime": "op {{date}} om {{time}}",
"cancel": "annuleren",
"capacity": "Hoedanigheid",
"changeAccepted": "Wijziging geaccepteerd",
@@ -197,6 +199,11 @@
"switchOnBelow": "Inschakelen onder",
"threshold": "Thresholded"
},
+ "Timeframe": {
+ "targetSoc": "Doel laadstatus",
+ "endTime": "Eindtijd",
+ "startTime": "Starttijd"
+ },
"Peakshaving": {
"asymmetricInfo": "De ingevoerde prestatiewaarden verwijzen naar afzonderlijke fasen. Het is aangepast aan de meest gestresste fase.",
"endDate": "Einddatum",