Browse Source

Improve alarm template

pull/14236/head
Andrii Landiak 8 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())
.alarmOriginator(alarmInfo.getOriginator())
.alarmOriginatorName(alarmInfo.getOriginatorName())
.alarmOriginatorLabel(alarmInfo.getOriginatorLabel())
.alarmSeverity(alarmInfo.getSeverity())
.alarmStatus(alarmInfo.getStatus())
.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
public RuleOriginatedNotificationInfo constructNotificationInfo(AlarmCommentTrigger trigger) {
Alarm alarm = trigger.getAlarm();
String originatorName;
String originatorName, originatorLabel;
if (alarm instanceof AlarmInfo) {
originatorName = ((AlarmInfo) alarm).getOriginatorName();
originatorLabel = ((AlarmInfo) alarm).getOriginatorLabel();
} else {
originatorName = entityService.fetchEntityName(trigger.getTenantId(), alarm.getOriginator()).orElse("");
originatorLabel = entityService.fetchEntityLabel(trigger.getTenantId(), alarm.getOriginator()).orElse("");
}
return AlarmCommentNotificationInfo.builder()
.comment(trigger.getComment().getComment().get("text").asText())
@ -73,6 +75,7 @@ public class AlarmCommentTriggerProcessor implements NotificationRuleTriggerProc
.alarmType(alarm.getType())
.alarmOriginator(alarm.getOriginator())
.alarmOriginatorName(originatorName)
.alarmOriginatorLabel(originatorLabel)
.alarmSeverity(alarm.getSeverity())
.alarmStatus(alarm.getStatus())
.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;
import com.fasterxml.jackson.databind.JsonNode;
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.AlarmApiCallResult;
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.NotificationRuleTriggerType;
import java.util.HashMap;
import java.util.Map;
import static org.apache.commons.collections4.CollectionUtils.isNotEmpty;
import static org.thingsboard.server.common.data.util.CollectionsUtil.emptyOrContains;
@ -106,15 +111,27 @@ public class AlarmTriggerProcessor implements NotificationRuleTriggerProcessor<A
alarmUpdate.isDeleted() ? "deleted" : null)
.alarmOriginator(alarmInfo.getOriginator())
.alarmOriginatorName(alarmInfo.getOriginatorName())
.alarmOriginatorLabel(alarmInfo.getOriginatorLabel())
.alarmSeverity(alarmInfo.getSeverity())
.alarmStatus(alarmInfo.getStatus())
.acknowledged(alarmInfo.isAcknowledged())
.cleared(alarmInfo.isCleared())
.alarmCustomerId(alarmInfo.getCustomerId())
.dashboardId(alarmInfo.getDashboardId())
.info(toInfoTemplateMap(alarmInfo.getDetails()))
.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
public NotificationRuleTriggerType getTriggerType() {
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 {
return createDevice(name, "default", null, accessToken);
}
protected Device createDevice(String name, String type, String label, String accessToken) throws Exception {
Device device = new Device();
device.setName(name);
device.setType("default");
device.setType(type);
device.setLabel(label);
DeviceData deviceData = new DeviceData();
deviceData.setTransportConfiguration(new DefaultDeviceTransportConfiguration());
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(() -> {
CalculatedFieldState calculatedFieldState = statesMap.get(cfId);
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);
return isReady;
});
@ -1308,7 +1313,7 @@ public abstract class AbstractWebTest extends AbstractInMemoryStorageTest {
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(",")) +
"&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();
}

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.function.ThrowingRunnable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.data.util.Pair;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.bean.override.mockito.MockitoSpyBean;
import org.thingsboard.common.util.JacksonUtil;
import org.thingsboard.server.cache.limits.RateLimitService;
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 {
@SpyBean
@MockitoSpyBean
private AlarmSubscriptionService alarmSubscriptionService;
@Autowired
private DefaultSystemInfoService systemInfoService;
@ -193,7 +193,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
@Test
public void testNotificationRuleProcessing_alarmTrigger() throws Exception {
String notificationSubject = "Alarm type: ${alarmType}, status: ${alarmStatus}, " +
"severity: ${alarmSeverity}, deviceId: ${alarmOriginatorId}";
"severity: ${alarmSeverity}, deviceId: ${alarmOriginatorId}, details: ${data}.";
String notificationText = "Status: ${alarmStatus}, severity: ${alarmSeverity}";
NotificationTemplate notificationTemplate = createNotificationTemplate(NotificationType.ALARM, notificationSubject, notificationText, NotificationDeliveryMethod.WEB);
@ -221,12 +221,12 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
clients.put(delay, userAndClient.getSecond());
}
notificationRule.setRecipientsConfig(recipientsConfig);
notificationRule = saveNotificationRule(notificationRule);
saveNotificationRule(notificationRule);
String alarmType = "myBoolIsTrue";
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 -> {
wsClient.subscribeForUnreadNotifications(10).waitForReply(true);
@ -250,7 +250,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
assertThat(actualDelay).isCloseTo(expectedDelay, offset(2.0));
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.getType()).isEqualTo(NotificationType.ALARM);
@ -270,7 +270,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
wsClient.waitForUpdate(true);
Notification updatedNotification = wsClient.getLastDataUpdate().getUpdate();
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());
wsClient.close();
@ -516,10 +516,10 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
.notifyOn(Set.of(ASSIGNED, UNASSIGNED))
.build();
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());
Device device = createDevice("Device A", "123");
Device device = createDevice("Device A", "default", "test", "123");
Alarm alarm = Alarm.builder()
.tenantId(tenantId)
.originator(device.getId())
@ -536,7 +536,7 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest {
doPost("/api/alarm/" + alarmId + "/assign/" + tenantAdminUserId).andExpect(status().isOk());
}, notification -> {
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());
}, notification -> {
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.setId(alarmType);
AlarmRule alarmRule = new AlarmRule();
alarmRule.setAlarmDetails("Details");
alarmRule.setAlarmDetails("attribute is ${bool}");
AlarmCondition alarmCondition = new AlarmCondition();
alarmCondition.setSpec(new SimpleAlarmConditionSpec());
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.ToString;
import java.io.Serial;
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Schema
public class AlarmInfo extends Alarm {
@Serial
private static final long serialVersionUID = 2807343093519543363L;
@Getter
@ -58,9 +61,10 @@ public class AlarmInfo extends Alarm {
public AlarmInfo(AlarmInfo alarmInfo) {
super(alarmInfo);
this.originatorName = alarmInfo.originatorName;
this.originatorLabel = alarmInfo.originatorLabel;
this.originatorName = alarmInfo.getOriginatorName();
this.originatorLabel = alarmInfo.getOriginatorLabel();
this.assignee = alarmInfo.getAssignee();
this.originatorDisplayName = alarmInfo.getOriginatorDisplayName();
}
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.validation.NoXss;
import java.io.Serial;
import java.io.Serializable;
@Schema
@Data
public class AlarmRule implements Serializable {
@Serial
private static final long serialVersionUID = -7617427132423304707L;
@Valid
@Schema(description = "JSON object representing the alarm rule 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 EntityId alarmOriginator;
private String alarmOriginatorName;
private String alarmOriginatorLabel;
private AlarmSeverity alarmSeverity;
private AlarmStatus alarmStatus;
private CustomerId alarmCustomerId;
@ -77,7 +78,8 @@ public class AlarmAssignmentNotificationInfo implements RuleOriginatedNotificati
"alarmStatus", alarmStatus.toString(),
"alarmOriginatorEntityType", alarmOriginator.getEntityType().getNormalName(),
"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 EntityId alarmOriginator;
private String alarmOriginatorName;
private String alarmOriginatorLabel;
private AlarmSeverity alarmSeverity;
private AlarmStatus alarmStatus;
private CustomerId alarmCustomerId;
@ -68,7 +69,8 @@ public class AlarmCommentNotificationInfo implements RuleOriginatedNotificationI
"alarmStatus", alarmStatus.toString(),
"alarmOriginatorEntityType", alarmOriginator.getEntityType().getNormalName(),
"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.EntityId;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import static org.thingsboard.server.common.data.util.CollectionsUtil.mapOf;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ -41,25 +40,28 @@ public class AlarmNotificationInfo implements RuleOriginatedNotificationInfo {
private UUID alarmId;
private EntityId alarmOriginator;
private String alarmOriginatorName;
private String alarmOriginatorLabel;
private AlarmSeverity alarmSeverity;
private AlarmStatus alarmStatus;
private boolean acknowledged;
private boolean cleared;
private CustomerId alarmCustomerId;
private DashboardId dashboardId;
private Map<String, String> info;
@Override
public Map<String, String> getTemplateData() {
return mapOf(
"alarmType", alarmType,
"action", action,
"alarmId", alarmId.toString(),
"alarmSeverity", alarmSeverity.name().toLowerCase(),
"alarmStatus", alarmStatus.toString(),
"alarmOriginatorEntityType", alarmOriginator.getEntityType().getNormalName(),
"alarmOriginatorName", alarmOriginatorName,
"alarmOriginatorId", alarmOriginator.getId().toString()
);
Map<String, String> templateData = new HashMap<>(info);
templateData.put("alarmType", alarmType);
templateData.put("action", action);
templateData.put("alarmId", alarmId.toString());
templateData.put("alarmSeverity", alarmSeverity.name().toLowerCase());
templateData.put("alarmStatus", alarmStatus.toString());
templateData.put("alarmOriginatorEntityType", alarmOriginator.getEntityType().getNormalName());
templateData.put("alarmOriginatorName", alarmOriginatorName);
templateData.put("alarmOriginatorLabel", alarmOriginatorLabel);
templateData.put("alarmOriginatorId", alarmOriginator.getId().toString());
return templateData;
}
@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.notification.rule.trigger.config.NotificationRuleTriggerType;
import java.io.Serial;
@Data
@Builder
public class AlarmCommentTrigger implements NotificationRuleTrigger {
@Serial
private static final long serialVersionUID = -8614770559491757202L;
private final TenantId tenantId;
private final AlarmComment comment;
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.notification.rule.trigger.config.NotificationRuleTriggerType;
import java.io.Serial;
@Data
@Builder
public class AlarmTrigger implements NotificationRuleTrigger {
@Serial
private static final long serialVersionUID = -466810297904938644L;
private final TenantId tenantId;
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.AlarmSeverity;
import java.io.Serial;
import java.util.Set;
@Data
@ -31,6 +32,9 @@ import java.util.Set;
@Builder
public class AlarmAssignmentNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@Serial
private static final long serialVersionUID = -5313556049809972096L;
private Set<String> alarmTypes;
private Set<AlarmSeverity> alarmSeverities;
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.AlarmSeverity;
import java.io.Serial;
import java.util.Set;
@Data
@ -30,6 +31,9 @@ import java.util.Set;
@Builder
public class AlarmCommentNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@Serial
private static final long serialVersionUID = -9164282098882339645L;
private Set<String> alarmTypes;
private Set<AlarmSeverity> alarmSeverities;
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.AlarmSeverity;
import java.io.Serial;
import java.io.Serializable;
import java.util.Set;
@ -32,6 +33,9 @@ import java.util.Set;
@Builder
public class AlarmNotificationRuleTriggerConfig implements NotificationRuleTriggerConfig {
@Serial
private static final long serialVersionUID = -7382883720381542344L;
private Set<String> alarmTypes;
private Set<AlarmSeverity> alarmSeverities;
@NotEmpty
@ -46,6 +50,8 @@ public class AlarmNotificationRuleTriggerConfig implements NotificationRuleTrigg
@Data
public static class ClearRule implements Serializable {
@Serial
private static final long serialVersionUID = 7922533150038105124L;
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.concurrent.CopyOnWriteArrayList;
/**
* Created by ashvayka on 13.01.18.
*/
@Data
@Slf4j
public final class TbMsg implements Serializable {
@ -500,11 +497,11 @@ public final class TbMsg implements Serializable {
public String toString() {
return "TbMsg.TbMsgBuilder(queueName=" + this.queueName + ", id=" + this.id + ", ts=" + this.ts +
", type=" + this.type + ", internalType=" + this.internalType + ", originator=" + this.originator +
", customerId=" + this.customerId + ", metaData=" + this.metaData + ", dataType=" + this.dataType +
", data=" + this.data + ", ruleChainId=" + this.ruleChainId + ", ruleNodeId=" + this.ruleNodeId +
", correlationId=" + this.correlationId + ", partition=" + this.partition + ", previousCalculatedFields=" + this.previousCalculatedFieldIds +
", ctx=" + this.ctx + ", callback=" + this.callback + ")";
", type=" + this.type + ", internalType=" + this.internalType + ", originator=" + this.originator +
", customerId=" + this.customerId + ", metaData=" + this.metaData + ", dataType=" + this.dataType +
", data=" + this.data + ", ruleChainId=" + this.ruleChainId + ", ruleNodeId=" + this.ruleNodeId +
", correlationId=" + this.correlationId + ", partition=" + this.partition + ", previousCalculatedFields=" + this.previousCalculatedFieldIds +
", 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;
* `alarmOriginatorEntityType` - the entity type of the alarm originator, e.g. 'Device';
* `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;
* `recipientTitle` - title of the recipient (first and last name if specified, email otherwise);
* `recipientEmail` - email of the recipient;
* `recipientFirstName` - first 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}`.
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;
* `alarmOriginatorEntityType` - the entity type of the alarm originator, e.g. 'Device';
* `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;
* `assigneeTitle` - title 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;
* `alarmOriginatorEntityType` - the entity type of the alarm originator, e.g. 'Device';
* `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;
* `comment` - text of the comment;
* `action` - one of: 'added', 'updated';

Loading…
Cancel
Save