Advertisement
PalleA

Elpris - Card

Dec 7th, 2022
105
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.86 KB | None | 1 0
  1. type: custom:apexcharts-card
  2. apex_config:
  3. chart:
  4. height: 350px
  5. xaxis:
  6. type: datetime
  7. labels:
  8. datetimeFormatter:
  9. hour: HH:mm
  10. tickPlacement: between
  11. graph_span: 48h
  12. span:
  13. start: hour
  14. offset: '-2h'
  15. now:
  16. show: true
  17. label: Nu
  18. header:
  19. title: El-priser pr. time (DKK/kWh)
  20. show: true
  21. show_states: true
  22. colorize_states: true
  23. yaxis:
  24. - min: 0
  25. max: 10
  26. decimals: 2
  27. apex_config:
  28. tickAmount: 5
  29. series:
  30. - entity: sensor.energi_data_service
  31. name: Pris
  32. type: column
  33. show:
  34. in_header: raw
  35. in_chart: true
  36. float_precision: 2
  37. unit: ' kr.'
  38. data_generator: >
  39. /**
  40. * Get HEX color of data point based on value.
  41. *
  42. * @param value { float }
  43. * @returns { string }
  44. */
  45. var colorByValue = function (value) {
  46. if (value >= 4.5) { return '#7f1d1d'; } // Dark red
  47. else if (value >= 3.5) { return '#ef4444' } // Red
  48. else if (value >= 2.5) { return '#f59e0b' } // Orange
  49. else if (value >= 1.5) { return '#fcd34d' } // Yellow
  50. else { return '#16a34a' } // Green
  51. }
  52.  
  53.  
  54. /**
  55. * Build data point object.
  56. *
  57. * @param item { object }
  58. * @param isForecast { boolean }
  59. * @returns { object }
  60. */
  61. var buildDataPoint = function (item, isForecast = false) {
  62. return {
  63. x: new Date(item['hour']).getTime(),
  64. y: item['price'],
  65. fillColor: isForecast ? '#a1a1aa' : colorByValue(item['price'])
  66. }
  67. }
  68.  
  69.  
  70. // Expected data points.
  71.  
  72. // Has to equal the value set in "group_span" but as hours.
  73.  
  74. // Which means, if you ie. have set "1d" as group span, you should set
  75. this to 24.
  76.  
  77. var expectedDataPoints = 48;
  78.  
  79.  
  80. // Data points
  81.  
  82. var data = [];
  83.  
  84.  
  85. // No prices available.
  86.  
  87. // Return empty dataset.
  88.  
  89. if (!entity.attributes.raw_today) {
  90. return data;
  91. }
  92.  
  93.  
  94. // Offset of hours set in "span" option.
  95.  
  96. // Note: Only set this, if offset is negative.
  97.  
  98. var offsetHours = 2;
  99.  
  100.  
  101. // Get current timestamp (incl. offset).
  102.  
  103. var currentTime = new Date().getTime() - (3600000 * offsetHours);
  104.  
  105.  
  106. // Loop through all today's hours and collect prices,
  107.  
  108. // but discard hours which have already passed.
  109.  
  110. entity.attributes.raw_today.filter(item => new
  111. Date(item['hour']).getTime() > currentTime).forEach(item => {
  112. data.push(buildDataPoint(item));
  113. });
  114.  
  115.  
  116. // If tomorrow prices is available,
  117.  
  118. // we'll add those to our dataset.
  119.  
  120. if (entity.attributes.tomorrow_valid) {
  121. entity.attributes.raw_tomorrow.forEach(item => {
  122. data.push(buildDataPoint(item));
  123. });
  124. }
  125.  
  126.  
  127. // Determine if we could use a few forecasted today points
  128.  
  129. // to forfill our expected data points.
  130.  
  131. var forecastValuesNeeded = expectedDataPoints - data.length;
  132.  
  133.  
  134. // If forecast values are needed and they are available,
  135.  
  136. // add forecast data points to our data set,
  137.  
  138. // until our expected data points has been reached.
  139.  
  140. if (forecastValuesNeeded > 0 && entity.attributes.forecast) {
  141. var lastKnownDatapointTimestamp = data[data.length - 1]['x'];
  142. entity.attributes.forecast.filter(item => new Date(item['hour']).getTime() > lastKnownDatapointTimestamp).slice(0, forecastValuesNeeded).forEach(item => {
  143. data.push(buildDataPoint(item, true));
  144. });
  145. }
  146.  
  147.  
  148. return data;
  149. - entity: sensor.energi_data_service
  150. name: Lavest i dag
  151. attribute: today_min
  152. transform: |
  153. return entity.attributes.today_min?.price ?? null
  154. float_precision: 2
  155. unit: ' kr.'
  156. show:
  157. in_chart: false
  158. - entity: sensor.energi_data_service
  159. name: Højest i dag
  160. attribute: today_max
  161. transform: |
  162. return entity.attributes.today_max?.price ?? null
  163. float_precision: 2
  164. unit: ' kr.'
  165. show:
  166. in_chart: false
  167. - entity: sensor.energi_data_service
  168. name: Gns. i dag
  169. attribute: today_mean
  170. float_precision: 2
  171. unit: ' kr.'
  172. show:
  173. in_chart: false
  174. - entity: sensor.energi_data_service
  175. name: Lavest i morgen
  176. attribute: tomorrow_min
  177. transform: |
  178. return entity.attributes.tomorrow_min?.price ?? null
  179. float_precision: 2
  180. unit: ' kr.'
  181. show:
  182. in_chart: false
  183. - entity: sensor.energi_data_service
  184. name: Højest i morgen
  185. attribute: today_max
  186. transform: |
  187. return entity.attributes.tomorrow_max?.price ?? null
  188. float_precision: 2
  189. unit: ' kr.'
  190. show:
  191. in_chart: false
  192. - entity: sensor.energi_data_service
  193. name: Gns. i morgen
  194. attribute: tomorrow_mean
  195. float_precision: 2
  196. unit: ' kr.'
  197. show:
  198. in_chart: false
  199.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement