diff --git a/package-lock.json b/package-lock.json index 540209a..f13415a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1274,6 +1274,7 @@ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, + "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -2492,7 +2493,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "dev": true, + "optional": true }, "constants-browserify": { "version": "1.0.0", @@ -2759,7 +2761,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "dev": true, + "optional": true }, "decode-uri-component": { "version": "0.2.0", @@ -2888,7 +2891,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "dev": true, + "optional": true }, "depd": { "version": "1.1.2", @@ -3912,7 +3916,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -3955,7 +3960,8 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", @@ -3966,7 +3972,8 @@ "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -4083,7 +4090,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -4095,6 +4103,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4117,12 +4126,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -4141,6 +4152,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -4221,7 +4233,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -4233,6 +4246,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -4318,7 +4332,8 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -4354,6 +4369,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4373,6 +4389,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4416,12 +4433,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -4430,6 +4449,7 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -4442,6 +4462,7 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, + "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -4479,7 +4500,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true + "dev": true, + "optional": true }, "get-stream": { "version": "3.0.0", @@ -4715,7 +4737,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "dev": true, + "optional": true }, "has-value": { "version": "1.0.0", @@ -5384,7 +5407,8 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "dev": true, + "optional": true }, "is-windows": { "version": "1.0.2", @@ -6017,6 +6041,7 @@ "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -6029,7 +6054,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "dev": true, + "optional": true } } }, @@ -6307,7 +6333,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "dev": true, + "optional": true }, "map-visit": { "version": "1.0.0", @@ -6965,6 +6992,7 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, + "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -7450,6 +7478,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, + "optional": true, "requires": { "error-ex": "^1.2.0" } @@ -8102,6 +8131,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, + "optional": true, "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -8113,6 +8143,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -8123,7 +8154,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "dev": true, + "optional": true } } }, @@ -8132,6 +8164,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, + "optional": true, "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -8142,6 +8175,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, + "optional": true, "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -8152,6 +8186,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, + "optional": true, "requires": { "pinkie-promise": "^2.0.0" } @@ -9407,6 +9442,7 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, + "optional": true, "requires": { "is-utf8": "^0.2.0" } @@ -10822,6 +10858,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, + "optional": true, "requires": { "string-width": "^1.0.2 || 2" } diff --git a/src/app/generator-object.ts b/src/app/generator-object.ts index f912f63..58ea15e 100644 --- a/src/app/generator-object.ts +++ b/src/app/generator-object.ts @@ -8,8 +8,8 @@ export interface GeneratorObject { export interface GeneratorState { online: boolean; - status: string; - status_code: number; + state: string; + state_code: number; fault_count?: number; fault_codes?: Array; status_count?: number; @@ -17,3 +17,12 @@ export interface GeneratorState { ip?: string; } +export interface GeneratorMetric { + id: string; + title: string; + units: string; + min: number; + max: number; + value?: number; + timestamp?: number; +} diff --git a/src/app/generator-search/generator-search.component.css b/src/app/generator-search/generator-search.component.css index 336075e..f570392 100644 --- a/src/app/generator-search/generator-search.component.css +++ b/src/app/generator-search/generator-search.component.css @@ -14,6 +14,7 @@ a#genLink { } */ mat-card.generator-card { - width: calc(100% - 70px); - height: calc(100% - 70px); + width: 300px; + height: 300px; + margin: 5px; } diff --git a/src/app/generator-search/generator-search.component.html b/src/app/generator-search/generator-search.component.html index 42085a7..7e37f51 100644 --- a/src/app/generator-search/generator-search.component.html +++ b/src/app/generator-search/generator-search.component.html @@ -1,32 +1,30 @@
-
-
-

Your Generators

- - - - - - {{ generator.gen_name }} - {{ generator.state.status }} - - - - error -

- Active Faults: {{ generator.state.fault_count }} -

-
- - settings_ethernet -

- IP Address: {{ generator.state.ip }} -

-
-
-
-
-
-
-
+
+ +

Your Generators

+ +
+
+ + + + {{ generator.gen_name }} + {{ generator.state.state }} + + + + error +

+ Active Faults: {{ generator.state.fault_count }} +

+
+ + settings_ethernet +

+ IP Address: {{ generator.state.ip }} +

+
+
+
+
diff --git a/src/app/services/generator.service.ts b/src/app/services/generator.service.ts index f6afbd1..d35a1f6 100644 --- a/src/app/services/generator.service.ts +++ b/src/app/services/generator.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import {HttpClient, HttpResponse} from '@angular/common/http'; -import {GeneratorObject, GeneratorState} from '../generator-object'; +import {GeneratorMetric, GeneratorObject, GeneratorState} from '../generator-object'; import {LoginService} from './login.service'; @Injectable({ @@ -47,4 +47,21 @@ export class GeneratorService { }); } + getGeneratorStatistics(gen_id: number, token: string): Promise> { + return new Promise>((resolve, reject) => { + this.http.get('http://sd5-backend.engr.uconn.edu/generator/' + gen_id + '/statistics', { + headers: { + Authorization: 'Bearer ' + token + } + }).subscribe(async (metrics: Array) => { + const result = new Map(); + for (const metric of metrics) { + result.set(metric.id, metric); + } + resolve(result); + }, (error) => { + reject(error); + }); + }); + } } diff --git a/src/app/statistics/statistics.component.html b/src/app/statistics/statistics.component.html index db195b7..563bfd1 100644 --- a/src/app/statistics/statistics.component.html +++ b/src/app/statistics/statistics.component.html @@ -1,318 +1,173 @@ -
- -
- - +
+
+
-
-
-
-
-
- - -
-
-
-
-
- - -
-
-
-
-
-
- - -
-
-
-
-
-
- - -
-
-
-
-
-
- - -
-
-
-
-
-
- - -
-
-
-
-
-
- - -
-
-
+ + + Data is not available within the last 24 hours + + + + + +
+
+

