Solar Array and home energy dashboard.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

148 lines
2.9 KiB

  1. Highcharts.setOptions({
  2. time: {
  3. timezone: 'America/Los_Angeles'
  4. }
  5. });
  6. socket.onopen = function() {
  7. // connected
  8. }
  9. // Indexes for chart series
  10. consumIdx = 0;
  11. gridIdx = 1;
  12. prodIdx = 2;
  13. var msgNumbs = {
  14. p: "#production",
  15. ng: "#netgrid",
  16. c: "#consumption",
  17. };
  18. function netgridcolor(v) {
  19. if (v <= 0)
  20. return "#00ff00";
  21. else
  22. return "#ff0000";
  23. }
  24. function afterSetExtremes(e) {
  25. // hack to deal w/ HighStocks being stupid
  26. if (Date.now() - solarchart.sd_lastwindata < 500) {
  27. // Make sure we trigger again, and that the user doesn't
  28. // have to wait too long
  29. solarchart.sd_lastwindata = Date.now() - 500;
  30. return;
  31. }
  32. solarchart.showLoading('Loading data from server...');
  33. console.log(e)
  34. socket.send('win ' + Math.round(e.min).toString() + ' ' + Math.round(e.max).toString());
  35. }
  36. socket.onmessage = function(m) {
  37. var msg = m.data.split(" ");
  38. if (msg[0] in msgNumbs) {
  39. // simple update values
  40. var num = parseFloat(msg[1]);
  41. var targ = $(msgNumbs[msg[0]]);
  42. targ.text(num.toString());
  43. // update color for ng
  44. if (msg[0] == "ng") {
  45. $(".gridpower").css('background', netgridcolor(num));
  46. }
  47. } else if (msg[0] == 'o') {
  48. // received overview data
  49. var data = JSON.parse(msg[1]);
  50. console.log(solarchart);
  51. solarchart.navigator.series[consumIdx].setData(data.consumption, false);
  52. solarchart.navigator.series[gridIdx].setData(data.grid, false);
  53. solarchart.navigator.series[prodIdx].setData(data.production, false);
  54. solarchart.redraw();
  55. } else if (msg[0] == 'windata') {
  56. var data = JSON.parse(msg[1]);
  57. console.log(data);
  58. solarchart.sd_lastwindata = Date.now();
  59. solarchart.series[consumIdx].setData(data.consumption, false);
  60. //solarchart.navigator.series[gridIdx].setData(data.grid, false);
  61. //solarchart.navigator.series[prodIdx].setData(data.production, false);
  62. solarchart.redraw();
  63. solarchart.hideLoading()
  64. }
  65. }
  66. var solarchart = Highcharts.stockChart('solarchart', {
  67. chart: {
  68. type: 'area',
  69. zoomType: 'x'
  70. },
  71. title: {
  72. text: 'Panel Production'
  73. },
  74. subtitle: {
  75. text: document.ontouchstart === undefined ?
  76. 'Click and drag in the plot area to zoom in' : 'Pinch the chart to zoom in'
  77. },
  78. navigator: {
  79. adaptToUpdatedData: false, // XXX - keep?
  80. series: [
  81. {
  82. type: 'bar',
  83. name: 'consumptionNav',
  84. showInNavigator: true,
  85. data: [],
  86. },
  87. {
  88. type: 'bar',
  89. name: 'gridNav',
  90. showInNavigator: true,
  91. data: [],
  92. },
  93. {
  94. type: 'bar',
  95. name: 'productionNav',
  96. showInNavigator: true,
  97. data: [],
  98. },
  99. ]
  100. },
  101. xAxis: {
  102. events: {
  103. afterSetExtremes: afterSetExtremes,
  104. },
  105. type: "datetime",
  106. title: {
  107. enabled: false
  108. }
  109. },
  110. yAxis: {
  111. title: {
  112. text: 'W'
  113. }
  114. },
  115. tooltip: {
  116. split: true,
  117. valueSuffix: ' W'
  118. },
  119. plotOptions: {
  120. area: {
  121. stacking: 'normal',
  122. lineColor: '#666666',
  123. lineWidth: 1,
  124. marker: {
  125. lineWidth: 1,
  126. lineColor: '#666666'
  127. }
  128. }
  129. },
  130. series: [
  131. {
  132. name: 'grid',
  133. type: 'area',
  134. gapSize: 1,
  135. //gapUnit: 'value',
  136. data: [ ],
  137. },
  138. ]
  139. });