Repository navigation
Temp Control
Temperature-based bypass management for free cooling and heating retention.
Temp Control is an automation feature that actively manages the FAN bypass to keep indoor temperature near a comfort setpoint. It supports two modes of actuation:
- Free Cooling – When indoor is too warm and outdoor air is cooler, opens the bypass to bring in fresh cool air.
- Heating Retention – When indoor is too cold, closes the bypass to retain warmth.
The feature integrates with the shared FanSpeedArbiter (for fan speed during cooling) and the ZoneDemandRegistry (for per-area zone valve control).
Temp Control operates a state machine with three active modes plus a disabled state:
| Mode | Bypass Command | Fan Speed | Description |
|---|---|---|---|
idle |
fan_bypass_auto |
No demand | Indoor is within comfort band |
cooling |
fan_bypass_open |
Requested via arbiter | Indoor too warm, outdoor can cool |
heating_retention |
fan_bypass_close |
No demand | Indoor too cold, retain heat |
disabled |
fan_bypass_auto |
No demand | Temp control switch is off |
When no sensor_control areas are configured, the decision is based on indoor vs comfort temperature:
-
Heating retention triggers when:
indoor_temp <= comfort_temp - comfort_delta_activate
-
Cooling triggers when:
indoor_temp >= comfort_temp + comfort_delta_activate-
outdoor_temp >= min_outdoor_temp(safety floor) outdoor_temp <= indoor_temp - cooling_delta_activate
-
Otherwise: idle
To prevent rapid mode switching, hysteresis is applied based on the previous mode:
- If previously cooling, stays cooling until
indoor_temp < comfort_temp + comfort_delta_deactivate - If previously heating, stays heating until
indoor_temp > comfort_temp - comfort_delta_deactivate
A configurable minimum interval (min_bypass_mode_interval_seconds, default 180s) prevents rapid bypass changes. If a mode change would occur within this interval, the previous mode is kept.
When dewpoint_guard_enabled is True, Temp Control adds a condensation safety check before forcing bypass open for cooling.
Why it's needed:
When bypass is open, cold outdoor air flows through the supply ducts. Ducts and internal surfaces cool down towards the supply air temperature. If warm, humid indoor air contacts those cold surfaces and supply_temp < indoor_dewpoint + margin, condensation forms on cold ducts/surfaces.
How it works:
-
Indoor dewpoint is calculated from
indoor_temp+indoor_rhusing the Magnus formula:a = 17.62, b = 243.12 gamma = (a * T) / (b + T) + ln(RH / 100) dewpoint = (b * gamma) / (a - gamma) -
If
supply_temp < indoor_dewpoint + dewpoint_margin_c, the desired mode is forced back toidle(bypass auto) and zone demands are cleared.
Why indoor (not outdoor) dewpoint:
The condensation risk is indoor moisture condensing on cold supply surfaces. Outdoor air at 6°C/100% RH has dewpoint 6°C, but when it enters a 22°C house it warms up and RH drops to ~30% — that air itself won't cause condensation. The relevant comparison is: how cold do surfaces get (supply_temp) vs. how much moisture is already in the house (indoor_dewpoint).
Important note on supply_temp:
The guard relies on supply_temp reflecting the actual supply air temperature after bypass open. When bypass is open (no heat recovery), supply_temp should approach outdoor_temp. If supply_temp is not available or not updating (e.g. sensor unavailable), the guard may not trigger as expected. Ensure sensor.<device>_supply_temp is populated.
Tuning:
- Start with
dewpoint_margin_c = 1.0(conservative). - Increase if the guard blocks cooling too often.
- Decrease if condensation still occurs.
When sensor_control areas are configured with temperature entities, each area is evaluated independently:
-
Per-area evaluation: Each area with a
temperature_entityis evaluated against its own comfort temperature (or the FAN global comfort as fallback). - Aggregation: Cooling has priority — if any area needs cooling, the house cools. If any area needs heating retention (and none need cooling), the house retains heat.
-
Zone demands: For areas that need actuation, zone demands are published via
ZoneDemandRegistry(DemandSource.OTHER) so the ZoneCoordinator opens valves for those areas.
Each area sensor can optionally specify a comfort_temperature_entity:
- Any HA entity that provides a numeric state:
input_number,number,sensor,climatecurrent temperature, etc. - If not configured, falls back to the FAN's global comfort parameter (param 75).
- This allows different rooms to have different target temperatures.
In addition to per-area comfort temperature, you can configure a global comfort temperature entity that overrides the FAN's param_75 for all areas that don't have their own comfort_temperature_entity. This is configured under FAN Configuration → Internal Fan Sensors → Comfort temperature (Temperature Control).
This is useful when:
- Your FAN doesn't support 2411 parameters (param_75 is unavailable)
- You want to use a dynamic comfort temperature from a thermostat, schedule, or
input_numberhelper
The entity can be any HA entity with a numeric state (e.g. input_number.my_comfort, sensor.thermostat_target, climate.living_room).
Comfort temp is resolved with this priority:
-
Area sensor
comfort_temperature_entity— if set, use that entity's value (per-area) -
Global
comfort_temp_entity(FAN Configuration → Internal Fan Sensors) — if set, use that entity's value - FAN global comfort temperature (param 75) — fallback when no comfort entity is configured
When comfort temp is unavailable (no entity configured and param_75 is unavailable), the automation sets the status to waiting_for_comfort_temp instead of silently skipping the device. The HVAC Fan Card will show this status so you know comfort temp is missing.
During cooling, Temp Control sets a fan speed demand via the FanSpeedArbiter:
- Priority: 20 (lower than CO2 Control and Humidity Control)
-
Speed: Configurable via the
select.temp_control_desired_speed_{device_id}entity - Conflict resolution: The arbiter resolves conflicts — highest priority wins. If CO2 Control or Humidity Control also demand a speed, theirs takes precedence.
- Non-cooling modes: Temp Control clears its speed demand when not cooling.
Temp Control has three layers of protection against conflicts with manual bypass operation:
When the user presses a bypass button on the HVAC Fan Card, the card turns off the temp_control switch before sending the manual command. This prevents temp_control from immediately overriding the manual action.
The FanSpeedArbiter tracks manual override state. When is_manual_override_active is true, temp_control skips processing for that device. Pressing Auto on the card clears the manual override and calls _reconcile_startup_states to re-evaluate.
Temp Control listens to the bypass position entity (binary_sensor.*_bypass_position). If the bypass changes externally (no temp_control command within the last 10 seconds), temp_control is automatically turned off. This catches:
- Physical bypass changes
- External service calls
- Unit-native auto mode changes
Temp Control creates the following entities per FAN device:
| Entity | Type | Description |
|---|---|---|
switch.temp_control_{device_id} |
switch | Enable/disable temp control |
select.temp_control_desired_speed_{device_id} |
select | Desired fan speed during cooling (low/medium/high) |
binary_sensor.temp_control_active_{device_id} |
binary_sensor | Whether temp control is actively managing the bypass |
sensor.temp_control_status_{device_id} |
sensor | Current mode (idle/cooling/heating_retention/disabled) |
| Parameter | Default | Description |
|---|---|---|
comfort_delta_activate |
1.0 | Temperature delta from comfort to trigger mode change |
comfort_delta_deactivate |
0.5 | Temperature delta from comfort to exit mode (hysteresis) |
cooling_delta_activate |
1.0 | Required indoor-outdoor delta to start cooling |
cooling_delta_deactivate |
0.5 | Required indoor-outdoor delta to stop cooling |
min_outdoor_temp |
10.0 | Safety floor — don't cool if outdoor is below this |
min_bypass_mode_interval_seconds |
180 | Minimum seconds between bypass mode changes |
default_desired_speed |
high | Default fan speed during cooling |
dewpoint_guard_enabled |
false | Enable condensation protection (see below) |
dewpoint_margin_c |
1.0 | Safety margin (°C) added to indoor dewpoint for the guard |
- Enable Temp Control in the Ramses Extras config flow for your FAN device.
- Configure the threshold/hysteresis parameters.
- Optionally configure sensor_control areas with temperature entities for per-area comfort.
- The HVAC Fan Card will show a "Temp control" button in the bypass row.
Temp Control uses SensorControlResolver to obtain indoor/outdoor temperature entities. If external sensors are configured via FAN Configuration, those are used instead of the internal FAN sensors.
All three automations coexist via the FanSpeedArbiter:
- CO2 Control has highest priority
- Humidity Control has medium priority
- Temp Control has lowest priority (20)
- Only one speed demand is active at a time (highest wins)
When multi-zone per-area comfort is used, Temp Control publishes zone demands via ZoneDemandRegistry. The ZoneCoordinator resolves demands from all sources (Humidity Control, CO2 Control, Temp Control) and opens/closes zone valves accordingly.
The HVAC Fan Card shows:
- A "Temp control" button in the bypass row to toggle the feature on/off
- A status indicator in the right panel (grouped with Balance and CO2) showing compact status like:
Temp → OffTemp → On + IdleTemp → On + CoolingTemp → On + Retain Heat
- Highlighted (blue glow) when actively controlling bypass
- The current mode in the card's status section
When temp_control is active and cooling, the card reflects the bypass open state and the requested fan speed.
Back to: Home Prev: CO2 Control Next: FAN Configuration (Sensor Control)
- Feature Catalog
- CO2 Control
- Humidity Control (Balance)
- Temp Control (Bypass)
- FAN Configuration (Sensor Control)
- HVAC Fan Card
- Ramses Debugger
-
Device Simulator -
⚠️ Use only on dedicated system/container - Default Feature
- Hello World (Developer Example)