Browse Source

Improve alarm template

pull/14236/head
Andrii Landiak 11 months ago
parent
commit
c464ba993f
  1. 1
      application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmAssignmentTriggerProcessor.java
  2. 5
      application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmCommentTriggerProcessor.java
  3. 17
      application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmTriggerProcessor.java
  4. 11
      application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java
  5. 24
      application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java
  6. 8
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmInfo.java
  7. 4
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmRule.java
  8. 4
      common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmAssignmentNotificationInfo.java
  9. 4
      common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmCommentNotificationInfo.java
  10. 26
      common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmNotificationInfo.java
  11. 5
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/AlarmCommentTrigger.java
  12. 5
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/AlarmTrigger.java
  13. 4
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/AlarmAssignmentNotificationRuleTriggerConfig.java
  14. 4
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/AlarmCommentNotificationRuleTriggerConfig.java
  15. 6
      common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/AlarmNotificationRuleTriggerConfig.java
  16. 13
      common/message/src/main/java/org/thingsboard/server/common/msg/TbMsg.java
  17. 2
      ui-ngx/src/assets/help/en_US/notification/alarm.md
  18. 1
      ui-ngx/src/assets/help/en_US/notification/alarm_assignment.md
  19. 1
      ui-ngx/src/assets/help/en_US/notification/alarm_comment.md

1
application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmAssignmentTriggerProcessor.java

@ -62,6 +62,7 @@ public class AlarmAssignmentTriggerProcessor implements NotificationRuleTriggerP
.alarmType(alarmInfo.getType()) .alarmType(alarmInfo.getType())
.alarmOriginator(alarmInfo.getOriginator()) .alarmOriginator(alarmInfo.getOriginator())
.alarmOriginatorName(alarmInfo.getOriginatorName()) .alarmOriginatorName(alarmInfo.getOriginatorName())
.alarmOriginatorLabel(alarmInfo.getOriginatorLabel())
.alarmSeverity(alarmInfo.getSeverity()) .alarmSeverity(alarmInfo.getSeverity())
.alarmStatus(alarmInfo.getStatus()) .alarmStatus(alarmInfo.getStatus())
.alarmCustomerId(alarmInfo.getCustomerId()) .alarmCustomerId(alarmInfo.getCustomerId())

5
application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmCommentTriggerProcessor.java

