Skip to content

Instantly share code, notes, and snippets.

@jorgror
Last active November 4, 2023 21:54
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jorgror/8e9fb54d7236bdba131931eabd90961b to your computer and use it in GitHub Desktop.
Save jorgror/8e9fb54d7236bdba131931eabd90961b to your computer and use it in GitHub Desktop.
Low spot price sensor
template:
- binary_sensor:
- name: Lav Spotpris
state: |
{% set today_price = state_attr('sensor.nordpool','today') %}
{% set current = state_attr('sensor.nordpool', 'current_price') %}
{% set number_of_hours = states('input_number.number_of_hours') | int %}
{% set max_price = states('input_number.max_price') | float %}
{% if number_of_hours == 0 %}
{% set price_limit = 0 %}
{% else %}
{% set price_limit = (today_price | sort)[number_of_hours-1] %}
{% endif %}
{% set limit = ([ price_limit, max_price ]) | min %}
{{current <= limit}}
input_number:
max_price:
name: Maks Pris
min: 0
max: 10
step: 0.1
icon: mdi:cash-lock
unit_of_measurement: kr/kWt
number_of_hours:
name: Antall Timer
min: 0
max: 24
step: 1
icon: mdi:clock
@oywino
Copy link

oywino commented Feb 25, 2023

Hei,
Det er litt vrient å forstå hvordan dette er ment å fungere.
Se f.kes. denne grafen:

image

Her gir sensoren verdien "on" uansett hva jeg setter på verdien "antall timer".
Slik er det vel ikke ment, eller ?

@oywino
Copy link

oywino commented Nov 4, 2023

Det er kanskje fåfengt å skrive her dersom du allikevel aldri leser dette, men jeg prøver (og håper) allikevel:
Akkurat nå gjelder følgende verdier:

today = [0.24,0.25,0.29,0.34,0.4,0.46,0.49,0.52,0.52,0.54,0.6,0.61,0.62,0.62,0.63,0.63,0.64,0.64,0.66,0.68,0.68,0.7,0.72,0.75]
ferdig sortert tabell
current_price=0.66

number_of_hours=9
max_price=0.8

begge verdiene over er valgt av meg

Dette gir sensor state value = True

Spørsmål: Hvorfor må jeg helt opp til 20 timer før verdien endrer seg til 'False' ?
Utregningen av price_limit gir 0.52 basert på formelen: {% set price_limit = (today_price | sort)[number_of_hours-1] %}
Det igjen gir en limit = 10 basert på formelen : {% set limit = ([ price_limit, max_price ]) | min %}
Noe som skulle tilsi at sensor state burde endre seg ved verdien number_of_hours = 10, men jeg må helt til 20 før den faktisk endrer seg fra 'True' til 'False'
Jeg skjønner ikke hvorfor? (men så er jeg da heller ingen Jinja2 expert)

@jorgror
Copy link
Author

jorgror commented Nov 4, 2023

Bruker du koden slik den er over? Jeg forstår ikke helt hvordan du får de resultatene du oppgir.

Det virker også som at du kanskje missforstår litt hvordan koden er ment å fungere. Jeg skal forsøke å oppsummere litt.

Sensoren gir "True" hvis strømprisen er lav. Lav strømpris er definert som de timene i løpet av en dag med lavest strømpris. Sensoren gir True i de number_of_hours laveste timene. Så hvis number_of_hours er 4 så vil sensoren være True i fire timer og False i 20 timer i løpet av et døgn. Så da setter man f.eks varmtvannsberederen til å gå på når sensoren gir True, og av når den gir False.

Det er også lagt inn en ekstra funksjon med max_price. Hvis en time er blant de number_of_hours billigste, men prisen i denne timen er høyere enn max_price, vil sensoren bli satt til False. Jeg bruker den funksjonen til å styre oppvarming av sentralvarme. Hvis prisen blir for høy, f.eks over 2 kroner, selv i de billigste timene så er det billigere å fyre med ved. Hvis du ikke ønsker denne funksjonen kan du sette max_price til 10 kr eller høyere så vil den aldri ha noen effekt.

