-Teme-

Electricity price and wind power

Oct 21st, 2025
977
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
YAML 6.81 KB | None | 0 0
  1. type: custom:apexcharts-card
  2. header:
  3.   show: true
  4.   title: Electricity price and wind power
  5.   show_states: true
  6.   colorize_states: true
  7.   standard_format: true
  8.   disable_actions: true
  9. graph_span: 96h
  10. update_interval: 15min
  11. experimental:
  12.   color_threshold: true
  13. apex_config:
  14.   chart:
  15.     height: 360
  16.     toolbar:
  17.       show: true
  18.   grid:
  19.     strokeDashArray: 3
  20.     xaxis:
  21.       lines:
  22.         show: false
  23.   legend:
  24.     show: false
  25.   xaxis:
  26.     tickAmount: 6
  27.     labels:
  28.       style:
  29.         fontWeight: 100
  30.         fontSize: 12px
  31.       format: ddd H:mm
  32.     tooltip:
  33.       enabled: true
  34.   tooltip:
  35.     x:
  36.       format: HH. mm
  37. span:
  38.   start: hour
  39.   offset: "-24h"
  40. now:
  41.   show: true
  42.   label: Now
  43. series:
  44.   - entity: sensor.nordpool_predict_fi_windpower
  45.     name: Tuulivoima
  46.     type: area
  47.     yaxis_id: wind
  48.     float_precision: 0
  49.     opacity: 0.2
  50.     extend_to: now
  51.     stroke_width: 0.2
  52.     curve: stepline
  53.     data_generator: |
  54.      const data = entity.attributes.windpower_forecast || [];
  55.       return data.map((item) => [item.timestamp, item.value / 1000]);
  56.     color: skyblue
  57.     color_threshold:
  58.       - value: 0
  59.         color: darkblue
  60.       - value: 3
  61.         color: dodgerblue
  62.       - value: 5
  63.         color: skyblue
  64.     show:
  65.       in_chart: true
  66.       in_header: false
  67.       in_legend: true
  68.       legend_value: false
  69.   - entity: sensor.powersaver
  70.     data_generator: |
  71.      return entity.attributes.minutes.map((entry) => {
  72.         return [new Date(entry.start), entry.onOff];
  73.       });
  74.     yaxis_id: powersaver
  75.     name: Boiler schedule
  76.     type: area
  77.     color: goldenrod
  78.     opacity: 0.3
  79.     stroke_width: 0
  80.     curve: stepline
  81.     show:
  82.       legend_value: false
  83.       in_header: false
  84.       name_in_header: false
  85.       datalabels: false
  86.     extend_to: false
  87.   - entity: sensor.nordpool
  88.     name: current price ¢/kWh
  89.     yaxis_id: price
  90.     type: area
  91.     extend_to: now
  92.     float_precision: 3
  93.     stroke_width: 0.2
  94.     opacity: 0.6
  95.     fill_raw: "null"
  96.     unit: ¢/kWh
  97.     show:
  98.       in_header: true
  99.       legend_value: false
  100.       extremas: false
  101.       header_color_threshold: true
  102.     color: "#aaaaaa"
  103.     color_threshold:
  104.       - value: -10
  105.         color: dodgerblue
  106.       - value: 0
  107.         color: darkgreen
  108.       - value: 5
  109.         color: green
  110.       - value: 10
  111.         color: orange
  112.       - value: 15
  113.         color: red
  114.       - value: 20
  115.         color: darkred
  116.       - value: 50
  117.         color: black
  118.   - entity: sensor.nordpool
  119.     name: coming prices ¢/kWh
  120.     yaxis_id: price
  121.     type: area
  122.     float_precision: 3
  123.     stroke_width: 0.2
  124.     opacity: 0.4
  125.     fill_raw: "null"
  126.     unit: ¢/kWh
  127.     show:
  128.       in_header: false
  129.       legend_value: false
  130.       extremas: false
  131.     data_generator: >
  132.      const now = new Date();
  133.  
  134.       const output =
  135.       entity.attributes.raw_today.concat(entity.attributes.raw_tomorrow);
  136.  
  137.       return output
  138.         .filter((entry) => new Date(entry.start) >= now)
  139.         .map((entry) => [new Date(entry.start), entry.value]);
  140.     color: "#aaaaaa"
  141.     color_threshold:
  142.       - value: -10
  143.         color: dodgerblue
  144.       - value: 0
  145.         color: darkgreen
  146.       - value: 5
  147.         color: green
  148.       - value: 10
  149.         color: orange
  150.       - value: 15
  151.         color: red
  152.       - value: 20
  153.         color: darkred
  154.       - value: 30
  155.         color: black
  156.     extend_to: false
  157.   - entity: sensor.nordpool_predict_fi_price
  158.     type: area
  159.     yaxis_id: price
  160.     extend_to: now
  161.     curve: stepline
  162.     stroke_width: 0
  163.     float_precision: 1
  164.     color: limegreen
  165.     opacity: 0.16
  166.     data_generator: |
  167.      const fs = entity.attributes.forecast_start;
  168.       const forecastStartTime = fs ? Date.parse(fs) - 3600000 : null;  // -1h
  169.       const data = entity.attributes.forecast || [];
  170.  
  171.       if (!forecastStartTime) return [];
  172.  
  173.       return data
  174.         .filter((item) => Date.parse(item.timestamp) >= forecastStartTime)
  175.         .map((item) => [item.timestamp, item.value]);
  176.     show:
  177.       in_chart: true
  178.       in_header: false
  179.       in_legend: false
  180.       legend_value: false
  181.   - entity: sensor.nordpool_predict_fi_price
  182.     name: Pediction
  183.     type: line
  184.     yaxis_id: price
  185.     curve: straight
  186.     stroke_width: 2
  187.     stroke_dash: 3
  188.     color: red
  189.     opacity: 1
  190.     extend_to: false
  191.     data_generator: >
  192.      const fs =
  193.       hass.states['sensor.nordpool_predict_fi_price']?.attributes?.forecast_start;
  194.  
  195.       const x = fs ? Date.parse(fs) - 3600000 : NaN;  // -1h
  196.  
  197.       if (!Number.isFinite(x)) return [];
  198.  
  199.       const data = entity.attributes.forecast || [];
  200.  
  201.       let min = Infinity, max = -Infinity;
  202.  
  203.       for (const i of data) {
  204.         const v = Number(i.value);
  205.         if (Number.isFinite(v)) { if (v < min) min = v; if (v > max) max = v; }
  206.       }
  207.  
  208.       if (!Number.isFinite(min) || !Number.isFinite(max)) { min = 0; max = 1; }
  209.  
  210.       return [[x, min], [x, max], [x + 1, null]];
  211.     show:
  212.       in_chart: true
  213.       in_header: false
  214.       in_legend: false
  215.       legend_value: false
  216.   - entity: sensor.nordpool_predict_fi_windpower_now
  217.     name: Wind power
  218.     float_precision: 0
  219.     color: skyblue
  220.     show:
  221.       in_chart: false
  222.       in_header: true
  223.       in_legend: true
  224.       legend_value: false
  225.   - entity: sensor.pro3em_total_active_power
  226.     name: Consumption
  227.     unit: W
  228.     show:
  229.       in_chart: false
  230.       in_header: true
  231.       in_legend: true
  232.       legend_value: false
  233.       header_color_threshold: true
  234.     color: "#aaaaaa"
  235.     color_threshold:
  236.       - value: 0
  237.         color: dodgerblue
  238.         opacity: 0.6
  239.       - value: 1000
  240.         color: dodgerblue
  241.         opacity: 0.8
  242.       - value: 5000
  243.         color: skyblue
  244.         opacity: 0.8
  245.       - value: 10000
  246.         color: red
  247.         opacity: 0.8
  248.       - value: 15000
  249.         color: darkred
  250.         opacity: 0.8
  251.       - value: 30000
  252.         color: black
  253.         opacity: 0.8
  254. yaxis:
  255.   - id: price
  256.     min: ~0
  257.     max: "|+3|"
  258.     decimals: 2
  259.     apex_config:
  260.       tickAmount: 10
  261.       forceNiceScale: true
  262.       title:
  263.         text: Price (¢/kWh)
  264.       labels:
  265.         formatter: |
  266.          EVAL:v => `¢ ${v.toFixed(2)}`
  267.   - id: wind
  268.     opposite: true
  269.     min: ~0
  270.     max: "|+1|"
  271.     decimals: 2
  272.     apex_config:
  273.       tickAmount: 10
  274.       forceNiceScale: true
  275.       title:
  276.         text: Windpower (GW)
  277.       labels:
  278.         formatter: |
  279.          EVAL:v => `${v.toFixed(2)} GW`
  280.   - id: consumption
  281.     min: 0
  282.     max: "|+1|"
  283.     decimals: 2
  284.     opposite: true
  285.     apex_config:
  286.       tickAmount: 10
  287.       forceNiceScale: true
  288.       title:
  289.         text: Consumption (kW)
  290.       labels:
  291.         formatter: |
  292.          EVAL:v => `${v.toFixed(2)} kW`
  293.   - id: powersaver
  294.     show: false
  295.     min: 0
  296.     max: 1
  297. show:
  298.   last_updated: true
  299.  
Advertisement
Add Comment
Please, Sign In to add comment