Browse Source

Deprecate device profile node

pull/14193/head
VIacheslavKlimov 12 months ago
parent
commit
8f1b2b832f
  1. 125
      application/src/main/data/json/edge/rule_chains/edge_root_rule_chain.json
  2. 44
      application/src/main/data/json/tenant/device_profile/rule_chain_template.json
  3. 20
      application/src/main/data/json/tenant/rule_chains/root_rule_chain.json
  4. 2
      application/src/main/java/org/thingsboard/server/actors/app/AppActor.java
  5. 279
      application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java
  6. 1
      application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java
  7. 1
      application/src/test/java/org/thingsboard/server/cf/AlarmRulesTest.java
  8. 4
      common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/SimpleAlarmConditionExpression.java
  9. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmCondition.java
  10. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionFilter.java
  11. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionFilterKey.java
  12. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionKeyType.java
  13. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionSpec.java
  14. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionSpecType.java
  15. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmRule.java
  16. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmSchedule.java
  17. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmScheduleType.java
  18. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AnyTimeSchedule.java
  19. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/CustomTimeSchedule.java
  20. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/CustomTimeScheduleItem.java
  21. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/DeviceProfileAlarm.java
  22. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/DurationAlarmConditionSpec.java
  23. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/RepeatingAlarmConditionSpec.java
  24. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/SimpleAlarmConditionSpec.java
  25. 1
      common/data/src/main/java/org/thingsboard/server/common/data/device/profile/SpecificTimeSchedule.java
  26. 2
      common/data/src/main/java/org/thingsboard/server/common/data/msg/TbMsgType.java
  27. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmEvalResult.java
  28. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java
  29. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmState.java
  30. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DataSnapshot.java
  31. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DeviceState.java
  32. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DynamicPredicateValueCtx.java
  33. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DynamicPredicateValueCtxImpl.java
  34. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/EntityKeyValue.java
  35. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/ProfileState.java
  36. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/SnapshotUpdate.java
  37. 5
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNode.java
  38. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNodeConfiguration.java
  39. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/state/PersistedAlarmRuleState.java
  40. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/state/PersistedAlarmState.java
  41. 1
      rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/state/PersistedDeviceState.java

125
application/src/main/data/json/edge/rule_chains/edge_root_rule_chain.json

@ -10,27 +10,9 @@
"externalId": null "externalId": null
}, },
"metadata": { "metadata": {
"firstNodeIndex": 0, "firstNodeIndex": 2,
"nodes": [ "nodes": [
{ {
"additionalInfo": {
"description": "Process incoming messages from devices with the alarm rules defined in the device profile. Dispatch all incoming messages with \"Success\" relation type.",
"layoutX": 187,
"layoutY": 468
},
"type": "org.thingsboard.rule.engine.profile.TbDeviceProfileNode",
"name": "Device Profile Node",
"configuration": {
"persistAlarmRulesState": false,
"fetchAlarmRulesStateOnStart": false
},
"externalId": null
},
{
"additionalInfo": {
"layoutX": 823,
"layoutY": 157
},
"type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode", "type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode",
"name": "Save Timeseries", "name": "Save Timeseries",
"configurationVersion": 1, "configurationVersion": 1,
@ -41,13 +23,12 @@
"type": "ON_EVERY_MESSAGE" "type": "ON_EVERY_MESSAGE"
} }
}, },
"externalId": null "additionalInfo": {
"layoutX": 823,
"layoutY": 157
}
}, },
{ {
"additionalInfo": {
"layoutX": 824,
"layoutY": 52
},
"type": "org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode", "type": "org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode",
"name": "Save Client Attributes", "name": "Save Client Attributes",
"configurationVersion": 3, "configurationVersion": 3,
@ -60,25 +41,23 @@
"sendAttributesUpdatedNotification": false, "sendAttributesUpdatedNotification": false,
"updateAttributesOnlyOnValueChange": true "updateAttributesOnlyOnValueChange": true
}, },
"externalId": null "additionalInfo": {
"layoutX": 824,
"layoutY": 52
}
}, },
{ {
"additionalInfo": {
"layoutX": 347,
"layoutY": 149
},
"type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode", "type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode",
"name": "Message Type Switch", "name": "Message Type Switch",
"configuration": { "configuration": {
"version": 0 "version": 0
}, },
"externalId": null "additionalInfo": {
"layoutX": 347,
"layoutY": 149
}
}, },
{ {
"additionalInfo": {
"layoutX": 825,
"layoutY": 266
},
"type": "org.thingsboard.rule.engine.action.TbLogNode", "type": "org.thingsboard.rule.engine.action.TbLogNode",
"name": "Log RPC from Device", "name": "Log RPC from Device",
"configuration": { "configuration": {
@ -86,13 +65,12 @@
"jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);", "jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);",
"tbelScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);" "tbelScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);"
}, },
"externalId": null "additionalInfo": {
"layoutX": 825,
"layoutY": 266
}
}, },
{ {
"additionalInfo": {
"layoutX": 824,
"layoutY": 378
},
"type": "org.thingsboard.rule.engine.action.TbLogNode", "type": "org.thingsboard.rule.engine.action.TbLogNode",
"name": "Log Other", "name": "Log Other",
"configuration": { "configuration": {
@ -100,97 +78,92 @@
"jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);", "jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);",
"tbelScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);" "tbelScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);"
}, },
"externalId": null
},
{
"additionalInfo": { "additionalInfo": {
"layoutX": 824, "layoutX": 824,
"layoutY": 466 "layoutY": 378
}, }
},
{
"type": "org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode", "type": "org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode",
"name": "RPC Call Request", "name": "RPC Call Request",
"configuration": { "configuration": {
"timeoutInSeconds": 60 "timeoutInSeconds": 60
}, },
"externalId": null "additionalInfo": {
"layoutX": 824,
"layoutY": 466
}
}, },
{ {
"additionalInfo": {
"layoutX": 1126,
"layoutY": 104
},
"type": "org.thingsboard.rule.engine.edge.TbMsgPushToCloudNode", "type": "org.thingsboard.rule.engine.edge.TbMsgPushToCloudNode",
"name": "Push to cloud", "name": "Push to cloud",
"configuration": { "configuration": {
"scope": "CLIENT_SCOPE" "scope": "CLIENT_SCOPE"
}, },
"externalId": null "additionalInfo": {
"layoutX": 1126,
"layoutY": 104
}
}, },
{ {
"additionalInfo": {
"layoutX": 826,
"layoutY": 601
},
"type": "org.thingsboard.rule.engine.edge.TbMsgPushToCloudNode", "type": "org.thingsboard.rule.engine.edge.TbMsgPushToCloudNode",
"name": "Push to cloud", "name": "Push to cloud",
"configuration": { "configuration": {
"scope": "SERVER_SCOPE" "scope": "SERVER_SCOPE"
}, },
"externalId": null "additionalInfo": {
"layoutX": 826,
"layoutY": 601
}
} }
], ],
"connections": [ "connections": [
{ {
"fromIndex": 0, "fromIndex": 0,
"toIndex": 3, "toIndex": 6,
"type": "Success" "type": "Success"
}, },
{ {
"fromIndex": 1, "fromIndex": 1,
"toIndex": 7, "toIndex": 6,
"type": "Success" "type": "Success"
}, },
{ {
"fromIndex": 2, "fromIndex": 2,
"toIndex": 7, "toIndex": 0,
"type": "Success"
},
{
"fromIndex": 3,
"toIndex": 1,
"type": "Post telemetry" "type": "Post telemetry"
}, },
{ {
"fromIndex": 3, "fromIndex": 2,
"toIndex": 2, "toIndex": 1,
"type": "Post attributes" "type": "Post attributes"
}, },
{ {
"fromIndex": 3, "fromIndex": 2,
"toIndex": 4, "toIndex": 3,
"type": "RPC Request from Device" "type": "RPC Request from Device"
}, },
{ {
"fromIndex": 3, "fromIndex": 2,
"toIndex": 5, "toIndex": 4,
"type": "Other" "type": "Other"
}, },
{ {
"fromIndex": 3, "fromIndex": 2,
"toIndex": 6, "toIndex": 5,
"type": "RPC Request to Device" "type": "RPC Request to Device"
}, },
{ {
"fromIndex": 3, "fromIndex": 2,
"toIndex": 8, "toIndex": 7,
"type": "Attributes Deleted" "type": "Attributes Deleted"
}, },
{ {
"fromIndex": 3, "fromIndex": 2,
"toIndex": 8, "toIndex": 7,
"type": "Attributes Updated" "type": "Attributes Updated"
} }
], ],
"ruleChainConnections": null "ruleChainConnections": null
} }
} }

