Use case
Well-insulated houses (low-energy builds, near-passive) accumulate heat differently from standard construction. During a heatwave (outdoor temp reaching 35–41°C), keeping shutters closed all day — even when the sun has moved away from the window — is the correct strategy: radiated heat from the hot wall, warm air convection through the glass, and thermal mass all contribute to indoor overheating regardless of direct sun exposure.
The current Climate Mode closes shutters only when the sun is in the FOV (cover_valid AND is_summer). Once the sun leaves the window, the shutter opens back to default position — exactly the wrong behaviour during a heatwave, since the wall is still radiating heat at 41°C.
Proposed feature: Extreme Heat mode
Add two new parameters to Temperature & Climate:
| Parameter |
Description |
Extreme heat threshold (temp_extreme_heat) |
Outdoor temperature above which extreme heat mode activates. Suggested default: none (disabled). Example: 35°C. |
Extreme heat position (extreme_heat_position) |
Position to hold all day while extreme heat is active. Default: 0% (fully closed). Could also be set to a "My" position value for partial closure. |
Behaviour: When outdoor temperature > temp_extreme_heat, the climate handler closes the shutter to extreme_heat_position regardless of sun position, time of day, FOV, or presence. The cover stays there until the outdoor temperature drops back below the threshold (with the existing weather_timeout-style hysteresis if desired).
This is distinct from normal summer mode (temp_high), which only closes when the sun is geometrically in the FOV. Extreme heat mode acts as a day-long hold, not a sun-tracking response.
Decision tree placement
The new rule would sit above the existing summer rule in all four climate rule tables (NORMAL_WITH_PRESENCE, NORMAL_WITHOUT_PRESENCE, TILT_WITH_PRESENCE, TILT_WITHOUT_PRESENCE) in pipeline/handlers/climate_modes.py:
is_extreme_heat (outdoor temp > temp_extreme_heat)
→ extreme_heat_position (regardless of cover_valid / FOV)
is_summer (temp > temp_high AND outdoor > outside_threshold AND cover_valid)
→ 0% (existing behaviour)
...
And in ClimateHandler.evaluate() (pipeline/handlers/climate.py lines 410–425):
if climate_data.is_extreme_heat:
method = ControlMethod.EXTREME_HEAT, season = "extreme heat"
elif climate_data.is_summer:
method = ControlMethod.SUMMER, season = "summer"
...
Implementation sketch
const.py
CONF_TEMP_EXTREME_HEAT = "temp_extreme_heat" (sibling of CONF_TEMP_HIGH)
CONF_EXTREME_HEAT_POSITION = "extreme_heat_position" (clearable, default 0)
ClimateStrategy.EXTREME_HEAT = "extreme_heat"
ControlMethod.EXTREME_HEAT = "extreme_heat"
pipeline/types.py — ClimateOptions
- Add
temp_extreme_heat: float | None = None
- Add
extreme_heat_position: int | None = None
pipeline/handlers/climate.py — ClimateCoverData
- Add
temp_extreme_heat: float | None
- Add
extreme_heat_position: int | None
- Add
is_extreme_heat computed property: outside_temperature > temp_extreme_heat (when both defined)
pipeline/handlers/climate_modes.py — all four rule tables
- Prepend one rule before the existing summer rule:
is_extreme_heat → extreme_heat_position
pipeline/snapshot_builder.py — build_climate_options()
- Populate the two new fields from
options
config_dynamic.py — temperature_climate_schema()
- Add
CONF_TEMP_EXTREME_HEAT threshold field (accepts number or Jinja2 template, same as CONF_TEMP_HIGH)
- Add
CONF_EXTREME_HEAT_POSITION clearable position field
config_fields.py — add the two new fields to the registry
migrations.py — minor version bump, additive only
Workaround with current version
This can be approximated today with a Custom Position slot:
Condition Template: {{ states('sensor.outdoor_temp') | float > 35 }}
Position: 0% (or use My position)
Priority: 51 (above climate=50, below cloud suppression=60)
This works but has two drawbacks: it bypasses the climate handler entirely (so the climate_status diagnostic sensor doesn't reflect it), and it requires the user to know about the pipeline priority system.
Related
- Climate Mode
- Configuration — Climate
pipeline/handlers/climate.py — ClimateCoverData.is_summer (lines 101–105)
pipeline/handlers/climate_modes.py — NORMAL_WITH_PRESENCE rule table
Use case
Well-insulated houses (low-energy builds, near-passive) accumulate heat differently from standard construction. During a heatwave (outdoor temp reaching 35–41°C), keeping shutters closed all day — even when the sun has moved away from the window — is the correct strategy: radiated heat from the hot wall, warm air convection through the glass, and thermal mass all contribute to indoor overheating regardless of direct sun exposure.
The current Climate Mode closes shutters only when the sun is in the FOV (
cover_valid AND is_summer). Once the sun leaves the window, the shutter opens back to default position — exactly the wrong behaviour during a heatwave, since the wall is still radiating heat at 41°C.Proposed feature: Extreme Heat mode
Add two new parameters to Temperature & Climate:
temp_extreme_heat)extreme_heat_position)Behaviour: When outdoor temperature >
temp_extreme_heat, the climate handler closes the shutter toextreme_heat_positionregardless of sun position, time of day, FOV, or presence. The cover stays there until the outdoor temperature drops back below the threshold (with the existingweather_timeout-style hysteresis if desired).This is distinct from normal summer mode (
temp_high), which only closes when the sun is geometrically in the FOV. Extreme heat mode acts as a day-long hold, not a sun-tracking response.Decision tree placement
The new rule would sit above the existing summer rule in all four climate rule tables (
NORMAL_WITH_PRESENCE,NORMAL_WITHOUT_PRESENCE,TILT_WITH_PRESENCE,TILT_WITHOUT_PRESENCE) inpipeline/handlers/climate_modes.py:And in
ClimateHandler.evaluate()(pipeline/handlers/climate.pylines 410–425):Implementation sketch
const.pyCONF_TEMP_EXTREME_HEAT = "temp_extreme_heat"(sibling ofCONF_TEMP_HIGH)CONF_EXTREME_HEAT_POSITION = "extreme_heat_position"(clearable, default 0)ClimateStrategy.EXTREME_HEAT = "extreme_heat"ControlMethod.EXTREME_HEAT = "extreme_heat"pipeline/types.py—ClimateOptionstemp_extreme_heat: float | None = Noneextreme_heat_position: int | None = Nonepipeline/handlers/climate.py—ClimateCoverDatatemp_extreme_heat: float | Noneextreme_heat_position: int | Noneis_extreme_heatcomputed property:outside_temperature > temp_extreme_heat(when both defined)pipeline/handlers/climate_modes.py— all four rule tablesis_extreme_heat → extreme_heat_positionpipeline/snapshot_builder.py—build_climate_options()optionsconfig_dynamic.py—temperature_climate_schema()CONF_TEMP_EXTREME_HEATthreshold field (accepts number or Jinja2 template, same asCONF_TEMP_HIGH)CONF_EXTREME_HEAT_POSITIONclearable position fieldconfig_fields.py— add the two new fields to the registrymigrations.py— minor version bump, additive onlyWorkaround with current version
This can be approximated today with a Custom Position slot:
This works but has two drawbacks: it bypasses the climate handler entirely (so the
climate_statusdiagnostic sensor doesn't reflect it), and it requires the user to know about the pipeline priority system.Related
pipeline/handlers/climate.py—ClimateCoverData.is_summer(lines 101–105)pipeline/handlers/climate_modes.py—NORMAL_WITH_PRESENCErule table