@ -57,11 +57,13 @@ public class AlarmCommentTriggerProcessor implements NotificationRuleTriggerProc
@Override @Override
public RuleOriginatedNotificationInfo constructNotificationInfo(AlarmCommentTrigger trigger) { public RuleOriginatedNotificationInfo constructNotificationInfo(AlarmCommentTrigger trigger) {
Alarm alarm = trigger.getAlarm(); Alarm alarm = trigger.getAlarm();
String originatorName; String originatorName, originatorLabel;
if (alarm instanceof AlarmInfo) { if (alarm instanceof AlarmInfo) {
originatorName = ((AlarmInfo) alarm).getOriginatorName(); originatorName = ((AlarmInfo) alarm).getOriginatorName();
originatorLabel = ((AlarmInfo) alarm).getOriginatorLabel();
} else { } else {
originatorName = entityService.fetchEntityName(trigger.getTenantId(), alarm.getOriginator()).orElse(""); originatorName = entityService.fetchEntityName(trigger.getTenantId(), alarm.getOriginator()).orElse("");
originatorLabel = entityService.fetchEntityLabel(trigger.getTenantId(), alarm.getOriginator()).orElse("");
} }
return AlarmCommentNotificationInfo.builder() return AlarmCommentNotificationInfo.builder()
.comment(trigger.getComment().getComment().get("text").asText()) .comment(trigger.getComment().getComment().get("text").asText())
@ -73,6 +75,7 @@ public class AlarmCommentTriggerProcessor implements NotificationRuleTriggerProc
.alarmType(alarm.getType()) .alarmType(alarm.getType())
.alarmOriginator(alarm.getOriginator()) .alarmOriginator(alarm.getOriginator())
.alarmOriginatorName(originatorName) .alarmOriginatorName(originatorName)
.alarmOriginatorLabel(originatorLabel)
.alarmSeverity(alarm.getSeverity()) .alarmSeverity(alarm.getSeverity())
.alarmStatus(alarm.getStatus()) .alarmStatus(alarm.getStatus())
.alarmCustomerId(alarm.getCustomerId()) .alarmCustomerId(alarm.getCustomerId())

17
application/src/main/java/org/thingsboard/server/service/notification/rule/trigger/AlarmTriggerProcessor.java

@ -15,7 +15,9 @@
*/ */
package org.thingsboard.server.service.notification.rule.trigger; package org.thingsboard.server.service.notification.rule.trigger;
import com.fasterxml.jackson.databind.JsonNode;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.Alarm;
import org.thingsboard.server.common.data.alarm.AlarmApiCallResult; import org.thingsboard.server.common.data.alarm.AlarmApiCallResult;
import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.alarm.AlarmInfo;
@ -28,6 +30,9 @@ import org.thingsboard.server.common.data.notification.rule.trigger.config.Alarm
import org.thingsboard.server.common.data.notification.rule.trigger.config.AlarmNotificationRuleTriggerConfig.ClearRule; import org.thingsboard.server.common.data.notification.rule.trigger.config.AlarmNotificationRuleTriggerConfig.ClearRule;
import org.thingsboard.server.common.data.notification.rule.trigger.config.NotificationRuleTriggerType; import org.thingsboard.server.common.data.notification.rule.trigger.config.NotificationRuleTriggerType;
import java.util.HashMap;
import java.util.Map;
import static org.apache.commons.collections4.CollectionUtils.isNotEmpty; import static org.apache.commons.collections4.CollectionUtils.isNotEmpty;
import static org.thingsboard.server.common.data.util.CollectionsUtil.emptyOrContains; import static org.thingsboard.server.common.data.util.CollectionsUtil.emptyOrContains;
@ -106,15 +111,27 @@ public class AlarmTriggerProcessor implements NotificationRuleTriggerProcessor<A
alarmUpdate.isDeleted() ? "deleted" : null) alarmUpdate.isDeleted() ? "deleted" : null)
.alarmOriginator(alarmInfo.getOriginator()) .alarmOriginator(alarmInfo.getOriginator())
.alarmOriginatorName(alarmInfo.getOriginatorName()) .alarmOriginatorName(alarmInfo.getOriginatorName())
.alarmOriginatorLabel(alarmInfo.getOriginatorLabel())
.alarmSeverity(alarmInfo.getSeverity()) .alarmSeverity(alarmInfo.getSeverity())
.alarmStatus(alarmInfo.getStatus()) .alarmStatus(alarmInfo.getStatus())
.acknowledged(alarmInfo.isAcknowledged()) .acknowledged(alarmInfo.isAcknowledged())
.cleared(alarmInfo.isCleared()) .cleared(alarmInfo.isCleared())
.alarmCustomerId(alarmInfo.getCustomerId()) .alarmCustomerId(alarmInfo.getCustomerId())
.dashboardId(alarmInfo.getDashboardId()) .dashboardId(alarmInfo.getDashboardId())
.info(toInfoTemplateMap(alarmInfo.getDetails()))
.build(); .build();
} }
private Map<String, String> toInfoTemplateMap(JsonNode details) {
Map<String, String> infoMap = JacksonUtil.toFlatMap(details);
Map<String, String> result = new HashMap<>();
for (Map.Entry<String, String> entry : infoMap.entrySet()) {
String key = "info." + entry.getKey();
result.put(key, entry.getValue());
}
return result;
}
@Override @Override
public NotificationRuleTriggerType getTriggerType() { public NotificationRuleTriggerType getTriggerType() {
return NotificationRuleTriggerType.ALARM; return NotificationRuleTriggerType.ALARM;

11
application/src/test/java/org/thingsboard/server/controller/AbstractWebTest.java

@ -680,9 +680,14 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
} }
protected Device createDevice(String name, String accessToken) throws Exception { protected Device createDevice(String name, String accessToken) throws Exception {
return createDevice(name, "default", null, accessToken);
}
protected Device createDevice(String name, String type, String label, String accessToken) throws Exception {
Device device = new Device(); Device device = new Device();
device.setName(name); device.setName(name);
device.setType("default"); device.setType(type);
device.setLabel(label);
DeviceData deviceData = new DeviceData(); DeviceData deviceData = new DeviceData();
deviceData.setTransportConfiguration(new DefaultDeviceTransportConfiguration()); deviceData.setTransportConfiguration(new DefaultDeviceTransportConfiguration());
deviceData.setConfiguration(new DefaultDeviceConfiguration()); deviceData.setConfiguration(new DefaultDeviceConfiguration());
@ -1117,7 +1122,7 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
Awaitility.await("CF state for entity actor ready to refresh dynamic arguments").atMost(TIMEOUT, TimeUnit.SECONDS).until(() -> { Awaitility.await("CF state for entity actor ready to refresh dynamic arguments").atMost(TIMEOUT, TimeUnit.SECONDS).until(() -> {
CalculatedFieldState calculatedFieldState = statesMap.get(cfId); CalculatedFieldState calculatedFieldState = statesMap.get(cfId);
boolean isReady = calculatedFieldState != null && ((GeofencingCalculatedFieldState) calculatedFieldState).getLastDynamicArgumentsRefreshTs() boolean isReady = calculatedFieldState != null && ((GeofencingCalculatedFieldState) calculatedFieldState).getLastDynamicArgumentsRefreshTs()
< System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(scheduledUpdateInterval); < System.currentTimeMillis() - TimeUnit.SECONDS.toMillis(scheduledUpdateInterval);
log.warn("entityId {}, cfId {}, state ready to refresh == {}", entityId, cfId, isReady); log.warn("entityId {}, cfId {}, state ready to refresh == {}", entityId, cfId, isReady);
return isReady; return isReady;
}); });
@ -1308,7 +1313,7 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
protected List<Job> findJobs(List<JobType> types, List<UUID> entities) throws Exception { protected List<Job> findJobs(List<JobType> types, List<UUID> entities) throws Exception {
return doGetTypedWithPageLink("/api/jobs?types=" + types.stream().map(Enum::name).collect(Collectors.joining(",")) + return doGetTypedWithPageLink("/api/jobs?types=" + types.stream().map(Enum::name).collect(Collectors.joining(",")) +
"&entities=" + entities.stream().map(UUID::toString).collect(Collectors.joining(",")) + "&", "&entities=" + entities.stream().map(UUID::toString).collect(Collectors.joining(",")) + "&",
new TypeReference<PageData<Job>>() {}, new PageLink(100, 0, null, new SortOrder("createdTime", SortOrder.Direction.DESC))).getData(); new TypeReference<PageData<Job>>() {}, new PageLink(100, 0, null, new SortOrder("createdTime", SortOrder.Direction.DESC))).getData();
} }

24
application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java

@ -22,9 +22,9 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.function.ThrowingRunnable; import org.junit.function.ThrowingRunnable;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.data.util.Pair; import org.springframework.data.util.Pair;
import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.cache.limits.RateLimitService; import org.thingsboard.server.cache.limits.RateLimitService;
import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.DataConstants;
@ -137,7 +137,7 @@ import static org.thingsboard.server.common.data.notification.rule.trigger.confi
}) })
public class NotificationRuleApiTest extends AbstractNotificationApiTest { public class NotificationRuleApiTest extends AbstractNotificationApiTest {
@SpyBean @MockitoSpyBean
private AlarmSubscriptionService alarmSubscriptionService; private AlarmSubscriptionService alarmSubscriptionService;
@Autowired @Autowired
private DefaultSystemInfoService systemInfoService; private DefaultSystemInfoService systemInfoService;
@ -193,7 +193,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
@Test @Test
public void testNotificationRuleProcessing_alarmTrigger() throws Exception { public void testNotificationRuleProcessing_alarmTrigger() throws Exception {
String notificationSubject = "Alarm type: ${alarmType}, status: ${alarmStatus}, " + String notificationSubject = "Alarm type: ${alarmType}, status: ${alarmStatus}, " +
"severity: ${alarmSeverity}, deviceId: ${alarmOriginatorId}"; "severity: ${alarmSeverity}, deviceId: ${alarmOriginatorId}, details: ${data}.";
String notificationText = "Status: ${alarmStatus}, severity: ${alarmSeverity}"; String notificationText = "Status: ${alarmStatus}, severity: ${alarmSeverity}";
NotificationTemplate notificationTemplate = createNotificationTemplate(NotificationType.ALARM, notificationSubject, notificationText, NotificationDeliveryMethod.WEB); NotificationTemplate notificationTemplate = createNotificationTemplate(NotificationType.ALARM, notificationSubject, notificationText, NotificationDeliveryMethod.WEB);
@ -221,12 +221,12 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
clients.put(delay, userAndClient.getSecond()); clients.put(delay, userAndClient.getSecond());
} }
notificationRule.setRecipientsConfig(recipientsConfig); notificationRule.setRecipientsConfig(recipientsConfig);
notificationRule = saveNotificationRule(notificationRule); saveNotificationRule(notificationRule);
String alarmType = "myBoolIsTrue"; String alarmType = "myBoolIsTrue";
DeviceProfile deviceProfile = createDeviceProfileWithAlarmRules(alarmType); DeviceProfile deviceProfile = createDeviceProfileWithAlarmRules(alarmType);
Device device = createDevice("Device 1", deviceProfile.getName(), "1234"); Device device = createDevice("Device 1", deviceProfile.getName(), "label", "1234");
clients.values().forEach(wsClient -> { clients.values().forEach(wsClient -> {
wsClient.subscribeForUnreadNotifications(10).waitForReply(true); wsClient.subscribeForUnreadNotifications(10).waitForReply(true);
@ -250,7 +250,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
assertThat(actualDelay).isCloseTo(expectedDelay, offset(2.0)); assertThat(actualDelay).isCloseTo(expectedDelay, offset(2.0));
assertThat(notification.getSubject()).isEqualTo("Alarm type: " + alarmType + ", status: " + AlarmStatus.ACTIVE_UNACK + ", " + assertThat(notification.getSubject()).isEqualTo("Alarm type: " + alarmType + ", status: " + AlarmStatus.ACTIVE_UNACK + ", " +
"severity: " + AlarmSeverity.CRITICAL.toString().toLowerCase() + ", deviceId: " + device.getId()); "severity: " + AlarmSeverity.CRITICAL.toString().toLowerCase() + ", deviceId: " + device.getId() + ", details: attribute is true.");
assertThat(notification.getText()).isEqualTo("Status: " + AlarmStatus.ACTIVE_UNACK + ", severity: " + AlarmSeverity.CRITICAL.toString().toLowerCase()); assertThat(notification.getText()).isEqualTo("Status: " + AlarmStatus.ACTIVE_UNACK + ", severity: " + AlarmSeverity.CRITICAL.toString().toLowerCase());
assertThat(notification.getType()).isEqualTo(NotificationType.ALARM); assertThat(notification.getType()).isEqualTo(NotificationType.ALARM);
@ -270,7 +270,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
wsClient.waitForUpdate(true); wsClient.waitForUpdate(true);
Notification updatedNotification = wsClient.getLastDataUpdate().getUpdate(); Notification updatedNotification = wsClient.getLastDataUpdate().getUpdate();
assertThat(updatedNotification.getSubject()).isEqualTo("Alarm type: " + alarmType + ", status: " + expectedStatus + ", " + assertThat(updatedNotification.getSubject()).isEqualTo("Alarm type: " + alarmType + ", status: " + expectedStatus + ", " +
"severity: " + expectedSeverity.toString().toLowerCase() + ", deviceId: " + device.getId()); "severity: " + expectedSeverity.toString().toLowerCase() + ", deviceId: " + device.getId() + ", details: attribute is true.");
assertThat(updatedNotification.getText()).isEqualTo("Status: " + expectedStatus + ", severity: " + expectedSeverity.toString().toLowerCase()); assertThat(updatedNotification.getText()).isEqualTo("Status: " + expectedStatus + ", severity: " + expectedSeverity.toString().toLowerCase());
wsClient.close(); wsClient.close();
@ -516,10 +516,10 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
.notifyOn(Set.of(ASSIGNED, UNASSIGNED)) .notifyOn(Set.of(ASSIGNED, UNASSIGNED))
.build(); .build();
NotificationTarget target = createNotificationTarget(tenantAdminUserId); NotificationTarget target = createNotificationTarget(tenantAdminUserId);
String template = "${userEmail} ${action} alarm on ${alarmOriginatorEntityType} '${alarmOriginatorName}'. Assignee: ${assigneeEmail}"; String template = "${userEmail} ${action} alarm on ${alarmOriginatorEntityType} '${alarmOriginatorName}' with label '${alarmOriginatorLabel}'. Assignee: ${assigneeEmail}";
createNotificationRule(triggerConfig, "Test", template, target.getId()); createNotificationRule(triggerConfig, "Test", template, target.getId());
Device device = createDevice("Device A", "123"); Device device = createDevice("Device A", "default", "test", "123");
Alarm alarm = Alarm.builder() Alarm alarm = Alarm.builder()
.tenantId(tenantId) .tenantId(tenantId)
.originator(device.getId()) .originator(device.getId())
@ -536,7 +536,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
doPost("/api/alarm/" + alarmId + "/assign/" + tenantAdminUserId).andExpect(status().isOk()); doPost("/api/alarm/" + alarmId + "/assign/" + tenantAdminUserId).andExpect(status().isOk());
}, notification -> { }, notification -> {
assertThat(notification.getText()).isEqualTo( assertThat(notification.getText()).isEqualTo(
TENANT_ADMIN_EMAIL + " assigned alarm on Device 'Device A'. Assignee: " + TENANT_ADMIN_EMAIL TENANT_ADMIN_EMAIL + " assigned alarm on Device 'Device A' with label 'test'. Assignee: " + TENANT_ADMIN_EMAIL
); );
}); });
@ -544,7 +544,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
doDelete("/api/alarm/" + alarmId + "/assign").andExpect(status().isOk()); doDelete("/api/alarm/" + alarmId + "/assign").andExpect(status().isOk());
}, notification -> { }, notification -> {
assertThat(notification.getText()).isEqualTo( assertThat(notification.getText()).isEqualTo(
TENANT_ADMIN_EMAIL + " unassigned alarm on Device 'Device A'. Assignee: " TENANT_ADMIN_EMAIL + " unassigned alarm on Device 'Device A' with label 'test'. Assignee: "
); );
}); });
} }
@ -950,7 +950,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
alarm.setAlarmType(alarmType); alarm.setAlarmType(alarmType);
alarm.setId(alarmType); alarm.setId(alarmType);
AlarmRule alarmRule = new AlarmRule(); AlarmRule alarmRule = new AlarmRule();
alarmRule.setAlarmDetails("Details"); alarmRule.setAlarmDetails("attribute is ${bool}");
AlarmCondition alarmCondition = new AlarmCondition(); AlarmCondition alarmCondition = new AlarmCondition();
alarmCondition.setSpec(new SimpleAlarmConditionSpec()); alarmCondition.setSpec(new SimpleAlarmConditionSpec());
List<AlarmConditionFilter> condition = new ArrayList<>(); List<AlarmConditionFilter> condition = new ArrayList<>();

