rnovacek / homeassistant_cz_energy_spot_prices

Home Assistant integration that provides current Czech electricity spot prices based on OTE.
Apache License 2.0
75 stars 17 forks source link

WIP: find cheapest hour #16

Closed mashbrno closed 1 year ago

mashbrno commented 1 year ago

Ahoj, potřeboval bych najít během dne tu nejlevnší energii pro ohřev bojleru. Chci aby spínal 3x denně, tzn. hledám nejlevnější hodinu, kdy sepnout v 8 hodinovém bloku. Typicky levná elektřina je již od půlnoci, ale nejlevnější je třeba až ve 4h ráno.

Zkusil jsem to opajcnout z příkladu nejlevnějších bloků, ale obzvlášť třídou CheapestHourFromPeriodSensor si nejsem jistý. Neznám totiž ani Python, ani dev prostředí pro HA.

Pokud ti tenhle senzor dává smysl, mohl bys to prosím zkouknout, a velmi pravděpodobně doladit?

rnovacek commented 1 year ago

Ahoj, díky za PR. Asi trochu nerozumím zadání. Bojler má spínat 3x denně - takže 3 nejlevnější hodiny během dne? Předpokládám, že to nemusí být souvislý blok, že? Nejde použít senzor "Current Spot Electricity Hour Order"? Když bude <= 3, znamená to, že aktuální cena je v 3 nejnižších za den. V atributech tohoto senzoru jsou pak hodiny s pořadím a cenou (nejlevnější 3 jsem zvýraznil):

image

mashbrno commented 1 year ago

Právěže nechci aby to byl souvislý blok. Potřebuji, aby byla voda dostupná celý den, takže hledám 3 nejlevnější hodiny ale nějak rozumně rozdistribuované přes den. image

Často právě levná hodina je ta poslední (23:00), nicméně nad ránem to je ještě levnější, takže je zbytečné dohřát bojler už v 23, když cena ve 4:00 dál klesne.

xsysel commented 1 year ago

Zdravím, Díky za integraci, super práce.. já bych ocenil něco podobného jako @mashbrno, ale s tím že by to nějak umělo vyhledat nejlevnější hodinu v daném intervalu... Vím že chci mít nahřátý bojler na koupání, takže najít nejlevnější hodinu mezi 15-19h a pak chci lehce dohřát v noci, takže nejlevnější hodinu mezi 3-7h.. ale tak aby se ty intervaly daly definovat... Možná to jde nějak udělat jinde a nedává to smysl to integrovat sem.. jsem nový v HA a učím se...

rnovacek commented 1 year ago

Co třeba nějaký takový template senzor:

{# Define your intervals here as tuples (hour starting the interval, hour ending the interval (excluded)) #}
{% set intervals = [
  (0, 8),
  (8, 16),
  (16, 24),
] %}

{# We need to use namespace so we can write into it in inner cycle #}
{% set min = namespace(price=None, dt=None, cheapest_hours=[]) %}
{% set cheapest_hours = [] %}

{% for interval in intervals %}
  {# Reset min price from previous runs #}
  {% set min.price = None %}

  {# Go through all the hours in the interval (end excluded) and find the hour with lowest price #}
  {% for i in range(interval[0], interval[1]) %}
     {# Get datetime of current hour in current interval #}
     {% set hour_dt = now().replace(hour=i, minute=0, second=0, microsecond=0) %}

     {# Get value for that hour #}
     {% set value = states.sensor.current_spot_electricity_hour_order.attributes.get(hour_dt.isoformat()) %}

     {# value is tuple (order, price), we'll use the price #}
     {% set price = value[1] %}

     {# Min price is not set or is higher than price of current hour => store the min price and hour #}
     {% if min.price is none or price < min.price %}
        {% set min.price = price %}
        {% set min.dt = hour_dt %}
     {% endif %}
  {% endfor %}

  {# Store cheapest hour in current interval #}
  {% set min.cheapest_hours = min.cheapest_hours + [min.dt.hour] %}
{% endfor %}

{# use this to get the cheapest hours #}
{# {{ min.cheapest_hours }} #}

{# return True if current hour is in the cheapest hour of any interval #}
{{ now().hour in min.cheapest_hours }}

Na začátku nastavíte intervaly, které vás zajímají a výsledek je True nebo False podle toho, jestli jsme teď v hodině, která má nejnižší cenu v libovolném z těchto intervalů. Nebo se dá použít {{ min.cheapest_hours }} místo posledního řádku a vypíše to pro každý z intervalu hodinu, která má nejnižší cenu.

Dejte vědět, jestli je to takhle dostatečné. Dalo by se tohle udělat jako vestavěný senzor, jen nevím, jak tomu udělat UI na nastavování těch intervalů. Zatím bych to přidal do README.

xsysel commented 1 year ago

@rnovacek díky moc, vypadá to dobře, vyzkouším o víkendu a dám vědět..

xsysel commented 1 year ago

@rnovacek Funguje to perfektně ;) Mně to stačí takto, nadefinoval jsem si intervaly v tom senzoru a je to.. Díky moc!

mashbrno commented 1 year ago

taky mi tahle magie zabrala. Díky

rnovacek commented 1 year ago

Přidal jsem do readme.

mashbrno commented 1 year ago

Ještě mi to padá o půlnoci na UndefinedError: None has no element 1

Zkusil jsem to ošetřit takto {% set price = iif(value is defined, value[1], 9999) %}

rnovacek commented 1 year ago

Díky, opravil jsem v readme.