@ -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.Relatio nService ;
import org.thingsboard.server.dao.rule.RuleChai nService ;
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 ) ) ,