Nordpool (ha integration) with 15min data. apexcharts and more. Updated

Here is a bit of extended code for aio energy management with cheap and expensive hours. There are some input helpers to be able to fine tune values that need to be created for this to work.

i found the expensive setting to be usefull if you don’t want to turn something off if the price is low enought the whole day.

aio_energy_management:
  cheapest_hours:
    - nordpool_official_config_entry: 01K6AEXZV4HDRNYVJQEJB2R5GT
      unique_id: my_cheapest_hours
      name: My Cheapest Hours
      mtu: 15
      first_hour: 19
      last_hour: 18
      price_limit: input_number.electricity_cheap_price_calc
      starting_today: true
      number_of_hours: input_number.cheap_hours_setting
      sequential: false
      failsafe_starting_hour: 21
      calendar: false
    - nordpool_official_config_entry: 01K6AEXZV4HDRNYVJQEJB2R5GT
      unique_id: my_expensive_hours
      name: My Expensive Hours
      mtu: 15
      first_hour: 24
      last_hour: 23
      inversed: true
      price_limit: input_number.expensive_price_calc
      starting_today: true
      number_of_hours: input_number.expensive_hours_setting
      sequential: false
      calendar: false

And graphs for that (and alot of extra stuff)

type: custom:apexcharts-card
experimental:
  color_threshold: true
apex_config:
  responsive:
    - breakpoint: 500
      options:
        chart:
          height: 300px
    - breakpoint: 1200
      options:
        chart:
          height: 640px
    - breakpoint: 3000
      options:
        chart:
          height: 800px
  legend:
    show: false
  title:
    floating: false
    align: center
    style:
      fontSize: 20px
      fontWeight: bold
  xaxis:
    labels:
      datetimeFormatter:
        hour: HH
  plotOptions:
    bar:
      columnWidth: 80%
      barGap: 3
graph_span: 2d
show:
  last_updated: true
header:
  title: Energy Price
  show: true
  show_states: true
  colorize_states: true
span:
  start: day
now:
  show: true
  label: Now
