diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmState.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmState.java index ed613dd55f..e864167c0d 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmState.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmState.java @@ -291,4 +291,11 @@ class AlarmState { } return updated; } + + public void processAckAlarm(Alarm alarm) { + if (currentAlarm != null && currentAlarm.getId().equals(alarm.getId())) { + currentAlarm.setStatus(alarm.getStatus()); + currentAlarm.setAckTs(alarm.getAckTs()); + } + } } diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DeviceState.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DeviceState.java index e078df6156..13dd0ea66d 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DeviceState.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DeviceState.java @@ -140,6 +140,8 @@ class DeviceState { stateChanged = processAttributesDeleteNotification(ctx, msg); } else if (msg.getType().equals(DataConstants.ALARM_CLEAR)) { stateChanged = processAlarmClearNotification(ctx, msg); + } else if (msg.getType().equals(DataConstants.ALARM_ACK)) { + processAlarmAckNotification(ctx, msg); } else { ctx.tellSuccess(msg); } @@ -161,6 +163,16 @@ class DeviceState { return stateChanged; } + private void processAlarmAckNotification(TbContext ctx, TbMsg msg) { + Alarm alarmNf = JacksonUtil.fromString(msg.getData(), Alarm.class); + for (DeviceProfileAlarm alarm : deviceProfile.getAlarmSettings()) { + AlarmState alarmState = alarmStates.computeIfAbsent(alarm.getId(), + a -> new AlarmState(this.deviceProfile, deviceId, alarm, getOrInitPersistedAlarmState(alarm))); + alarmState.processAckAlarm(alarmNf); + } + ctx.tellSuccess(msg); + } + private boolean processAttributesUpdateNotification(TbContext ctx, TbMsg msg) throws ExecutionException, InterruptedException { Set attributes = JsonConverter.convertToAttributes(new JsonParser().parse(msg.getData())); String scope = msg.getMetaData().getValue("scope");