Commit 2b95d6cbaed06d6c1f752abb4b728ceffa61ac23
Committed by
Andrew Shvayka
1 parent
fea2f879
changed logic to report activity & improvements for clear alarm node
Showing
3 changed files
with
36 additions
and
10 deletions
@@ -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()); |