Generator Offline

+

To view statistics ensure generator can communicate with the PowerPanel system and check back later.

-
-
- - -
-
+
+ +
+
+
+
+
+
+ +
-
-
-
- - +
-
-
-
- -
-
-
-

Faults

-
-
-
Overcrank
+
+
+
+

Faults

+
+
+
Overcrank
-
Overcrank
+
Overcrank
-
-
High Engine
Temperature
+
+
High Engine
Temperature
-
High Engine
Temperature
-
+
High Engine
Temperature
+
-
-
Low Oil
Pressure
+
+
Low Oil
Pressure
-
Low Oil
Pressure
-
+
Low Oil
Pressure
+
-
-
Overspeed
- -
Overspeed
-
+
+
Overspeed
+ +
Overspeed
+
-
-
Emergency Stop
- -
Emergency Stop
-
+
+
Emergency Stop
+ +
Emergency Stop
+
-
-
Low Fuel
+
+
Low Fuel
-
Low Fuel
-
+
Low Fuel
+
-
-
Low Coolant
Level/Aux
+
+
Low Coolant
Level/Aux
-
Low Coolant
Level/Aux
-
+
Low Coolant
Level/Aux
+
-
-
Low Cranking
Voltage
+
+
Low Cranking
Voltage
-
Low Cranking
Voltage
-
+
Low Cranking
Voltage
+
-
-
Battery Voltage
(Hi/Lo)
+
+
+ Battery Voltage
(Hi/Lo)
-
Battery Voltage
(Hi/Lo)
-
-
-
-
Common Fault
+
Battery Voltage
(Hi/Lo)
+ +
+
+
Common Fault
-
Common Fault
-
-
+
Common Fault
+ +
-
-
-

System Status

+
+
+

System Status

