Commit 2b95d6cbaed06d6c1f752abb4b728ceffa61ac23

Authored by Dmytro Shvaika
Committed by Andrew Shvayka
1 parent fea2f879

changed logic to report activity & improvements for clear alarm node

@@ -197,15 +197,15 @@ public class DefaultDeviceStateService implements DeviceStateService { @@ -197,15 +197,15 @@ public class DefaultDeviceStateService implements DeviceStateService {
197 if (lastReportedActivity > 0 && lastReportedActivity > lastSavedActivity) { 197 if (lastReportedActivity > 0 && lastReportedActivity > lastSavedActivity) {
198 DeviceStateData stateData = getOrFetchDeviceStateData(deviceId); 198 DeviceStateData stateData = getOrFetchDeviceStateData(deviceId);
199 if (stateData != null) { 199 if (stateData != null) {
200 - DeviceState state = stateData.getState();  
201 - stateData.getState().setLastActivityTime(lastReportedActivity);  
202 - stateData.getMetaData().putValue("scope", SERVER_SCOPE);  
203 - pushRuleEngineMessage(stateData, ACTIVITY_EVENT);  
204 save(deviceId, LAST_ACTIVITY_TIME, lastReportedActivity); 200 save(deviceId, LAST_ACTIVITY_TIME, lastReportedActivity);
205 deviceLastSavedActivity.put(deviceId, lastReportedActivity); 201 deviceLastSavedActivity.put(deviceId, lastReportedActivity);
  202 + DeviceState state = stateData.getState();
206 if (!state.isActive()) { 203 if (!state.isActive()) {
207 state.setActive(true); 204 state.setActive(true);
208 save(deviceId, ACTIVITY_STATE, state.isActive()); 205 save(deviceId, ACTIVITY_STATE, state.isActive());
  206 + state.setLastActivityTime(lastReportedActivity);
  207 + stateData.getMetaData().putValue("scope", SERVER_SCOPE);
  208 + pushRuleEngineMessage(stateData, ACTIVITY_EVENT);
209 } 209 }
210 } 210 }
211 } 211 }
@@ -41,7 +41,7 @@ public abstract class TbAbstractAlarmNode<C extends TbAbstractAlarmNodeConfigura @@ -41,7 +41,7 @@ public abstract class TbAbstractAlarmNode<C extends TbAbstractAlarmNodeConfigura
41 static final String IS_EXISTING_ALARM = "isExistingAlarm"; 41 static final String IS_EXISTING_ALARM = "isExistingAlarm";
42 static final String IS_CLEARED_ALARM = "isClearedAlarm"; 42 static final String IS_CLEARED_ALARM = "isClearedAlarm";
43 43
44 - private final ObjectMapper mapper = new ObjectMapper(); 44 + protected final ObjectMapper mapper = new ObjectMapper();
45 45
46 protected C config; 46 protected C config;
47 private ScriptEngine buildDetailsJsEngine; 47 private ScriptEngine buildDetailsJsEngine;
@@ -18,15 +18,16 @@ package org.thingsboard.rule.engine.action; @@ -18,15 +18,16 @@ package org.thingsboard.rule.engine.action;
18 import com.fasterxml.jackson.databind.JsonNode; 18 import com.fasterxml.jackson.databind.JsonNode;
19 import com.google.common.util.concurrent.Futures; 19 import com.google.common.util.concurrent.Futures;
20 import com.google.common.util.concurrent.ListenableFuture; 20 import com.google.common.util.concurrent.ListenableFuture;
21 -import com.google.common.util.concurrent.MoreExecutors;  
22 import lombok.extern.slf4j.Slf4j; 21 import lombok.extern.slf4j.Slf4j;
23 import org.thingsboard.rule.engine.api.RuleNode; 22 import org.thingsboard.rule.engine.api.RuleNode;
24 import org.thingsboard.rule.engine.api.TbContext; 23 import org.thingsboard.rule.engine.api.TbContext;
25 import org.thingsboard.rule.engine.api.TbNodeConfiguration; 24 import org.thingsboard.rule.engine.api.TbNodeConfiguration;
26 import org.thingsboard.rule.engine.api.TbNodeException; 25 import org.thingsboard.rule.engine.api.TbNodeException;
27 import org.thingsboard.rule.engine.api.util.TbNodeUtils; 26 import org.thingsboard.rule.engine.api.util.TbNodeUtils;
  27 +import org.thingsboard.server.common.data.EntityType;
28 import org.thingsboard.server.common.data.alarm.Alarm; 28 import org.thingsboard.server.common.data.alarm.Alarm;
29 import org.thingsboard.server.common.data.alarm.AlarmStatus; 29 import org.thingsboard.server.common.data.alarm.AlarmStatus;
  30 +import org.thingsboard.server.common.data.id.AlarmId;
30 import org.thingsboard.server.common.data.plugin.ComponentType; 31 import org.thingsboard.server.common.data.plugin.ComponentType;
31 import org.thingsboard.server.common.msg.TbMsg; 32 import org.thingsboard.server.common.msg.TbMsg;
32 33
@@ -56,10 +57,35 @@ public class TbClearAlarmNode extends TbAbstractAlarmNode<TbClearAlarmNodeConfig @@ -56,10 +57,35 @@ public class TbClearAlarmNode extends TbAbstractAlarmNode<TbClearAlarmNodeConfig
56 @Override 57 @Override
57 protected ListenableFuture<AlarmResult> processAlarm(TbContext ctx, TbMsg msg) { 58 protected ListenableFuture<AlarmResult> processAlarm(TbContext ctx, TbMsg msg) {
58 String alarmType = TbNodeUtils.processPattern(this.config.getAlarmType(), msg.getMetaData()); 59 String alarmType = TbNodeUtils.processPattern(this.config.getAlarmType(), msg.getMetaData());
59 - ListenableFuture<Alarm> latest = ctx.getAlarmService().findLatestByOriginatorAndType(ctx.getTenantId(), msg.getOriginator(), alarmType);  
60 - return Futures.transformAsync(latest, a -> {  
61 - if (a != null && !a.getStatus().isCleared()) {  
62 - return clearAlarm(ctx, msg, a); 60 + if (msg.getOriginator().getEntityType().equals(EntityType.ALARM)) {
  61 + return clearAlarmFromOriginator(ctx, msg);
  62 + } else {
  63 + ListenableFuture<Alarm> latest = ctx.getAlarmService().findLatestByOriginatorAndType(ctx.getTenantId(), msg.getOriginator(), alarmType);
  64 + return Futures.transformAsync(latest, a -> {
  65 + if (a != null && !a.getStatus().isCleared()) {
  66 + return clearAlarm(ctx, msg, a);
  67 + }
  68 + return Futures.immediateFuture(new AlarmResult(false, false, false, null));
  69 + }, ctx.getDbCallbackExecutor());
  70 + }
  71 + }
  72 +
  73 + private ListenableFuture<AlarmResult> clearAlarmFromOriginator(TbContext ctx, TbMsg msg) {
  74 + ListenableFuture<Alarm> alarmByIdAsync = ctx.getAlarmService().findAlarmByIdAsync(ctx.getTenantId(), new AlarmId(msg.getOriginator().getId()));
  75 + return Futures.transformAsync(alarmByIdAsync, alarm -> {
  76 + if (alarm != null && !alarm.getStatus().isCleared()) {
  77 + long clearTs = System.currentTimeMillis();
  78 + ListenableFuture<Boolean> clearAlarmFuture = ctx.getAlarmService().clearAlarm(ctx.getTenantId(), alarm.getId(), alarm.getDetails(), clearTs);
  79 + return Futures.transformAsync(clearAlarmFuture, cleared -> {
  80 + if (cleared) {
  81 + alarm.setClearTs(clearTs);
  82 + AlarmStatus oldStatus = alarm.getStatus();
  83 + AlarmStatus newStatus = oldStatus.isAck() ? AlarmStatus.CLEARED_ACK : AlarmStatus.CLEARED_UNACK;
  84 + alarm.setStatus(newStatus);
  85 + return Futures.immediateFuture(new AlarmResult(false, false, true, alarm));
  86 + }
  87 + return Futures.immediateFuture(new AlarmResult(false, false, false, alarm));
  88 + }, ctx.getDbCallbackExecutor());
63 } 89 }
64 return Futures.immediateFuture(new AlarmResult(false, false, false, null)); 90 return Futures.immediateFuture(new AlarmResult(false, false, false, null));
65 }, ctx.getDbCallbackExecutor()); 91 }, ctx.getDbCallbackExecutor());