8
common/data/src/main/java/org/thingsboard/server/common/data/alarm/AlarmInfo.java

@ -21,11 +21,14 @@ import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import lombok.ToString; import lombok.ToString;
import java.io.Serial;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true) @ToString(callSuper = true)
@Schema @Schema
public class AlarmInfo extends Alarm { public class AlarmInfo extends Alarm {
@Serial
private static final long serialVersionUID = 2807343093519543363L; private static final long serialVersionUID = 2807343093519543363L;
@Getter @Getter
@ -58,9 +61,10 @@ public class AlarmInfo extends Alarm {
public AlarmInfo(AlarmInfo alarmInfo) { public AlarmInfo(AlarmInfo alarmInfo) {
super(alarmInfo); super(alarmInfo);
this.originatorName = alarmInfo.originatorName; this.originatorName = alarmInfo.getOriginatorName();
this.originatorLabel = alarmInfo.originatorLabel; this.originatorLabel = alarmInfo.getOriginatorLabel();
this.assignee = alarmInfo.getAssignee(); this.assignee = alarmInfo.getAssignee();
this.originatorDisplayName = alarmInfo.getOriginatorDisplayName();
} }
public AlarmInfo(Alarm alarm, String originatorName, String originatorLabel, AlarmAssignee assignee) { public AlarmInfo(Alarm alarm, String originatorName, String originatorLabel, AlarmAssignee assignee) {

4
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmRule.java

@ -21,12 +21,16 @@ import lombok.Data;
import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.validation.NoXss; import org.thingsboard.server.common.data.validation.NoXss;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
@Schema @Schema
@Data @Data
public class AlarmRule implements Serializable { public class AlarmRule implements Serializable {
@Serial
private static final long serialVersionUID = -7617427132423304707L;
@Valid @Valid
@Schema(description = "JSON object representing the alarm rule condition") @Schema(description = "JSON object representing the alarm rule condition")
private AlarmCondition condition; private AlarmCondition condition;

4
common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmAssignmentNotificationInfo.java

@ -53,6 +53,7 @@ public class AlarmAssignmentNotificationInfo implements RuleOriginatedNotificati
private UUID alarmId; private UUID alarmId;
private EntityId alarmOriginator; private EntityId alarmOriginator;
private String alarmOriginatorName; private String alarmOriginatorName;
private String alarmOriginatorLabel;
private AlarmSeverity alarmSeverity; private AlarmSeverity alarmSeverity;
private AlarmStatus alarmStatus; private AlarmStatus alarmStatus;
private CustomerId alarmCustomerId; private CustomerId alarmCustomerId;
@ -77,7 +78,8 @@ public class AlarmAssignmentNotificationInfo implements RuleOriginatedNotificati
"alarmStatus", alarmStatus.toString(), "alarmStatus", alarmStatus.toString(),
"alarmOriginatorEntityType", alarmOriginator.getEntityType().getNormalName(), "alarmOriginatorEntityType", alarmOriginator.getEntityType().getNormalName(),
"alarmOriginatorId", alarmOriginator.getId().toString(), "alarmOriginatorId", alarmOriginator.getId().toString(),
"alarmOriginatorName", alarmOriginatorName "alarmOriginatorName", alarmOriginatorName,
"alarmOriginatorLabel", alarmOriginatorLabel
); );
} }

4
common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmCommentNotificationInfo.java

@ -48,6 +48,7 @@ public class AlarmCommentNotificationInfo implements RuleOriginatedNotificationI
private UUID alarmId; private UUID alarmId;
private EntityId alarmOriginator; private EntityId alarmOriginator;
private String alarmOriginatorName; private String alarmOriginatorName;
private String alarmOriginatorLabel;
private AlarmSeverity alarmSeverity; private AlarmSeverity alarmSeverity;
private AlarmStatus alarmStatus; private AlarmStatus alarmStatus;
private CustomerId alarmCustomerId; private CustomerId alarmCustomerId;
@ -68,7 +69,8 @@ public class AlarmCommentNotificationInfo implements RuleOriginatedNotificationI
"alarmStatus", alarmStatus.toString(), "alarmStatus", alarmStatus.toString(),
"alarmOriginatorEntityType", alarmOriginator.getEntityType().getNormalName(), "alarmOriginatorEntityType", alarmOriginator.getEntityType().getNormalName(),
"alarmOriginatorId", alarmOriginator.getId().toString(), "alarmOriginatorId", alarmOriginator.getId().toString(),
"alarmOriginatorName", alarmOriginatorName "alarmOriginatorName", alarmOriginatorName,
"alarmOriginatorLabel", alarmOriginatorLabel
); );
} }