-
-
EPS Supplying
Load
+
+
EPS Supplying
Load
-
EPS Supplying
Load
-
+
EPS Supplying
Load
+
-
-
Not-In-Auto
+
+
Not-In-Auto
-
Not-In-Auto
-
+
Not-In-Auto
+
-
-
System Ready
+
+
System Ready
-
System Running
-
+
System Running
+
-
-
Generator
Running
+
+
Generator
Running
-
Generator
Running
-
-
- -
-
-
-
-
-
- - - -
-
-
- -
-
- -
- - -
-
-
-
-
- -
- -
-
-
-
-
- -
- - - +
Generator
Running
+
-
-
-
-
- - - - - - - - - Data is not available within the last 24 hours - - -
- - +
+
diff --git a/src/app/statistics/statistics.component.ts b/src/app/statistics/statistics.component.ts index 0cb6236..3b13043 100644 --- a/src/app/statistics/statistics.component.ts +++ b/src/app/statistics/statistics.component.ts @@ -3,7 +3,7 @@ import {MetricsService} from '../services/metrics.service'; import {HttpClient, HttpHeaders} from '@angular/common/http'; import { Router } from '@angular/router'; import {LoginService} from '../services/login.service'; -import { GeneratorState } from '../generator-object'; +import { GeneratorState, GeneratorMetric} from '../generator-object'; import { GeneratorService } from '../services/generator.service'; @Component({ @@ -16,119 +16,61 @@ export class StatisticsComponent implements OnInit { constructor(public data: MetricsService, public data2: GeneratorService, private http: HttpClient, private router: Router, private login: LoginService) { - - } - public fuelTemp: any; - public oilTemp: any; - public pACurrent: any; - public pBCurrent: any; - public pCCurrent: any; - public engineSpeed: any; - public fuelPressure: any; - public pAVoltage: any; - public pBVoltage: any; - public pCVoltage: any; - public totalKw: any; - public coolantTemp: any; - public oilPressure: any; - - public fuelTempCheck: any; - public oilTempCheck: any; - public pACurrentCheck: any; - public pBCurrentCheck: any; - public pCCurrentCheck: any; - public engineSpeedCheck: any; - public fuelLevelCheck: any; - public pAVoltageCheck: any; - public pBVoltageCheck: any; - public pCVoltageCheck: any; - public totalKwCheck: any; - public coolantTempCheck: any; - public oilPressureCheck: any; - - public metric: any; - public metricYearAvg: any; - public fuelTempYearAvg: any; - - - - - public generator : GeneratorState; - - goToGraphGen() - { - this.router.navigateByUrl('/visualize-one'); + public generator_state: GeneratorState; + public generator_statistics: Map; + public radial_metrics = ['l1.current', 'l2.current', 'l3.current', 'engine.rpm', 'fuel.pressure', 'l1.l0.voltage', 'l2.l0.voltage', 'l3.l0.voltage', 'total.kw']; + public slide_metrics = ['coolant.temp', 'fuel.temp', 'oil.temp', 'oil.pressure']; + + getMajorTicks(metric: GeneratorMetric) { + const total = (metric.max - metric.min); + let inner = 0; + if (total % 6 === 0) { + inner = total / 6; + } else if (total % 5 === 0) { + inner = total / 5; + } + const tick_array = []; + for (let i = metric.min; i < metric.max; i += inner) { + tick_array.push(i); + } + tick_array.push(metric.max); + return tick_array.join(','); } - goToGraphSpec(dataType) - { - this.router.navigateByUrl('/visualize-one'); - localStorage.setItem('data_type', dataType); + + getMetric(metric_name: string) { + if (this.generator_statistics.has(metric_name)) { + return this.generator_statistics.get(metric_name); + } else { + return null; + } } - - - - async ngOnInit() { + goToGraphGen() { + this.router.navigateByUrl('/visualize-one'); + } + goToGraphSpec(dataType) { + this.router.navigateByUrl('/visualize-one'); + localStorage.setItem('data_type', dataType); + } + ngOnInit() { localStorage.removeItem('data_type'); localStorage.removeItem('fault_type'); - const jsonToken = await this.login.getToken(); - const gen_id = parseInt(localStorage.getItem('gen_id'),10); - - - - try { - this.data.getDevMetrics(jsonToken).subscribe((data) => { - - this.metric = data; - this.fuelTemp = this.metric.outputs[0].dps[0][1]; - this.oilTemp = this.metric.outputs[1].dps[0][1]; - this.pACurrent = this.metric.outputs[2].dps[0][1]; - this.pBCurrent = this.metric.outputs[3].dps[0][1]; - this.pCCurrent = this.metric.outputs[4].dps[0][1]; - this.engineSpeed = this.metric.outputs[5].dps[0][1]; - this.fuelPressure = this.metric.outputs[6].dps[0][1]; - this.pAVoltage = this.metric.outputs[7].dps[0][1]; - this.pBVoltage = this.metric.outputs[8].dps[0][1]; - this.pCVoltage = this.metric.outputs[9].dps[0][1]; - this.totalKw = this.metric.outputs[10].dps[0][1]; - this.coolantTemp = this.metric.outputs[11].dps[0][1]; - this.oilPressure = this.metric.outputs[12].dps[0][1]; - - - - - + const gen_id = parseInt(localStorage.getItem('gen_id'), 10); + this.login.getToken().then((jsonToken) => { + this.data2.getGeneratorState(gen_id, jsonToken).then((state) => { + this.generator_state = state; }); - - - this.generator = await this.data2.getGeneratorState(gen_id,jsonToken); - - - - - } catch (err) { - return err; - } - - try { - - this.data.getYearMetrics(jsonToken).subscribe((data) => { - - this.metricYearAvg = data; - - this.fuelTempYearAvg = this.metricYearAvg.outputs[0].dps[0][1]; - + this.data2.getGeneratorStatistics(gen_id, jsonToken).then((statistics) => { + this.generator_statistics = statistics; }); - } catch (err) { - return err; - } - - + }, (error) => { + // todo go to logout + }); } }