44
application/src/main/data/json/tenant/device_profile/rule_chain_template.json

@ -10,12 +10,12 @@
"configuration": null "configuration": null
}, },
"metadata": { "metadata": {
"firstNodeIndex": 6, "firstNodeIndex": 2,
"nodes": [ "nodes": [
{ {
"additionalInfo": { "additionalInfo": {
"layoutX": 822, "layoutX": 824,
"layoutY": 294 "layoutY": 156
}, },
"type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode", "type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode",
"name": "Save Timeseries", "name": "Save Timeseries",
@ -30,8 +30,8 @@
}, },
{ {
"additionalInfo": { "additionalInfo": {
"layoutX": 824, "layoutX": 825,
"layoutY": 221 "layoutY": 52
}, },
"type": "org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode", "type": "org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode",
"name": "Save Client Attributes", "name": "Save Client Attributes",
@ -48,8 +48,8 @@
}, },
{ {
"additionalInfo": { "additionalInfo": {
"layoutX": 494, "layoutX": 347,
"layoutY": 309 "layoutY": 149
}, },
"type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode", "type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode",
"name": "Message Type Switch", "name": "Message Type Switch",
@ -59,8 +59,8 @@
}, },
{ {
"additionalInfo": { "additionalInfo": {
"layoutX": 824, "layoutX": 825,
"layoutY": 383 "layoutY": 266
}, },
"type": "org.thingsboard.rule.engine.action.TbLogNode", "type": "org.thingsboard.rule.engine.action.TbLogNode",
"name": "Log RPC from Device", "name": "Log RPC from Device",
@ -72,8 +72,8 @@
}, },
{ {
"additionalInfo": { "additionalInfo": {
"layoutX": 823, "layoutX": 825,
"layoutY": 444 "layoutY": 379
}, },
"type": "org.thingsboard.rule.engine.action.TbLogNode", "type": "org.thingsboard.rule.engine.action.TbLogNode",
"name": "Log Other", "name": "Log Other",
@ -85,27 +85,14 @@
}, },
{ {
"additionalInfo": { "additionalInfo": {
"layoutX": 822, "layoutX": 825,
"layoutY": 507 "layoutY": 468
}, },
"type": "org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode", "type": "org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode",
"name": "RPC Call Request", "name": "RPC Call Request",
"configuration": { "configuration": {
"timeoutInSeconds": 60 "timeoutInSeconds": 60
} }
},
{
"additionalInfo": {
"description": "",
"layoutX": 209,
"layoutY": 307
},
"type": "org.thingsboard.rule.engine.profile.TbDeviceProfileNode",
"name": "Device Profile Node",
"configuration": {
"persistAlarmRulesState": false,
"fetchAlarmRulesStateOnStart": false
}
} }
], ],
"connections": [ "connections": [
@ -133,11 +120,6 @@
"fromIndex": 2, "fromIndex": 2,
"toIndex": 5, "toIndex": 5,
"type": "RPC Request to Device" "type": "RPC Request to Device"
},
{
"fromIndex": 6,
"toIndex": 2,
"type": "Success"
} }
], ],
"ruleChainConnections": null "ruleChainConnections": null

20
application/src/main/data/json/tenant/rule_chains/root_rule_chain.json

