Home Assistant seriál s Jakubem: Díl 18: Danfoss Ally – nová automatizace a řízení teploty
Úvod
V loňském roce jsme si ve čtvrtém díle ukazovali a nastavovali termostatickou hlavici Danfoss Ally a teplotní senzor Xiaomi. Jenže během celé minulé topné sezóny se ukázalo, že papírově „chytrá“ hlavice v praxi umí být spíš zdrojem frustrace než pohodlí.
- přetápěla
- nedotápěla
- odmítala se vypnout a topila klidně nekonečně dlouho
- reagovala buď strašně pomalu, nebo vůbec
Ve většině případů stačilo z hlavice vyndat baterie, nechat ji 5 minut „odpočinout“ a zase fungovala téměř „normálně“. Přesto se problémy s přetápěním a nedotápěním vracely dál.
Začal jsem tedy hledat řešení – nejdřív jsem zpochybnil automatizaci, pak zkusil Generic Thermostat, následně Better Thermostat. Nic z toho nevyřešilo základní problém.
Nakonec jsem pochopil, že jediná cesta je kompletně přepsat logiku řízení teploty tak, aby Ally přestala být pasivní náhodou a začala se chovat konzistentně. A právě tuto logiku si dnes detailně projdeme.
Jak to funguje
Původně jsem se snažil jít nejčistší cestou a využít hodnotu pi_heating_demand, což je interní procentuální požadavek hlavice na otevření ventilu (0-100%). To by byla úplně nejlepší forma řízení: prostě jí pošlu, kolik má otevřít, a je hotovo.
Problém je, že do pi_heating_demand se nedá zapisovat, je to jen stavová hodnota ne řídicí vstup. Výrobce záměrně tuto funkci zamknul. Takže tento elegantní nápad padl.
Skončil jsem tedy u řešení, které funguje spolehlivě a mám ho plně pod kontrolou:
Home Assistant počítá, jak moc má hlavice přitopit, a Ally dostává jen finální setpoint.
Nepoužívám žádnou její interní regulaci. Ally je v téhle konfiguraci prostě „vykonavatel“.
Používám tři parametry:
- Kp – jak agresivně reagovat na zimu
- Max. boost – kolik stupňů jsem maximálně ochotný přidat nad svůj požadavek
- Min. delta – minimální rozdíl, aby mělo smysl vůbec budit hlavici
Logika:
- Otevřené okno → pošlu hlavici 5 °C a netopím.
- V místnosti je stejně nebo tepleji, než chci → posílám jen svůj cílový setpoint. Nic neřeším.
- V místnosti je chladněji → spočítám rozdíl, použiju Kp a určím, o kolik stupňů má smysl přitopit (boost).
- Boost nikdy nepřesáhne max. boost → nedochází k přetápění
- Pokud by změna byla menší než min. delta, hlavice ji ignoruje, takže ji vůbec nepošlu.
Výsledek je jednoduchý:
- Home Assistant řídí
- Ally jen poslouchá
- teplota se drží přesně a stabilně
- žádné přetápění, žádné nedotápění, žádné „záseky“
Postup
Vytvoření helperů
Aby šla regulace jemně ladit a nebylo potřeba upravovat automatizaci v YAML, tak vytvoříme čtyři číselné helpery (pomocníky) typu input_number a jednoho pomocníka typu boolean. Helpery najdeme v Settings -> Devices & services -> Helpers a pomocí „+ Create Helper“ vytvoříme nového pomocníka, celkem budeme vytvářet pět pomocníků:
- input_number.bedroom_setpoint
Cílová teplota v místnosti (hlavní vstup) - input_number.bedroom_kp
Jak agresivně má systém reagovat, když je v místnosti zima - input_number.bedroom_max_boost_c
Maximální počet stupňů, které může automatizace přidat nad setpoint - input_number.bedroom_activate_delta
Minimální rozdíl potřebný k tomu, aby hlavice vůbec reagovala - input_boolean.bedroom_tune_mode
Režim ladění (umožňuje zapnout nebo vypnout možnost měnit pokročilé hodnoty).
Helper bedroom_setpoint
V okně najdeme nebo vyhledáme typ „Number“ a pomocníka přidáme s následujícím nastavením:
- Name: bedroom_setpoint
(název si můžete přizpůsobit, ale pokud ho změníte, budete muset upravit i automatizaci) - Minimum value: 5
- Maximum value: 30
bedroom_setpoint je hodnota, kterou budete používat k nastavení cílové teploty, na kterou chcete topit. Všechna logika regulace se následně odvíjí právě od této hodnoty.
Helper bedroom_kp
Stejným způsobem přidáme i helper bedroom_kp:
- Name: bedroom_kp
(název si můžete přizpůsobit, ale pokud ho změníte, budete muset upravit i automatizaci) - Minimum value: 1
- Maximum value: 40
Helper bedroom_max_boost_c
- Name: bedroom_max_boost_c
(název si můžete přizpůsobit, ale pokud ho změníte, budete muset upravit i automatizaci) - Minimum value: 0
- Maximum value: 6
Helper bedroom_activate_delta
- Name: bedroom_activate_delta
(název si můžete přizpůsobit, ale pokud ho změníte, budete muset upravit i automatizaci) - Minimum value: 0
- Maximum value: 2
Helper bedroom_tune_mode
U tohoto helperu nevybereme typ Number, ale Toggle. Slouží k zapínání a vypínání režimu ladění.
Rozbor automatizace
Následující část je záměrně rozepsaná detailně a je určená hlavně pro ty, kteří si chtějí automatizaci upravovat nebo jí opravdu rozumět.
Pokud chcete řešení jen používat, můžete si stáhnout hotový blueprint, vybrat své entity a tuto část klidně přeskočit.
Triggery
Automatizace se spouští ve dvou případech
1) Každou minutu
- minutes: /1
trigger: time_pattern
Minutový trigger slouží jako pojistka.
Zajistí, že se logika pravidelně přepočítá a hlavice dostane správný setpoint i v situacích, kdy:
- Ally ignoruje předchozí příkaz
- externí senzor zrovna neposlal update
- nebo se systém ocitne ve stavu, kdy nic jiného trigger nespustí
Je to prostě základní stabilizace.
2) Při změně důležitých vstupů
- entity_id:
- sensor.bedroom_temperature_and_humidity_sensor_ble_temperature
- input_number.bedroom_setpoint
- input_number.bedroom_kp
- input_number.bedroom_max_boost_c
- input_number.bedroom_activate_delta
- binary_sensor.bedroom_window_sensor_contact
trigger: state
Automatizace se spustí i pokaždé, když se změní:
- teplota v místnosti
- cílový setpoint
- Kp / max boost / activate delta
- stav okna
To zajišťuje:
- okamžitou reakci na změnu setpointu
- přesnou regulaci, když se změní teplota
- okamžité vypnutí, když se otevře okno
- okamžitý přepočet, když ladíš parametry
Shrnutí triggerů
- Minutový trigger = stabilita a jistota
- Trigger na změnu hodnot = rychlá reakce na všechny důležité změny
Dohromady tvoří spolehlivý systém, který funguje i když Danfoss Ally zrovna ne.
Proměnné
V části variables si automatizace připraví všechny hodnoty, které potřebuje k výpočtu nového setpointu. Díky tomu je YAML přehlednější a výpočty se neopakují v několika místech.
Níže projdeme jen ty důležité proměnné, které přímo ovlivňují regulaci.
user_setp
user_setp: "{{ states('input_number.bedroom_setpoint')|float(21) }}"
Cílová teplota, kterou chce uživatel.
Je to „pravda“ celého systému — ke které se snažíme dostat.
temp
temp: "{{ states('sensor.bedroom_temperature_and_humidity_sensor_ble_temperature')|float(21) }}"
Aktuální teplota v místnosti podle externího senzoru.
kp, max_boost_c, activate_delta
kp: "{{ states('input_number.bedroom_kp')|float(16) }}"
max_boost_c: "{{ states('input_number.bedroom_max_boost_c')|float(1.5) }}"
activate_delta: "{{ states('input_number.bedroom_activate_delta')|float(0.8) }}"
Tři hodnoty, které určují chování regulace:
- kp – jak silně přitápět
- max_boost_c – kolik °C maximálně přidat nad setpoint
- activate_delta – minimální rozdíl, aby hlavice vůbec reagovala
window_open
window_open: "{{ is_state('binary_sensor.bedroom_window_sensor_contact','on') }}"
Pokud je okno otevřené, regulace se vypne a hlavice dostane 5 °C.
Ve výchozím nastavení automatizace začne topit okamžitě po zavření okna. To ale nemusí být vždy žádoucí – typicky když krátce větráte a v místnosti je ještě studený vzduch, který se má nejdřív promíchat a ohřát přirozeně.
Řešením je přidat časové zpoždění po zavření okna, během kterého se topení stále drží vypnuté.
Předchozí kód tedy stačí v automatizaci nahradit následující variantou a upravit si hodnotu v sekundách.
Například 300 odpovídá 5 minutám (5 × 60 sekund). Postup, jak upravit blueprint, naleznete zde.
window_open: >
{{
is_state(window_entity, 'on')
or (now() - states[window_entity].last_changed).total_seconds() < 300
}}
err
err: "{{ (user_setp - temp)|float(0) }}"
Rozdíl mezi cílovou a skutečnou teplotou:
- kladné číslo → je zima → přitápět
- nula nebo záporné číslo → je teplo → nepřitápět
Je to základní vstup pro výpočet boostu.
raw_pct a pct
raw_pct: "{{ (kp * err)|float(0) }}"
pct: >
{% set p = raw_pct|float(0) %}
{% if p < 0 %} 0
{% elif p > 100 %} 100
{% else %} {{ p|round(1) }}
{% endif %}
raw_pct je teoretická síla přitopení v procentech (0–100).
pct je její oříznutá verze, aby se nepřehoupla přes hranice.
- 0 % → žádné přitopení
- 100 % → plný boost
boost_c
boost_c: "{{ (pct / 100.0 * max_boost_c)|float|round(2) }}"
Výsledný boost ve stupních, tedy o kolik °C přidáme k setpointu.
boosted_setp
boosted_setp: "{{ (user_setp + boost_c)|float|round(1) }}"
Cílová teplota včetně boostu.
Tohle je hodnota, která se pošle hlavici — pokud dává smysl.
new_sp
new_sp: |
{% if window_open %}
5
{% elif err|float <= 0 %}
{{ user_setp|round(1) }}
{% else %}
{% set wake_sp = (temp + activate_delta)|float %}
{% set sp = boosted_setp|float %}
{% set final = sp if sp > wake_sp else wake_sp %}
{% if final < 5 %}
5
{% elif final > 35 %}
35
{% else %}
{{ final|round(1) }}
{% endif %}
{% endif %}
Proměnná new_sp určuje, jakou teplotu nakonec pošleme hlavici.
Je to nejdůležitější část celé automatizace — všechny předchozí výpočty (Kp, boost, err…) se nakonec promítnou právě sem.
Celý výpočet má jen tři hlavní větve:
1) Otevřené okno → vypnout topení
{% if window_open %}
5
2) V místnosti je teplo → drž setpoint
{% elif err|float <= 0 %}
{{ user_setp|round(1) }}
err = user_setp – temp
- Je-li err ≤ 0 → v místnosti je dost tepla.
- Nepřidáváme žádný boost.
- Hlavici pošleme jen uživatelský setpoint (nic neřešíme).
3) V místnosti je zima → spočítáme přitopení
Tady začíná ta hlavní logika regulace.
{% else %}
{% set wake_sp = (temp + activate_delta)|float %}
{% set sp = boosted_setp|float %}
{% set final = sp if sp > wake_sp else wake_sp %}
- boosted_setp je setpoint navýšený o vypočítaný boost (podle Kp a rozdílu teplot)
- wake_sp = temp + activate_delta je minimální hodnota, kterou hlavice musí vidět, aby vůbec reagovala
(protože malé změny ignoruje)
Potom se vybere větší z těchto dvou:
- buď boostovaný setpoint,
- nebo wake_sp (aby se hlavice „probudila“)
Tím je zaručeno:
- že regulace přitápí jen tolik, kolik je potřeba
- ale zároveň se nikdy nestane, že Danfoss Ally ignoruje příliš malou změnu
4) Ochrana proti nesmyslným hodnotám
{% if final < 5 %}
5
{% elif final > 35 %}
35
{% else %}
{{ final|round(1) }}
{% endif %}
Hlavice má své povolené limity — Danfoss Ally umí jen:
- 5 °C minimum
- 35 °C maximum
Tady se zaručí, že automatizace nikdy neposílá mimo rozsah.
Je to ochrana proti extrémním situacím (např. tunění extrémními hodnotami Kp).
5) Shrnutí logiky new_sp
Jednoduše řečeno:
- Otevřené okno → 5 °C
- Teplo v místnosti → pošli jen uživatelský setpoint
- Zima v místnosti → vypočítej boost, ale hlavice musí dostat aspoň temp + activate_delta
- Mimo rozsah → ořez na 5–35 °C
- Výsledek → odešle se hlavici jako nový setpoint
Tahle větev rozhoduje o tom, zda topíme, jak moc topíme a kdy přestaneme.
Akce automatizace
Poslední část automatizace je velmi jednoduchá: pošle finální vypočítaný setpoint do hlavice Danfoss Ally.
actions:
- target:
entity_id: climate.bedroom_thermostat_danfoss_ally
data:
temperature: "{{ new_sp }}"
action: climate.set_temperature
mode: restart
1) Vybereme zařízení, kterému chceme poslat hodnotu
target:
entity_id: climate.bedroom_thermostat_danfoss_ally
To je vaše hlavice.
2) Pošleme jí novou teplotu
data:
temperature: "{{ new_sp }}"
new_sp je finální teplota spočítaná v části variables:
Tou může být:
- cílový setpoint (když je teplo)
- boostovaný setpoint (když je zima)
- minimálně temp + activate_delta (aby reagovala)
- nebo 5 °C (když je otevřené okno)
Automatizace nikdy neposílá nic jiného.
3) Použije se služba climate.set_temperature
action: climate.set_temperature
To je standardní způsob, jak Home Assistant nastavuje teplotu hlavicím.
4) Proč je mód restart
mode: restart
Protože automatizace může být spuštěna několikrát rychle za sebou (např. teplota se mění, posouváme se sliderem, ladíme Kp apod). Bez restartu by se mohly posílat staré hodnoty / fronta příkazů.
Blueprint
Díky blueprintu si můžete ušetřit spoustu práce. Stačí importovat soubor, vybrat helpery, hlavici, externí teplotní senzor a případně senzor otevřeného okna. Celá automatizace se pak nastaví sama, bez ručního přepisování entit.
Pro import blueprintu se přesuneme do Settings-> Automations & scenes -> Blueprints a klikneme na „Import blueprint“. V poli „Blueprint address“ vyplníme následující adresu a klikneme na „Preview“ a poté na „Import blueprint“.
Blueprint se senzorem otevřeného okna naleznete zde.
Blueprint bez senzoru otevřeného okna naleznete zde.

