|
|
|
@ -28,12 +28,21 @@ import org.thingsboard.server.common.data.Customer; |
|
|
|
import org.thingsboard.server.common.data.DataConstants; |
|
|
|
import org.thingsboard.server.common.data.Device; |
|
|
|
import org.thingsboard.server.common.data.DeviceProfile; |
|
|
|
import org.thingsboard.server.common.data.DeviceProfileProvisionType; |
|
|
|
import org.thingsboard.server.common.data.DeviceProfileType; |
|
|
|
import org.thingsboard.server.common.data.DeviceTransportType; |
|
|
|
import org.thingsboard.server.common.data.Tenant; |
|
|
|
import org.thingsboard.server.common.data.TenantProfile; |
|
|
|
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; |
|
|
|
import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; |
|
|
|
import org.thingsboard.server.common.data.User; |
|
|
|
import org.thingsboard.server.common.data.asset.Asset; |
|
|
|
import org.thingsboard.server.common.data.alarm.AlarmSeverity; |
|
|
|
import org.thingsboard.server.common.data.device.profile.AlarmCondition; |
|
|
|
import org.thingsboard.server.common.data.device.profile.AlarmRule; |
|
|
|
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.DeviceProfileAlarm; |
|
|
|
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.SimpleAlarmConditionSpec; |
|
|
|
import org.thingsboard.server.common.data.id.CustomerId; |
|
|
|
import org.thingsboard.server.common.data.id.DeviceId; |
|
|
|
import org.thingsboard.server.common.data.id.DeviceProfileId; |
|
|
|
@ -42,19 +51,29 @@ import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry; |
|
|
|
import org.thingsboard.server.common.data.kv.BooleanDataEntry; |
|
|
|
import org.thingsboard.server.common.data.kv.DoubleDataEntry; |
|
|
|
import org.thingsboard.server.common.data.kv.LongDataEntry; |
|
|
|
import org.thingsboard.server.common.data.relation.EntityRelation; |
|
|
|
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.EntityKey; |
|
|
|
import org.thingsboard.server.common.data.query.EntityKeyType; |
|
|
|
import org.thingsboard.server.common.data.query.EntityKeyValueType; |
|
|
|
import org.thingsboard.server.common.data.query.FilterPredicateValue; |
|
|
|
import org.thingsboard.server.common.data.query.KeyFilter; |
|
|
|
import org.thingsboard.server.common.data.query.NumericFilterPredicate; |
|
|
|
import org.thingsboard.server.common.data.security.Authority; |
|
|
|
import org.thingsboard.server.common.data.security.DeviceCredentials; |
|
|
|
import org.thingsboard.server.common.data.security.UserCredentials; |
|
|
|
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration; |
|
|
|
import org.thingsboard.server.common.data.tenant.profile.TenantProfileData; |
|
|
|
import org.thingsboard.server.common.data.widget.WidgetsBundle; |
|
|
|
import org.thingsboard.server.dao.asset.AssetService; |
|
|
|
import org.thingsboard.server.dao.attributes.AttributesService; |
|
|
|
import org.thingsboard.server.dao.customer.CustomerService; |
|
|
|
import org.thingsboard.server.dao.device.DeviceCredentialsService; |
|
|
|
import org.thingsboard.server.dao.device.DeviceProfileService; |
|
|
|
import org.thingsboard.server.dao.device.DeviceService; |
|
|
|
import org.thingsboard.server.dao.exception.DataValidationException; |
|
|
|
import org.thingsboard.server.dao.relation.RelationService; |
|
|
|
import org.thingsboard.server.dao.rule.RuleChainService; |
|
|
|
import org.thingsboard.server.dao.settings.AdminSettingsService; |
|
|
|
import org.thingsboard.server.dao.tenant.TenantProfileService; |
|
|
|
import org.thingsboard.server.dao.tenant.TenantService; |
|
|
|
@ -62,6 +81,8 @@ import org.thingsboard.server.dao.user.UserService; |
|
|
|
import org.thingsboard.server.dao.widget.WidgetsBundleService; |
|
|
|
|
|
|
|
import java.util.Arrays; |
|
|
|
import java.util.Collections; |
|
|
|
import java.util.LinkedHashMap; |
|
|
|
|
|
|
|
@Service |
|
|
|
@Profile("install") |
|
|
|
@ -96,12 +117,6 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { |
|
|
|
@Autowired |
|
|
|
private CustomerService customerService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private RelationService relationService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private AssetService assetService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private DeviceService deviceService; |
|
|
|
|
|
|
|
@ -114,6 +129,9 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { |
|
|
|
@Autowired |
|
|
|
private DeviceCredentialsService deviceCredentialsService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private RuleChainService ruleChainService; |
|
|
|
|
|
|
|
@Bean |
|
|
|
protected BCryptPasswordEncoder passwordEncoder() { |
|
|
|
return new BCryptPasswordEncoder(); |
|
|
|
@ -245,19 +263,133 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { |
|
|
|
createDevice(demoTenant.getId(), null, defaultDeviceProfile.getId(), "Raspberry Pi Demo Device", "RASPBERRY_PI_DEMO_TOKEN", "Demo device that is used in " + |
|
|
|
"Raspberry Pi GPIO control sample application"); |
|
|
|
|
|
|
|
Asset thermostatAlarms = new Asset(); |
|
|
|
thermostatAlarms.setTenantId(demoTenant.getId()); |
|
|
|
thermostatAlarms.setName("Thermostat Alarms"); |
|
|
|
thermostatAlarms.setType("AlarmPropagationAsset"); |
|
|
|
thermostatAlarms = assetService.saveAsset(thermostatAlarms); |
|
|
|
|
|
|
|
DeviceProfile thermostatDeviceProfile = this.deviceProfileService.findOrCreateDeviceProfile(demoTenant.getId(), "thermostat"); |
|
|
|
|
|
|
|
DeviceId t1Id = createDevice(demoTenant.getId(), null, thermostatDeviceProfile.getId(), "Thermostat T1", "T1_TEST_TOKEN", "Demo device for Thermostats dashboard").getId(); |
|
|
|
DeviceId t2Id = createDevice(demoTenant.getId(), null, thermostatDeviceProfile.getId(), "Thermostat T2", "T2_TEST_TOKEN", "Demo device for Thermostats dashboard").getId(); |
|
|
|
|
|
|
|
relationService.saveRelation(thermostatAlarms.getTenantId(), new EntityRelation(thermostatAlarms.getId(), t1Id, "ToAlarmPropagationAsset")); |
|
|
|
relationService.saveRelation(thermostatAlarms.getTenantId(), new EntityRelation(thermostatAlarms.getId(), t2Id, "ToAlarmPropagationAsset")); |
|
|
|
DeviceProfile thermostatDeviceProfile = new DeviceProfile(); |
|
|
|
thermostatDeviceProfile.setTenantId(demoTenant.getId()); |
|
|
|
thermostatDeviceProfile.setDefault(false); |
|
|
|
thermostatDeviceProfile.setName("thermostat"); |
|
|
|
thermostatDeviceProfile.setType(DeviceProfileType.DEFAULT); |
|
|
|
thermostatDeviceProfile.setTransportType(DeviceTransportType.DEFAULT); |
|
|
|
thermostatDeviceProfile.setProvisionType(DeviceProfileProvisionType.DISABLED); |
|
|
|
thermostatDeviceProfile.setDescription("Thermostat device profile"); |
|
|
|
thermostatDeviceProfile.setDefaultRuleChainId(ruleChainService.findTenantRuleChains( |
|
|
|
demoTenant.getId(), new PageLink(1, 0, "Thermostat Alarms")).getData().get(0).getId()); |
|
|
|
|
|
|
|
DeviceProfileData deviceProfileData = new DeviceProfileData(); |
|
|
|
DefaultDeviceProfileConfiguration configuration = new DefaultDeviceProfileConfiguration(); |
|
|
|
DefaultDeviceProfileTransportConfiguration transportConfiguration = new DefaultDeviceProfileTransportConfiguration(); |
|
|
|
DisabledDeviceProfileProvisionConfiguration provisionConfiguration = new DisabledDeviceProfileProvisionConfiguration(null); |
|
|
|
deviceProfileData.setConfiguration(configuration); |
|
|
|
deviceProfileData.setTransportConfiguration(transportConfiguration); |
|
|
|
deviceProfileData.setProvisionConfiguration(provisionConfiguration); |
|
|
|
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()); |
|
|
|
|
|
|
|
KeyFilter alarmTemperatureAttributeFilter = new KeyFilter(); |
|
|
|
alarmTemperatureAttributeFilter.setKey(new EntityKey(EntityKeyType.ATTRIBUTE, "alarmTemperature")); |
|
|
|
alarmTemperatureAttributeFilter.setValueType(EntityKeyValueType.BOOLEAN); |
|
|
|
BooleanFilterPredicate alarmTemperatureAttributePredicate = new BooleanFilterPredicate(); |
|
|
|
alarmTemperatureAttributePredicate.setOperation(BooleanFilterPredicate.BooleanOperation.EQUAL); |
|
|
|
alarmTemperatureAttributePredicate.setValue(new FilterPredicateValue<>(Boolean.TRUE)); |
|
|
|
alarmTemperatureAttributeFilter.setPredicate(alarmTemperatureAttributePredicate); |
|
|
|
|
|
|
|
KeyFilter temperatureTimeseriesFilter = new KeyFilter(); |
|
|
|
temperatureTimeseriesFilter.setKey(new EntityKey(EntityKeyType.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, "thresholdTemperature")); |
|
|
|
temperatureTimeseriesFilterPredicate.setValue(temperatureTimeseriesPredicateValue); |
|
|
|
temperatureTimeseriesFilter.setPredicate(temperatureTimeseriesFilterPredicate); |
|
|
|
temperatureCondition.setCondition(Arrays.asList(alarmTemperatureAttributeFilter, temperatureTimeseriesFilter)); |
|
|
|
temperatureRule.setAlarmDetails("Current temperature = ${temperature}"); |
|
|
|
temperatureRule.setCondition(temperatureCondition); |
|
|
|
highTemperature.setCreateRules(new LinkedHashMap<>(Collections.singletonMap(AlarmSeverity.MAJOR, temperatureRule))); |
|
|
|
|
|
|
|
AlarmRule clearTemperatureRule = new AlarmRule(); |
|
|
|
AlarmCondition clearTemperatureCondition = new AlarmCondition(); |
|
|
|
clearTemperatureCondition.setSpec(new SimpleAlarmConditionSpec()); |
|
|
|
|
|
|
|
KeyFilter clearTemperatureTimeseriesFilter = new KeyFilter(); |
|
|
|
clearTemperatureTimeseriesFilter.setKey(new EntityKey(EntityKeyType.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, "thresholdTemperature")); |
|
|
|
|
|
|
|
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()); |
|
|
|
|
|
|
|
KeyFilter alarmHumidityAttributeFilter = new KeyFilter(); |
|
|
|
alarmHumidityAttributeFilter.setKey(new EntityKey(EntityKeyType.ATTRIBUTE, "alarmHumidity")); |
|
|
|
alarmHumidityAttributeFilter.setValueType(EntityKeyValueType.BOOLEAN); |
|
|
|
BooleanFilterPredicate alarmHumidityAttributePredicate = new BooleanFilterPredicate(); |
|
|
|
alarmHumidityAttributePredicate.setOperation(BooleanFilterPredicate.BooleanOperation.EQUAL); |
|
|
|
alarmHumidityAttributePredicate.setValue(new FilterPredicateValue<>(Boolean.TRUE)); |
|
|
|
alarmHumidityAttributeFilter.setPredicate(alarmHumidityAttributePredicate); |
|
|
|
|
|
|
|
KeyFilter humidityTimeseriesFilter = new KeyFilter(); |
|
|
|
humidityTimeseriesFilter.setKey(new EntityKey(EntityKeyType.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, "thresholdHumidity")); |
|
|
|
humidityTimeseriesFilterPredicate.setValue(humidityTimeseriesPredicateValue); |
|
|
|
humidityTimeseriesFilter.setPredicate(humidityTimeseriesFilterPredicate); |
|
|
|
humidityCondition.setCondition(Arrays.asList(alarmHumidityAttributeFilter, humidityTimeseriesFilter)); |
|
|
|
|
|
|
|
humidityRule.setCondition(humidityCondition); |
|
|
|
humidityRule.setAlarmDetails("Current humidity = ${humidity}"); |
|
|
|
lowHumidity.setCreateRules(new LinkedHashMap<>(Collections.singletonMap(AlarmSeverity.MINOR, humidityRule))); |
|
|
|
|
|
|
|
AlarmRule clearHumidityRule = new AlarmRule(); |
|
|
|
AlarmCondition clearHumidityCondition = new AlarmCondition(); |
|
|
|
clearHumidityCondition.setSpec(new SimpleAlarmConditionSpec()); |
|
|
|
|
|
|
|
KeyFilter clearHumidityTimeseriesFilter = new KeyFilter(); |
|
|
|
clearHumidityTimeseriesFilter.setKey(new EntityKey(EntityKeyType.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, "thresholdHumidity")); |
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
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(); |
|
|
|
|
|
|
|
attributesService.save(demoTenant.getId(), t1Id, DataConstants.SERVER_SCOPE, |
|
|
|
Arrays.asList(new BaseAttributeKvEntry(System.currentTimeMillis(), new DoubleDataEntry("latitude", 37.3948)), |
|
|
|
|