@ -9,7 +9,7 @@
"configuration": null "configuration": null
}, },
"metadata": { "metadata": {
"firstNodeIndex": 6, "firstNodeIndex": 2,
"nodes": [ "nodes": [
{ {
"additionalInfo": { "additionalInfo": {
@ -92,27 +92,9 @@
"configuration": { "configuration": {
"timeoutInSeconds": 60 "timeoutInSeconds": 60
} }
},
{
"additionalInfo": {
"description": "Process incoming messages from devices with the alarm rules defined in the device profile. Dispatch all incoming messages with \"Success\" relation type.",
"layoutX": 204,
"layoutY": 240
},
"type": "org.thingsboard.rule.engine.profile.TbDeviceProfileNode",
"name": "Device Profile Node",
"configuration": {
"persistAlarmRulesState": false,
"fetchAlarmRulesStateOnStart": false
}
} }
], ],
"connections": [ "connections": [
{
"fromIndex": 6,
"toIndex": 2,
"type": "Success"
},
{ {
"fromIndex": 2, "fromIndex": 2,
"toIndex": 4, "toIndex": 4,

2
application/src/main/java/org/thingsboard/server/actors/app/AppActor.java

@ -165,7 +165,7 @@ public class AppActor extends ContextAwareActor {
private void onComponentLifecycleMsg(ComponentLifecycleMsg msg) { private void onComponentLifecycleMsg(ComponentLifecycleMsg msg) {
TbActorRef target = null; TbActorRef target = null;
if (TenantId.SYS_TENANT_ID.equals(msg.getTenantId())) { if (TenantId.SYS_TENANT_ID.equals(msg.getTenantId())) {
if (!EntityType.TENANT_PROFILE.equals(msg.getEntityId().getEntityType())) { if (!msg.getEntityId().getEntityType().isOneOf(EntityType.TENANT_PROFILE, EntityType.TB_RESOURCE)) {
log.warn("Message has system tenant id: {}", msg); log.warn("Message has system tenant id: {}", msg);
} }
} else { } else {

279
application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java

@ -49,17 +49,25 @@ import org.thingsboard.server.common.data.Tenant;
import org.thingsboard.server.common.data.TenantProfile; import org.thingsboard.server.common.data.TenantProfile;
import org.thingsboard.server.common.data.User; import org.thingsboard.server.common.data.User;
import org.thingsboard.server.common.data.alarm.AlarmSeverity; import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import org.thingsboard.server.common.data.device.profile.AlarmCondition; import org.thingsboard.server.common.data.alarm.rule.AlarmRule;
import org.thingsboard.server.common.data.device.profile.AlarmConditionFilter; import org.thingsboard.server.common.data.alarm.rule.condition.AlarmConditionValue;
import org.thingsboard.server.common.data.device.profile.AlarmConditionFilterKey; import org.thingsboard.server.common.data.alarm.rule.condition.SimpleAlarmCondition;
import org.thingsboard.server.common.data.device.profile.AlarmConditionKeyType; import org.thingsboard.server.common.data.alarm.rule.condition.expression.AlarmConditionFilter;
import org.thingsboard.server.common.data.device.profile.AlarmRule; import org.thingsboard.server.common.data.alarm.rule.condition.expression.ComplexOperation;
import org.thingsboard.server.common.data.alarm.rule.condition.expression.SimpleAlarmConditionExpression;
import org.thingsboard.server.common.data.alarm.rule.condition.expression.predicate.BooleanFilterPredicate;
import org.thingsboard.server.common.data.alarm.rule.condition.expression.predicate.NumericFilterPredicate;
import org.thingsboard.server.common.data.cf.CalculatedField;
import org.thingsboard.server.common.data.cf.CalculatedFieldType;
import org.thingsboard.server.common.data.cf.configuration.AlarmCalculatedFieldConfiguration;
import org.thingsboard.server.common.data.cf.configuration.Argument;
import org.thingsboard.server.common.data.cf.configuration.ArgumentType;
import org.thingsboard.server.common.data.cf.configuration.ReferencedEntityKey;
import org.thingsboard.server.common.data.debug.DebugSettings;
import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileConfiguration; import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileConfiguration;
import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileTransportConfiguration;
import org.thingsboard.server.common.data.device.profile.DeviceProfileAlarm;
import org.thingsboard.server.common.data.device.profile.DeviceProfileData; import org.thingsboard.server.common.data.device.profile.DeviceProfileData;
import org.thingsboard.server.common.data.device.profile.DisabledDeviceProfileProvisionConfiguration; import org.thingsboard.server.common.data.device.profile.DisabledDeviceProfileProvisionConfiguration;
import org.thingsboard.server.common.data.device.profile.SimpleAlarmConditionSpec;
import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.CustomerId;
import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.DeviceId;
import org.thingsboard.server.common.data.id.DeviceProfileId; import org.thingsboard.server.common.data.id.DeviceProfileId;
@ -74,12 +82,6 @@ import org.thingsboard.server.common.data.kv.TimeseriesSaveResult;
import org.thingsboard.server.common.data.mobile.app.MobileApp; import org.thingsboard.server.common.data.mobile.app.MobileApp;
import org.thingsboard.server.common.data.page.PageDataIterable; import org.thingsboard.server.common.data.page.PageDataIterable;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.query.BooleanFilterPredicate;
import org.thingsboard.server.common.data.query.DynamicValue;
import org.thingsboard.server.common.data.query.DynamicValueSourceType;
import org.thingsboard.server.common.data.query.EntityKeyValueType;
import org.thingsboard.server.common.data.query.FilterPredicateValue;
import org.thingsboard.server.common.data.query.NumericFilterPredicate;
import org.thingsboard.server.common.data.queue.ProcessingStrategy; import org.thingsboard.server.common.data.queue.ProcessingStrategy;
import org.thingsboard.server.common.data.queue.ProcessingStrategyType; import org.thingsboard.server.common.data.queue.ProcessingStrategyType;
import org.thingsboard.server.common.data.queue.Queue; import org.thingsboard.server.common.data.queue.Queue;
@ -94,6 +96,7 @@ import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileCon
import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; import org.thingsboard.server.common.data.tenant.profile.TenantProfileData;
import org.thingsboard.server.common.data.tenant.profile.TenantProfileQueueConfiguration; import org.thingsboard.server.common.data.tenant.profile.TenantProfileQueueConfiguration;
import org.thingsboard.server.dao.attributes.AttributesService; import org.thingsboard.server.dao.attributes.AttributesService;
import org.thingsboard.server.dao.cf.CalculatedFieldService;
import org.thingsboard.server.dao.customer.CustomerService; import org.thingsboard.server.dao.customer.CustomerService;
import org.thingsboard.server.dao.device.DeviceConnectivityConfiguration; import org.thingsboard.server.dao.device.DeviceConnectivityConfiguration;
import org.thingsboard.server.dao.device.DeviceCredentialsService; import org.thingsboard.server.dao.device.DeviceCredentialsService;
@ -117,7 +120,7 @@ import java.util.Arrays;
import java.util.Base64; import java.util.Base64;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.TreeMap; import java.util.Map;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -155,6 +158,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
private final MobileAppDao mobileAppDao; private final MobileAppDao mobileAppDao;
private final NotificationSettingsService notificationSettingsService; private final NotificationSettingsService notificationSettingsService;
private final NotificationTargetService notificationTargetService; private final NotificationTargetService notificationTargetService;
private final CalculatedFieldService calculatedFieldService;
@Autowired @Autowired
private BCryptPasswordEncoder passwordEncoder; private BCryptPasswordEncoder passwordEncoder;
@ -306,8 +310,8 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
if (invalidSignKey) { if (invalidSignKey) {
log.warn("WARNING: {}. A new JWT Signing Key has been added automatically. " + log.warn("WARNING: {}. A new JWT Signing Key has been added automatically. " +
"You can change the JWT Signing Key using the Web UI: " + "You can change the JWT Signing Key using the Web UI: " +
"Navigate to \"System settings -> Security settings\" while logged in as a System Administrator.", warningMessage); "Navigate to \"System settings -> Security settings\" while logged in as a System Administrator.", warningMessage);
jwtSettings.setTokenSigningKey(generateRandomKey()); jwtSettings.setTokenSigningKey(generateRandomKey());
jwtSettingsService.saveJwtSettings(jwtSettings); jwtSettingsService.saveJwtSettings(jwtSettings);
@ -319,9 +323,9 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
.filter(mobileApp -> !validateKeyLength(mobileApp.getAppSecret())) .filter(mobileApp -> !validateKeyLength(mobileApp.getAppSecret()))
.forEach(mobileApp -> { .forEach(mobileApp -> {
log.warn("WARNING: The App secret is shorter than 512 bits, which is a security risk. " + log.warn("WARNING: The App secret is shorter than 512 bits, which is a security risk. " +
"A new Application Secret has been added automatically for Mobile Application [{}]. " + "A new Application Secret has been added automatically for Mobile Application [{}]. " +
"You can change the Application Secret using the Web UI: " + "You can change the Application Secret using the Web UI: " +
"Navigate to \"Security settings -> OAuth2 -> Mobile applications\" while logged in as a System Administrator.", mobileApp.getPkgName()); "Navigate to \"Security settings -> OAuth2 -> Mobile applications\" while logged in as a System Administrator.", mobileApp.getPkgName());
mobileApp.setAppSecret(generateRandomKey()); mobileApp.setAppSecret(generateRandomKey());
mobileAppDao.save(TenantId.SYS_TENANT_ID, mobileApp); mobileAppDao.save(TenantId.SYS_TENANT_ID, mobileApp);
}); });
@ -372,11 +376,11 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
createDevice(demoTenant.getId(), customerB.getId(), defaultDeviceProfile.getId(), "Test Device B1", "B1_TEST_TOKEN", null); createDevice(demoTenant.getId(), customerB.getId(), defaultDeviceProfile.getId(), "Test Device B1", "B1_TEST_TOKEN", null);
createDevice(demoTenant.getId(), customerC.getId(), defaultDeviceProfile.getId(), "Test Device C1", "C1_TEST_TOKEN", null); createDevice(demoTenant.getId(), customerC.getId(), defaultDeviceProfile.getId(), "Test Device C1", "C1_TEST_TOKEN", null);
createDevice(demoTenant.getId(), null, defaultDeviceProfile.getId(), "DHT11 Demo Device", "DHT11_DEMO_TOKEN", "Demo device that is used in sample " + createDevice(demoTenant.getId(), null, defaultDeviceProfile.getId(), "DHT11 Demo Device", "DHT11_DEMO_TOKEN",
"applications that upload data from DHT11 temperature and humidity sensor"); "Demo device that is used in sample applications that upload data from DHT11 temperature and humidity sensor");
createDevice(demoTenant.getId(), null, defaultDeviceProfile.getId(), "Raspberry Pi Demo Device", "RASPBERRY_PI_DEMO_TOKEN", "Demo device that is used in " + createDevice(demoTenant.getId(), null, defaultDeviceProfile.getId(), "Raspberry Pi Demo Device", "RASPBERRY_PI_DEMO_TOKEN",
"Raspberry Pi GPIO control sample application"); "Demo device that is used in Raspberry Pi GPIO control sample application");
DeviceProfile thermostatDeviceProfile = new DeviceProfile(); DeviceProfile thermostatDeviceProfile = new DeviceProfile();
thermostatDeviceProfile.setTenantId(demoTenant.getId()); thermostatDeviceProfile.setTenantId(demoTenant.getId());
@ -398,110 +402,8 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
deviceProfileData.setProvisionConfiguration(provisionConfiguration); deviceProfileData.setProvisionConfiguration(provisionConfiguration);
thermostatDeviceProfile.setProfileData(deviceProfileData); thermostatDeviceProfile.setProfileData(deviceProfileData);
DeviceProfileAlarm highTemperature = new DeviceProfileAlarm();
highTemperature.setId("highTemperatureAlarmID");
highTemperature.setAlarmType("High Temperature");
AlarmRule temperatureRule = new AlarmRule();
AlarmCondition temperatureCondition = new AlarmCondition();
temperatureCondition.setSpec(new SimpleAlarmConditionSpec());
AlarmConditionFilter temperatureAlarmFlagAttributeFilter = new AlarmConditionFilter();
temperatureAlarmFlagAttributeFilter.setKey(new AlarmConditionFilterKey(AlarmConditionKeyType.ATTRIBUTE, "temperatureAlarmFlag"));
temperatureAlarmFlagAttributeFilter.setValueType(EntityKeyValueType.BOOLEAN);
BooleanFilterPredicate temperatureAlarmFlagAttributePredicate = new BooleanFilterPredicate();
temperatureAlarmFlagAttributePredicate.setOperation(BooleanFilterPredicate.BooleanOperation.EQUAL);
temperatureAlarmFlagAttributePredicate.setValue(new FilterPredicateValue<>(Boolean.TRUE));
temperatureAlarmFlagAttributeFilter.setPredicate(temperatureAlarmFlagAttributePredicate);
AlarmConditionFilter temperatureTimeseriesFilter = new AlarmConditionFilter();
temperatureTimeseriesFilter.setKey(new AlarmConditionFilterKey(AlarmConditionKeyType.TIME_SERIES, "temperature"));
temperatureTimeseriesFilter.setValueType(EntityKeyValueType.NUMERIC);
NumericFilterPredicate temperatureTimeseriesFilterPredicate = new NumericFilterPredicate();
temperatureTimeseriesFilterPredicate.setOperation(NumericFilterPredicate.NumericOperation.GREATER);
FilterPredicateValue<Double> temperatureTimeseriesPredicateValue =
new FilterPredicateValue<>(25.0, null,
new DynamicValue<>(DynamicValueSourceType.CURRENT_DEVICE, "temperatureAlarmThreshold"));
temperatureTimeseriesFilterPredicate.setValue(temperatureTimeseriesPredicateValue);
temperatureTimeseriesFilter.setPredicate(temperatureTimeseriesFilterPredicate);
temperatureCondition.setCondition(Arrays.asList(temperatureAlarmFlagAttributeFilter, temperatureTimeseriesFilter));
temperatureRule.setAlarmDetails("Current temperature = ${temperature}");
temperatureRule.setCondition(temperatureCondition);
highTemperature.setCreateRules(new TreeMap<>(Collections.singletonMap(AlarmSeverity.MAJOR, temperatureRule)));
AlarmRule clearTemperatureRule = new AlarmRule();
AlarmCondition clearTemperatureCondition = new AlarmCondition();
clearTemperatureCondition.setSpec(new SimpleAlarmConditionSpec());
AlarmConditionFilter clearTemperatureTimeseriesFilter = new AlarmConditionFilter();
clearTemperatureTimeseriesFilter.setKey(new AlarmConditionFilterKey(AlarmConditionKeyType.TIME_SERIES, "temperature"));
clearTemperatureTimeseriesFilter.setValueType(EntityKeyValueType.NUMERIC);
NumericFilterPredicate clearTemperatureTimeseriesFilterPredicate = new NumericFilterPredicate();
clearTemperatureTimeseriesFilterPredicate.setOperation(NumericFilterPredicate.NumericOperation.LESS_OR_EQUAL);
FilterPredicateValue<Double> clearTemperatureTimeseriesPredicateValue =
new FilterPredicateValue<>(25.0, null,
new DynamicValue<>(DynamicValueSourceType.CURRENT_DEVICE, "temperatureAlarmThreshold"));
clearTemperatureTimeseriesFilterPredicate.setValue(clearTemperatureTimeseriesPredicateValue);
clearTemperatureTimeseriesFilter.setPredicate(clearTemperatureTimeseriesFilterPredicate);
clearTemperatureCondition.setCondition(Collections.singletonList(clearTemperatureTimeseriesFilter));
clearTemperatureRule.setCondition(clearTemperatureCondition);
clearTemperatureRule.setAlarmDetails("Current temperature = ${temperature}");
highTemperature.setClearRule(clearTemperatureRule);
DeviceProfileAlarm lowHumidity = new DeviceProfileAlarm();
lowHumidity.setId("lowHumidityAlarmID");
lowHumidity.setAlarmType("Low Humidity");
AlarmRule humidityRule = new AlarmRule();
AlarmCondition humidityCondition = new AlarmCondition();
humidityCondition.setSpec(new SimpleAlarmConditionSpec());
AlarmConditionFilter humidityAlarmFlagAttributeFilter = new AlarmConditionFilter();
humidityAlarmFlagAttributeFilter.setKey(new AlarmConditionFilterKey(AlarmConditionKeyType.ATTRIBUTE, "humidityAlarmFlag"));
humidityAlarmFlagAttributeFilter.setValueType(EntityKeyValueType.BOOLEAN);
BooleanFilterPredicate humidityAlarmFlagAttributePredicate = new BooleanFilterPredicate();
humidityAlarmFlagAttributePredicate.setOperation(BooleanFilterPredicate.BooleanOperation.EQUAL);
humidityAlarmFlagAttributePredicate.setValue(new FilterPredicateValue<>(Boolean.TRUE));
humidityAlarmFlagAttributeFilter.setPredicate(humidityAlarmFlagAttributePredicate);
AlarmConditionFilter humidityTimeseriesFilter = new AlarmConditionFilter();
humidityTimeseriesFilter.setKey(new AlarmConditionFilterKey(AlarmConditionKeyType.TIME_SERIES, "humidity"));
humidityTimeseriesFilter.setValueType(EntityKeyValueType.NUMERIC);
NumericFilterPredicate humidityTimeseriesFilterPredicate = new NumericFilterPredicate();
humidityTimeseriesFilterPredicate.setOperation(NumericFilterPredicate.NumericOperation.LESS);
FilterPredicateValue<Double> humidityTimeseriesPredicateValue =
new FilterPredicateValue<>(60.0, null,
new DynamicValue<>(DynamicValueSourceType.CURRENT_DEVICE, "humidityAlarmThreshold"));
humidityTimeseriesFilterPredicate.setValue(humidityTimeseriesPredicateValue);
humidityTimeseriesFilter.setPredicate(humidityTimeseriesFilterPredicate);
humidityCondition.setCondition(Arrays.asList(humidityAlarmFlagAttributeFilter, humidityTimeseriesFilter));
humidityRule.setCondition(humidityCondition);
humidityRule.setAlarmDetails("Current humidity = ${humidity}");
lowHumidity.setCreateRules(new TreeMap<>(Collections.singletonMap(AlarmSeverity.MINOR, humidityRule)));
AlarmRule clearHumidityRule = new AlarmRule();
AlarmCondition clearHumidityCondition = new AlarmCondition();
clearHumidityCondition.setSpec(new SimpleAlarmConditionSpec());
AlarmConditionFilter clearHumidityTimeseriesFilter = new AlarmConditionFilter();
clearHumidityTimeseriesFilter.setKey(new AlarmConditionFilterKey(AlarmConditionKeyType.TIME_SERIES, "humidity"));
clearHumidityTimeseriesFilter.setValueType(EntityKeyValueType.NUMERIC);
NumericFilterPredicate clearHumidityTimeseriesFilterPredicate = new NumericFilterPredicate();
clearHumidityTimeseriesFilterPredicate.setOperation(NumericFilterPredicate.NumericOperation.GREATER_OR_EQUAL);
FilterPredicateValue<Double> clearHumidityTimeseriesPredicateValue =
new FilterPredicateValue<>(60.0, null,
new DynamicValue<>(DynamicValueSourceType.CURRENT_DEVICE, "humidityAlarmThreshold"));
clearHumidityTimeseriesFilterPredicate.setValue(clearHumidityTimeseriesPredicateValue);
clearHumidityTimeseriesFilter.setPredicate(clearHumidityTimeseriesFilterPredicate);
clearHumidityCondition.setCondition(Collections.singletonList(clearHumidityTimeseriesFilter));
clearHumidityRule.setCondition(clearHumidityCondition);
clearHumidityRule.setAlarmDetails("Current humidity = ${humidity}");
lowHumidity.setClearRule(clearHumidityRule);
deviceProfileData.setAlarms(Arrays.asList(highTemperature, lowHumidity));
DeviceProfile savedThermostatDeviceProfile = deviceProfileService.saveDeviceProfile(thermostatDeviceProfile); DeviceProfile savedThermostatDeviceProfile = deviceProfileService.saveDeviceProfile(thermostatDeviceProfile);
createAlarmRules(demoTenant.getId(), savedThermostatDeviceProfile.getId());
DeviceId t1Id = createDevice(demoTenant.getId(), null, savedThermostatDeviceProfile.getId(), "Thermostat T1", "T1_TEST_TOKEN", "Demo device for Thermostats dashboard").getId(); DeviceId t1Id = createDevice(demoTenant.getId(), null, savedThermostatDeviceProfile.getId(), "Thermostat T1", "T1_TEST_TOKEN", "Demo device for Thermostats dashboard").getId();
DeviceId t2Id = createDevice(demoTenant.getId(), null, savedThermostatDeviceProfile.getId(), "Thermostat T2", "T2_TEST_TOKEN", "Demo device for Thermostats dashboard").getId(); DeviceId t2Id = createDevice(demoTenant.getId(), null, savedThermostatDeviceProfile.getId(), "Thermostat T2", "T2_TEST_TOKEN", "Demo device for Thermostats dashboard").getId();
@ -526,6 +428,130 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
installScripts.createDefaultTenantDashboards(demoTenant.getId(), null); installScripts.createDefaultTenantDashboards(demoTenant.getId(), null);
} }
private void createAlarmRules(TenantId tenantId, DeviceProfileId deviceProfileId) {
CalculatedField highTemperature = new CalculatedField();
highTemperature.setName("High Temperature");
highTemperature.setType(CalculatedFieldType.ALARM);
highTemperature.setTenantId(tenantId);
highTemperature.setEntityId(deviceProfileId);
highTemperature.setDebugSettings(DebugSettings.all());
AlarmCalculatedFieldConfiguration highTemperatureConfig = new AlarmCalculatedFieldConfiguration();
highTemperature.setConfiguration(highTemperatureConfig);
Argument temperatureArgument = new Argument();
temperatureArgument.setRefEntityKey(new ReferencedEntityKey("temperature", ArgumentType.TS_LATEST, null));
Argument temperatureThresholdArgument = new Argument();
temperatureThresholdArgument.setRefEntityKey(new ReferencedEntityKey("temperatureAlarmThreshold", ArgumentType.ATTRIBUTE, AttributeScope.SERVER_SCOPE));
temperatureThresholdArgument.setDefaultValue("25");
Argument temperatureAlarmFlagArgument = new Argument();
temperatureAlarmFlagArgument.setRefEntityKey(new ReferencedEntityKey("temperatureAlarmFlag", ArgumentType.ATTRIBUTE, AttributeScope.SERVER_SCOPE));
highTemperatureConfig.setArguments(Map.of(
"temperature", temperatureArgument,
"temperatureAlarmThreshold", temperatureThresholdArgument,
"temperatureAlarmFlag", temperatureAlarmFlagArgument
));
AlarmRule temperatureRule = new AlarmRule();
SimpleAlarmCondition temperatureCondition = new SimpleAlarmCondition();
AlarmConditionFilter temperatureAlarmFlagFilter = new AlarmConditionFilter();
temperatureAlarmFlagFilter.setArgument("temperatureAlarmFlag");
BooleanFilterPredicate temperatureAlarmFlagAttributePredicate = new BooleanFilterPredicate();
temperatureAlarmFlagAttributePredicate.setOperation(BooleanFilterPredicate.BooleanOperation.EQUAL);
temperatureAlarmFlagAttributePredicate.setValue(new AlarmConditionValue<>(Boolean.TRUE, null));
temperatureAlarmFlagFilter.setPredicate(temperatureAlarmFlagAttributePredicate);
AlarmConditionFilter temperatureFilter = new AlarmConditionFilter();
temperatureFilter.setArgument("temperature");
NumericFilterPredicate temperatureFilterPredicate = new NumericFilterPredicate();
temperatureFilterPredicate.setOperation(NumericFilterPredicate.NumericOperation.GREATER);
temperatureFilterPredicate.setValue(new AlarmConditionValue<>(null, "temperatureAlarmThreshold"));
temperatureFilter.setPredicate(temperatureFilterPredicate);
temperatureCondition.setExpression(new SimpleAlarmConditionExpression(List.of(temperatureAlarmFlagFilter, temperatureFilter), ComplexOperation.AND));
temperatureRule.setCondition(temperatureCondition);
temperatureRule.setAlarmDetails("Current temperature = ${temperature}");
highTemperatureConfig.setCreateRules(Map.of(
AlarmSeverity.MAJOR, temperatureRule
));
AlarmRule clearTemperatureRule = new AlarmRule();
SimpleAlarmCondition clearTemperatureCondition = new SimpleAlarmCondition();
AlarmConditionFilter clearTemperatureFilter = new AlarmConditionFilter();
clearTemperatureFilter.setArgument("temperature");
NumericFilterPredicate clearTemperatureFilterPredicate = new NumericFilterPredicate();
clearTemperatureFilterPredicate.setOperation(NumericFilterPredicate.NumericOperation.LESS_OR_EQUAL);
clearTemperatureFilterPredicate.setValue(new AlarmConditionValue<>(null, "temperatureAlarmThreshold"));
clearTemperatureFilter.setPredicate(clearTemperatureFilterPredicate);
clearTemperatureCondition.setExpression(new SimpleAlarmConditionExpression(List.of(clearTemperatureFilter), ComplexOperation.AND));
clearTemperatureRule.setCondition(clearTemperatureCondition);
clearTemperatureRule.setAlarmDetails("Current temperature = ${temperature}");
highTemperatureConfig.setClearRule(clearTemperatureRule);
calculatedFieldService.save(highTemperature);
CalculatedField lowHumidity = new CalculatedField();
lowHumidity.setName("Low Humidity");
lowHumidity.setType(CalculatedFieldType.ALARM);
lowHumidity.setTenantId(tenantId);
lowHumidity.setEntityId(deviceProfileId);
lowHumidity.setDebugSettings(DebugSettings.all());
AlarmCalculatedFieldConfiguration lowHumidityConfig = new AlarmCalculatedFieldConfiguration();
lowHumidity.setConfiguration(lowHumidityConfig);
Argument humidityArgument = new Argument();
humidityArgument.setRefEntityKey(new ReferencedEntityKey("humidity", ArgumentType.TS_LATEST, null));
Argument humidityThresholdArgument = new Argument();
humidityThresholdArgument.setRefEntityKey(new ReferencedEntityKey("humidityAlarmThreshold", ArgumentType.ATTRIBUTE, AttributeScope.SERVER_SCOPE));
humidityThresholdArgument.setDefaultValue("60");
Argument humidityAlarmFlagArgument = new Argument();
humidityAlarmFlagArgument.setRefEntityKey(new ReferencedEntityKey("humidityAlarmFlag", ArgumentType.ATTRIBUTE, AttributeScope.SERVER_SCOPE));
lowHumidityConfig.setArguments(Map.of(
"humidity", humidityArgument,
"humidityAlarmThreshold", humidityThresholdArgument,
"humidityAlarmFlag", humidityAlarmFlagArgument
));
AlarmRule humidityRule = new AlarmRule();
SimpleAlarmCondition humidityCondition = new SimpleAlarmCondition();
AlarmConditionFilter humidityAlarmFlagAttributeFilter = new AlarmConditionFilter();
humidityAlarmFlagAttributeFilter.setArgument("humidityAlarmFlag");
BooleanFilterPredicate humidityAlarmFlagPredicate = new BooleanFilterPredicate();
humidityAlarmFlagPredicate.setOperation(BooleanFilterPredicate.BooleanOperation.EQUAL);
humidityAlarmFlagPredicate.setValue(new AlarmConditionValue<>(Boolean.TRUE, null));
humidityAlarmFlagAttributeFilter.setPredicate(humidityAlarmFlagPredicate);
AlarmConditionFilter humidityFilter = new AlarmConditionFilter();
humidityFilter.setArgument("humidity");
NumericFilterPredicate humidityFilterPredicate = new NumericFilterPredicate();
humidityFilterPredicate.setOperation(NumericFilterPredicate.NumericOperation.LESS);
humidityFilterPredicate.setValue(new AlarmConditionValue<>(null, "humidityAlarmThreshold"));
humidityFilter.setPredicate(humidityFilterPredicate);
humidityCondition.setExpression(new SimpleAlarmConditionExpression(List.of(humidityAlarmFlagAttributeFilter, humidityFilter), ComplexOperation.AND));
humidityRule.setCondition(humidityCondition);
humidityRule.setAlarmDetails("Current humidity = ${humidity}");
lowHumidityConfig.setCreateRules(Map.of(
AlarmSeverity.MINOR, humidityRule
));
AlarmRule clearHumidityRule = new AlarmRule();
SimpleAlarmCondition clearHumidityCondition = new SimpleAlarmCondition();
AlarmConditionFilter clearHumidityFilter = new AlarmConditionFilter();
clearHumidityFilter.setArgument("humidity");
NumericFilterPredicate clearHumidityFilterPredicate = new NumericFilterPredicate();
clearHumidityFilterPredicate.setOperation(NumericFilterPredicate.NumericOperation.GREATER_OR_EQUAL);
clearHumidityFilterPredicate.setValue(new AlarmConditionValue<>(null, "humidityAlarmThreshold"));
clearHumidityFilter.setPredicate(clearHumidityFilterPredicate);
clearHumidityCondition.setExpression(new SimpleAlarmConditionExpression(List.of(clearHumidityFilter), ComplexOperation.AND));
clearHumidityRule.setCondition(clearHumidityCondition);
clearHumidityRule.setAlarmDetails("Current humidity = ${humidity}");
lowHumidityConfig.setClearRule(clearHumidityRule);
calculatedFieldService.save(lowHumidity);
}
@Override @Override
public void loadSystemWidgets() throws Exception { public void loadSystemWidgets() throws Exception {
installScripts.loadSystemWidgets(); installScripts.loadSystemWidgets();
@ -609,6 +635,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
public void onFailure(Throwable t) { public void onFailure(Throwable t) {
log.warn("[{}] Failed to update attribute [{}] with value [{}]", deviceId, key, value, t); log.warn("[{}] Failed to update attribute [{}] with value [{}]", deviceId, key, value, t);
} }
} }
private <S> void addTsCallback(ListenableFuture<S> saveFuture, final FutureCallback<S> callback) { private <S> void addTsCallback(ListenableFuture<S> saveFuture, final FutureCallback<S> callback) {

1
application/src/main/java/org/thingsboard/server/service/queue/processing/AbstractConsumerService.java

@ -228,6 +228,7 @@ public abstract class AbstractConsumerService<N extends com.google.protobuf.Gene
} }
} else if (EntityType.TB_RESOURCE.equals(componentLifecycleMsg.getEntityId().getEntityType())) { } else if (EntityType.TB_RESOURCE.equals(componentLifecycleMsg.getEntityId().getEntityType())) {
tbResourceDataCache.evictResourceData(tenantId, new TbResourceId(componentLifecycleMsg.getEntityId().getId())); tbResourceDataCache.evictResourceData(tenantId, new TbResourceId(componentLifecycleMsg.getEntityId().getId()));
return;
} }
eventPublisher.publishEvent(componentLifecycleMsg); eventPublisher.publishEvent(componentLifecycleMsg);

1
application/src/test/java/org/thingsboard/server/cf/AlarmRulesTest.java

@ -690,6 +690,7 @@ public class AlarmRulesTest extends AbstractControllerTest {
} }
// TODO: MSA tests // TODO: MSA tests
// TODO: test when attribute or telemetry is deleted without default value - perform calculation not happens
private void checkAlarmResult(CalculatedField calculatedField, Consumer<TbAlarmResult> assertion) { private void checkAlarmResult(CalculatedField calculatedField, Consumer<TbAlarmResult> assertion) {
checkAlarmResult(calculatedField, null, assertion); checkAlarmResult(calculatedField, null, assertion);

4
common/data/src/main/java/org/thingsboard/server/common/data/alarm/rule/condition/expression/SimpleAlarmConditionExpression.java

@ -17,11 +17,15 @@ package org.thingsboard.server.common.data.alarm.rule.condition.expression;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List; import java.util.List;
@Data @Data
@AllArgsConstructor
@NoArgsConstructor
public class SimpleAlarmConditionExpression implements AlarmConditionExpression { public class SimpleAlarmConditionExpression implements AlarmConditionExpression {
@Valid @Valid

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmCondition.java

@ -26,6 +26,7 @@ import java.util.List;
@Schema @Schema
@Data @Data
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@Deprecated
public class AlarmCondition implements Serializable { public class AlarmCondition implements Serializable {
@Valid @Valid

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionFilter.java

@ -26,6 +26,7 @@ import java.io.Serializable;
@Schema @Schema
@Data @Data
@Deprecated
public class AlarmConditionFilter implements Serializable { public class AlarmConditionFilter implements Serializable {
@Valid @Valid

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionFilterKey.java

@ -23,6 +23,7 @@ import java.io.Serializable;
@Schema @Schema
@Data @Data
@Deprecated
public class AlarmConditionFilterKey implements Serializable { public class AlarmConditionFilterKey implements Serializable {
@Schema(description = "The key type", example = "TIME_SERIES") @Schema(description = "The key type", example = "TIME_SERIES")

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionKeyType.java

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.server.common.data.device.profile; package org.thingsboard.server.common.data.device.profile;
@Deprecated
public enum AlarmConditionKeyType { public enum AlarmConditionKeyType {
ATTRIBUTE, ATTRIBUTE,
TIME_SERIES, TIME_SERIES,

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionSpec.java

@ -31,6 +31,7 @@ import java.io.Serializable;
@JsonSubTypes.Type(value = SimpleAlarmConditionSpec.class, name = "SIMPLE"), @JsonSubTypes.Type(value = SimpleAlarmConditionSpec.class, name = "SIMPLE"),
@JsonSubTypes.Type(value = DurationAlarmConditionSpec.class, name = "DURATION"), @JsonSubTypes.Type(value = DurationAlarmConditionSpec.class, name = "DURATION"),
@JsonSubTypes.Type(value = RepeatingAlarmConditionSpec.class, name = "REPEATING")}) @JsonSubTypes.Type(value = RepeatingAlarmConditionSpec.class, name = "REPEATING")})
@Deprecated
public interface AlarmConditionSpec extends Serializable { public interface AlarmConditionSpec extends Serializable {
@JsonIgnore @JsonIgnore

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmConditionSpecType.java

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.server.common.data.device.profile; package org.thingsboard.server.common.data.device.profile;
@Deprecated
public enum AlarmConditionSpecType { public enum AlarmConditionSpecType {
SIMPLE, SIMPLE,

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

@ -25,6 +25,7 @@ import java.io.Serializable;
@Schema @Schema
@Data @Data
@Deprecated
public class AlarmRule implements Serializable { public class AlarmRule implements Serializable {
@Valid @Valid

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmSchedule.java

@ -31,6 +31,7 @@ import java.io.Serializable;
@JsonSubTypes.Type(value = AnyTimeSchedule.class, name = "ANY_TIME"), @JsonSubTypes.Type(value = AnyTimeSchedule.class, name = "ANY_TIME"),
@JsonSubTypes.Type(value = SpecificTimeSchedule.class, name = "SPECIFIC_TIME"), @JsonSubTypes.Type(value = SpecificTimeSchedule.class, name = "SPECIFIC_TIME"),
@JsonSubTypes.Type(value = CustomTimeSchedule.class, name = "CUSTOM")}) @JsonSubTypes.Type(value = CustomTimeSchedule.class, name = "CUSTOM")})
@Deprecated
public interface AlarmSchedule extends Serializable { public interface AlarmSchedule extends Serializable {
AlarmScheduleType getType(); AlarmScheduleType getType();

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AlarmScheduleType.java

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.server.common.data.device.profile; package org.thingsboard.server.common.data.device.profile;
@Deprecated
public enum AlarmScheduleType { public enum AlarmScheduleType {
ANY_TIME, ANY_TIME,

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/AnyTimeSchedule.java

@ -17,6 +17,7 @@ package org.thingsboard.server.common.data.device.profile;
import org.thingsboard.server.common.data.query.DynamicValue; import org.thingsboard.server.common.data.query.DynamicValue;
@Deprecated
public class AnyTimeSchedule implements AlarmSchedule { public class AnyTimeSchedule implements AlarmSchedule {
@Override @Override

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/CustomTimeSchedule.java

@ -21,6 +21,7 @@ import org.thingsboard.server.common.data.query.DynamicValue;
import java.util.List; import java.util.List;
@Data @Data
@Deprecated
public class CustomTimeSchedule implements AlarmSchedule { public class CustomTimeSchedule implements AlarmSchedule {
private String timezone; private String timezone;

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/CustomTimeScheduleItem.java

@ -20,6 +20,7 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
@Data @Data
@Deprecated
public class CustomTimeScheduleItem implements Serializable { public class CustomTimeScheduleItem implements Serializable {
private boolean enabled; private boolean enabled;

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/DeviceProfileAlarm.java

@ -28,6 +28,7 @@ import java.util.TreeMap;
@Schema @Schema
@Data @Data
@Deprecated
public class DeviceProfileAlarm implements Serializable { public class DeviceProfileAlarm implements Serializable {
@Schema(description = "String value representing the alarm rule id", example = "highTemperatureAlarmID") @Schema(description = "String value representing the alarm rule id", example = "highTemperatureAlarmID")

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/DurationAlarmConditionSpec.java

@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit;
@Data @Data
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@Deprecated
public class DurationAlarmConditionSpec implements AlarmConditionSpec { public class DurationAlarmConditionSpec implements AlarmConditionSpec {
private TimeUnit unit; private TimeUnit unit;

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/RepeatingAlarmConditionSpec.java

@ -21,6 +21,7 @@ import org.thingsboard.server.common.data.query.FilterPredicateValue;
@Data @Data
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@Deprecated
public class RepeatingAlarmConditionSpec implements AlarmConditionSpec { public class RepeatingAlarmConditionSpec implements AlarmConditionSpec {
private FilterPredicateValue<Integer> predicate; private FilterPredicateValue<Integer> predicate;

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/SimpleAlarmConditionSpec.java

@ -20,6 +20,7 @@ import lombok.Data;
@Data @Data
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@Deprecated
public class SimpleAlarmConditionSpec implements AlarmConditionSpec { public class SimpleAlarmConditionSpec implements AlarmConditionSpec {
@Override @Override
public AlarmConditionSpecType getType() { public AlarmConditionSpecType getType() {

1
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/SpecificTimeSchedule.java

@ -21,6 +21,7 @@ import org.thingsboard.server.common.data.query.DynamicValue;
import java.util.Set; import java.util.Set;
@Data @Data
@Deprecated
public class SpecificTimeSchedule implements AlarmSchedule { public class SpecificTimeSchedule implements AlarmSchedule {
private String timezone; private String timezone;

2
common/data/src/main/java/org/thingsboard/server/common/data/msg/TbMsgType.java

@ -38,7 +38,7 @@ public enum TbMsgType {
ENTITY_UNASSIGNED("Entity Unassigned"), ENTITY_UNASSIGNED("Entity Unassigned"),
ATTRIBUTES_UPDATED("Attributes Updated"), ATTRIBUTES_UPDATED("Attributes Updated"),
ATTRIBUTES_DELETED("Attributes Deleted"), ATTRIBUTES_DELETED("Attributes Deleted"),
ALARM, ALARM("Alarm"),
ALARM_ACK("Alarm Acknowledged"), ALARM_ACK("Alarm Acknowledged"),
ALARM_CLEAR("Alarm Cleared"), ALARM_CLEAR("Alarm Cleared"),
ALARM_DELETE, ALARM_DELETE,

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmEvalResult.java

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.rule.engine.profile; package org.thingsboard.rule.engine.profile;
@Deprecated
public enum AlarmEvalResult { public enum AlarmEvalResult {
FALSE, NOT_YET_TRUE, TRUE; FALSE, NOT_YET_TRUE, TRUE;

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmRuleState.java

@ -55,6 +55,7 @@ import static org.thingsboard.server.common.data.StringUtils.splitByCommaWithout
@Data @Data
@Slf4j @Slf4j
class AlarmRuleState { class AlarmRuleState {
private final AlarmSeverity severity; private final AlarmSeverity severity;

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/AlarmState.java

@ -48,6 +48,7 @@ import java.util.function.BiFunction;
@Data @Data
@Slf4j @Slf4j
@Deprecated
class AlarmState { class AlarmState {
public static final String ERROR_MSG = "Failed to process alarm rule for Device [%s]: %s"; public static final String ERROR_MSG = "Failed to process alarm rule for Device [%s]: %s";

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DataSnapshot.java

@ -26,6 +26,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@Deprecated
class DataSnapshot { class DataSnapshot {
private volatile boolean ready; private volatile boolean ready;

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DeviceState.java

@ -71,6 +71,7 @@ import static org.thingsboard.server.common.data.msg.TbMsgType.POST_TELEMETRY_RE
import static org.thingsboard.server.common.data.msg.TbMsgType.TIMESERIES_UPDATED; import static org.thingsboard.server.common.data.msg.TbMsgType.TIMESERIES_UPDATED;
@Slf4j @Slf4j
@Deprecated
class DeviceState { class DeviceState {
private final boolean persistState; private final boolean persistState;

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DynamicPredicateValueCtx.java

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.rule.engine.profile; package org.thingsboard.rule.engine.profile;
@Deprecated
public interface DynamicPredicateValueCtx { public interface DynamicPredicateValueCtx {
EntityKeyValue getTenantValue(String key); EntityKeyValue getTenantValue(String key);

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/DynamicPredicateValueCtxImpl.java

@ -29,6 +29,7 @@ import java.util.Optional;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
@Slf4j @Slf4j
@Deprecated
public class DynamicPredicateValueCtxImpl implements DynamicPredicateValueCtx { public class DynamicPredicateValueCtxImpl implements DynamicPredicateValueCtx {
private final TenantId tenantId; private final TenantId tenantId;
private CustomerId customerId; private CustomerId customerId;

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/EntityKeyValue.java

@ -20,6 +20,7 @@ import lombok.Getter;
import org.thingsboard.server.common.data.kv.DataType; import org.thingsboard.server.common.data.kv.DataType;
@EqualsAndHashCode @EqualsAndHashCode
@Deprecated
class EntityKeyValue { class EntityKeyValue {
@Getter @Getter

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/ProfileState.java

@ -45,6 +45,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
@Deprecated
class ProfileState { class ProfileState {
private DeviceProfile deviceProfile; private DeviceProfile deviceProfile;

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/SnapshotUpdate.java

@ -21,6 +21,7 @@ import org.thingsboard.server.common.data.device.profile.AlarmConditionKeyType;
import java.util.Set; import java.util.Set;
@Deprecated
class SnapshotUpdate { class SnapshotUpdate {
@Getter @Getter

5
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNode.java

@ -51,17 +51,18 @@ import java.util.concurrent.TimeUnit;
@Slf4j @Slf4j
@RuleNode( @RuleNode(
type = ComponentType.ACTION, type = ComponentType.ACTION,
name = "device profile", name = "device profile (deprecated)", // TODO: add description on why is it deprecated and what to use
customRelations = true, customRelations = true,
relationTypes = {"Alarm Created", "Alarm Updated", "Alarm Severity Updated", "Alarm Cleared", "Success", "Failure"}, relationTypes = {"Alarm Created", "Alarm Updated", "Alarm Severity Updated", "Alarm Cleared", "Success", "Failure"},
version = 1, version = 1,
configClazz = TbDeviceProfileNodeConfiguration.class, configClazz = TbDeviceProfileNodeConfiguration.class,
nodeDescription = "Process device messages based on device profile settings", nodeDescription = "Process device messages based on device profile settings (deprecated)",
nodeDetails = "Create and clear alarms based on alarm rules defined in device profile. The output relation type is either " + nodeDetails = "Create and clear alarms based on alarm rules defined in device profile. The output relation type is either " +
"'Alarm Created', 'Alarm Updated', 'Alarm Severity Updated' and 'Alarm Cleared' or simply 'Success' if no alarms were affected.", "'Alarm Created', 'Alarm Updated', 'Alarm Severity Updated' and 'Alarm Cleared' or simply 'Success' if no alarms were affected.",
configDirective = "tbActionNodeDeviceProfileConfig", configDirective = "tbActionNodeDeviceProfileConfig",
docUrl = "https://thingsboard.io/docs/user-guide/rule-engine-2-0/nodes/action/device-profile/" docUrl = "https://thingsboard.io/docs/user-guide/rule-engine-2-0/nodes/action/device-profile/"
) )
@Deprecated
public class TbDeviceProfileNode implements TbNode { public class TbDeviceProfileNode implements TbNode {
private TbDeviceProfileNodeConfiguration config; private TbDeviceProfileNodeConfiguration config;

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/TbDeviceProfileNodeConfiguration.java

@ -21,6 +21,7 @@ import org.thingsboard.rule.engine.api.NodeConfiguration;
@Data @Data
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
@Deprecated
public class TbDeviceProfileNodeConfiguration implements NodeConfiguration<TbDeviceProfileNodeConfiguration> { public class TbDeviceProfileNodeConfiguration implements NodeConfiguration<TbDeviceProfileNodeConfiguration> {
private boolean persistAlarmRulesState; private boolean persistAlarmRulesState;

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/state/PersistedAlarmRuleState.java

@ -22,6 +22,7 @@ import lombok.NoArgsConstructor;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Deprecated
public class PersistedAlarmRuleState { public class PersistedAlarmRuleState {
private long lastEventTs; private long lastEventTs;

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/state/PersistedAlarmState.java

@ -21,6 +21,7 @@ import org.thingsboard.server.common.data.alarm.AlarmSeverity;
import java.util.Map; import java.util.Map;
@Data @Data
@Deprecated
public class PersistedAlarmState { public class PersistedAlarmState {
private Map<AlarmSeverity, PersistedAlarmRuleState> createRuleStates; private Map<AlarmSeverity, PersistedAlarmRuleState> createRuleStates;

1
rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/profile/state/PersistedDeviceState.java

@ -20,6 +20,7 @@ import lombok.Data;
import java.util.Map; import java.util.Map;
@Data @Data
@Deprecated
public class PersistedDeviceState { public class PersistedDeviceState {
Map<String, PersistedAlarmState> alarmStates; Map<String, PersistedAlarmState> alarmStates;

Loading…
Cancel
Save