fixed TIMESERIES_UPDATED message handling
This commit is contained in:
parent
61254a6850
commit
832af90bd9
@ -590,7 +590,8 @@ public class JsonConverter {
|
|||||||
|
|
||||||
public static Map<Long, List<KvEntry>> convertToSortedTelemetry(JsonElement jsonElement, long systemTs) throws
|
public static Map<Long, List<KvEntry>> convertToSortedTelemetry(JsonElement jsonElement, long systemTs) throws
|
||||||
JsonSyntaxException {
|
JsonSyntaxException {
|
||||||
return convertToTelemetry(jsonElement, systemTs, true);
|
JsonElement timeseriesElement = jsonElement.isJsonObject() ? jsonElement.getAsJsonObject().get("timeseries") : null;
|
||||||
|
return convertToTelemetry(timeseriesElement != null ? timeseriesElement : jsonElement, systemTs, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Map<Long, List<KvEntry>> convertToTelemetry(JsonElement jsonElement, long systemTs, boolean sorted) throws
|
public static Map<Long, List<KvEntry>> convertToTelemetry(JsonElement jsonElement, long systemTs, boolean sorted) throws
|
||||||
|
|||||||
@ -66,6 +66,7 @@ import static org.thingsboard.server.common.data.msg.TbMsgType.ENTITY_UNASSIGNED
|
|||||||
import static org.thingsboard.server.common.data.msg.TbMsgType.INACTIVITY_EVENT;
|
import static org.thingsboard.server.common.data.msg.TbMsgType.INACTIVITY_EVENT;
|
||||||
import static org.thingsboard.server.common.data.msg.TbMsgType.POST_ATTRIBUTES_REQUEST;
|
import static org.thingsboard.server.common.data.msg.TbMsgType.POST_ATTRIBUTES_REQUEST;
|
||||||
import static org.thingsboard.server.common.data.msg.TbMsgType.POST_TELEMETRY_REQUEST;
|
import static org.thingsboard.server.common.data.msg.TbMsgType.POST_TELEMETRY_REQUEST;
|
||||||
|
import static org.thingsboard.server.common.data.msg.TbMsgType.TIMESERIES_UPDATED;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
class DeviceState {
|
class DeviceState {
|
||||||
@ -148,7 +149,7 @@ class DeviceState {
|
|||||||
latestValues = fetchLatestValues(ctx, deviceId);
|
latestValues = fetchLatestValues(ctx, deviceId);
|
||||||
}
|
}
|
||||||
boolean stateChanged = false;
|
boolean stateChanged = false;
|
||||||
if (msg.isTypeOf(POST_TELEMETRY_REQUEST)) {
|
if (msg.isTypeOf(POST_TELEMETRY_REQUEST) || msg.isTypeOf(TIMESERIES_UPDATED)) {
|
||||||
stateChanged = processTelemetry(ctx, msg);
|
stateChanged = processTelemetry(ctx, msg);
|
||||||
} else if (msg.isTypeOf(POST_ATTRIBUTES_REQUEST)) {
|
} else if (msg.isTypeOf(POST_ATTRIBUTES_REQUEST)) {
|
||||||
stateChanged = processAttributesUpdateRequest(ctx, msg);
|
stateChanged = processAttributesUpdateRequest(ctx, msg);
|
||||||
|
|||||||
@ -1981,6 +1981,74 @@ public class TbDeviceProfileNodeTest extends AbstractRuleNodeUpgradeTest {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAlarmCreateAfterTimeseriesUpdated() throws Exception {
|
||||||
|
init();
|
||||||
|
|
||||||
|
DeviceProfile deviceProfile = new DeviceProfile();
|
||||||
|
DeviceProfileData deviceProfileData = new DeviceProfileData();
|
||||||
|
|
||||||
|
AlarmConditionFilter highTempFilter = new AlarmConditionFilter();
|
||||||
|
highTempFilter.setKey(new AlarmConditionFilterKey(AlarmConditionKeyType.TIME_SERIES, "temperature"));
|
||||||
|
highTempFilter.setValueType(EntityKeyValueType.NUMERIC);
|
||||||
|
NumericFilterPredicate highTemperaturePredicate = new NumericFilterPredicate();
|
||||||
|
highTemperaturePredicate.setOperation(NumericFilterPredicate.NumericOperation.GREATER);
|
||||||
|
highTemperaturePredicate.setValue(new FilterPredicateValue<>(30.0));
|
||||||
|
highTempFilter.setPredicate(highTemperaturePredicate);
|
||||||
|
AlarmCondition alarmCondition = new AlarmCondition();
|
||||||
|
alarmCondition.setCondition(Collections.singletonList(highTempFilter));
|
||||||
|
AlarmRule alarmRule = new AlarmRule();
|
||||||
|
alarmRule.setCondition(alarmCondition);
|
||||||
|
DeviceProfileAlarm dpa = new DeviceProfileAlarm();
|
||||||
|
dpa.setId("highTemperatureAlarmID");
|
||||||
|
dpa.setAlarmType("highTemperatureAlarm");
|
||||||
|
dpa.setCreateRules(new TreeMap<>(Collections.singletonMap(AlarmSeverity.CRITICAL, alarmRule)));
|
||||||
|
|
||||||
|
AlarmConditionFilter lowTempFilter = new AlarmConditionFilter();
|
||||||
|
lowTempFilter.setKey(new AlarmConditionFilterKey(AlarmConditionKeyType.TIME_SERIES, "temperature"));
|
||||||
|
lowTempFilter.setValueType(EntityKeyValueType.NUMERIC);
|
||||||
|
NumericFilterPredicate lowTemperaturePredicate = new NumericFilterPredicate();
|
||||||
|
lowTemperaturePredicate.setOperation(NumericFilterPredicate.NumericOperation.LESS);
|
||||||
|
lowTemperaturePredicate.setValue(new FilterPredicateValue<>(10.0));
|
||||||
|
lowTempFilter.setPredicate(lowTemperaturePredicate);
|
||||||
|
AlarmRule clearRule = new AlarmRule();
|
||||||
|
AlarmCondition clearCondition = new AlarmCondition();
|
||||||
|
clearCondition.setCondition(Collections.singletonList(lowTempFilter));
|
||||||
|
clearRule.setCondition(clearCondition);
|
||||||
|
dpa.setClearRule(clearRule);
|
||||||
|
|
||||||
|
deviceProfileData.setAlarms(Collections.singletonList(dpa));
|
||||||
|
deviceProfile.setProfileData(deviceProfileData);
|
||||||
|
|
||||||
|
Mockito.when(cache.get(tenantId, deviceId)).thenReturn(deviceProfile);
|
||||||
|
Mockito.when(timeseriesService.findLatest(tenantId, deviceId, Collections.singleton("temperature")))
|
||||||
|
.thenReturn(Futures.immediateFuture(Collections.emptyList()));
|
||||||
|
Mockito.when(alarmService.findLatestActiveByOriginatorAndType(tenantId, deviceId, "highTemperatureAlarm")).thenReturn(null);
|
||||||
|
registerCreateAlarmMock(alarmService.createAlarm(any()), true);
|
||||||
|
|
||||||
|
TbMsg theMsg = TbMsg.newMsg()
|
||||||
|
.type(TbMsgType.ALARM)
|
||||||
|
.originator(deviceId)
|
||||||
|
.copyMetaData(TbMsgMetaData.EMPTY)
|
||||||
|
.data(TbMsg.EMPTY_STRING)
|
||||||
|
.build();
|
||||||
|
when(ctx.newMsg(any(), any(TbMsgType.class), any(), any(), any(), Mockito.anyString())).thenReturn(theMsg);
|
||||||
|
|
||||||
|
ObjectNode data = JacksonUtil.newObjectNode();
|
||||||
|
data.put("temperature", 42);
|
||||||
|
TbMsg msg = TbMsg.newMsg()
|
||||||
|
.type(TbMsgType.TIMESERIES_UPDATED)
|
||||||
|
.originator(deviceId)
|
||||||
|
.copyMetaData(TbMsgMetaData.EMPTY)
|
||||||
|
.dataType(TbMsgDataType.JSON)
|
||||||
|
.data(JacksonUtil.toString(data))
|
||||||
|
.build();
|
||||||
|
node.onMsg(ctx, msg);
|
||||||
|
verify(ctx).tellSuccess(msg);
|
||||||
|
verify(ctx).enqueueForTellNext(theMsg, "Alarm Created");
|
||||||
|
verify(ctx, Mockito.never()).tellFailure(Mockito.any(), Mockito.any());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected TbNode getTestNode() {
|
protected TbNode getTestNode() {
|
||||||
return node;
|
return node;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user