V seznamu blueprintů vybereme náš nově importovaný blueprint a nastavíme příslušné entity.

Ujistěte se, že váš okenní kontakt má stav „on“ při otevření. Pokud váš senzor používá jinou logiku (např. „open/closed“), je možné si blueprint ručně upravit přes File Editor. Blueprint najdete ve složce:
config/blueprints/automations/Freestylerrr/danfoss_ally_p_boost_with_window_sensor.yaml
V souboru pak stačí upravit vyhodnocení stavu okna v tomto řádku tak, aby odpovídalo vašemu senzoru:
window_open: '{{ is_state(window_entity, ''on'') }}'
Vytvoření dashboardu
Aby se regulace dala pohodlně používat v běžném provozu, připravil jsem si jednoduchý dashboard, kde mám na jednom místě cílovou teplotu, aktuální stav a možnost ladění parametrů.
V horní části dashboardu je běžné ovládání – nastavení cílové teploty, aktuální teplota v místnosti, stav okna a informace o otevření ventilu. To jsou věci, které používám denně. Vše ostatní je záměrně schované.
Pokročilé ladění je dostupné až po zapnutí přepínače Tune advanced settings. Dokud je vypnutý, žádné ladicí parametry na dashboardu vůbec nejsou vidět, takže se k nim není možné omylem dostat. Po zapnutí se zobrazí parametry Kp, maximální boost a minimální rozdíl pro probuzení hlavice.
Tyto hodnoty je potřeba si doladit podle konkrétní místnosti – univerzální nastavení neexistuje. Záleží především na velikosti místnosti, umístění externího teplotního senzoru, typu a velikosti radiátoru a také na tom, jak rychle radiátor topí a jak dlouho drží teplo.
Například velký nebo litinový radiátor, který dlouho zůstává horký, obvykle potřebuje nižší Kp a klidnější regulaci. Naopak menší nebo rychle chladnoucí radiátor si často říká o agresivnější reakci. Podobně hraje roli i umístění externího senzoru – senzor blízko radiátoru nebo v průvanu se bude chovat jinak než senzor umístěný uprostřed místnosti.
Důležitou roli hraje také hodnota Max boost. Ta musí být nastavená relativně vysoko, jinak se může stát, že hlavice vůbec nezačne topit. Danfoss Ally totiž často ignoruje malé změny setpointu a reaguje až na výraznější rozdíl. Vyšší maximální boost neznamená agresivní topení – je to pouze horní limit. Skutečnou sílu topení určuje kombinace rozdílu teplot a hodnoty Kp.
Prakticky to znamená, že:
- nízký max boost může způsobit, že hlavice nereaguje
- vyšší max boost dává hlavici dostatečný impuls se „probudit“
- jemnost regulace se pak řeší hlavně pomocí Kp
Ideální postup je nastavit spíše konzervativní hodnoty, sledovat chování topení v průběhu několika hodin a parametry postupně jemně upravovat. Ne podle jednoho krátkého výkyvu, ale podle dlouhodobého chování – zejména toho, zda místnost přetápí, nebo se na cílovou teplotu dostává příliš pomalu.
V běžném provozu pak už řeším jen cílovou teplotu. O zbytek se stará automatizace.
Pro dashboardy bohužel Home Assistant zatím nemá ekvivalent „blueprintů“ jako u automatizací. Proto zde přikládám kompletní YAML kód celého dashboardu. Po vložení bude potřeba upravit názvy entit tak, aby odpovídaly vašemu Home Assistantu (zejména teplotní senzor, hlavice, okenní kontakt a helpery).
type: vertical-stack
cards:
- type: entities
title: Bedroom – Heating control
entities:
- entity: input_number.bedroom_setpoint
name: Target temperature (user)
icon: mdi:thermometer-plus
- type: attribute
entity: climate.bedroom_thermostat_danfoss_ally
attribute: temperature
name: Thermostat setpoint (sent to valve)
- type: attribute
entity: climate.bedroom_thermostat_danfoss_ally
attribute: current_temperature
name: Thermostat internal temperature
- entity: sensor.bedroom_temperature_and_humidity_sensor_ble_temperature
name: Room temperature (external sensor)
- entity: binary_sensor.bedroom_window_sensor_contact
name: Window contact
- entity: sensor.bedroom_thermostat_danfoss_ally_pi_heating_demand
name: Valve opening (%)
- entity: input_boolean.bedroom_tune_mode
name: Tune advanced settings
icon: mdi:tune-variant
- type: conditional
conditions:
- entity: input_boolean.bedroom_tune_mode
state: "on"
card:
type: entities
title: Advanced tuning
show_header_toggle: false
entities:
- entity: input_number.bedroom_kp
name: Kp gain (responsiveness)
- entity: input_number.bedroom_max_boost_c
name: Max boost (°C)
- entity: input_number.bedroom_activate_delta
name: Min delta to wake TRV (°C)
- type: gauge
name: Valve opening (%)
entity: sensor.bedroom_thermostat_danfoss_ally_pi_heating_demand
min: 0
max: 100
- type: history-graph
title: Last 12 hours
hours_to_show: 12
entities:
- entity: sensor.bedroom_temperature_and_humidity_sensor_ble_temperature
name: Room temperature
- entity: input_number.bedroom_setpoint
name: Target (user)
- entity: climate.bedroom_thermostat_danfoss_ally
name: Thermostat
Závěr
V dnešním díle jsme dostali hlavici Danfoss Ally z polofunkčního stavu do stavu plně funkční a stabilně regulující termostatické hlavice. Celé řešení je postavené tak, aby si každý mohl nastavení přizpůsobit vlastním podmínkám — velikosti místnosti, typu a velikosti radiátoru nebo umístění externího teplotního senzoru.
Výsledkem je řízení topení, které reaguje předvídatelně, nepřetápí, nedotápí a nechová se nahodile jako při použití výchozí logiky hlavice. Pokud jste s Danfoss Ally bojovali podobně jako já, věřím, že vám toto řešení výrazně zlepší každodenní provoz.
Tak nohám v teple zdar!







