|
|
|
@ -15,7 +15,6 @@ |
|
|
|
*/ |
|
|
|
package org.thingsboard.server.cf; |
|
|
|
|
|
|
|
import com.fasterxml.jackson.databind.JsonNode; |
|
|
|
import com.fasterxml.jackson.databind.node.ArrayNode; |
|
|
|
import com.fasterxml.jackson.databind.node.ObjectNode; |
|
|
|
import org.junit.Test; |
|
|
|
@ -35,6 +34,8 @@ import org.thingsboard.server.common.data.cf.configuration.OutputType; |
|
|
|
import org.thingsboard.server.common.data.cf.configuration.ReferencedEntityKey; |
|
|
|
import org.thingsboard.server.common.data.cf.configuration.SimpleCalculatedFieldConfiguration; |
|
|
|
import org.thingsboard.server.common.data.debug.DebugSettings; |
|
|
|
import org.thingsboard.server.common.data.id.AssetProfileId; |
|
|
|
import org.thingsboard.server.common.data.id.EntityId; |
|
|
|
import org.thingsboard.server.controller.CalculatedFieldControllerTest; |
|
|
|
import org.thingsboard.server.dao.service.DaoSqlTest; |
|
|
|
|
|
|
|
@ -51,14 +52,10 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testSimpleCalculatedField() throws Exception { |
|
|
|
public void testSimpleCalculatedFieldWhenAllTelemetryPresent() throws Exception { |
|
|
|
Device testDevice = createDevice("Test device", "1234567890"); |
|
|
|
|
|
|
|
JsonNode timeSeries = JacksonUtil.toJsonNode("{\"temperature\":25}"); |
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, timeSeries); |
|
|
|
|
|
|
|
JsonNode attributes = JacksonUtil.toJsonNode("{\"deviceTemperature\":40}"); |
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, attributes); |
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"temperature\":25}")); |
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"deviceTemperature\":40}")); |
|
|
|
|
|
|
|
CalculatedField calculatedField = new CalculatedField(); |
|
|
|
calculatedField.setEntityId(testDevice.getId()); |
|
|
|
@ -72,15 +69,13 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes |
|
|
|
Argument argument = new Argument(); |
|
|
|
ReferencedEntityKey refEntityKey = new ReferencedEntityKey("temperature", ArgumentType.TS_LATEST, null); |
|
|
|
argument.setRefEntityKey(refEntityKey); |
|
|
|
|
|
|
|
argument.setDefaultValue("12"); // not used because real telemetry value in db is present
|
|
|
|
config.setArguments(Map.of("T", argument)); |
|
|
|
|
|
|
|
config.setExpression("(T * 9/5) + 32"); |
|
|
|
|
|
|
|
Output output = new Output(); |
|
|
|
output.setName("fahrenheitTemp"); |
|
|
|
output.setType(OutputType.TIME_SERIES); |
|
|
|
|
|
|
|
config.setOutput(output); |
|
|
|
|
|
|
|
calculatedField.setConfiguration(config); |
|
|
|
@ -91,19 +86,18 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
ObjectNode fahrenheitTemp = doGetAsync("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/values/timeseries?keys=fahrenheitTemp", ObjectNode.class); |
|
|
|
ObjectNode fahrenheitTemp = getLatestTelemetry(testDevice.getId(), "fahrenheitTemp"); |
|
|
|
assertThat(fahrenheitTemp).isNotNull(); |
|
|
|
assertThat(fahrenheitTemp.get("fahrenheitTemp").get(0).get("value").asText()).isEqualTo("77.0"); |
|
|
|
|
|
|
|
// update telemetry -> recalculate state
|
|
|
|
JsonNode newTelemetry = JacksonUtil.toJsonNode("{\"temperature\":30}"); |
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, newTelemetry); |
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"temperature\":30}")); |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
ObjectNode fahrenheitTempAfterUpdate = doGetAsync("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/values/timeseries?keys=fahrenheitTemp", ObjectNode.class); |
|
|
|
assertThat(fahrenheitTempAfterUpdate).isNotNull(); |
|
|
|
assertThat(fahrenheitTempAfterUpdate.get("fahrenheitTemp").get(0).get("value").asText()).isEqualTo("86.0"); |
|
|
|
fahrenheitTemp = getLatestTelemetry(testDevice.getId(), "fahrenheitTemp"); |
|
|
|
assertThat(fahrenheitTemp).isNotNull(); |
|
|
|
assertThat(fahrenheitTemp.get("fahrenheitTemp").get(0).get("value").asText()).isEqualTo("86.0"); |
|
|
|
|
|
|
|
// update CF output -> perform calculation with updated output
|
|
|
|
Output savedOutput = savedCalculatedField.getConfiguration().getOutput(); |
|
|
|
@ -114,21 +108,20 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
ArrayNode temperatureF = doGetAsync("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/values/attributes/SERVER_SCOPE?keys=temperatureF", ArrayNode.class); |
|
|
|
ArrayNode temperatureF = getServerAttributes(testDevice.getId(), "temperatureF"); |
|
|
|
assertThat(temperatureF).isNotNull(); |
|
|
|
assertThat(temperatureF.get(0).get("value").asText()).isEqualTo("86.0"); |
|
|
|
|
|
|
|
// update CF argument -> perform calculation with new argument
|
|
|
|
|
|
|
|
Argument savedArgument = savedCalculatedField.getConfiguration().getArguments().get("T"); |
|
|
|
savedArgument.setRefEntityKey(new ReferencedEntityKey("deviceTemperature", ArgumentType.ATTRIBUTE, AttributeScope.SERVER_SCOPE)); |
|
|
|
savedCalculatedField = doPost("/api/calculatedField", savedCalculatedField, CalculatedField.class); |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
ArrayNode temperatureFAfterUpdateArg = doGetAsync("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/values/attributes/SERVER_SCOPE?keys=temperatureF", ArrayNode.class); |
|
|
|
assertThat(temperatureFAfterUpdateArg).isNotNull(); |
|
|
|
assertThat(temperatureFAfterUpdateArg.get(0).get("value").asText()).isEqualTo("104.0"); |
|
|
|
temperatureF = getServerAttributes(testDevice.getId(), "temperatureF"); |
|
|
|
assertThat(temperatureF).isNotNull(); |
|
|
|
assertThat(temperatureF.get(0).get("value").asText()).isEqualTo("104.0"); |
|
|
|
|
|
|
|
// update CF expression -> perform calculation with new expression
|
|
|
|
savedCalculatedField.getConfiguration().setExpression("1.8 * T + 32"); |
|
|
|
@ -136,36 +129,116 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
ArrayNode temperatureFAfterUpdateExpression = doGetAsync("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/values/attributes/SERVER_SCOPE?keys=temperatureF", ArrayNode.class); |
|
|
|
assertThat(temperatureFAfterUpdateExpression).isNotNull(); |
|
|
|
assertThat(temperatureFAfterUpdateExpression.get(0).get("value").asText()).isEqualTo("104.0"); |
|
|
|
temperatureF = getServerAttributes(testDevice.getId(), "temperatureF"); |
|
|
|
assertThat(temperatureF).isNotNull(); |
|
|
|
assertThat(temperatureF.get(0).get("value").asText()).isEqualTo("104.0"); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testSimpleCalculatedFieldWhenEntityIdIsProfile() throws Exception { |
|
|
|
public void testSimpleCalculatedFieldWhenNotAllTelemetryPresent() throws Exception { |
|
|
|
Device testDevice = createDevice("Test device", "1234567890"); |
|
|
|
JsonNode deviceAttributes = JacksonUtil.toJsonNode("{\"x\":40}"); |
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, deviceAttributes); |
|
|
|
|
|
|
|
AssetProfile assetProfile = doPost("/api/assetProfile", createAssetProfile("Test Asset Profile"), AssetProfile.class); |
|
|
|
CalculatedField calculatedField = new CalculatedField(); |
|
|
|
calculatedField.setEntityId(testDevice.getId()); |
|
|
|
calculatedField.setType(CalculatedFieldType.SIMPLE); |
|
|
|
calculatedField.setName("C to F"); |
|
|
|
calculatedField.setDebugSettings(DebugSettings.all()); |
|
|
|
calculatedField.setConfigurationVersion(1); |
|
|
|
|
|
|
|
SimpleCalculatedFieldConfiguration config = new SimpleCalculatedFieldConfiguration(); |
|
|
|
|
|
|
|
Argument argument = new Argument(); |
|
|
|
ReferencedEntityKey refEntityKey = new ReferencedEntityKey("temperature", ArgumentType.TS_LATEST, null); |
|
|
|
argument.setRefEntityKey(refEntityKey); |
|
|
|
config.setArguments(Map.of("T", argument)); |
|
|
|
config.setExpression("(T * 9/5) + 32"); |
|
|
|
|
|
|
|
Output output = new Output(); |
|
|
|
output.setName("fahrenheitTemp"); |
|
|
|
output.setType(OutputType.TIME_SERIES); |
|
|
|
config.setOutput(output); |
|
|
|
|
|
|
|
calculatedField.setConfiguration(config); |
|
|
|
calculatedField.setVersion(1L); |
|
|
|
|
|
|
|
Asset asset1 = new Asset(); |
|
|
|
asset1.setName("Test asset 1"); |
|
|
|
asset1.setAssetProfileId(assetProfile.getId()); |
|
|
|
// create CF -> state is not ready -> no calculation performed
|
|
|
|
CalculatedField savedCalculatedField = doPost("/api/calculatedField", calculatedField, CalculatedField.class); |
|
|
|
|
|
|
|
Asset savedAsset1 = doPost("/api/asset", asset1, Asset.class); |
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
JsonNode asset1Attributes = JacksonUtil.toJsonNode("{\"y\":11}"); |
|
|
|
doPost("/api/plugins/telemetry/ASSET/" + savedAsset1.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, asset1Attributes); |
|
|
|
ObjectNode fahrenheitTemp = getLatestTelemetry(testDevice.getId(), "fahrenheitTemp"); |
|
|
|
assertThat(fahrenheitTemp).isNotNull(); |
|
|
|
assertThat(fahrenheitTemp.get("fahrenheitTemp").get(0).get("value").isNull()).isTrue(); |
|
|
|
|
|
|
|
Asset asset2 = new Asset(); |
|
|
|
asset2.setName("Test asset 2"); |
|
|
|
asset2.setAssetProfileId(assetProfile.getId()); |
|
|
|
// update telemetry -> perform calculation
|
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"temperature\":30}")); |
|
|
|
|
|
|
|
Asset savedAsset2 = doPost("/api/asset", asset2, Asset.class); |
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
JsonNode asset2Attributes = JacksonUtil.toJsonNode("{\"y\":12}"); |
|
|
|
doPost("/api/plugins/telemetry/ASSET/" + savedAsset2.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, asset2Attributes); |
|
|
|
fahrenheitTemp = getLatestTelemetry(testDevice.getId(), "fahrenheitTemp"); |
|
|
|
assertThat(fahrenheitTemp).isNotNull(); |
|
|
|
assertThat(fahrenheitTemp.get("fahrenheitTemp").get(0).get("value").asText()).isEqualTo("86.0"); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testSimpleCalculatedFieldWhenNotAllTelemetryPresentButDefaultValueIsSet() throws Exception { |
|
|
|
Device testDevice = createDevice("Test device", "1234567890"); |
|
|
|
|
|
|
|
CalculatedField calculatedField = new CalculatedField(); |
|
|
|
calculatedField.setEntityId(testDevice.getId()); |
|
|
|
calculatedField.setType(CalculatedFieldType.SIMPLE); |
|
|
|
calculatedField.setName("C to F"); |
|
|
|
calculatedField.setDebugSettings(DebugSettings.all()); |
|
|
|
calculatedField.setConfigurationVersion(1); |
|
|
|
|
|
|
|
SimpleCalculatedFieldConfiguration config = new SimpleCalculatedFieldConfiguration(); |
|
|
|
|
|
|
|
Argument argument = new Argument(); |
|
|
|
ReferencedEntityKey refEntityKey = new ReferencedEntityKey("temperature", ArgumentType.TS_LATEST, null); |
|
|
|
argument.setRefEntityKey(refEntityKey); |
|
|
|
argument.setDefaultValue("12"); |
|
|
|
config.setArguments(Map.of("T", argument)); |
|
|
|
config.setExpression("(T * 9/5) + 32"); |
|
|
|
|
|
|
|
Output output = new Output(); |
|
|
|
output.setName("fahrenheitTemp"); |
|
|
|
output.setType(OutputType.TIME_SERIES); |
|
|
|
config.setOutput(output); |
|
|
|
|
|
|
|
calculatedField.setConfiguration(config); |
|
|
|
calculatedField.setVersion(1L); |
|
|
|
|
|
|
|
// create CF -> perform initial calculation with default value
|
|
|
|
CalculatedField savedCalculatedField = doPost("/api/calculatedField", calculatedField, CalculatedField.class); |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
ObjectNode fahrenheitTemp = getLatestTelemetry(testDevice.getId(), "fahrenheitTemp"); |
|
|
|
assertThat(fahrenheitTemp).isNotNull(); |
|
|
|
assertThat(fahrenheitTemp.get("fahrenheitTemp").get(0).get("value").asText()).isEqualTo("53.6"); |
|
|
|
|
|
|
|
// update telemetry -> recalculate state
|
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"temperature\":30}")); |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
fahrenheitTemp = getLatestTelemetry(testDevice.getId(), "fahrenheitTemp"); |
|
|
|
assertThat(fahrenheitTemp).isNotNull(); |
|
|
|
assertThat(fahrenheitTemp.get("fahrenheitTemp").get(0).get("value").asText()).isEqualTo("86.0"); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testSimpleCalculatedFieldWhenEntityIdIsProfile() throws Exception { |
|
|
|
Device testDevice = createDevice("Test device", "1234567890"); |
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"x\":40}")); |
|
|
|
|
|
|
|
AssetProfile assetProfile = doPost("/api/assetProfile", createAssetProfile("Test Asset Profile"), AssetProfile.class); |
|
|
|
|
|
|
|
Asset asset1 = createAsset("Test asset 1", assetProfile.getId()); |
|
|
|
doPost("/api/plugins/telemetry/ASSET/" + asset1.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"y\":11}")); |
|
|
|
|
|
|
|
Asset asset2 = createAsset("Test asset 2", assetProfile.getId()); |
|
|
|
doPost("/api/plugins/telemetry/ASSET/" + asset2.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"y\":12}")); |
|
|
|
|
|
|
|
CalculatedField calculatedField = new CalculatedField(); |
|
|
|
calculatedField.setEntityId(assetProfile.getId()); |
|
|
|
@ -205,62 +278,178 @@ public class CalculatedFieldIntegrationTest extends CalculatedFieldControllerTes |
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
// result of asset 1
|
|
|
|
ArrayNode z1 = doGetAsync("/api/plugins/telemetry/ASSET/" + savedAsset1.getUuidId() + "/values/attributes/SERVER_SCOPE?keys=z", ArrayNode.class); |
|
|
|
ArrayNode z1 = getServerAttributes(asset1.getId(), "z"); |
|
|
|
assertThat(z1).isNotNull(); |
|
|
|
assertThat(z1.get(0).get("value").asText()).isEqualTo("51.0"); |
|
|
|
|
|
|
|
// result of asset 2
|
|
|
|
ArrayNode z2 = doGetAsync("/api/plugins/telemetry/ASSET/" + savedAsset2.getUuidId() + "/values/attributes/SERVER_SCOPE?keys=z", ArrayNode.class); |
|
|
|
ArrayNode z2 = getServerAttributes(asset2.getId(), "z"); |
|
|
|
assertThat(z2).isNotNull(); |
|
|
|
assertThat(z2.get(0).get("value").asText()).isEqualTo("52.0"); |
|
|
|
|
|
|
|
// update device telemetry -> recalculate state for all assets
|
|
|
|
JsonNode updatedDeviceAttributes = JacksonUtil.toJsonNode("{\"x\":25}"); |
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, updatedDeviceAttributes); |
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"x\":25}")); |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
// result of asset 1
|
|
|
|
ArrayNode updZ1 = doGetAsync("/api/plugins/telemetry/ASSET/" + savedAsset1.getUuidId() + "/values/attributes/SERVER_SCOPE?keys=z", ArrayNode.class); |
|
|
|
assertThat(updZ1).isNotNull(); |
|
|
|
assertThat(updZ1.get(0).get("value").asText()).isEqualTo("36.0"); |
|
|
|
z1 = getServerAttributes(asset1.getId(), "z"); |
|
|
|
assertThat(z1).isNotNull(); |
|
|
|
assertThat(z1.get(0).get("value").asText()).isEqualTo("36.0"); |
|
|
|
|
|
|
|
// result of asset 2
|
|
|
|
ArrayNode updZ2 = doGetAsync("/api/plugins/telemetry/ASSET/" + savedAsset2.getUuidId() + "/values/attributes/SERVER_SCOPE?keys=z", ArrayNode.class); |
|
|
|
assertThat(updZ2).isNotNull(); |
|
|
|
assertThat(updZ2.get(0).get("value").asText()).isEqualTo("37.0"); |
|
|
|
|
|
|
|
// // update asset 1 telemetry -> recalculate state only for asset 1
|
|
|
|
// JsonNode updatedAsset1Attributes = JacksonUtil.toJsonNode("{\"x\":15}");
|
|
|
|
// doPost("/api/plugins/telemetry/DEVICE/" + asset1.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, updatedAsset1Attributes);
|
|
|
|
//
|
|
|
|
// Thread.sleep(300);
|
|
|
|
//
|
|
|
|
// // result of asset 1
|
|
|
|
// updZ1 = doGetAsync("/api/plugins/telemetry/ASSET/" + savedAsset1.getUuidId() + "/values/attributes/SERVER_SCOPE?keys=z", ArrayNode.class);
|
|
|
|
// assertThat(updZ1).isNotNull();
|
|
|
|
// assertThat(updZ1.get(0).get("value").asText()).isEqualTo("40.0");
|
|
|
|
//
|
|
|
|
// // result of asset 2 (no changes)
|
|
|
|
// updZ2 = doGetAsync("/api/plugins/telemetry/ASSET/" + savedAsset2.getUuidId() + "/values/attributes/SERVER_SCOPE?keys=z", ArrayNode.class);
|
|
|
|
// assertThat(updZ2).isNotNull();
|
|
|
|
// assertThat(updZ2.get(0).get("value").asText()).isEqualTo("37.0");
|
|
|
|
//
|
|
|
|
// // update asset 2 telemetry -> recalculate state only for asset 2
|
|
|
|
// JsonNode updatedAsset2Attributes = JacksonUtil.toJsonNode("{\"x\":5}");
|
|
|
|
// doPost("/api/plugins/telemetry/DEVICE/" + asset2.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, updatedAsset2Attributes);
|
|
|
|
//
|
|
|
|
// Thread.sleep(300);
|
|
|
|
//
|
|
|
|
// // result of asset 1 (no changes)
|
|
|
|
// updZ1 = doGetAsync("/api/plugins/telemetry/ASSET/" + savedAsset1.getUuidId() + "/values/attributes/SERVER_SCOPE?keys=z", ArrayNode.class);
|
|
|
|
// assertThat(updZ1).isNotNull();
|
|
|
|
// assertThat(updZ1.get(0).get("value").asText()).isEqualTo("40.0");
|
|
|
|
//
|
|
|
|
// // result of asset 2
|
|
|
|
// updZ2 = doGetAsync("/api/plugins/telemetry/ASSET/" + savedAsset2.getUuidId() + "/values/attributes/SERVER_SCOPE?keys=z", ArrayNode.class);
|
|
|
|
// assertThat(updZ2).isNotNull();
|
|
|
|
// assertThat(updZ2.get(0).get("value").asText()).isEqualTo("30.0");
|
|
|
|
z2 = getServerAttributes(asset2.getId(), "z"); |
|
|
|
assertThat(z2).isNotNull(); |
|
|
|
assertThat(z2.get(0).get("value").asText()).isEqualTo("37.0"); |
|
|
|
|
|
|
|
// update asset 1 telemetry -> recalculate state only for asset 1
|
|
|
|
doPost("/api/plugins/telemetry/ASSET/" + asset1.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"y\":15}")); |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
// result of asset 1
|
|
|
|
z1 = getServerAttributes(asset1.getId(), "z"); |
|
|
|
assertThat(z1).isNotNull(); |
|
|
|
assertThat(z1.get(0).get("value").asText()).isEqualTo("40.0"); |
|
|
|
|
|
|
|
// result of asset 2 (no changes)
|
|
|
|
z2 = getServerAttributes(asset2.getId(), "z"); |
|
|
|
assertThat(z2).isNotNull(); |
|
|
|
assertThat(z2.get(0).get("value").asText()).isEqualTo("37.0"); |
|
|
|
|
|
|
|
// update asset 2 telemetry -> recalculate state only for asset 2
|
|
|
|
doPost("/api/plugins/telemetry/ASSET/" + asset2.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"y\":5}")); |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
// result of asset 1 (no changes)
|
|
|
|
z1 = getServerAttributes(asset1.getId(), "z"); |
|
|
|
assertThat(z1).isNotNull(); |
|
|
|
assertThat(z1.get(0).get("value").asText()).isEqualTo("40.0"); |
|
|
|
|
|
|
|
// result of asset 2
|
|
|
|
z2 = getServerAttributes(asset2.getId(), "z"); |
|
|
|
assertThat(z2).isNotNull(); |
|
|
|
assertThat(z2.get(0).get("value").asText()).isEqualTo("30.0"); |
|
|
|
|
|
|
|
// add new entity to profile -> calculate state for new entity
|
|
|
|
Asset asset3 = createAsset("Test asset 3", assetProfile.getId()); |
|
|
|
doPost("/api/plugins/telemetry/ASSET/" + asset3.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"y\":13}")); |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
// result of asset 3
|
|
|
|
ArrayNode z3 = getServerAttributes(asset3.getId(), "z"); |
|
|
|
assertThat(z3).isNotNull(); |
|
|
|
assertThat(z3.get(0).get("value").asText()).isEqualTo("38.0"); |
|
|
|
|
|
|
|
// update device telemetry -> recalculate state for all assets
|
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"x\":20}")); |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
// result of asset 1
|
|
|
|
z1 = getServerAttributes(asset1.getId(), "z"); |
|
|
|
assertThat(z1).isNotNull(); |
|
|
|
assertThat(z1.get(0).get("value").asText()).isEqualTo("35.0"); |
|
|
|
|
|
|
|
// result of asset 2
|
|
|
|
z2 = getServerAttributes(asset2.getId(), "z"); |
|
|
|
assertThat(z2).isNotNull(); |
|
|
|
assertThat(z2.get(0).get("value").asText()).isEqualTo("25.0"); |
|
|
|
|
|
|
|
// result of asset 3
|
|
|
|
z3 = getServerAttributes(asset3.getId(), "z"); |
|
|
|
assertThat(z3).isNotNull(); |
|
|
|
assertThat(z3.get(0).get("value").asText()).isEqualTo("33.0"); |
|
|
|
|
|
|
|
// update profile for asset 3 -> delete state for asset 3
|
|
|
|
AssetProfile newAssetProfile = doPost("/api/assetProfile", createAssetProfile("New Asset Profile"), AssetProfile.class); |
|
|
|
asset3.setAssetProfileId(newAssetProfile.getId()); |
|
|
|
asset3 = doPost("/api/asset", asset3, Asset.class); |
|
|
|
|
|
|
|
// update device telemetry -> recalculate state for asset 1 and asset 2
|
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/attributes/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"x\":15}")); |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
// result of asset 1
|
|
|
|
z1 = getServerAttributes(asset1.getId(), "z"); |
|
|
|
assertThat(z1).isNotNull(); |
|
|
|
assertThat(z1.get(0).get("value").asText()).isEqualTo("30.0"); |
|
|
|
|
|
|
|
// result of asset 2
|
|
|
|
z2 = getServerAttributes(asset2.getId(), "z"); |
|
|
|
assertThat(z2).isNotNull(); |
|
|
|
assertThat(z2.get(0).get("value").asText()).isEqualTo("20.0"); |
|
|
|
|
|
|
|
// no changes for asset 3
|
|
|
|
z3 = getServerAttributes(asset3.getId(), "z"); |
|
|
|
assertThat(z3).isNotNull(); |
|
|
|
assertThat(z3.get(0).get("value").asText()).isEqualTo("33.0"); |
|
|
|
} |
|
|
|
|
|
|
|
@Test |
|
|
|
public void testSimpleCalculatedFieldWhenExpressionIsInvalid() throws Exception { |
|
|
|
Device testDevice = createDevice("Test device", "1234567890"); |
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"temperature\":25}")); |
|
|
|
|
|
|
|
CalculatedField calculatedField = new CalculatedField(); |
|
|
|
calculatedField.setEntityId(testDevice.getId()); |
|
|
|
calculatedField.setType(CalculatedFieldType.SIMPLE); |
|
|
|
calculatedField.setName("C to F"); |
|
|
|
calculatedField.setDebugSettings(DebugSettings.all()); |
|
|
|
calculatedField.setConfigurationVersion(1); |
|
|
|
|
|
|
|
SimpleCalculatedFieldConfiguration config = new SimpleCalculatedFieldConfiguration(); |
|
|
|
|
|
|
|
Argument argument = new Argument(); |
|
|
|
ReferencedEntityKey refEntityKey = new ReferencedEntityKey("temperature", ArgumentType.TS_LATEST, null); |
|
|
|
argument.setRefEntityKey(refEntityKey); |
|
|
|
argument.setDefaultValue("12"); // not used because real telemetry value in db is present
|
|
|
|
config.setArguments(Map.of("T", argument)); |
|
|
|
config.setExpression("(T * 9/0) + 32"); |
|
|
|
|
|
|
|
Output output = new Output(); |
|
|
|
output.setName("fahrenheitTemp"); |
|
|
|
output.setType(OutputType.TIME_SERIES); |
|
|
|
config.setOutput(output); |
|
|
|
|
|
|
|
calculatedField.setConfiguration(config); |
|
|
|
calculatedField.setVersion(1L); |
|
|
|
|
|
|
|
// create CF -> ctx is not initialized -> no calculation perform
|
|
|
|
CalculatedField savedCalculatedField = doPost("/api/calculatedField", calculatedField, CalculatedField.class); |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
ObjectNode fahrenheitTemp = getLatestTelemetry(testDevice.getId(), "fahrenheitTemp"); |
|
|
|
assertThat(fahrenheitTemp).isNotNull(); |
|
|
|
assertThat(fahrenheitTemp.get("fahrenheitTemp").get(0).get("value").isNull()).isTrue(); |
|
|
|
|
|
|
|
// update telemetry -> ctx is not initialized -> no calculation perform
|
|
|
|
doPost("/api/plugins/telemetry/DEVICE/" + testDevice.getUuidId() + "/timeseries/" + DataConstants.SERVER_SCOPE, JacksonUtil.toJsonNode("{\"temperature\":30}")); |
|
|
|
|
|
|
|
Thread.sleep(300); |
|
|
|
|
|
|
|
fahrenheitTemp = getLatestTelemetry(testDevice.getId(), "fahrenheitTemp"); |
|
|
|
assertThat(fahrenheitTemp).isNotNull(); |
|
|
|
assertThat(fahrenheitTemp.get("fahrenheitTemp").get(0).get("value").isNull()).isTrue(); |
|
|
|
} |
|
|
|
|
|
|
|
private ObjectNode getLatestTelemetry(EntityId entityId, String... keys) throws Exception { |
|
|
|
return doGetAsync("/api/plugins/telemetry/" + entityId.getEntityType() + "/" + entityId.getId() + "/values/timeseries?keys=" + String.join(",", keys), ObjectNode.class); |
|
|
|
} |
|
|
|
|
|
|
|
private ArrayNode getServerAttributes(EntityId entityId, String... keys) throws Exception { |
|
|
|
return doGetAsync("/api/plugins/telemetry/" + entityId.getEntityType() + "/" + entityId.getId() + "/values/attributes/SERVER_SCOPE?keys=" + String.join(",", keys), ArrayNode.class); |
|
|
|
} |
|
|
|
|
|
|
|
private Asset createAsset(String name, AssetProfileId assetProfileId) { |
|
|
|
Asset asset = new Asset(); |
|
|
|
asset.setName(name); |
|
|
|
asset.setAssetProfileId(assetProfileId); |
|
|
|
return doPost("/api/asset", asset, Asset.class); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|