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 197 if (lastReportedActivity > 0 && lastReportedActivity > lastSavedActivity) {
198 198 DeviceStateData stateData = getOrFetchDeviceStateData(deviceId);
199 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 200 save(deviceId, LAST_ACTIVITY_TIME, lastReportedActivity);
205 201 deviceLastSavedActivity.put(deviceId, lastReportedActivity);
  202 + DeviceState state = stateData.getState();
206 203 if (!state.isActive()) {
207 204 state.setActive(true);
208 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 41 static final String IS_EXISTING_ALARM = "isExistingAlarm";
42 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 46 protected C config;
47 47 private ScriptEngine buildDetailsJsEngine;
... ...
... ... @@ -18,15 +18,16 @@ package org.thingsboard.rule.engine.action;
18 18 import com.fasterxml.jackson.databind.JsonNode;
19 19 import com.google.common.util.concurrent.Futures;
20 20 import com.google.common.util.concurrent.ListenableFuture;
21   -import com.google.common.util.concurrent.MoreExecutors;
22 21 import lombok.extern.slf4j.Slf4j;
23 22 import org.thingsboard.rule.engine.api.RuleNode;
24 23 import org.thingsboard.rule.engine.api.TbContext;
25 24 import org.thingsboard.rule.engine.api.TbNodeConfiguration;
26 25 import org.thingsboard.rule.engine.api.TbNodeException;
27 26 import org.thingsboard.rule.engine.api.util.TbNodeUtils;
  27 +import org.thingsboard.server.common.data.EntityType;
28 28 import org.thingsboard.server.common.data.alarm.Alarm;
29 29 import org.thingsboard.server.common.data.alarm.AlarmStatus;
  30 +import org.thingsboard.server.common.data.id.AlarmId;
30 31 import org.thingsboard.server.common.data.plugin.ComponentType;
31 32 import org.thingsboard.server.common.msg.TbMsg;
32 33
... ... @@ -56,10 +57,35 @@ public class TbClearAlarmNode extends TbAbstractAlarmNode<TbClearAlarmNodeConfig
56 57 @Override
57 58 protected ListenableFuture<AlarmResult> processAlarm(TbContext ctx, TbMsg msg) {
58 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 90 return Futures.immediateFuture(new AlarmResult(false, false, false, null));
65 91 }, ctx.getDbCallbackExecutor());
... ...