Dobrý den, parádá toto přišlo naprosto vhod protože přesně jak píšete je to spíše zdroj frustrace… Mám stejný HW tzn. jak xiaomi teplotní senzory tak hlavice Danfoss. Jen bych měl pár otázek.
1) s tímto novým návodem zachoval jste zapnutou automatizaci pro odesílání teploty ze senzoru do hlavice?
2) s novou automatizaci na PID řizení kterou jste představil v tomto článku, přestal jste využívat Better Thermostat protože již s tímto řízením není potřeba nebo jste ho zachoval ?
3) Maximální hodnotu v Helperu KP je 40 musel jste někde nastavit reálně opravdu tak vysoké KP ?
Moc díky za návody v podstatě vy jste mě přivedl k HA a i když se naše cesty od 5 dílu trošku rozešly pořád s velkým očekáváním čekám na další díly. Super články a jen tak dál
Dobrý den, jsem rád, že se Vám články líbí :).
1) Ne, původní automatizaci pro odesílání teploty do hlavice už nepoužívám. Vše řeší nová P-boost automatizace, která pracuje s externím senzorem jen jako se vstupem pro výpočet a do Danfoss Ally posílá už pouze výsledný setpoint.
2) Better Thermostat již není potřeba, všechno řídí automatizace a teplotu nastavuji přes slider.
3) Nemusel, ale mám rychlý radiátor a relativně malé místnosti. U starých litinových by mohla být vysoká hodnota potřeba, trvá jim dlouho než začnou pořádně topit.