Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nejlevnejsi hodiny spotu pres pulnoc. #80

Open
Policanek opened this issue Jan 7, 2025 · 10 comments
Open

Nejlevnejsi hodiny spotu pres pulnoc. #80

Policanek opened this issue Jan 7, 2025 · 10 comments

Comments

@Policanek
Copy link

Zdravim,
díky za skvělou integraci.
Nabíjím díky ní bojler za nejnižší spot. Rád bych ale nahříval v noci např. mezi 22:00 a 06:00. s možností výběru počtu hodin. Je nějká možnost? V tomto případě "nefunguje" hour order.
Děkuji

@kkoouu
Copy link

kkoouu commented Jan 7, 2025

proč nahřívat zrovna v noci a ne skutečně za nejnižší ceny ?

@Policanek
Copy link
Author

proč nahřívat zrovna v noci a ne skutečně za nejnižší ceny ?

Máte pravdu (špatně jsem to formuloval), nahřívám za nejnižší cenu spotu (1-3 hodiny dle hour order). Ale pokud večer vodu vypotřebuji (teplota pod určitou úrověň), chci přes noc nahřát , abych měl ráno teplou vodu. Nicméně přes noc mi je jedno,jestli nahřívám ve 22:00 nebo 4:00 druhý den. Tuto automatizaci mám převážně pro zimní období. Léto se nahřívá z FVE.

@zhouska
Copy link

zhouska commented Jan 16, 2025

Zdravim, díky za skvělou integraci. Nabíjím díky ní bojler za nejnižší spot. Rád bych ale nahříval v noci např. mezi 22:00 a 06:00. s možností výběru počtu hodin. Je nějká možnost? V tomto případě "nefunguje" hour order. Děkuji

Napsal jsem si takovou malou aplikaci do AppDaemon, která dělá přesně tohle - umí najít nejlevnější souvislé (consecutive) a nesouvislé (non-consecutive) bloky hodin v zadaném časovém úseku. Váhování bloků je nastavitelné, tzn. do určitého rozdílu cenami preferuj souvislé bloky, pokud překročíš threshold, tak klidně ber nesouvislé bloky hodin. V moment nejlevnější hodiny v daném časovém úseku prostě nastaví stav senzoru na ON nad kterým mám postavenou automatizaci, až hodina či blok hodin skončí, tak prostě nestaví stav senzoru na stav OFF. Po expiraci okna (den/noc) se prostě posune o jednu či dvě pozice dál.

V mém případě kombinuje dvě okna - den a noc pro D57 sazbu. Počet hodin a počáteční/koncové časy úseků jsou konfigurovatelné včetně hodin kdy mám vysokou distribuční sazbu. Aplikace umí uložit svůj stav i do souboru aby přežila restart a reaguje na stav senzoru has_tomorrow_data z homeassistant_cz_energy_spot_prices kdy vyhledá bloky hodin na další den.

Už mám skoro odladěno a otestováno. Až bude hotovo nasdílím na github.

@ZdenekM
Copy link

ZdenekM commented Jan 24, 2025

Možná řeším něco podobného... Hodilo by se mi aby mi integrace dávala "hour order" pouze do budoucnosti a ideálně i přes půlnoc (když jsou data dostupná). Pro řízení nabíjení / vybíjení baterky mi data do historie jsou k ničemu a potřebuji se dívat i přes půlnoc - abych třeba nenabíjel baterku v 23:00, když to bude levnější "za chvíli" třeba v 2:00.

@Paja-git
Copy link

Paja-git commented Jan 25, 2025

Co brání použít tomorrow_buy/sell_electricity_hour_order a spot_electricity_has_tomorrow_data?

@Policanek
Copy link
Author

@Paja-git Pokud cena spotu v noci klesa, tak je pred pulnoci treba hour order 3, 2, 1, a po pulnoci pokracuje dal pokles, tak muze byt napr. 5, 4, 3, 2, 1. To znamena, ze chcete mit spotrebic zapnuty az nad ranem druheho dne, protoze je cena nejnizsi. Bez další chytristiky nelze jednoduse pouzit tyto dva senzory s hour order. Nebo mi neco utika?

@Paja-git
Copy link

