REST, nebo MQTT?
- REST je nejjednodušší: nic dalšího neinstalujete, Home Assistant se sám jednou za 15 minut zeptá API. Hodí se, když nemáte MQTT broker.
- MQTT doručí novou cenu hned na začátku každého intervalu a zítřejší ceny ihned po zveřejnění. Potřebujete vlastní broker (např. doplněk Mosquitto broker), který se na spotovky.cz připojí jako most.
Obě varianty používají formát v2. Popis polí je v dokumentaci. Konfiguraci vložte do configuration.yaml (nebo do souboru, který z něj načítáte) a Home Assistant restartujte. Pokud už v konfiguraci máte klíč rest:, template: nebo mqtt:, položky do něj přidejte, klíč nesmí být v souboru dvakrát. Použijte jen jednu z variant: obě vytvářejí senzor sensor.spotova_cena.
Varianta 1: REST senzor
Senzor sensor.spotovky_dnes má jako stav datum dne a v atributu slots všechny intervaly dne. Šablonové senzory z něj počítají aktuální cenu, minimum a maximum. Aktuální cena se přepočítá každou minutu, takže na začátku nového intervalu se změní bez nového dotazu na API.
# configuration.yaml — ceny dneška přes REST (bez MQTT)
rest:
- resource: https://api.spotovky.cz/v2/prices/today
scan_interval: 900
sensor:
- name: "Spotovky dnes"
unique_id: spotovky_dnes
value_template: "{{ value_json.date }}"
json_attributes:
- complete
- negative
- rate
- slots
template:
- sensor:
- name: "Spotová cena"
unique_id: spotovky_spotova_cena
unit_of_measurement: "Kč/kWh"
state_class: measurement
availability: >
{{ states('sensor.spotovky_dnes') == now().strftime('%Y-%m-%d')
and state_attr('sensor.spotovky_dnes', 'slots') is not none }}
state: >
{% set ns = namespace(czk=none) %}
{% set t_now = now().timestamp() %}
{% for s in state_attr('sensor.spotovky_dnes', 'slots') or [] %}
{% set t = as_timestamp(s.start) %}
{% if t <= t_now and t_now < t + 900 %}{% set ns.czk = s.czk %}{% endif %}
{% endfor %}
{{ ns.czk }}
- name: "Spotová cena minimum dnes"
unique_id: spotovky_minimum_dnes
unit_of_measurement: "Kč/kWh"
availability: "{{ (state_attr('sensor.spotovky_dnes', 'slots') or []) | count > 0 }}"
state: "{{ state_attr('sensor.spotovky_dnes', 'slots') | map(attribute='czk') | min }}"
- name: "Spotová cena maximum dnes"
unique_id: spotovky_maximum_dnes
unit_of_measurement: "Kč/kWh"
availability: "{{ (state_attr('sensor.spotovky_dnes', 'slots') or []) | count > 0 }}"
state: "{{ state_attr('sensor.spotovky_dnes', 'slots') | map(attribute='czk') | max }}"
Po půlnoci může aktuální cena až 15 minut hlásit „nedostupné“, dokud REST senzor nestáhne nový den. Stav REST senzoru (datum) je krátký, celý den je v atributech; Home Assistant omezuje délku stavu na 255 znaků, atributy ne.
Zítřejší ceny lze stáhnout stejně s adresou /v2/prices/tomorrow. Do zveřejnění výsledků (obvykle 13:05) ale API vrací HTTP 404 a senzor bude nedostupný; Home Assistant to zapíše do logu. Pro zítřek je proto pohodlnější MQTT.
Varianta 2: MQTT senzor
Krok 1: most z vlastního brokeru
Integrace MQTT v Home Assistantu se připojuje k jednomu brokeru. Nepřipojujte ji přímo na spotovky.cz: Home Assistant na broker sám publikuje (stav, discovery), a broker spotovky.cz publish odmítá. Správné řešení je most (bridge) ve vašem brokeru, který z spotovky.cz jen odebírá vybrané topicy.
V doplňku Mosquitto broker zapněte v konfiguraci doplňku volbu customize (active: true, folder: mosquitto), vytvořte soubor níže a doplněk restartujte.
# /share/mosquitto/spotovky.conf — most z vašeho Mosquitto na spotovky.cz connection spotovky address spotovky.cz:1883 cleansession true notifications false topic v2/current/json in 1 topic v2/today/json in 1 topic v2/tomorrow/json in 1
Ponechte notifications false: bez toho by most publikoval svůj stav na vzdálený broker. Topicy uvádějte jednotlivě, wildcardy broker nepovoluje.
Krok 2: senzory
# configuration.yaml — senzory z MQTT (přes most z předchozího kroku)
mqtt:
sensor:
- name: "Spotová cena"
unique_id: spotovky_mqtt_aktualni
state_topic: "v2/current/json"
value_template: "{{ value_json.czk }}"
unit_of_measurement: "Kč/kWh"
state_class: measurement
json_attributes_topic: "v2/current/json"
- name: "Spotovky dnes"
unique_id: spotovky_mqtt_dnes
state_topic: "v2/today/json"
value_template: "{{ value_json.date }}"
json_attributes_topic: "v2/today/json"
- name: "Spotovky zítra"
unique_id: spotovky_mqtt_zitra
state_topic: "v2/tomorrow/json"
value_template: "{{ value_json.date if value_json is defined else None }}"
json_attributes_topic: "v2/tomorrow/json"
sensor.spotova_cena má jako stav cenu v Kč/kWh a v atributech start, end, eur, rank a periods ze zprávy v2/current/json. Senzory dne mají celý JSON v2 v atributech (včetně slots). Zpráva v2/tomorrow/json se po půlnoci maže; šablona pro zítřek proto počítá s prázdnou zprávou.
Levná čtvrthodina pro automatizace
Pole rank udává pořadí intervalu v rámci dne (1 = nejlevnější). Binární senzor níže se zapne, když je aktuální interval mezi 16 nejlevnějšími dne, a lze ho použít jako spouštěč pro bojler, nabíjení nebo pračku. Předpokládá MQTT senzor sensor.spotova_cena z varianty 2.
# configuration.yaml — „levná čtvrthodina“ pro automatizace
template:
- binary_sensor:
- name: "Levná elektřina"
unique_id: spotovky_levna_elektrina
# zapnuto, když je aktuální interval mezi 16 nejlevnějšími dne (4 hodiny)
state: "{{ state_attr('sensor.spotova_cena', 'rank') | int(999) <= 16 }}"
ID entit vzniká z názvu; zkontrolujte je v Nastavení → Zařízení a služby → Entity a případně je v šablonách upravte. Ceny jsou spotové bez DPH, bez distribuce a poplatků.