@oywino
Copy link

oywino commented Nov 4, 2023

Hei og tusen takk for svar.
Jeg har lagt inn koden din med copy/paste så den skal være identisk.
Tillat meg å stille et par tilleggsspørsmål:

  1. Ditt eksempel med 4 timer og max_price = 10. Kan hver av de 4 timene være spredt tilfeldig ut over døgnet? La oss si at én time om morgenen, to midt på dagen og en på kvelden, eller må de være "consecutive" (etter-hverandre samlet)?

  2. La oss anta at de 4 billigste timene ligger fra kl 06 om morgenen. Er det da slik at om vi aktiverer vaskemaskinen like etter kl 10 så har vi mistet muligheten for "autostart" denne dagen, og sensoren vil ikke bli 'True' i den neste billige 4-timersperiode i den gjenværende delen av dagen?

  3. Data fra Nordpool dekker også neste dag. Tar koden hensyn til det? Eller sagt på en annen måte: Kan den enkelt endres til å gjøre det? Du skjønner sikkert hvor jeg vil; Selv den billigste 4-timers perioden en dag, er ofte betydelig dyrere enn neste periode som er på natta mens vi sover oss inn til neste dag. Jeg antar at definisjonen på dag = døgn = 24 timer fra kl 00 til kl 24 Med andre ord at kl 21 finnes det uansett ingen 4 timers periode igjen av dagen.

Oppsummert; Ville ikke en ideell løsning vært et 24 timers scenario, eller tenker jeg feil?

På forhånd takk for svar, og si gjerne fra om du ikke ønsker eller har mulighet til å holde på "med slike som meg" 😉

@jorgror
Copy link
Author

jorgror commented Nov 4, 2023

  1. Den tar de fire billigste timene, uavhengig når de er. Så de kan gjerne være slik som i ditt eksempel.
  2. Ja, da vil du måtte vente til neste dag. Koden er hovedsaklig tiltenkt utstyr som varmer opp et varmelager, f.eks varmtvannsbereder, sentralvarme eller lignende.
  3. Koden tar ikke hensyn til dette. Det er relativt enkelt å oppdatere den til å ta hånd om dette, men det har noen negative side-effekter. Hvis prisen synker dag for dag vil man kunne ende opp i en situasjon hvor sensoren ikke blir True mange dager i strekk. Hovedtanken bak sensoren er styring av varmtvannsbereder og da vil man at den skal varme hver dag, selv om strømmen blir billigere i morgen.

@oywino
Copy link

oywino commented Nov 4, 2023

Ok, jeg skjønner.
Jeg gjorde et forsøk i HA Template editoren som følger:

 {% set today_price = state_attr('sensor.nordpool','today') %}
 {% set tomorrow_price = state_attr('sensor.nordpool','tomorrow') %}
 {% set two_days = today_price + tomorrow_price %}
 {% set x = now().hour %}
 {{ x }}
 {% set two_days = two_days[x:] %}
 {{ two_days}}
 {% set current = state_attr('sensor.nordpool', 'current_price') %}
 {% set number_of_hours = 5 %}
 {% set max_price = 10 %}
 {% set price_limit = (two_days | sort)[number_of_hours-1] %}
 {{ price_limit }}
 {% set limit = ([ price_limit, max_price ]) | min %}
 {{ limit }}
 {{current <= limit}}

Tanken er at koden hele tiden ser fra "now" og frem til slutten på neste dag. Jeg innbiller meg at det kan fungere?
Verdiene jeg fikk ut var disse (nå kl 22:45):

 22

 [0.54, 0.52, 0.59, 0.59, 0.54, 0.52, 0.49, 0.52, 0.54, 0.68, 0.74, 0.71, 0.73, 0.74, 0.68, 0.69, 0.7, 0.83, 0.93, 1.02, 1.01, 0.9, 0.79, 0.79, 0.76, 0.7]

0.54

0.54

True

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment