Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UI: FlatWidget for Storage #1445

Merged
merged 50 commits into from
May 3, 2021
Merged
Show file tree
Hide file tree
Changes from 32 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
eb7cec3
autarchy
lukasrgr Apr 14, 2021
71767f8
fix import
lukasrgr Apr 14, 2021
e96cd85
reduce code-length
lukasrgr Apr 14, 2021
e0d01b3
revert deleting line this.ouputchannel
lukasrgr Apr 15, 2021
1b8d4d2
no message
lukasrgr Apr 15, 2021
55ec04a
refactored calculateAutarchy
lukasrgr Apr 15, 2021
5462823
refactored calculateAutarchy() 2
lukasrgr Apr 15, 2021
272ae97
refactored caluclateAutarchy() 3
lukasrgr Apr 15, 2021
d09ed37
refactored calculateAutarchy() 4
lukasrgr Apr 15, 2021
ad67b34
> refactored autarchy title
lukasrgr Apr 15, 2021
e46a69b
Review
sfeilmeier Apr 15, 2021
2127973
Generic Widget for Storage
lukasrgr Apr 15, 2021
628fc95
Merge remote-tracking branch 'origin/develop' into feature/flatwidget…
lukasrgr Apr 15, 2021
f10a675
Style text-underline
lukasrgr Apr 15, 2021
65b5531
> move storage in /common
lukasrgr Apr 16, 2021
e730755
> updated imports
lukasrgr Apr 19, 2021
bfeaa33
reverting some imports
lukasrgr Apr 19, 2021
9c28fbf
revert import ng-cookie-service
lukasrgr Apr 20, 2021
c577eb3
> service.ts import changes 2
lukasrgr Apr 20, 2021
7165f8e
update chageWattInKiloWatt
lukasrgr Apr 20, 2021
37f99b1
> refactor changeWattInKiloWatt to convertWattToKiloWatt, update imports
lukasrgr Apr 20, 2021
457bd6d
> implemented convertCharge, convertDischarge
lukasrgr Apr 21, 2021
42c624e
> removed unnecessary logic
lukasrgr Apr 21, 2021
2472c50
> reduced code
lukasrgr Apr 21, 2021
bae1c70
> reduced code 2
lukasrgr Apr 21, 2021
6fd9ae8
no message
lukasrgr Apr 21, 2021
52c1dc5
> refactored converters
lukasrgr Apr 21, 2021
cffff93
Merge branch 'develop' into feature/flatwidget_for_more_complex_widgets
lukasrgr Apr 21, 2021
3f52f97
> refactored converter
lukasrgr Apr 21, 2021
cba83dd
Merge branch 'feature/flatwidget_for_more_complex_widgets' of https:/…
lukasrgr Apr 21, 2021
a23d92e
> show storageSystem only when StateOfCharge not null
lukasrgr Apr 22, 2021
c166f82
> commented converter
lukasrgr Apr 22, 2021
5b5280f
no message
lukasrgr Apr 22, 2021
db2f703
> conflicting files
lukasrgr Apr 22, 2021
f03bdab
Revert "> conflicting files"
lukasrgr Apr 22, 2021
4d6d3fd
> import FlatwidgetHorizontalLine
lukasrgr Apr 23, 2021
9b2ee84
new flat-widget-horizontal-line
lukasrgr Apr 23, 2021
34daaa7
no message
lukasrgr Apr 23, 2021
bb7d683
Merge remote-tracking branch 'origin/develop' into feature/flatwidget…
lukasrgr Apr 23, 2021
caf39b7
> commented
lukasrgr Apr 23, 2021
82f1873
> called boolean-Array instead of calling function for better perform…
lukasrgr Apr 28, 2021
438d5a8
> reduced isHybridEss
lukasrgr Apr 28, 2021
6f31b04
> removed log
lukasrgr Apr 28, 2021
1ef7f0f
Review + add comments
sfeilmeier May 3, 2021
908562b
Merge branch 'develop' into feature/flatwidget_for_more_complex_widgets
sfeilmeier May 3, 2021
15cb69a
Move method to Utils
sfeilmeier May 3, 2021
18a6037
Review
sfeilmeier May 3, 2021
f0d84dd
Remove isInitialized for flat-widget-line
sfeilmeier May 3, 2021
a6a7896
Reset service.ts
sfeilmeier May 3, 2021
b656991
Reset environment to develop
sfeilmeier May 3, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 23 additions & 0 deletions ui/src/app/edge/live/common/storage/storage.component.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<ng-container *ngIf="isInitialized">
<oe-flat-widget [img]="storageItem" [title]="'General.storageSystem'| translate" (click)="presentModal()">
<ng-container *ngFor="let component of essComponents, let i = index">
<ng-container *ngIf="essComponents.length > 1">
<oe-flat-widget-line [name]="component.alias">
</oe-flat-widget-line>
</ng-container>
<ng-container *ngIf="checkStateOfCharge(component.id)">
lukasrgr marked this conversation as resolved.
Show resolved Hide resolved
<oe-flat-widget-percentagebar [channelAddress]="component.id + '/Soc'">
</oe-flat-widget-percentagebar>
<oe-flat-widget-line [name]="'General.chargePower' | translate"
[channelAddress]="component.id + '/ActivePower'" [converter]="convertChargePower">
lukasrgr marked this conversation as resolved.
Show resolved Hide resolved
</oe-flat-widget-line>
<oe-flat-widget-line [name]="'General.dischargePower' | translate"
[channelAddress]="component.id + '/ActivePower'" [converter]="convertDischargePower">
</oe-flat-widget-line>
<div *ngIf="essComponents.length > 1 && i != (essComponents.length -1)"
lukasrgr marked this conversation as resolved.
Show resolved Hide resolved
style="border-bottom: 1px solid lightgray; width: 110%; margin-top: 2%; margin-bottom: 2%; margin-left: -5%;">
</div>
</ng-container>
</ng-container>
</oe-flat-widget>
</ng-container>
131 changes: 131 additions & 0 deletions ui/src/app/edge/live/common/storage/storage.component.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
import { ChannelAddress, EdgeConfig } from '../../../../shared/shared';
import { Component } from '@angular/core';
import { StorageModalComponent } from './modal/modal.component';
import { AbstractFlatWidget } from '../../flat/abstract-flat-widget';
import { CurrentData } from "src/app/shared/shared";

@Component({
selector: 'storage',
templateUrl: './storage.component.html'
})
export class StorageComponent extends AbstractFlatWidget {

public essComponents: EdgeConfig.Component[] = [];
public chargerComponents: EdgeConfig.Component[] = [];
lukasrgr marked this conversation as resolved.
Show resolved Hide resolved
public storageItem: string = null;
public stateOfCharge: number[] = [];

protected getChannelAddresses() {
let channelAddresses: ChannelAddress[] = [];
channelAddresses.push(
new ChannelAddress('_sum', 'EssSoc'),
new ChannelAddress('_sum', 'EssActivePower'),
// channels for modal component, subscribe here for better UX
new ChannelAddress('_sum', 'EssActivePowerL1'),
new ChannelAddress('_sum', 'EssActivePowerL2'),
new ChannelAddress('_sum', 'EssActivePowerL3'),
new ChannelAddress('_sum', 'EssCapacity'),
)
this.chargerComponents = this.config.getComponentsImplementingNature("io.openems.edge.ess.dccharger.api.EssDcCharger").filter(component => component.isEnabled);
for (let component of this.chargerComponents) {
channelAddresses.push(
new ChannelAddress(component.id, 'ActualPower'),
)
}
this.essComponents = this.config.getComponentsImplementingNature("io.openems.edge.ess.api.SymmetricEss").filter(component => !component.factoryId.includes("Ess.Cluster") && component.isEnabled);
for (let component of this.essComponents) {
channelAddresses.push(
new ChannelAddress(component.id, 'Soc'),
new ChannelAddress(component.id, 'Capacity'),
);
if (this.config.factories[component.factoryId].natureIds.includes("io.openems.edge.ess.api.AsymmetricEss")) {
channelAddresses.push(
new ChannelAddress(component.id, 'ActivePowerL1'),
new ChannelAddress(component.id, 'ActivePowerL2'),
new ChannelAddress(component.id, 'ActivePowerL3')
);
}
}
return channelAddresses
}
/**
* Use 'checkStateOfCharge' to check, if a Storage-System has a State of Charge
*
* @param componentID componentID of essComponents
* @returns boolean
*/
public checkStateOfCharge(componentID: string): boolean {
if (this.stateOfCharge[componentID] != null) {
return true;
}
}
protected onCurrentData(currentData: CurrentData) {
// Check State_of_Charge for every component of essComponents
for (let component of this.essComponents) {
this.stateOfCharge[component.id] = currentData.allComponents[component.id + '/Soc'];
}
// Check total State_of_Charge for dynamical icon in widget-header
let soc = currentData.allComponents['_sum' + '/EssSoc'];
if (soc < 20) {
this.storageItem = 'assets/img/storage_20.png'
} else if (soc < 40 || soc == 20) {
this.storageItem = 'assets/img/storage_40.png'
} else if (soc < 60 || soc == 40) {
this.storageItem = 'assets/img/storage_60.png'
} else if (soc < 80 || soc == 60) {
this.storageItem = 'assets/img/storage_80.png'
} else if (soc < 100 || soc == 80) {
this.storageItem = 'assets/img/storage_100.png'
} else {
this.storageItem = 'assets/img/storage_100.png'
}
}
/**
* Use 'convertChargePower' to convert/map a value, to be only showed when not negative
*
* @param value takes @Input value or channelAddress for chargePower
* @returns only positive value
*/
public convertChargePower = (value: any): string => {
let thisValue = (value / 1000 * -1).toFixed(1);
lukasrgr marked this conversation as resolved.
Show resolved Hide resolved
if (value <= 0) {
if (thisValue.endsWith('0')) {
return parseInt(thisValue).toString() + ' kW';
} else {
return thisValue + ' kW';
}
} else {
return '-'
}
}
/**
* Use 'convertDischargePower' to convert/map a value, to be only showed when not negative
*
* @param value takes @Input value or channelAddress for dischargePower
* @returns only positive value
*/
public convertDischargePower = (value: any): string => {
let thisValue = (value / 1000).toFixed(1);
if (value > 0) {
if (thisValue.endsWith('0')) {
return parseInt(thisValue).toString() + ' kW';
} else {
return thisValue + ' kW';
}
} else {
return '-'
}
}
async presentModal() {
const modal = await this.modalController.create({
component: StorageModalComponent,
componentProps: {
edge: this.edge,
config: this.config,
essComponents: this.essComponents,
chargerComponents: this.chargerComponents,
}
});
return await modal.present();
}
}
3 changes: 1 addition & 2 deletions ui/src/app/edge/live/flat/abstract-flat-widget.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ export abstract class AbstractFlatWidget implements OnInit, OnDestroy {
public config: EdgeConfig = null;
public component: EdgeConfig.Component = null;
public stopOnDestroy: Subject<void> = new Subject<void>();

private selector: string = UUID.UUID().toString();

constructor(
Expand All @@ -32,8 +31,8 @@ export abstract class AbstractFlatWidget implements OnInit, OnDestroy {
@Inject(TranslateService) protected translate: TranslateService
) {
}

public ngOnInit() {
// this.convert = this.changeWattInKiloWatt;
lukasrgr marked this conversation as resolved.
Show resolved Hide resolved
this.service.setCurrentComponent('', this.route).then(edge => {
this.service.getConfig().then(config => {
// store important variables publically
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ export abstract class AbstractFlatWidgetLine implements OnDestroy {
*/
private selector: string = UUID.UUID().toString();

/**
* displayName is the displayed @Input value in html
*/
public displayName: string;
lukasrgr marked this conversation as resolved.
Show resolved Hide resolved
/**
* displayValue is the displayed @Input value in html
*/
Expand All @@ -42,15 +46,20 @@ export abstract class AbstractFlatWidgetLine implements OnDestroy {
@Inject(ModalController) protected modalCtrl: ModalController
) {
}

protected setName(value: any) {
this.displayName = value;
this.isInitialized = true;
lukasrgr marked this conversation as resolved.
Show resolved Hide resolved
}
protected setValue(value: any) {
this.displayValue = this.converter(value);

if (this.converter != null) {
this.displayValue = this.converter(value);
} else {
this.displayValue = value;
}
// announce initialized
this.isInitialized = true;
}

protected subscribe(channelAddress?: ChannelAddress) {
protected subscribe(channelAddress: ChannelAddress) {
this.service.setCurrentComponent('', this.route).then(edge => {
this.edge = edge;

Expand All @@ -62,7 +71,6 @@ export abstract class AbstractFlatWidgetLine implements OnDestroy {
});
});
}

public ngOnDestroy() {
// Unsubscribe from OpenEMS
if (this.edge != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<tr>
<!-- Name of Parameter on the left side -->
<td style="width:65%">
<ng-container *ngIf="name">{{ name }}</ng-container>
<ng-container *ngIf="displayName">{{ displayName }}</ng-container>
</td>

<!-- Value of Parameter on the right side -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ export class FlatWidgetLine extends AbstractFlatWidgetLine {

/** Name for parameter, displayed on the left side*/
@Input()
name: string;
set name(value: any) {
this.setName(value);
}

/** value defines value of the parameter, displayed on the right */
@Input()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
<rect width="100%" rx="5" ry="5" height="20" style="fill:#f4f4f4" />
<rect *ngIf="displayValue" x="1" y="2" rx="5" ry="5" attr.width="{{displayValue}}%" height="16"
style="fill:#2d8fab" />
<text x="50%" y="58%" dominant-baseline="middle" text-anchor="middle" style="font-weight: 500">{{ displayValue |
<text x="50%" y="58%" dominant-baseline="middle" text-anchor="middle" style="font-weight: 500">{{ displayValue
|| 0 |
number:'1.0-0' }}&nbsp;%</text>
</svg>
</ng-container>
4 changes: 2 additions & 2 deletions ui/src/app/edge/live/live.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ import { SelfconsumptionModalComponent } from './selfconsumption/modal/modal.com
import { SelfConsumptionComponent } from './selfconsumption/selfconsumption.component';
import { SinglethresholdModalComponent } from './singlethreshold/modal/modal.component';
import { SinglethresholdComponent } from './singlethreshold/singlethreshold.component';
import { StorageModalComponent } from './storage/modal/modal.component';
import { StorageComponent } from './storage/storage.component';
import { StorageModalComponent } from './common/storage/modal/modal.component';
import { StorageComponent } from './common/storage/storage.component';

@NgModule({
imports: [
Expand Down