Jak přidat spotové ceny do Home Assistant

S přechodem na spot se začne člověk zajímat o to, kdy je nejlepší spotřebovávat elekřinu, protože ta stojí každou hodinu jinak. Vhodným posouváním spotřeby (např. ohřev boileru, spínání tepelného čerpadla) se dá výrazně ušetřit. Elektřina je nejlevnější v hodiny, kdy člověk není doma nebo spí a tak možností “zapnut to, až to bude levné” moc není a je potřeba využít domácí automatizaci. Poslední dobou jsou díky většímu zapojení obnovitelných zdrojů rozdíly cen mezi nejlevnější a nejdražší hodinou i přes 5 kč/kWh a to už stojí za to sem tam nějaký spotřebič přesunout do levnějších hodin.

Pro představu, takhle vypadaly průměrné denní ceny za rok 2022 (do 10. listopadu). O nejlevnější průměrnou hodinu se přetahuje 3. hodina ranní a 2. odpolední.

Čas od času se stane, že elektřina je ve “výprodeji” a je téměř zadarmo. Např. 7.11.2022 byla za 0.002 Kč/kWh.

Strategií jak na spotové ceny je více a obecně se dá říct, že to není jednoduchá optimalizační úloha, protože do ní vstupuje mnoho proměnných od předpovědi počasí (určuje výkon FVE) přes energetickou kapacitu zařízení až po chování domácnosti. Pokud se ale pokusíte některé spotřeby přesunou do levných hodin, můžete tím výrazně ušetřit.

  • na webu Nano Green si můžete vyzkoušet, jak posouvání spotřeby do levných hodin může ovlivnit váš účet za elektřinu
  • nejvhodnějšími zařízeními pro posun spotřeby v čase jsou bojlery, tepelná čerpadla/přímotopy (díky jejich setrvačnosti = můžu je nahřát o něco dříve a vydrží mi nějaký čas nahřáté) a nebo nabíjení elektroaut/baterií. Dají se samozřejmě posouvat i spotřeby myček, praček a sušiček - jejich spotřeba, ale většinou není tak velká a tak i potenciální úspora je menší, i tak to stojí za posunutí.
  • ohřev teplé vody v bojleru ve správné hodiny, dokáže ušetřit až 50% nákladů (detailní analýzy a návody budeme brzy publikovat)

Nejjednodušší cestou, jak optimalizovat spotřebu vůči spotu je využít domácí automatizaci. Proto jsme pro Vás připravili konektory do nejpoužívanějších domácích automatizací. Dnes se podíváme, jak dostat spotové ceny do Home Assistenta.

Home Assistant

Instalace

  1. Nainstalujte HACS pomocí oficiálního návodu.
  2. Zrestartujte Home Assistenta.
  3. Přidejte Nano Green repozitář.

Klikněte na “HACS” v levém menu.
Klikněte na “Integrations”.

Klikněte na tři tečky v pravém horním rohu obrazovky.
Klikněte na “Custom repositories”.

Do pole “Repository” přidat https://github.com/nanogreencz/homeassistant-integrations.
Ve výběru “Category” vybrat Integration.
Klikněte na “Add”.

Repozitář by se vám měl zobrazit mezi ostatními repozitáři.

  1. stáhněte Nano Green integraci.

  1. restartujte Home Assistenta.
  2. nainstalujte Nano Green integraci pomocí Home Assistent settings menu.

Sensory

Jméno ID
Current kWh price in CZK sensor.current_kwh_price_in_czk
Is currently cheapest electricity hour in day sensor.is_currently_cheapest_electricity_hour_in_day
Base cheapest hour sensor.base_cheapest_hour
Base second cheapest hour sensor.base_second_cheapest_hour
Offpeak cheapest hour sensor.offpeak_cheapest_hour
Offpeak second cheapest hour sensor.offpeak_second_cheapest_hour
Peak cheapest hour sensor.peak_cheapest_hour
Peak second cheapest hour sensor.peak_second_cheapest_hour
*Peak = 8:00 - 20:00, Offpeak = 0:00 - 8:00 a 20:00 - 24:00

Grafy

Cena elektřiny

Po nainstalování ApexCharts přes HACS dle návodu pro jistotu restartujete HA a určitě nezapomeňte promazat chache prohlížeče (!), přidejte custom komponentu a vložte do ní níže uvedený kód.

type: custom:apexcharts-card
now:
  show: true
  label: Now
header:
  show: true
  title: Cena elektriny dnes
  show_states: true
  colorize_states: true
series:
  - entity: sensor.current_market_price_czk_kwh
    data_generator: |
      return entity.attributes.today_hourly_prices.map((price, index) => {
        const date = new Date().setHours(index)
        return [date, price];
      });
graph_span: 24h
span:
  start: day

