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.
 
 
 
 
 

170 lines
3.6 KiB

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