@Policanek Reagoval jsem na ten pozadavek budoucich dat. Mezi 13:00-24:00 jsou k dispozici Tomorrow data, o pulnoci se preklopi do Today. Jedine reseni by asi bylo si vytvorit svuj vlastni template senzor, nacist data Today a Tomorrow a nad nimi spocitat bloky nejnizsich cen. nez byla k dispozici inovovana verze, pocital jsem si nakupni senzory, napr. tento, ktery vracel True pokud byla dana hodina uvnitr. Nechalo by se to zrejme i upravit pro 48 hodin.

          {% set block_size = 4 %}
          {% set data = namespace(is_within_block = false, hour_block_start=-1, price_sum=0, min_price_sum=10000, prices=[]) %}
          {# Gather prices for each hour #}
          {% for i in range(0, 24) %}
            {% set time_dt = now() %}
            {% set hour_dt = time_dt.replace(hour=i, minute=0, second=0, microsecond=0).isoformat()|string %}
            {% set price = states.sensor.spot_electricity_buy_prices.attributes.prices[i][hour_dt] %}
            
            {% if price is not none %}
              {% set data.prices = data.prices + [(i, price)] %}
            {% endif %}
          {% endfor %}
          
          {# Find the block of X consecutive hours with the minumum combined price #}
          {% for i in range(0, data.prices | length - block_size + 1) %}
            {% set data.price_sum = 0 %}
            {% for j in range(0, block_size) %}
              {% set data.price_sum = data.price_sum + data.prices[i + j][1] %}
            {% endfor %}
            {% if data.price_sum < data.min_price_sum %}
              {% set data.hour_block_start = data.prices[i][0] %}
              {% set data.min_price_sum = data.price_sum %}
            {% endif %}
          {% endfor %}
          
          {# Determine if the current hour is within the cheapest block #}
          {% set current_hour = now().hour %}
          {% for j in range(0, block_size) %}
            {% if current_hour == (data.hour_block_start + j) % 24 %}
              {% set data.is_within_block = true %}
              {% break %}
            {% endif %}
          {% endfor %}
          {{ data.is_within_block }}  

@Paja-git
Copy link

@Policanek prosel jsem Python kod integrace a rikal jsem si, ze Cheapest bloky by mely prechazet i pres pulnoc. A taky ze jo:
Current Buy Electricity is Cheapest 8 Hours Block:

Image

@Policanek
Copy link
Author

@Policanek prosel jsem Python kod integrace a rikal jsem si, ze Cheapest bloky by mely prechazet i pres pulnoc. A taky ze jo: Current Buy Electricity is Cheapest 8 Hours Block:

Image

Diky. Zkusim vymyslet nejaky skript (dik za inspiraci). Kdyz se povede, dam ho sem.

@Policanek
Copy link
Author

Policanek commented Feb 13, 2025

Za pomoci ChatGPT se mi povedlo udelat tento sensor template...
Načte informace o ceně, včetně time stamp. Ale nedaří se mi seřadit Order dle ceny. Nemáte pls nekdo napad jak na to? Diky

- name: "Eletricity price night"
 unique_id: electricity_price_night
 state: >
   {% set data = state_attr('sensor.eletricity_price_night', 'sorted_prices') %}
   {#{ data[3] }#}
   {% set now_hour = now().replace(minute=0, second=0, microsecond=0).isoformat() %}
   {% set current_entry = data | selectattr('hour', 'equalto', now_hour) | first %}
   {{ current_entry.order if current_entry else 'unknown' }}

 attributes:
   sorted_prices: >
     {% set data = namespace(order=1, prices=[]) %}
     {% set tomorrow_data = states('binary_sensor.spot_electricity_has_tomorrow_data') %}
     
     {# Gather prices for hour today #}
     {% if  tomorrow_data == 'on' %}
       {% for i in range(18, 24) %}
         {% set time_dt = now() %}
         {% set hour_dt = time_dt.replace(hour=i, minute=0, second=0, microsecond=0).isoformat() %}
         {% set prices = state_attr('sensor.current_spot_electricity_price', hour_dt) %}
         {# If prices exist, store them in the prices list along with order #}
         {% if prices is not none %}
           {% set data.prices = data.prices + [{'hour': hour_dt, 'price': prices, 'order': data.order}] %}
           {% set data.order = data.order + 1 %}
         {% endif %}
       {% endfor %}
       {# Gather prices for hour tomorrow #}
       {% for i in range(0, 7) %}
         {% set time_dt = now() + timedelta(days=1) %}
         {% set hour_dt = time_dt.replace(hour=i, minute=0, second=0, microsecond=0).isoformat() %}
         {% set prices = state_attr('sensor.current_spot_electricity_price', hour_dt) %}
         {# If prices exist, store them in the prices list along with order #}
         {% if prices is not none %}
           {% set data.prices = data.prices + [{'hour': hour_dt, 'price': prices, 'order': data.order}] %}
           {% set data.order = data.order + 1 %}
         {% endif %}
       {% endfor %}
     {% endif %}

     {# Sort the prices from lowest to highest by the 'price' value #}
     {% set sorted_prices = data.prices | sort(attribute='price') %}
     {# Sort the prices by date and time in ascending order #}
     {% set sorted_prices_by_time = sorted_prices | sort(attribute='hour') %}
     {# Return the sorted prices #}
     {{ sorted_prices_by_time }}

``

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants