diff --git a/src/main/angular/src/app/location/Location.ts b/src/main/angular/src/app/location/Location.ts index a26a11d..afbe3e9 100644 --- a/src/main/angular/src/app/location/Location.ts +++ b/src/main/angular/src/app/location/Location.ts @@ -4,6 +4,20 @@ import {Value} from '../series/Value'; export class Location { + powerSelf: Value = Value.NULL; + + powerPurchasePercentConsume: Value = Value.NULL; + + powerProducePercentConsume: Value = Value.NULL; + + powerDeliveryPercentConsume: Value = Value.NULL; + + powerDeliveryPercentProduce: Value = Value.NULL; + + powerSelfPercentConsume: Value = Value.NULL; + + powerSelfPercentProduce: Value = Value.NULL; + constructor( readonly id: number, readonly name: string, @@ -46,6 +60,13 @@ export class Location { private updateConsume() { this._powerConsume = Value.ZERO.plus(this._powerPurchase?.value, true).plus(this._powerProduce?.value, true).minus(this._powerDeliver?.value, true); + this.powerSelf = Value.ZERO.plus(this.powerProduce?.value.minus(this.powerDeliver?.value, true), true); + this.powerPurchasePercentConsume = Value.ZERO.plus(this.powerPurchase?.value.percent(this.powerConsume, "%", 0), true); + this.powerProducePercentConsume = Value.ZERO.plus(this.powerProduce?.value.percent(this.powerConsume, "%", 0), true); + this.powerDeliveryPercentConsume = Value.ZERO.plus(this.powerDeliver?.value.percent(this.powerConsume, "%", 0), true); + this.powerDeliveryPercentProduce = Value.ZERO.plus(this.powerDeliver?.value.percent(this.powerProduce?.value, "%", 0), true); + this.powerSelfPercentConsume = Value.ZERO.plus(this.powerSelf.percent(this.powerConsume, "%", 0), true); + this.powerSelfPercentProduce = Value.ZERO.plus(this.powerSelf.percent(this.powerProduce?.value, "%", 0), true); } static fromJson(json: any): Location { diff --git a/src/main/angular/src/app/location/energy/location-energy.html b/src/main/angular/src/app/location/energy/location-energy.html index 423a9a2..fd5159a 100644 --- a/src/main/angular/src/app/location/energy/location-energy.html +++ b/src/main/angular/src/app/location/energy/location-energy.html @@ -14,6 +14,10 @@
{{ purchase.toValueString(null) }}
+
+ {{ purchasePercentConsume.toValueString(null) }} + Verbrauch +
@@ -23,6 +27,27 @@
{{ produce.toValueString(null) }}
+
+ {{ producePercentConsume.toValueString(null) }} + Verbrauch +
+
+ +
+
+ Selbst +
+
+ {{ self.toValueString(null) }} +
+
+ {{ selfPercentConsume.toValueString(null) }} + Verbrauch +
+
+ {{ selfPercentProduce.toValueString(null) }} + Produktion +
@@ -41,6 +66,14 @@
{{ deliver.toValueString(null) }}
+
+ {{ deliveryPercentConsume.toValueString(null) }} + Verbrauch +
+
+ {{ deliveryPercentProduce.toValueString(null) }} + Produktion +
diff --git a/src/main/angular/src/app/location/energy/location-energy.ts b/src/main/angular/src/app/location/energy/location-energy.ts index a20b626..84bad26 100644 --- a/src/main/angular/src/app/location/energy/location-energy.ts +++ b/src/main/angular/src/app/location/energy/location-energy.ts @@ -31,6 +31,20 @@ export class LocationEnergy implements OnInit, AfterViewInit, OnDestroy { protected consume: Value = Value.NULL; + protected self: Value = Value.NULL; + + protected purchasePercentConsume: Value = Value.NULL; + + protected producePercentConsume: Value = Value.NULL; + + protected deliveryPercentConsume: Value = Value.NULL; + + protected deliveryPercentProduce: Value = Value.NULL; + + protected selfPercentConsume: Value = Value.NULL; + + protected selfPercentProduce: Value = Value.NULL; + @Input() heading!: string; @@ -89,6 +103,13 @@ export class LocationEnergy implements OnInit, AfterViewInit, OnDestroy { const callNextAndUpdateConsume = (value: Value) => { next(value); this.consume = this.purchase.plus(this.produce, true).minus(this.deliver, true); + this.self = this.produce.minus(this.deliver, true); + this.purchasePercentConsume = this.purchase.percent(this.consume, "%", 0); + this.producePercentConsume = this.produce.percent(this.consume, "%", 0); + this.deliveryPercentConsume = this.deliver.percent(this.consume, "%", 0); + this.deliveryPercentProduce = this.deliver.percent(this.produce, "%", 0); + this.selfPercentConsume = this.self.percent(this.consume, "%", 0); + this.selfPercentProduce = this.self.percent(this.produce, "%", 0); }; if (fresh !== null && fresh !== undefined) { if (fresh.id !== series?.id) { diff --git a/src/main/angular/src/app/location/power/location-power.html b/src/main/angular/src/app/location/power/location-power.html index 7898456..aaeaf5f 100644 --- a/src/main/angular/src/app/location/power/location-power.html +++ b/src/main/angular/src/app/location/power/location-power.html @@ -13,6 +13,10 @@
{{ location.powerPurchase?.value?.toValueString(dateService.now) }}
+
+ {{ location.powerPurchasePercentConsume.toValueString(dateService.now) }} + Verbrauch +
@@ -22,6 +26,27 @@
{{ location.powerProduce?.value?.toValueString(dateService.now) }}
+
+ {{ location.powerProducePercentConsume.toValueString(dateService.now) }} + Verbrauch +
+
+ +
+
+ Selbst +
+
+ {{ location.powerSelf?.toValueString(dateService.now) }} +
+
+ {{ location.powerSelfPercentConsume.toValueString(dateService.now) }} + Verbrauch +
+
+ {{ location.powerSelfPercentProduce.toValueString(dateService.now) }} + Produktion +
@@ -40,6 +65,14 @@
{{ location.powerDeliver?.value?.toValueString(dateService.now) }}
+
+ {{ location.powerDeliveryPercentConsume.toValueString(dateService.now) }} + Verbrauch +
+
+ {{ location.powerDeliveryPercentProduce.toValueString(dateService.now) }} + Produktion +
diff --git a/src/main/angular/src/app/series/Value.ts b/src/main/angular/src/app/series/Value.ts index 9a97916..e3f4a02 100644 --- a/src/main/angular/src/app/series/Value.ts +++ b/src/main/angular/src/app/series/Value.ts @@ -83,11 +83,11 @@ export class Value { return ageSeconds > this.seconds * 2.1; } - onlyPositive(): Value { - if (this.value < 0) { - return Value.ZERO; + percent(other: Value | null | undefined, unit: string | null = null, precision: number | null = null): Value { + if (other === null || other === undefined) { + return Value.NULL; } - return this; + return new BiValue(this, other, (a, b) => a / b * 100, unit, precision); } } @@ -98,12 +98,18 @@ export class BiValue extends Value { readonly a: Value, readonly b: Value, readonly operation: (a: number, b: number) => number, + unit: string | null = null, + precision: number | null = null, ) { if (a.unit !== "" && b.unit !== "" && a.unit !== b.unit) { throw new Error(`Operation needs units to be equal or empty: this=${a}, other=${b}`); } - const precision = Math.max(a.precision, b.precision); - const unit = a.unit || b.unit; + if (precision === null) { + precision = Math.max(a.precision, b.precision); + } + if (unit === null) { + unit = a.unit || b.unit; + } const date = a.date.getTime() < b.date.getTime() ? a.date : b.date; super(operation(a.value, b.value), precision, 0, unit, date); } diff --git a/src/main/angular/src/colors.less b/src/main/angular/src/colors.less index dc9b9c7..51867ed 100644 --- a/src/main/angular/src/colors.less +++ b/src/main/angular/src/colors.less @@ -3,7 +3,7 @@ @COLOR_FONT_PURCHASE: red; @COLOR_FONT_DELIVER: magenta; @COLOR_FONT_PRODUCE: #0095ff; -@COLOR_FONT_SELF: #0095ff; +@COLOR_FONT_SELF: #00b34a; @COLOR_FONT_CONSUME: #ff8800; @COLOR_BACK_PURCHASE: #ffa7a7; @@ -28,6 +28,10 @@ color: @COLOR_FONT_SELF; } +.COLOR_FONT_SELF { + color: @COLOR_FONT_SELF; +} + .COLOR_FONT_CONSUME { color: @COLOR_FONT_CONSUME; } diff --git a/src/main/angular/src/styles.less b/src/main/angular/src/styles.less index 0edb031..d355748 100644 --- a/src/main/angular/src/styles.less +++ b/src/main/angular/src/styles.less @@ -3,7 +3,7 @@ body { height: 100%; margin: 0; font-family: sans-serif; - font-size: 4vw; + font-size: 3.5vw; user-select: none; } @@ -99,3 +99,11 @@ div { } } + +.percent { + font-size: 70%; + + .subscript { + font-size: 60%; + } +}