-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathemailalert.html
More file actions
148 lines (123 loc) · 5.53 KB
/
emailalert.html
File metadata and controls
148 lines (123 loc) · 5.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Get Event Data</title>
<!-- Custom Siemens Theme -->
<link href="siemens-theme.css" rel="stylesheet">
</head>
<script>
window.onload = function() {
// Get and show all alarms
setInterval(function() {
checkForAlerts();
}, 5000);
}
function checkForAlerts(){
var alarmEventData = getAlarms(getAlarms());
if((alarmEventData != null) && (alarmEventData.length > 0)){
fireEvent(alarmEventData);
}
}
function getTimeSeriesData(assetId, aspectTypeName, limit){
limit = limit || 1;
var to = new Date.now().toISOString();
var from = new Date(to).setMinues(to.getMinutes() - 1).toISOString();
var timeSeriesReq = new XMLHttpRequest();
var address = 'api/iottimeseries/v3/timeseries/' + assetId + "/";
// api/iottimeseries/v3/timeseries/b43703b007924c2889adc9da9f818a5b/Sensors?from=2018-05-01T00:00:00Z&to=2018-05-01T23:50:00Z&limit=100
timeSeriesReq.open("GET", address + "/" + aspectTypeName + "?from="+from + "&to=" +to + "&limit=" + limit , false); // 'false' makes the request synchronous
timeSeriesReq.onreadystatechange = function() {
if (timeSeriesReq.readyState === 4) { // When readyState property is 4 and status property is 200, the response is ready
if (timeSeriesReq.status === 200) {
console.log('GET timeseries response: ' + timeSeriesReq.response);
var timeSeriesArray = JSON.parse(timeSeriesReq.response);
return timeSeriesArray;
}
else {
console.error('Request status text: ' + timeSeriesReq.statusText);
}
}
}
return [];
}
function getAlarms(alarmDefinitionList){
var alarmsGenerated = [];
var alarmslist = [];
var codex = 0;
for (var i = alarmDefinitionList.length - 1; i >= 0; i--) {
//Retrieved the list of alarms -> many triggers
var assestId = alarmDefinitionList[i]['assetId'];
//Retrived Trigger List inside of the Alarms
var triggerList = alarmDefinitionList[i]['triggers'];
var aspectTypeName = (triggerList[0]['aspectTypeName'] != null) ? triggerList[0]['aspectTypeName'] : null;
var timeSeriesData = getTimeSeriesData(assestId, aspectTypeName, 5);
for (var x = timeSeriesData.length - 1; x >= 0; x--) {
//Need to iterate Trigger List againts Timeseries data
for (var u = triggerList.length - 1; u >= 0; u--) {
//1. Obtain the Sensor Name:
var trigdPName = triggerList[u]['dataPointName'];
//2. Obtain the Sensor Name's data point (value):
var timeSerdPVal = parseFloat(timeSeriesData[x][trigdPName]);
//3. Get the trigger (<, >, =)
var trigger = triggerList[u]['trigger'];
//4. Get the condition
var condition = parseFloat(triggerList[u]['condition']);
if(trigger == "<"){
if(condition < timeSerdPVal){
alarmsGenerated.push({
timestamp: timeSeriesData[x]["_time"],
entityId: assestId,
severity: 1,
description: trigdPName + ": Alert observed value ("+timeSerdPVal+") less than threshold ("+condition+")",
code: trigdPName + "-BELOW-" + codex++,
});
}
} else if(trigger = ">"){
if(condition > timeSerdPVal){
alarmsGenerated.push({
timestamp: timeSeriesData[x]["_time"],
entityId: assestId,
severity: 2,
description: trigdPName + ": Alert observed value ("+timeSerdPVal+") more than threshold ("+condition+")",
code: trigdPName + "-ABOVE-" + codex++,
});
}
} else if(trigger = "="){
if(condition == timeSerdPVal){
alarmsGenerated.push({
timestamp: timeSeriesData[x]["_time"],
entityId: assestId,
severity: 3,
description: trigdPName + ": Alert observed value ("+timeSerdPVal+") equals the threshold ("+condition+")",
code: trigdPName + "-ABOVE-" + codex++,
});
}
}
}
}
}
return alarmsGenerated;
}
function fireEvent(alarmEventData){
for (var i = alarmEventData.length - 1; i >= 0; i--) {
var eventsReq = new XMLHttpRequest();
var address = '/api/eventmanagement/v3/events';
eventsReq.open("POST", address, false); // 'false' makes the request synchronous
var data = new FormData();
data.append('timestamp', alarmEventData[i]['timestamp']);
data.append('entityId', alarmEventData[i]['entityId']);
data.append('severity', alarmEventData[i]['severity']);
data.append('description', alarmEventData[i]['description']);
data.append('code', alarmEventData[i]['code']);
data.append('acknowledged', 'false');
eventsReq.onload = function () {
// do something to response
console.log(this.responseText);
};
eventsReq.send(data);
}
}
function sendEmail(){
}
</script>