Skip to content

[Feature] Extreme heat mode — keep shutters closed all day when outdoor temp exceeds threshold #766

Description

@FredM67

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.pyClimateOptions

  • Add temp_extreme_heat: float | None = None
  • Add extreme_heat_position: int | None = None

pipeline/handlers/climate.pyClimateCoverData

  • 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.pybuild_climate_options()

  • Populate the two new fields from options

config_dynamic.pytemperature_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.pyClimateCoverData.is_summer (lines 101–105)
  • pipeline/handlers/climate_modes.pyNORMAL_WITH_PRESENCE rule table

Metadata

Metadata

Assignees

Labels

awaiting-releaseFix merged, pending next stable releaseenhancementNew feature or request

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions