• 部件:Charts -> Timeseries -> State Chart
  • 问题:将多台设备的遥测温度展示到图表(State Chart)时候,无法区分到底是哪个设备的数据
  • 改造:右侧的遥测字段label前,自动加上设备名称。
  • 备注:也有手动一个个设置的方式,设备多了太心累。

    效果说明

    原版效果

    无法区分绿色蓝色线条分别是哪个设备的数据
    image.png

    改造效果

    自动在label前加设备名称
    image.png

    准备数据

    添加俩个温度计,分别为室内和室外。

    image.png

    添加规则链自动生成遥测数据

    image.pngimage.png

    添加一个部件库

    Charts(label add device name)
    image.png

    改造自带Charts

    在部件库中找到Charts,点击编辑,修改后会另存到之前添加的部件库。
    image.png

JavaScript中改为下面代码

只改变了onInit和onDataUpdated,也可以都写到onInit中

  1. //标记是否已经加上设备名称
  2. var changed = false;
  3. self.onInit = function() {
  4. self.ctx.flot = new TbFlot(self.ctx, 'state');
  5. self.ctx.$scope.data = self.ctx.defaultSubscription.data;
  6. // console.log(JSON.stringify(self.ctx.defaultSubscription.data.datasource));
  7. //datasourceData是为了过滤self.ctx.defaultSubscription.data中的重复datasource数据
  8. //感兴趣的可以打开console.log注释对比前后差别。
  9. self.ctx.$scope.datasourceData = [];
  10. var currentDatasource = null;
  11. var currentDatasourceIndex = -1;
  12. for (var i=0;i<self.ctx.$scope.data.length;i++) {
  13. var dataKeyData = self.ctx.$scope.data[i];
  14. if (dataKeyData.datasource != currentDatasource) {
  15. currentDatasource = dataKeyData.datasource
  16. currentDatasourceIndex++;
  17. self.ctx.$scope.datasourceData[currentDatasourceIndex] = dataKeyData;
  18. }
  19. }
  20. // console.log(JSON.stringify(self.ctx.$scope.datasourceData));
  21. }
  22. self.onDataUpdated = function() {
  23. if(!changed){
  24. changed = true;
  25. for (var j=0;j<self.ctx.$scope.datasourceData.length;j++) {
  26. for(var k = 0;k<self.ctx.$scope.datasourceData[j].datasource.dataKeys.length;k++){
  27. self.ctx.$scope.datasourceData[j].datasource.dataKeys[k].label
  28. = self.ctx.$scope.datasourceData[j].datasource.name + "-"
  29. + self.ctx.$scope.datasourceData[j].datasource.dataKeys[k].label;
  30. }
  31. }
  32. //只会打印一次,不会每次数据更新都调用!也可以写到onInit中
  33. console.log("change label");
  34. }
  35. self.ctx.flot.update();
  36. }
  37. self.onResize = function() {
  38. self.ctx.flot.resize();
  39. }
  40. self.typeParameters = function() {
  41. return {
  42. stateData: true
  43. };
  44. }
  45. self.onEditModeChanged = function() {
  46. self.ctx.flot.checkMouseEvents();
  47. }
  48. self.onMobileModeChanged = function() {
  49. self.ctx.flot.checkMouseEvents();
  50. }
  51. self.getSettingsSchema = function() {
  52. return TbFlot.settingsSchema('graph');
  53. }
  54. self.getDataKeySettingsSchema = function() {
  55. return TbFlot.datakeySettingsSchema(true, 'graph');
  56. }
  57. self.onDestroy = function() {
  58. self.ctx.flot.destroy();
  59. }

另存为部件

另存为 -> 输入部件标题 -> 选择部件库(这里选择之前创建的那个部件库)
image.png
image.png

展示数据

image.png
image.png
image.png
再加上自带的State Chart作比较
image.png
再添加一个温度计设备,会自动加入图表
image.png
也可以改变图例位置
image.png
image.png

手动设置

image.png
这个也可以关注一下
image.png
一言不合就点赞.gif