Thingsboard -使用Chart.js库注入的自定义时间序列小部件

ct2axkht  于 2023-08-05  发布在  Chart.js
关注(0)|答案(1)|浏览(213)

我想在thingsboard中创建我的线性时间序列小部件,但我需要一些默认版本中不包含的自定义功能。
Thingsboard提供的配置示例:
Chart.js库:https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.js HTML画布:JS代码:

var myChart;

self.onInit = function() {
    
    var chartData = {
        datasets: []
    };

    for (var i=0; i < self.ctx.data.length; i++) {
        var dataKey = self.ctx.data[i].dataKey;
        var dataset = {
            label: dataKey.label,
            data: [],
            borderColor: dataKey.color,
            fill: false
        };
        chartData.datasets.push(dataset);
    }
    
    var options = {
        maintainAspectRatio: false,
        legend: {
            display: false
        },
        scales: {
        xAxes: [{
            type: 'time',
            ticks: {
                maxRotation: 0,
                autoSkipPadding: 30
            }
        }]
    }
    };
    
    var canvasElement = $('#myChart', self.ctx.$container)[0];
    var canvasCtx = canvasElement.getContext('2d');
    myChart = new Chart(canvasCtx, {
        type: 'line',
        data: chartData,
        options: options
    });
    self.onResize();
}

self.onResize = function() {
    myChart.resize();
}

self.onDataUpdated = function() {
    for (var i = 0; i < self.ctx.data.length; i++) {
        var datasourceData = self.ctx.data[i];
        var dataSet = datasourceData.data;
        myChart.data.datasets[i].data.length = 0;
        var data = myChart.data.datasets[i].data;
        for (var d = 0; d < dataSet.length; d++) {
            var tsValuePair = dataSet[d];
            var ts = tsValuePair[0];
            var value = tsValuePair[1];
            data.push({t: ts, y: value});
        }
    }
    myChart.options.scales.xAxes[0].ticks.min = self.ctx.timeWindow.minTime;
    myChart.options.scales.xAxes[0].ticks.max = self.ctx.timeWindow.maxTime;
    myChart.update();
}

字符串
和输出:
Thingsboard timeseries example
正如你所看到的,X轴定义为时间,“First”和“Second”是ctx对象生成的数据源。

  • 我需要什么?正如你所看到的,两个数据源的颜色永远不会改变,我想通过以下情况来改变颜色:如果值(Y轴> 50且< 70)且在6分钟(X轴)期间,那么如果值(Y轴> 70且< 90)且在6分钟(X轴)期间,那么颜色为橙子如果值(Y轴> 90)且在6分钟(X轴)期间,那么颜色为橙色,默认情况下,在此示例中,颜色将为灰色。
    我尝试使用Chart.js库创建图表并将其注入TB,但X轴与我预期的不一样,因为我需要与上图中显示的X轴相同的X轴。
    我也用另一个库Highcharts尝试过,但结果是这样的:HighCharts try
    图书馆使用:https://cdnjs.cloudflare.com/ajax/libs/highcharts/10.3.3/highcharts.min.js
self.onInit = function() {
    //self.ctx.flot = new TbFlot(self.ctx);
Highcharts.chart('container', {
    chart: {
        type: 'line'
    },
    xAxis: {
        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    },

    plotOptions: {
        series: {
            color: {
                linearGradient: [500, 0, 100, 0],
                stops: [
                    [0, 'red'],
                    [1, 'green']
                ]
            }
        }
    },

    series: [{
        data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
    }]
});
}


我对JS的了解是基本的,我正在研究这个图表是如何为这个库工作的,但我不知道TB图表是如何工作的,只知道X轴是如何工作和更新的。
X轴更新方法:

self.onDataUpdated = function() {
    for (var i = 0; i < self.ctx.data.length; i++) {
        var datasourceData = self.ctx.data[i];
        var dataSet = datasourceData.data;
        myChart.data.datasets[i].data.length = 0;
        var data = myChart.data.datasets[i].data;
        for (var d = 0; d < dataSet.length; d++) {
            var tsValuePair = dataSet[d];
            var ts = tsValuePair[0];
            var value = tsValuePair[1];
            data.push({t: ts, y: value});
        }
    }
    myChart.options.scales.xAxes[0].ticks.min = self.ctx.timeWindow.minTime;
    myChart.options.scales.xAxes[0].ticks.max = self.ctx.timeWindow.maxTime;
    myChart.update();
}```

Note: depending which version of the library we use this method changes.

If anyone who experimented or created before a custom timeseries chart in TB please let me know any useful information because from TB i didnt find to many helpful documentation.

PD: its my first time creating a question in StackOverflow

qv7cva1a

qv7cva1a1#

在Highcharts中可以通过使用zones实现所需的行为,但是如果要应用持续时间检查,则需要进行一些自定义。
以下是基于点值和趋势时间长度动态添加区域的示例。

chart: {
    type: 'line',
    events: {
      load: function() {
        const zones = [];
        const sixMinutes = 1000 * 60 * 6;

        function updateTime(timeObj, color, timestamp) {
          // check time for other colors
          for (let key in timeObj) {
            if (key !== color && key !== 'passed' && timeObj[key]) {
              if (timeObj.passed > sixMinutes) {
                zones.push({
                  color: 'grey',
                  value: timeObj[key]
                }, {
                  value: timeObj[key] + timeObj.passed,
                  color: key
                });
              }
              timeObj[key] = 0;
              timeObj.passed = 0;
            }
          }
          // save current trend
          if (timeObj[color]) {
            timeObj.passed = timestamp - timeObj[color];
          } else {
            timeObj[color] = timestamp;
          }
        }

        this.series.forEach(s => {
          const time = {
            green: 0,
            orange: 0,
            red: 0,
            passed: 0
          };

          s.points.forEach(p => {
            if (p.y > 50 && p.y < 70) {
              updateTime(time, 'green', p.x);
            } else if (p.y > 70 && p.y < 90) {
              updateTime(time, 'orange', p.x);
            } else if (p.y > 90) {
              updateTime(time, 'red', p.x);
            } else {
              updateTime(time, null, p.x);
            }
          });

          s.update({
            zones
          });
        });
      }
    }
  }

字符串

现场演示:https://jsfiddle.net/BlackLabel/jt0p9a3d/
API引用:https://api.highcharts.com/highcharts/series.line.zones
**文档:**https:www.highcharts.com/docs/chart-concepts/series#zones

相关问题