Crall

HA power saver

Oct 1st, 2025 (edited)
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
YAML 7.17 KB | Source Code | 0 0
  1. *******************Power Saver Fix efter 15 minuters elpriser********************
  2. OBS!! kopiera endast koden, ta inte med alla mina **********rubriker*********** och *************kommentarer*****************
  3.  
  4. **************** Template sensorer ***************************
  5.  
  6. **************** Sensor för powersaver uppdaterad för att använda mina nya nordpool template sensorer ***************
  7. template:
  8.   - binary_sensor:
  9.       - name: Power saver
  10.         unique_id: powersaver
  11.         device_class: problem
  12.         state: >
  13.          {{ not (this.attributes.schedule | selectattr("current") | map(attribute="onOff") | first | default(true)) }}
  14.         attributes:
  15.           schedule: >
  16.            {% set data = namespace(schedule_items=[], activated=0) %}
  17.            
  18.             {# --- Part 1: Process Today's Data --- #}
  19.  
  20.             {% set today_prices = state_attr("sensor.today_lowest_price", "data") or [] %}
  21.  
  22.             {% if today_prices | length > 0 %}
  23.               {% set data.activated = states("input_number.power_min_hours_on") | int(10) * 4 %}
  24.               {% set minperc = (states("input_number.power_percent_over_min") | int(15) + 100.0) / 100.0 %}
  25.               {% set maxprice = states("input_number.power_max_price") | float(999) %}
  26.  
  27.               {% set sorted_today = today_prices | sort(attribute="price") %}
  28.              
  29.               {% set breakprice = minperc * sorted_today[0].price %}
  30.  
  31.               {% for s in sorted_today %}
  32.                 {% set onOff = (s.price <= breakprice or data.activated > 0) and s.price < maxprice %}
  33.                 {% set current = as_datetime(s.start) < now() and as_datetime(s.end) > now() %}
  34.                 {% set data.schedule_items = data.schedule_items + [{"price": s.price, "time": as_timestamp(s.start) | timestamp_local, "onOff": onOff, "current": current }] %}
  35.                 {% set data.activated = data.activated - (1 if onOff else 0) %}
  36.               {% endfor %}
  37.             {% endif %}
  38.  
  39.             {# --- Part 2: Process Tomorrow's Data --- #}
  40.  
  41.             {% set tomorrow_prices = state_attr("sensor.tomorrow_lowest_price", "data") or [] %}
  42.  
  43.             {% if tomorrow_prices | length > 0 %}
  44.               {% set data.activated = states("input_number.power_min_hours_on") | int(10) * 4 %}
  45.              
  46.               {% set sorted_tomorrow = tomorrow_prices | sort(attribute="price") %}
  47.  
  48.               {% set breakprice = minperc * sorted_tomorrow[0].price %}
  49.  
  50.               {% for s in sorted_tomorrow %}
  51.                 {% set onOff = (s.price <= breakprice or data.activated > 0) and s.price < maxprice %}
  52.                 {% set current = false %}
  53.                 {% set data.schedule_items = data.schedule_items + [{"price": s.price, "time": as_timestamp(s.start) | timestamp_local, "onOff": onOff, "current": current }] %}
  54.                 {% set data.activated = data.activated - (1 if onOff else 0) %}
  55.               {% endfor %}
  56.             {% endif %}
  57.  
  58.             {# --- Final Step: Combine and Sort Chronologically --- #}
  59.             {{ data.schedule_items | sort(attribute="time") | list }}
  60.      
  61.  ************************ template sensorer för dagens och morgondagens elpriser för norpools integration ***********************
  62.  
  63.   - trigger:
  64.       - trigger: time_pattern
  65.         minutes: /10
  66.       - trigger: homeassistant
  67.         event: start
  68.     action:
  69.       - action: nordpool.get_prices_for_date
  70.         data:
  71.           config_entry: 01K6BFF0TVKT3M3RDYTQWVM38D  ****************OBS BYT TILL DIN CONFIG ENTERY********************
  72.           date: "{{ now().date() + timedelta(days=1) }}"
  73.           areas: SE3
  74.           currency: SEK
  75.         response_variable: tomorrow_price
  76.     sensor:
  77.       - name: Tomorrow lowest price
  78.         unique_id: se3_tomorrow_low_price
  79.         state: >
  80.          {% set data = namespace(prices=[]) %}
  81.           {% for state in tomorrow_price['SE3'] %}
  82.             {% set data.prices = data.prices + [(state.price / 1000)] %}
  83.           {% endfor %}
  84.           {{min(data.prices)}}
  85.         attributes:
  86.           data: >
  87.            {% set data = namespace(prices=[]) %}
  88.             {% for state in tomorrow_price['SE3'] %}
  89.               {# Denna rad är den enda som är ändrad #}
  90.               {% set data.prices = data.prices + [{'start': (state.start | as_datetime | as_local).isoformat(), 'end': (state.end | as_datetime | as_local).isoformat(), 'price': state.price/1000}] %}
  91.             {% endfor %}
  92.             {{data.prices}}
  93.   - trigger:
  94.       - trigger: time_pattern
  95.         minutes: /10
  96.       - trigger: homeassistant
  97.         event: start
  98.     action:
  99.       - action: nordpool.get_prices_for_date
  100.         data:
  101.           config_entry: 01K6BFF0TVKT3M3RDYTQWVM38D  ****************OBS BYT TILL DIN CONFIG ENTERY********************
  102.           date: "{{ now().date() }}"
  103.           areas: SE3
  104.           currency: SEK
  105.         response_variable: today_price
  106.     sensor:
  107.       - name: Today lowest price
  108.         unique_id: se3_today_low_price
  109.         state: >
  110.          {% set data = namespace(prices=[]) %}
  111.           {% for state in today_price['SE3'] %}
  112.             {% set data.prices = data.prices + [(state.price / 1000)] %}
  113.           {% endfor %}
  114.           {{min(data.prices)}}
  115.         attributes:
  116.           data: >
  117.            {% set data = namespace(prices=[]) %}
  118.             {% for state in today_price['SE3'] %}
  119.               {# Denna rad är den enda som är ändrad #}
  120.               {% set data.prices = data.prices + [{'start': (state.start | as_datetime | as_local).isoformat(), 'end': (state.end | as_datetime | as_local).isoformat(), 'price': state.price/1000}] %}
  121.             {% endfor %}
  122.             {{data.prices}}
  123.  
  124.  
  125. ************************* APEX kort kod ************************************
  126.  
  127. type: custom:apexcharts-card
  128. update_interval: 11m
  129. graph_span: 1d
  130. header:
  131.   show: true
  132.   title: Power Saver Today
  133. apex_config:
  134.   chart:
  135.     type: area
  136.   legend:
  137.     show: false
  138.   fill:
  139.     type: gradient
  140.     gradient:
  141.       shadeIntensity: 0.1
  142.       opacityFrom: 0.55
  143.       opacityTo: 1
  144.       inverseColors: true
  145.       stops:
  146.        - 0
  147.         - 90
  148.         - 100
  149. span:
  150.   start: day
  151.   offset: "-0d"
  152. now:
  153.   show: true
  154.   color: rgb(138,43,226)
  155.   label: Now
  156. yaxis:
  157.   - id: price
  158.     decimals: 2
  159.     min: "|-0.1|"
  160.     max: "|+0.1|"
  161.     apex_config:
  162.       title:
  163.         text: kr/kWh
  164.       forceNiceScale: true
  165.   - id: powersaver
  166.     show: false
  167.     min: 0
  168.     max: 1
  169. series:
  170.   - entity: sensor.today_lowest_price
  171.     yaxis_id: price
  172.     type: line
  173.     color: rgb(128,128,128)
  174.     data_generator: |
  175.      return entity.attributes.data.map(d => {
  176.         return [new Date(d.start), d.price];
  177.       });
  178.     name: Elpris
  179.     curve: stepline
  180.     stroke_width: 3
  181.   - entity: binary_sensor.power_saver
  182.     data_generator: |
  183.      return entity.attributes.schedule.map((entry) => {
  184.         return [new Date(entry.time), entry.onOff ? 1 : 0];
  185.       });
  186.     yaxis_id: powersaver
  187.     name: " "
  188.     type: area
  189.     color: rgba(0, 255, 0, 0.2)
  190.     opacity: 0.1
  191.     stroke_width: 0
  192.     curve: stepline
  193.     show:
  194.       legend_value: false
  195.       in_header: false
  196.       name_in_header: false
  197.       datalabels: false
  198.  
Advertisement
Add Comment
Please, Sign In to add comment