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

X nejlevnějších hodin v zadaném intervalu #40

Open lukasde opened 8 months ago

lukasde commented 8 months ago

Dobrý den,

chtěl bych se zeptat, zda můžu nějak zjistit X nejlevnějších hodin v zadaném intervalu. Pokud správně chápu "Find cheapest hours in selected interval", tak to najde vždy jednu nejlevnější hodinu, ale já bych potřeboval najít např. 3 nebo 4 nejlevnější hodiny v intervalu 10-18hod.

Díky moc, Lukáš

PatrikTrestik commented 7 months ago

Ano, chápete to správně. Není ale těžké vyrobit senzor který najde blok X nejlevnějších hodin.

Řeším pro sebe výpočet se zapojením distribučních cen a HDO času. To bude trochu složitější. Pokud z toho něco bude pošlu sem výsledek.

lukasde commented 6 months ago

Me to furt nejak nedochazi:( Muzu poprosit o vetsi nakopnuti, jak najit napr. 5 nejlevnejsich hodin v intervalu 0:00 - 12:00? Diky moc

shaman79 commented 6 months ago

Tohle jsem řešil nedávno, zde je verze pro 2 nejlevnější hodiny v intervalu.

Mělo by to jít snadno upravit pro libovolný počet hodin úpravou této podmínky {% if min.min_hours|length < 2 %}

- sensor:
    - name: "two cheapest hours in interval"
      unique_id: two_cheapest_hours_in_interval
      state: > 
        {# Define your intervals here as tuples (hour starting the interval, hour ending the interval (excluded)) #}
        {% set intervals = [
          (0, 8),
          (8, 18),
          (18, 24),
        ] %}

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

        {% for interval in intervals %}
        {# Initialize a list to store the two cheapest hours for the current interval #}
          {% set min.min_hours = [] %}

          {# Go through all the hours in the interval (end excluded) and find the two hours with the lowest prices #}
          {% for i in range(interval[0], interval[1]) %}
            {# Get datetime of the current hour in the 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()) %}

            {# Skip if not found #}
            {% if value is not defined %}
              {% break %}
            {% endif %}

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

            {# Add the hour to the list of two cheapest hours if it has a lower price #}
            {% if min.min_hours|length < 2 %}
              {% set min.min_hours = min.min_hours + [(hour_dt.hour, price)] %}
            {% else %}
              {% set min.min_hours = min.min_hours|sort(attribute=1) %}
              {% if price < min.min_hours[1][1] %}
                {% set min.min_hours = min.min_hours[:1] + [(hour_dt.hour, price)] %}
              {% endif %}
            {% endif %}

          {% endfor %}

          {# Store two cheapest hours in the overall list #}
          {% set min.cheapest_hours = min.cheapest_hours + min.min_hours %}
        {% endfor %}

        {{ now().hour in min.cheapest_hours | map(attribute=0) }}
johny-mnemonic commented 3 months ago

@rnovacek je tu už několik vytvořených issue na téma hledání jedné nebo více hodin v nějakém intervalu. Na kratší intervaly, které nejdou přes půlnoc se dá většinou použít ta vzorová šablona pro jednu hodinu, případně pro víc hodin v komentáři nahoře. Bohužel to má nevýhodu v tom, že to nejde používat moc dynamicky (např, v automatizaci, kde si spočítám kolik hodin mi bude trvat nabití auta, nebo nahřátí bojleru a hledám nejlevnější tak velký interval) a také to nejde používat přes půlnoc, kdy definice intervalu nefunguje.

Nešlo by vygenerovat něco jako current_spot_electricity_hour_order pro daný interval (typicky noc)?

PatrikTrestik commented 3 months ago

Ja mám v plánu pár vylepšení, ale nemám na to čas ☹️ Snad v příštím týdnu. Na některé věci jde udělat šablonu. Na něco bude potřeba změna kódu.