series:
  - entity: binary_sensor.my_cheapest_hours
    name: Cheapest
    type: area
    curve: stepline
    yaxis_id: CHEAP
    opacity: 0.6
    stroke_width: 0
    color: "#008"
    show:
      extremas: false
      in_header: false
    data_generator: |
      let data = [];
      let periods = entity.attributes.list || [];
      periods.forEach((p) => {
        let s = new Date(p.start).getTime();
        let e = new Date(p.end).getTime();
        data.push([s, 1]);    // jump up at start
        data.push([e, 1]);    // stay high until end
        data.push([e, 0]);    // drop straight down
      });
      return data;
  - entity: binary_sensor.my_cheapest_hours
    yaxis_id: CHEAP
    name: Cheap Chart
    transform: "return x === 'on' ? 1 : 0;"
    curve: stepline
    type: area
    opacity: 0.2
    stroke_width: 2
    extend_to: false
    group_by:
      func: avg
      duration: 15m
    color: "#00f"
    show:
      extremas: false
      in_header: false
  - entity: binary_sensor.my_expensive_hours
    name: Expensive
    type: area
    curve: stepline
    yaxis_id: CHEAP
    opacity: 0.6
    stroke_width: 0
    color: "#800"
    show:
      extremas: false
      in_header: false
    data_generator: |
      let data = [];
      let periods = entity.attributes.list || [];
      periods.forEach((p) => {
        let s = new Date(p.start).getTime();
        let e = new Date(p.end).getTime();
        data.push([s, 1]);    // jump up at start
        data.push([e, 1]);    // stay high until end
        data.push([e, 0]);    // drop straight down
      });
      return data;
  - entity: binary_sensor.my_expensive_hours
    yaxis_id: CHEAP
    name: Expensive Chart
    transform: "return x === 'on' ? 1 : 0;"
    curve: stepline
    type: area
    opacity: 0.2
    stroke_width: 2
    extend_to: false
    group_by:
      func: avg
      duration: 15m
    color: "#f00"
    show:
      extremas: false
      in_header: false
  - entity: sensor.electricity_prices_today
    yaxis_id: SEK
    type: column
    show:
      extremas: true
      in_header: false
    float_precision: 2
    color: green
    color_threshold:
      - value: 0
        color: "#00ffaa"
      - value: 0.25
        color: "#00ff55"
      - value: 0.5
        color: "#00ff00"
      - value: 0.75
        color: "#55ff00"
      - value: 1
        color: "#aaff00"
      - value: 1.5
        color: "#ffff00"
      - value: 2
        color: "#ffaa00"
      - value: 2.5
        color: "#ff5500"
      - value: 3
        color: "#ff0000"
      - value: 4
        color: "#ff0055"
      - value: 5
        color: "#ff00aa"
      - value: 6
        color: "#ff00ff"
      - value: 7
        color: "#ff34ff"
      - value: 9
        color: "#ff65ff"
      - value: 11
        color: "#ff98ff"
      - value: 13
        color: "#ffccff"
      - value: 15
        color: "#ffffff"
    data_generator: |
      return entity.attributes.data.map((start, index) => {
        return [new Date(start["start"]).getTime() + 450000, entity.attributes.data[index]["value"]];
      });
  - entity: sensor.electricity_prices_tomorrow
    yaxis_id: SEK
    type: column
    show:
      extremas: true
      in_header: false
    float_precision: 2
    color: green
    color_threshold:
      - value: 0
        color: "#00ffaa"
      - value: 0.25
        color: "#00ff55"
      - value: 0.5
        color: "#00ff00"
      - value: 0.75
        color: "#55ff00"
      - value: 1
        color: "#aaff00"
      - value: 1.5
        color: "#ffff00"
      - value: 2
        color: "#ffaa00"
      - value: 2.5
        color: "#ff5500"
      - value: 3
        color: "#ff0000"
      - value: 4
        color: "#ff0055"
      - value: 5
        color: "#ff00aa"
      - value: 6
        color: "#ff00ff"
      - value: 7
        color: "#ff34ff"
      - value: 9
        color: "#ff65ff"
      - value: 11
        color: "#ff98ff"
      - value: 13
        color: "#ffccff"
      - value: 15
        color: "#ffffff"
    data_generator: |
      return entity.attributes.data.map((start, index) => {
        return [new Date(start["start"]).getTime() + 450000, entity.attributes.data[index]["value"]];
      });      
  - entity: sensor.electricity_prices_today
    name: Current Price
    yaxis_id: SEK
    float_precision: 2
    show:
      in_header: true
      in_chart: false
    unit: Kr/kWh
    color: orange
  - entity: sensor.total_power
    yaxis_id: kW
    name: Power Usage Chart
    color: white
    opacity: 0.8
    float_precision: 2
    show:
      extremas: false
      in_header: true
    type: line
    curve: stepline
    stroke_width: 2
    extend_to: false
    unit: kW
    transform: return x /1000;
    group_by:
      func: avg
      duration: 15m
  - entity: sensor.total_real_time_energy_cost
    name: Cost Now Chart
    yaxis_id: SEK
    float_precision: 2
    show:
      extremas: false
      in_header: true
    unit: Kr/h
    type: line
    curve: stepline
    stroke_width: 3
    color: purple
    opacity: 0.8
    extend_to: false
    group_by:
      func: avg
      duration: 15min
  - entity: sensor.electricity_prices_today
    attribute: min
    name: Min Today
    yaxis_id: SEK
    float_precision: 2
    show:
      in_header: true
      in_chart: false
    unit: Kr/kWh
    color: green
  - entity: sensor.electricity_prices_today
    attribute: mean
    name: Average Today
    yaxis_id: SEK
    float_precision: 2
    show:
      in_header: true
      in_chart: false
    unit: Kr/kWh
    color: yellow
  - entity: sensor.electricity_prices_today
    attribute: max
    name: Max Today
    yaxis_id: SEK
    float_precision: 2
    show:
      in_header: true
      in_chart: false
    unit: Kr/kWh
    color: red
  - entity: sensor.electricity_prices_tomorrow
    attribute: min
    name: Min Tomorrow
    yaxis_id: SEK
    float_precision: 2
    show:
      in_header: true
      in_chart: false
    unit: Kr/kWh
    color: darkgreen
  - entity: sensor.electricity_prices_tomorrow
    attribute: mean
    name: Average Tomorrow
    yaxis_id: SEK
    float_precision: 2
    show:
      in_header: true
      in_chart: false
    unit: Kr/kWh
    color: brown
  - entity: sensor.electricity_prices_tomorrow
    attribute: max
    name: Max Tomorrow
    yaxis_id: SEK
    float_precision: 2
    show:
      in_header: true
      in_chart: false
    unit: Kr/kWh
    color: darkred
  - entity: binary_sensor.my_cheapest_hours
    yaxis_id: CHEAP
    name: Cheap Now
    transform: "return x === 'on' ? 1 : 0;"
    color: "#00f"
    show:
      in_header: true
      in_chart: false
  - entity: binary_sensor.my_expensive_hours
    yaxis_id: CHEAP
    name: Expensive Now
    transform: "return x === 'on' ? 1 : 0;"
    color: "#f00"
    show:
      in_header: true
      in_chart: false
yaxis:
  - id: SEK
    min: 0
    max: ~12
    apex_config:
      tickAmount: 6
      forceNiceScale: true
      title:
        text: SEK
  - id: kW
    min: 0
    max: ~6
    decimals: 0
    apex_config:
      tickAmount: 6
      forceNiceScale: true
      opposite: true
      title:
        text: kW
  - id: CHEAP
    min: 0
    max: 1
    show: false
    apex_config:
      tickAmount: 6
      forceNiceScale: true

1 Like