Jakmile máte spotové ceny přidané do Home Assistenta můžete je využit pro nastavení pravidel pro ovládání spotřeby. Já osobně používám pro nastavení pravidel NodeRed, kde se dají rychle a přehledně pravidla realizovat.

Zároveň si můžete hodinové ceny přidat do Energy Dashboardu pro počítání vašich nákladů pro spotřebu a výnosů za výrobu. Pokud máte v Energy Dashboardu přidané proměnné pro spotřebu a dodávku, tak stačí jít do Settings/Dashboards/Energy a tam přidat ke spotřebě a výrobě cenu elektřiny. Jakmile přidáte spotovou cenu, tak se hodinové objemy budou násobit hodinovou cenou a v přehledech pak uvidíte celkový sumy.

1 Like

Hezký den, díky za návod i add-on.

Mám k tomu pár dotazů - jaký je rozdíl mezi market a consumption price? Current production price je předpokládám pro lidi např. se soláry co vám prodávají přebytky? A má nějaký smysl řešit peak a off-peak u spotu?
Díky

Dobrý den,
current_market_price je cena, která je uvedena na OTE přenásobena aktuálním kurzem ČNB a vydělena 1000, aby byla v Kč/kWh.
current_consumption_price je cena po odečtení naší marže, která činí 0.35 Kč/kWh.
current_production_price_with_nano je cena za vyrobenou elekřinu v případě, že zákazník zároveň odebírá elektřinu od Nano.

Peak je v energetice definovaný jako hodiny od 8.00 do 20.00, off-peak 20.00 až 8.00. Někteří zákazníci preferují pouštět vybraná zařízení (např. klimatizaci na topení) jen přes den a tím pádem chtějí znát nejlevnější hodiny v denní hodiny = peak.

Podrobně jsme se snažili vše vysvětlit v dokumentaci - kdyby cokoliv chybělo, dejte vědět a doplníme.

Díky moc za vysvětlení i odkaz na github.

1 Like

Take diky za doplnek. Jde nastavit, aby se zobrazovala i cena na den dooredu, jak to je na OTE?

Dobrý den,

ceny na den dopředu se zobrazit dají - jsou k dispozici jako attribut tomorrow_hourly_prices.

Zde je příklad grafu udělaný pomocí ApexCharts, který zobrazuje ceny pro dnešní den a pokud jsou k dispozici, tak i ceny pro zítřek:

type: custom:apexcharts-card
header:
  show: true
  title: Cena elektriny
  show_states: true
  colorize_states: true
series:
  - entity: sensor.current_market_price_czk_kwh
    data_generator: >
      const todayData = entity.attributes.today_hourly_prices.map((price, index)
      => {
        const date = new Date()
        date.setHours(index)
        date.setMinutes(0)
        date.setSeconds(0)
        return [date, price];
      });

      let tomorrowPrices =  Array(24).fill(undefined); if
      (entity.attributes.tomorrow_hourly_prices?.length > 0) {
          tomorrowPrices = entity.attributes.tomorrow_hourly_prices
      }

      const tomorrowData = tomorrowPrices.map((price, index) => {
        const date = new Date()
        date.setDate(date.getDate() + 1)
        date.setHours(index)
        date.setMinutes(0)
        date.setSeconds(0)
        return [date, price ?? null];
      });

      return [...todayData, ...tomorrowData]
    show:
      in_header: before_now
graph_span: 48h
span:
  start: day

image

3 Likes

Díky moc za odpověď;)

Upravil jsem trošku vaši kartu, tak aby více odpovídala grafu zde: Nano Green

type: custom:apexcharts-card
now:
  show: true
  color: rgb(124,167,173)
  label: Nyní
header:
  show: true
  show_states: true
  colorize_states: true
experimental:
  color_threshold: true
series:
  - entity: sensor.current_market_price_czk_kwh
    color_threshold:
      - value: 1
        color: rgb(62,233,171)
      - value: 1.8
        color: rgb(238,231,24)
      - value: 2.3
        color: rgb(255,149,15)
      - value: 3
        color: rgb(255,71,19)
    data_generator: >
      const todayData = entity.attributes.today_hourly_prices.map((price, index)
      => {
        const date = new Date()
        date.setHours(index)
        date.setMinutes(0)
        date.setSeconds(0)
        return [date, price];
      });

      let tomorrowPrices =  Array(24).fill(undefined); if
      (entity.attributes.tomorrow_hourly_prices?.length > 0) {
          tomorrowPrices = entity.attributes.tomorrow_hourly_prices
      }

      const tomorrowData = tomorrowPrices.map((price, index) => {
        const date = new Date()
        date.setDate(date.getDate() + 1)
        date.setHours(index)
        date.setMinutes(0)
        date.setSeconds(0)
        return [date, price ?? null];
      });

      return [...todayData, ...tomorrowData]
    show:
      in_header: before_now
