thingsboard-aplcache

Merge pull request #302 from thingsboard/feature/rpc-rule Alarm

9/20/2017 6:39:38 AM

Details

diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java
index 64e98ad..96b49ac 100644
--- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java
+++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessor.java
@@ -41,6 +41,7 @@ import javax.script.Bindings;
 import javax.script.ScriptException;
 import java.io.IOException;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
 
 /**
  * @author Andrew Shvayka
@@ -131,6 +132,16 @@ public class AlarmProcessor implements RuleProcessor<AlarmProcessorConfiguration
         Alarm existing = null;
         if (isActiveAlarm) {
             Alarm alarm = buildAlarm(ctx, msg);
+            if (configuration.isNewAlarmFlag()) {
+                Optional<Alarm> oldAlarmOpt = ctx.findLatestAlarm(alarm.getOriginator(), alarm.getType());
+                if (oldAlarmOpt.isPresent() && !oldAlarmOpt.get().getStatus().isCleared()) {
+                    try {
+                        ctx.clearAlarm(oldAlarmOpt.get().getId(), oldAlarmOpt.get().getEndTs()).get();
+                    } catch (Exception e) {
+                        throw new RuleException("Failed to clear old alarm", e);
+                    }
+                }
+            }
             existing = ctx.createOrUpdateAlarm(alarm);
             if (existing.getStartTs() == alarm.getStartTs()) {
                 log.debug("[{}][{}] New Active Alarm detected", ctx.getRuleId(), existing.getId());
@@ -140,7 +151,7 @@ public class AlarmProcessor implements RuleProcessor<AlarmProcessorConfiguration
                 log.debug("[{}][{}] Existing Active Alarm detected", ctx.getRuleId(), existing.getId());
                 md.put(IS_EXISTING_ALARM, Boolean.TRUE);
             }
-        } else if (isClearedAlarm) {
+        } else {
             String alarmType = VelocityUtils.merge(alarmTypeTemplate, context);
             Optional<Alarm> alarm = ctx.findLatestAlarm(ctx.getDeviceMetaData().getDeviceId(), alarmType);
             if (alarm.isPresent()) {
diff --git a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessorConfiguration.java b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessorConfiguration.java
index 197cc44..8d73dd6 100644
--- a/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessorConfiguration.java
+++ b/extensions-core/src/main/java/org/thingsboard/server/extensions/core/processor/AlarmProcessorConfiguration.java
@@ -32,6 +32,7 @@ public class AlarmProcessorConfiguration {
     private String alarmSeverity;
     private String alarmStatus;
     private boolean alarmPropagateFlag;
+    private boolean newAlarmFlag;
 
     private String alarmDetailsTemplate;
 
diff --git a/extensions-core/src/main/resources/AlarmProcessorDescriptor.json b/extensions-core/src/main/resources/AlarmProcessorDescriptor.json
index f23b40c..74dcffb 100644
--- a/extensions-core/src/main/resources/AlarmProcessorDescriptor.json
+++ b/extensions-core/src/main/resources/AlarmProcessorDescriptor.json
@@ -30,6 +30,11 @@
         "type": "boolean",
         "default": true
       },
+      "newAlarmFlag": {
+        "title": "New Alarm on each event",
+        "type": "boolean",
+        "default": false
+      },
       "alarmDetailsTemplate": {
         "title": "Alarm details (JSON)",
         "type": "string",
@@ -106,6 +111,7 @@
     },
     "alarmTypeTemplate",
     "alarmPropagateFlag",
+    "newAlarmFlag",
     {
       "key": "alarmDetailsTemplate",
       "type": "textarea",