26
common/data/src/main/java/org/thingsboard/server/common/data/notification/info/AlarmNotificationInfo.java

@ -25,11 +25,10 @@ import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DashboardId; import org.thingsboard.server.common.data.id.DashboardId;
import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.EntityId;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import static org.thingsboard.server.common.data.util.CollectionsUtil.mapOf;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@ -41,25 +40,28 @@ public class AlarmNotificationInfo implements RuleOriginatedNotificationInfo {
private UUID alarmId; private UUID alarmId;
private EntityId alarmOriginator; private EntityId alarmOriginator;
private String alarmOriginatorName; private String alarmOriginatorName;
private String alarmOriginatorLabel;
private AlarmSeverity alarmSeverity; private AlarmSeverity alarmSeverity;
private AlarmStatus alarmStatus; private AlarmStatus alarmStatus;
private boolean acknowledged; private boolean acknowledged;
private boolean cleared; private boolean cleared;
private CustomerId alarmCustomerId; private CustomerId alarmCustomerId;
private DashboardId dashboardId; private DashboardId dashboardId;
private Map<String, String> info;
@Override @Override
public Map<String, String> getTemplateData() { public Map<String, String> getTemplateData() {
return mapOf( Map<String, String> templateData = new HashMap<>(info);
"alarmType", alarmType, templateData.put("alarmType", alarmType);
"action", action, templateData.put("action", action);
"alarmId", alarmId.toString(), templateData.put("alarmId", alarmId.toString());
"alarmSeverity", alarmSeverity.name().toLowerCase(), templateData.put("alarmSeverity", alarmSeverity.name().toLowerCase());
"alarmStatus", alarmStatus.toString(), templateData.put("alarmStatus", alarmStatus.toString());
"alarmOriginatorEntityType", alarmOriginator.getEntityType().getNormalName(), templateData.put("alarmOriginatorEntityType", alarmOriginator.getEntityType().getNormalName());
"alarmOriginatorName", alarmOriginatorName, templateData.put("alarmOriginatorName", alarmOriginatorName);
"alarmOriginatorId", alarmOriginator.getId().toString() templateData.put("alarmOriginatorLabel", alarmOriginatorLabel);
); templateData.put("alarmOriginatorId", alarmOriginator.getId().toString());
return templateData;
} }
@Override @Override

5
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/AlarmCommentTrigger.java

@ -25,10 +25,15 @@ import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.notification.rule.trigger.config.NotificationRuleTriggerType; import org.thingsboard.server.common.data.notification.rule.trigger.config.NotificationRuleTriggerType;
import java.io.Serial;
@Data @Data
@Builder @Builder
public class AlarmCommentTrigger implements NotificationRuleTrigger { public class AlarmCommentTrigger implements NotificationRuleTrigger {
@Serial
private static final long serialVersionUID = -8614770559491757202L;
private final TenantId tenantId; private final TenantId tenantId;
private final AlarmComment comment; private final AlarmComment comment;
private final Alarm alarm; private final Alarm alarm;

5
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/AlarmTrigger.java

@ -22,10 +22,15 @@ import org.thingsboard.server.common.data.id.EntityId;
import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.notification.rule.trigger.config.NotificationRuleTriggerType; import org.thingsboard.server.common.data.notification.rule.trigger.config.NotificationRuleTriggerType;
import java.io.Serial;
@Data @Data
@Builder @Builder
public class AlarmTrigger implements NotificationRuleTrigger { public class AlarmTrigger implements NotificationRuleTrigger {
@Serial
private static final long serialVersionUID = -466810297904938644L;
private final TenantId tenantId; private final TenantId tenantId;
private final AlarmApiCallResult alarmUpdate; private final AlarmApiCallResult alarmUpdate;

4
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/AlarmAssignmentNotificationRuleTriggerConfig.java

@ -23,6 +23,7 @@ import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.alarm.AlarmSearchStatus; import org.thingsboard.server.common.data.alarm.AlarmSearchStatus;
import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import java.io.Serial;
import java.util.Set; import java.util.Set;
@Data @Data
@ -31,6 +32,9 @@ import java.util.Set;
@Builder @Builder
public class AlarmAssignmentNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig { public class AlarmAssignmentNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@Serial
private static final long serialVersionUID = -5313556049809972096L;
private Set<String> alarmTypes; private Set<String> alarmTypes;
private Set<AlarmSeverity> alarmSeverities; private Set<AlarmSeverity> alarmSeverities;
private Set<AlarmSearchStatus> alarmStatuses; private Set<AlarmSearchStatus> alarmStatuses;

4
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/AlarmCommentNotificationRuleTriggerConfig.java

@ -22,6 +22,7 @@ import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.alarm.AlarmSearchStatus; import org.thingsboard.server.common.data.alarm.AlarmSearchStatus;
import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import java.io.Serial;
import java.util.Set; import java.util.Set;
@Data @Data
@ -30,6 +31,9 @@ import java.util.Set;
@Builder @Builder
public class AlarmCommentNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig { public class AlarmCommentNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@Serial
private static final long serialVersionUID = -9164282098882339645L;
private Set<String> alarmTypes; private Set<String> alarmTypes;
private Set<AlarmSeverity> alarmSeverities; private Set<AlarmSeverity> alarmSeverities;
private Set<AlarmSearchStatus> alarmStatuses; private Set<AlarmSearchStatus> alarmStatuses;

6
common/data/src/main/java/org/thingsboard/server/common/data/notification/rule/trigger/config/AlarmNotificationRuleTriggerConfig.java

@ -23,6 +23,7 @@ import lombok.NoArgsConstructor;
import org.thingsboard.server.common.data.alarm.AlarmSearchStatus; import org.thingsboard.server.common.data.alarm.AlarmSearchStatus;
import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Set; import java.util.Set;
@ -32,6 +33,9 @@ import java.util.Set;
@Builder @Builder
public class AlarmNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig { public class AlarmNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@Serial
private static final long serialVersionUID = -7382883720381542344L;
private Set<String> alarmTypes; private Set<String> alarmTypes;
private Set<AlarmSeverity> alarmSeverities; private Set<AlarmSeverity> alarmSeverities;
@NotEmpty @NotEmpty
@ -46,6 +50,8 @@ public class AlarmNotificationRuleTriggerConfig implements NotificationRuleTrigg
@Data @Data
public static class ClearRule implements Serializable { public static class ClearRule implements Serializable {
@Serial
private static final long serialVersionUID = 7922533150038105124L;
private Set<AlarmSearchStatus> alarmStatuses; private Set<AlarmSearchStatus> alarmStatuses;
} }

13
common/message/src/main/java/org/thingsboard/server/common/msg/TbMsg.java

@ -41,9 +41,6 @@ import java.util.Objects;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
/**
* Created by ashvayka on 13.01.18.
*/
@Data @Data
@Slf4j @Slf4j
public final class TbMsg implements Serializable { public final class TbMsg implements Serializable {
@ -500,11 +497,11 @@ public final class TbMsg implements Serializable {
public String toString() { public String toString() {
return "TbMsg.TbMsgBuilder(queueName=" + this.queueName + ", id=" + this.id + ", ts=" + this.ts + return "TbMsg.TbMsgBuilder(queueName=" + this.queueName + ", id=" + this.id + ", ts=" + this.ts +
", type=" + this.type + ", internalType=" + this.internalType + ", originator=" + this.originator + ", type=" + this.type + ", internalType=" + this.internalType + ", originator=" + this.originator +
", customerId=" + this.customerId + ", metaData=" + this.metaData + ", dataType=" + this.dataType + ", customerId=" + this.customerId + ", metaData=" + this.metaData + ", dataType=" + this.dataType +
", data=" + this.data + ", ruleChainId=" + this.ruleChainId + ", ruleNodeId=" + this.ruleNodeId + ", data=" + this.data + ", ruleChainId=" + this.ruleChainId + ", ruleNodeId=" + this.ruleNodeId +
", correlationId=" + this.correlationId + ", partition=" + this.partition + ", previousCalculatedFields=" + this.previousCalculatedFieldIds + ", correlationId=" + this.correlationId + ", partition=" + this.partition + ", previousCalculatedFields=" + this.previousCalculatedFieldIds +
", ctx=" + this.ctx + ", callback=" + this.callback + ")"; ", ctx=" + this.ctx + ", callback=" + this.callback + ")";
} }
} }

2
ui-ngx/src/assets/help/en_US/notification/alarm.md

@ -16,11 +16,13 @@ Available template parameters:
* `alarmStatus` - the alarm status; * `alarmStatus` - the alarm status;
* `alarmOriginatorEntityType` - the entity type of the alarm originator, e.g. 'Device'; * `alarmOriginatorEntityType` - the entity type of the alarm originator, e.g. 'Device';
* `alarmOriginatorName` - the name of the alarm originator, e.g. 'Sensor T1'; * `alarmOriginatorName` - the name of the alarm originator, e.g. 'Sensor T1';
* `alarmOriginatorLabel` - the label of the alarm originator, e.g. 'Sensor T1';
* `alarmOriginatorId` - the alarm originator entity id as uuid string; * `alarmOriginatorId` - the alarm originator entity id as uuid string;
* `recipientTitle` - title of the recipient (first and last name if specified, email otherwise); * `recipientTitle` - title of the recipient (first and last name if specified, email otherwise);
* `recipientEmail` - email of the recipient; * `recipientEmail` - email of the recipient;
* `recipientFirstName` - first name of the recipient; * `recipientFirstName` - first name of the recipient;
* `recipientLastName` - last name of the recipient; * `recipientLastName` - last name of the recipient;
* `info.<key>` - any key field from the alarm's additional info. Fox example, if additional info is `{"data": "Temperature is 25"}`, use `${info.data}` to access "Temperature is 25";
Parameter names must be wrapped using `${...}`. For example: `${action}`. Parameter names must be wrapped using `${...}`. For example: `${action}`.
You may also modify the value of the parameter with one of the suffixes: You may also modify the value of the parameter with one of the suffixes:

1
ui-ngx/src/assets/help/en_US/notification/alarm_assignment.md

@ -15,6 +15,7 @@ Available template parameters:
* `alarmStatus` - the alarm status; * `alarmStatus` - the alarm status;
* `alarmOriginatorEntityType` - the entity type of the alarm originator, e.g. 'Device'; * `alarmOriginatorEntityType` - the entity type of the alarm originator, e.g. 'Device';
* `alarmOriginatorName` - the name of the alarm originator, e.g. 'Sensor T1'; * `alarmOriginatorName` - the name of the alarm originator, e.g. 'Sensor T1';
* `alarmOriginatorLabel` - the label of the alarm originator, e.g. 'Sensor T1';
* `alarmOriginatorId` - the alarm originator entity id as uuid string; * `alarmOriginatorId` - the alarm originator entity id as uuid string;
* `assigneeTitle` - title of the assignee; * `assigneeTitle` - title of the assignee;
* `assigneeEmail` - email of the assignee; * `assigneeEmail` - email of the assignee;

1
ui-ngx/src/assets/help/en_US/notification/alarm_comment.md

@ -15,6 +15,7 @@ Available template parameters:
* `alarmStatus` - the alarm status; * `alarmStatus` - the alarm status;
* `alarmOriginatorEntityType` - the entity type of the alarm originator, e.g. 'Device'; * `alarmOriginatorEntityType` - the entity type of the alarm originator, e.g. 'Device';
* `alarmOriginatorName` - the name of the alarm originator, e.g. 'Sensor T1'; * `alarmOriginatorName` - the name of the alarm originator, e.g. 'Sensor T1';
* `alarmOriginatorLabel` - the label of the alarm originator, e.g. 'Sensor T1';
* `alarmOriginatorId` - the alarm originator entity id as uuid string; * `alarmOriginatorId` - the alarm originator entity id as uuid string;
* `comment` - text of the comment; * `comment` - text of the comment;
* `action` - one of: 'added', 'updated'; * `action` - one of: 'added', 'updated';

Loading…
Cancel
Save