TbGetTelemetryCertainTimeRangeNode
This commit is contained in:
		
							parent
							
								
									291634c10f
								
							
						
					
					
						commit
						4ac26bc664
					
				@ -0,0 +1,105 @@
 | 
				
			|||||||
 | 
					package org.thingsboard.rule.engine.metadata;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.JsonNode;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.ObjectMapper;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.node.ArrayNode;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.node.ObjectNode;
 | 
				
			||||||
 | 
					import com.google.common.util.concurrent.ListenableFuture;
 | 
				
			||||||
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
 | 
					import org.thingsboard.rule.engine.api.*;
 | 
				
			||||||
 | 
					import org.thingsboard.rule.engine.api.util.DonAsynchron;
 | 
				
			||||||
 | 
					import org.thingsboard.rule.engine.api.util.TbNodeUtils;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.kv.BaseTsKvQuery;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.kv.TsKvEntry;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.kv.TsKvQuery;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.data.plugin.ComponentType;
 | 
				
			||||||
 | 
					import org.thingsboard.server.common.msg.TbMsg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.concurrent.ExecutionException;
 | 
				
			||||||
 | 
					import java.util.concurrent.TimeUnit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static org.thingsboard.rule.engine.api.TbRelationTypes.SUCCESS;
 | 
				
			||||||
 | 
					import static org.thingsboard.server.common.data.kv.Aggregation.NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Created by mshvayka on 04.09.18.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Slf4j
 | 
				
			||||||
 | 
					@RuleNode(type = ComponentType.ENRICHMENT,
 | 
				
			||||||
 | 
					        name = "huy",
 | 
				
			||||||
 | 
					        configClazz = TbGetTelemetryCertainTimeRangeNodeConfiguration.class,
 | 
				
			||||||
 | 
					        nodeDescription = "",
 | 
				
			||||||
 | 
					        nodeDetails = "",
 | 
				
			||||||
 | 
					        uiResources = "", //{"static/rulenode/rulenode-core-config.js"},
 | 
				
			||||||
 | 
					        configDirective = "")
 | 
				
			||||||
 | 
					public class TbGetTelemetryCertainTimeRangeNode implements TbNode {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private TbGetTelemetryCertainTimeRangeNodeConfiguration config;
 | 
				
			||||||
 | 
					    private List<String> tsKeyNames;
 | 
				
			||||||
 | 
					    private long startTsOffset;
 | 
				
			||||||
 | 
					    private long endTsOffset;
 | 
				
			||||||
 | 
					    private int limit;
 | 
				
			||||||
 | 
					    private ObjectMapper mapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void init(TbContext ctx, TbNodeConfiguration configuration) throws TbNodeException {
 | 
				
			||||||
 | 
					        this.config = TbNodeUtils.convert(configuration, TbGetTelemetryCertainTimeRangeNodeConfiguration.class);
 | 
				
			||||||
 | 
					        tsKeyNames = config.getLatestTsKeyNames();
 | 
				
			||||||
 | 
					        startTsOffset = TimeUnit.valueOf(config.getStartIntervalTimeUnit()).toMillis(config.getStartInterval());
 | 
				
			||||||
 | 
					        endTsOffset = TimeUnit.valueOf(config.getEndIntervalTimeUnit()).toMillis(config.getEndInterval());
 | 
				
			||||||
 | 
					        limit = config.getFetchMode().equals(TbGetTelemetryCertainTimeRangeNodeConfiguration.FETCH_MODE_ALL)
 | 
				
			||||||
 | 
					                ? TbGetTelemetryCertainTimeRangeNodeConfiguration.MAX_FETCH_SIZE : 1;
 | 
				
			||||||
 | 
					        mapper = new ObjectMapper();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void onMsg(TbContext ctx, TbMsg msg) throws ExecutionException, InterruptedException, TbNodeException {
 | 
				
			||||||
 | 
					        ObjectNode resultNode = mapper.createObjectNode();
 | 
				
			||||||
 | 
					        List<TsKvQuery> queries = new ArrayList<>();
 | 
				
			||||||
 | 
					        long ts = System.currentTimeMillis();
 | 
				
			||||||
 | 
					        long startTs = ts - startTsOffset;
 | 
				
			||||||
 | 
					        long endTs = ts - endTsOffset;
 | 
				
			||||||
 | 
					        if (tsKeyNames.isEmpty()) {
 | 
				
			||||||
 | 
					            ctx.tellFailure(msg, new Exception("Telemetry not found"));
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            for (String key : tsKeyNames) {
 | 
				
			||||||
 | 
					                //TODO: handle direction;
 | 
				
			||||||
 | 
					                queries.add(new BaseTsKvQuery(key, startTs, endTs, 1, limit, NONE));
 | 
				
			||||||
 | 
					                if (limit == TbGetTelemetryCertainTimeRangeNodeConfiguration.MAX_FETCH_SIZE) {
 | 
				
			||||||
 | 
					                    resultNode.set(key, mapper.createArrayNode());
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    resultNode.putObject(key);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                ListenableFuture<List<TsKvEntry>> list = ctx.getTimeseriesService().findAll(msg.getOriginator(), queries);
 | 
				
			||||||
 | 
					                DonAsynchron.withCallback(list, data -> {
 | 
				
			||||||
 | 
					                    for (TsKvEntry tsKvEntry : data) {
 | 
				
			||||||
 | 
					                        JsonNode node = resultNode.get(tsKvEntry.getKey());
 | 
				
			||||||
 | 
					                        if (node.isArray()) {
 | 
				
			||||||
 | 
					                            ArrayNode arrayNode = (ArrayNode) node;
 | 
				
			||||||
 | 
					                            arrayNode.add(mapper.createObjectNode().put(String.valueOf(tsKvEntry.getTs()), tsKvEntry.getValueAsString()));
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            ObjectNode object = mapper.createObjectNode().put(String.valueOf(tsKvEntry.getTs()), tsKvEntry.getValueAsString());
 | 
				
			||||||
 | 
					                            resultNode.set(tsKvEntry.getKey(), object);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    for (String key : tsKeyNames) {
 | 
				
			||||||
 | 
					                        msg.getMetaData().putValue(key, resultNode.get(key).toString());
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    TbMsg newMsg = ctx.newMsg(msg.getType(), msg.getOriginator(), msg.getMetaData(), msg.getData());
 | 
				
			||||||
 | 
					                    ctx.tellNext(newMsg, SUCCESS);
 | 
				
			||||||
 | 
					                }, error -> ctx.tellFailure(msg, error));
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                ctx.tellFailure(msg, e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void destroy() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					package org.thingsboard.rule.engine.metadata;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					import org.thingsboard.rule.engine.api.NodeConfiguration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.Collections;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.concurrent.TimeUnit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Created by mshvayka on 04.09.18.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					public class TbGetTelemetryCertainTimeRangeNodeConfiguration implements NodeConfiguration<TbGetTelemetryCertainTimeRangeNodeConfiguration> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final String FETCH_MODE_FIRST = "FIRST";
 | 
				
			||||||
 | 
					    public static final String FETCH_MODE_LAST = "LAST";
 | 
				
			||||||
 | 
					    public static final String FETCH_MODE_ALL = "ALL";
 | 
				
			||||||
 | 
					    public static final int MAX_FETCH_SIZE = 1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private int startInterval;
 | 
				
			||||||
 | 
					    private int endInterval;
 | 
				
			||||||
 | 
					    private String startIntervalTimeUnit;
 | 
				
			||||||
 | 
					    private String endIntervalTimeUnit;
 | 
				
			||||||
 | 
					    private String fetchMode; //FIRST, LAST, LATEST
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private List<String> latestTsKeyNames;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public TbGetTelemetryCertainTimeRangeNodeConfiguration defaultConfiguration() {
 | 
				
			||||||
 | 
					        TbGetTelemetryCertainTimeRangeNodeConfiguration configuration = new TbGetTelemetryCertainTimeRangeNodeConfiguration();
 | 
				
			||||||
 | 
					        configuration.setLatestTsKeyNames(Collections.emptyList());
 | 
				
			||||||
 | 
					        configuration.setStartIntervalTimeUnit(TimeUnit.MINUTES.name());
 | 
				
			||||||
 | 
					        configuration.setStartInterval(1);
 | 
				
			||||||
 | 
					        configuration.setEndIntervalTimeUnit(TimeUnit.MINUTES.name());
 | 
				
			||||||
 | 
					        configuration.setEndInterval(2);
 | 
				
			||||||
 | 
					        return configuration;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user