graph_span: 48h
yaxis:
  - min: 0
    max: 5
    decimals: 1
    apex_config:
      tickAmount: 10
span:
  start: day

Snímek obrazovky 2023-03-17 143734

3 Likes

Skvela prace! Diky moc!

Také děkuji za super počin o za vysvětlení. Nicméně (díval jsem se i do kodu), od market price se vždy odecita nějaká konstanta: 0,35 pro consuption price a 0,6 (resp. 0,9) pro Production price. Nejde teď o konkrétní čísla (asi odpovídají starším cenikum). Jde mi o consuption price. Neměla by se konstanta k tržní ceně naopak přičíst? Přeci když chci kupovat elektřinu, musí to byt za “trh plus něco”. Nebo uvazuju chybne?

1 Like

Ano, to si nas mysli vic, delal jsem na to tohle issue: Znamenko u current_consumption_price · Issue #3 · nanogreencz/homeassistant-integrations · GitHub

Jinak jeste k te posledni verzi apex chartu co zde je, pridal jsem si do series parametr “type: column”, s tim mi to prijde lepsi - je to “skok” ceny co plati vzdy celou hodinu, tak lepsi nez vyhlazena krivka.

1 Like

Nasadili jsme změnu, mělo by to snad už být správně.

Dobrý den, vidím, že PR byl odbaven, nicméně nedošlo k releasu integrace, takže HACS tuto změnu nereflektuje. Mohl bych poprosit o release? Díky moc!

Dobrý dne, upraveno. Mělo by to tam už být… Díky moc za upozornění :slightly_smiling_face:

1 Like

Malý postřeh z dnešního vývoje cen na spotu - 24.9.2023
Pokud zvolím, jako spouštěč pro TČ “Jedna z šesti nejlevnějších hodin” bude se TČ spínat v okně od 10.00 - 15.00 hod. V ostatní hodiny zahálí, osazenstvo “mrzne”.
Nešlo by okno, resp. počet nejlevnějších hodin zvětšit?
A aby to i byla volba v integritě, někdo tak velké okno nepotřebuje.
Díky

Edit: Případně i obrácené hodiny, tedy ty nejdrahší. Např. jedna z šesti nejdrahších a dalo by si tím TČ odstavovat.

Díky za feedback - máme to v backlogu, ale zatím jsme se k tomu nedostali. Dost by to pomohlo i mě :frowning:

Já jsem to vyřešil spot cenou od OTE a nastavením od rnovacek, kde ná vytvořenou automatizaci s výběrem X hodin.

1 Like

Tak super funguje to dobře. Teď 21 nejlevnější hodina, mám filtr na 20.



1 Like

kdyby byl někdo ochoten ještě dodělat celkovou cenu se všema poplatkama za distribuci a daněma, tak by to bylo super!

Dá se to bez problémů udělat přes template senzor:

      - name: "Cena elektřiny nákup"
        state: >-
          {{- ((float(states("sensor.czk_price_per_kwh")) * 1.21 * 1000 + float(states("input_number.nakup_elektriny_poplatky")) + float(states("input_number.nakup_elektriny_distribuce"))  + float(states("input_number.nakup_elektriny_systemove_sluzby")) + float(states("input_number.nakup_elektriny_podpora_oze"))) / 1000) | round(4) -}}
        unit_of_measurement: "Kč/kWh"
        unique_id: price.czk_price_per_kwh_purchase
        state_class: measurement
        attributes:
          prices_hourly: >-
            {% from 'hdo.jinja' import cena_distribuce %}
            {% set ceny=states.sensor.czk_price_per_kwh.attributes.prices_hourly %}
            [{% for hour in range(ceny|length) %}
            {{- (((ceny[hour] * 1.21 * 1000 + float(states("input_number.nakup_elektriny_poplatky"))) + float(cena_distribuce(hour)) + float(states("input_number.nakup_elektriny_systemove_sluzby")) + float(states("input_number.nakup_elektriny_podpora_oze"))) / 1000) | round(2) -}}
            {%- if not loop.last %}, {% endif -%}
            {% endfor %}]
{% macro cena_distribuce(hodina) %}
{% if (hodina >= 0 and hodina < 5) or (hodina >= 18 and hodina < 20) or (hodina >= 23 and hodina < 24 + 5) or (hodina >= 24 + 18 and hodina < 24 + 20) or (hodina >= 24+23 and hodina < 24+24) %}
{{ states("input_number.nakup_elektriny_distribuce_nt") }}
{% else %}
{{ states("input_number.nakup_elektriny_distribuce_vt") }}
{% endif %}
{% endmacro %}