Heating Failure Detection

Why this feature?

Heating failure detection allows you to monitor the proper operation of your heating system. It detects two types of abnormal situations:

  1. Heating failure: the thermostat is requesting a lot of power (high on_percent) but the temperature is not increasing. This may indicate:

    • a faulty or turned off radiator,
    • a stuck thermostatic valve,
    • an undetected open window,
    • a hot water circulation problem (central heating).
  2. Cooling failure: the thermostat is not requesting power (on_percent at 0) but the temperature keeps rising. This may indicate:

    • a radiator that stays on despite the stop command,
    • a relay stuck in the "on" position,
    • an underlying device that is no longer responding.

Tip Important

This feature does not change the thermostat's behavior. It only sends events to alert you of an abnormal situation. It is up to you to create the necessary automations to react to these events (notifications, alerts, etc.).

How it works

This feature only applies to VTherm using the TPI algorithm (over_switch, over_valve, or over_climate with valve regulation). Therefore, over_climate VTherms that control a heat pump, for example, are not affected. Indeed, in this case, the heating decision is made by the underlying device itself, which prevents access to reliable information.

This function only applies to Heating mode (hvac_mode=heat). In cooling mode (hvac_mode=cool) no detection is performed to avoid false positives.

Heating failure detection

  1. The VTherm is in heating mode,
  2. The on_percent is greater than or equal to the configured threshold (default 90%),
  3. This situation has lasted longer than the detection delay (default 15 minutes),
  4. The temperature has not increased during this period.

➡️ A versatile_thermostat_heating_failure_event event is emitted with failure_type: heating and type: heating_failure_start.

When the situation returns to normal (temperature rising or on_percent dropping), an event with type: heating_failure_end is emitted.

Cooling failure detection

  1. The VTherm is in heating mode,
  2. The on_percent is less than or equal to the configured threshold (default 0%),
  3. This situation has lasted longer than the detection delay (default 15 minutes),
  4. The temperature continues to rise.

➡️ A versatile_thermostat_heating_failure_event event is emitted with failure_type: cooling and type: cooling_failure_start.

When the situation returns to normal, an event with type: cooling_failure_end is emitted.

Configuration

Like many VTherm features, this functionality can be configured in the central configuration to share parameters. To apply it to the chosen VTherms, the user must add the feature (see "Features" menu) and choose to use the common parameters from the central configuration or specify new ones that will only be applied to this VTherm.

To access it:

  1. Go to the configuration of your "Central Configuration" type VTherm
  2. In the menu, select "Heating failure detection"
  3. Then go to the configuration of the relevant VTherms,
  4. Select the "Features" menu,
  5. Check the "Heating failure detection" feature,
  6. Choose to use the central configuration parameters or specify new ones.

Configuration

Parameters

ParameterDescriptionDefault value
Enable heating failure detectionEnables or disables the featureDisabled
Heating failure thresholdon_percent percentage above which heating should cause temperature to increase. Value between 0 and 1 (0.9 = 90%)0.9 (90%)
Cooling failure thresholdon_percent percentage below which temperature should not increase. Value between 0 and 1 (0 = 0%)0.0 (0%)
Detection delay (minutes)Waiting time before declaring a failure. Helps avoid false positives due to normal fluctuations15 minutes
Temperature change tolerance (°C)Minimum temperature change in degrees to consider significant. Smaller changes are ignored to filter sensor noise0.5°C

Tip Tuning tips

  • Heating threshold: If you have false positives (failure detection when everything is working), increase this threshold to 0.95 or 1.0.
  • Cooling threshold: If you want to detect a radiator that stays on even with a low on_percent, increase this threshold to 0.05 or 0.1.
  • Detection delay: Increase this delay if you have rooms with high thermal inertia (large rooms, underfloor heating, etc.). You can look at the heating curves (see additions) and see how long it takes for your thermometer to increase after heating is triggered. This duration should be the minimum for this parameter.
  • Tolerance: If you have inaccurate or noisy sensors, increase this value (e.g., 0.8°C). Many sensors have an accuracy of ±0.5°C.

Exposed attributes

VTherms with TPI expose the following attributes:

is_heating_failure_detection_configured: true
heating_failure_detection_manager:
  heating_failure_state: "off"      # "on", "off", "unknown", "unavailable"
  cooling_failure_state: "off"      # "on", "off", "unknown", "unavailable"
  heating_failure_threshold: 0.9
  cooling_failure_threshold: 0.0
  detection_delay_min: 15
  temperature_change_tolerance: 0.5
  heating_tracking:                 # Heating failure detection tracking
    is_tracking: true               # Detection in progress?
    initial_temperature: 19.5       # Temperature at the start of tracking
    current_temperature: 19.7       # Current temperature
    remaining_time_min: 8.5         # Minutes remaining before alert
    elapsed_time_min: 6.5           # Minutes elapsed since start
  cooling_tracking:                 # Cooling failure detection tracking
    is_tracking: false
    initial_temperature: null
    current_temperature: null
    remaining_time_min: null
    elapsed_time_min: null

Binary sensor

When heating failure detection is enabled, a binary sensor is automatically created for each relevant VTherm:

EntityDescription
binary_sensor.<name>_heating_failure_stateIndicates if a heating or cooling failure is detected

The sensor's display name is translated according to your Home Assistant language "Heating failure state".

This sensor is:

  • ON when an anomaly (heating or cooling) is detected
  • OFF when the system is working normally

Characteristics:

  • Device class: problem (enables native Home Assistant alerts)
  • Icons:
    • mdi:radiator-off when an anomaly is detected
    • mdi:radiator when everything is working

This binary sensor can be used directly in your automations as a trigger, or to create alerts via Home Assistant's native notifications.

Events

The versatile_thermostat_heating_failure_event event is emitted when a failure is detected or ends.

Event data:

FieldDescription
entity_idThe VTherm identifier
nameThe VTherm name
typeEvent type: heating_failure_start, heating_failure_end, cooling_failure_start, cooling_failure_end
failure_typeFailure type: heating or cooling
on_percentThe power percentage requested at the time of detection
temperature_differenceThe temperature difference observed during the detection period
current_tempThe current temperature
target_tempThe target temperature
thresholdThe configured threshold that triggered the detection
detection_delay_minThe configured detection delay
state_attributesAll entity attributes at the time of the event

Automation examples

Persistent notification for heating failure

This automation creates a persistent notification when a heating failure is detected:

  alias: "Heating failure alert"
  description: "Creates a persistent notification when heating failure is detected"
  trigger:
    - platform: event
      event_type: versatile_thermostat_heating_failure_event
  condition:
    - condition: template
      value_template: "{{ trigger.event.data.type == 'heating_failure_start' }}"
  action:
    - service: persistent_notification.create
      data:
        title: "🔥 Heating failure detected"
        message: >
          The thermostat **{{ trigger.event.data.name }}** has detected a heating failure.

          📊 **Details:**
          - Power requested: {{ (trigger.event.data.on_percent * 100) | round(0) }}%
          - Current temperature: {{ trigger.event.data.current_temp }}°C
          - Target temperature: {{ trigger.event.data.target_temp }}°C
          - Temperature change: {{ trigger.event.data.temperature_difference | round(2) }}°C

          ⚠️ The heating is running at full power but the temperature is not increasing.
          Check that the radiator is working properly.
        notification_id: "heating_failure_{{ trigger.event.data.entity_id }}"

Persistent notification for all failure types

This automation handles both failure types (heating and cooling):

  alias: "Heating anomaly alert"
  description: "Notification for all types of heating failures"
  trigger:
    - platform: event
      event_type: versatile_thermostat_heating_failure_event
  condition:
    - condition: template
      value_template: "{{ trigger.event.data.type in ['heating_failure_start', 'cooling_failure_start'] }}"
  action:
    - service: persistent_notification.create
      data:
        title: >
          {% if trigger.event.data.failure_type == 'heating' %}
            🔥 Heating failure detected
          {% else %}
            ❄️ Cooling failure detected
          {% endif %}
        message: >
          The thermostat **{{ trigger.event.data.name }}** has detected an anomaly.

          📊 **Details:**
          - Failure type: {{ trigger.event.data.failure_type }}
          - Power requested: {{ (trigger.event.data.on_percent * 100) | round(0) }}%
          - Current temperature: {{ trigger.event.data.current_temp }}°C
          - Target temperature: {{ trigger.event.data.target_temp }}°C
          - Temperature change: {{ trigger.event.data.temperature_difference | round(2) }}°C

          {% if trigger.event.data.failure_type == 'heating' %}
          ⚠️ The heating is running at {{ (trigger.event.data.on_percent * 100) | round(0) }}% but the temperature is not increasing.
          Check that the radiator is working properly.
          {% else %}
          ⚠️ The heating is off but the temperature keeps rising.
          Check that the radiator turns off properly.
          {% endif %}
        notification_id: "heating_failure_{{ trigger.event.data.entity_id }}"

Automatically dismiss notification when failure is resolved

This automation dismisses the persistent notification when the failure is resolved:

  alias: "Heating anomaly resolved"
  description: "Dismisses the notification when the failure is resolved"
  trigger:
    - platform: event
      event_type: versatile_thermostat_heating_failure_event
  condition:
    - condition: template
      value_template: "{{ trigger.event.data.type in ['heating_failure_end', 'cooling_failure_end'] }}"
  action:
    - service: persistent_notification.dismiss
      data:
        notification_id: "heating_failure_{{ trigger.event.data.entity_id }}"
    - service: persistent_notification.create
      data:
        title: "✅ Anomaly resolved"
        message: >
          The thermostat **{{ trigger.event.data.name }}** is working normally again.
        notification_id: "heating_failure_resolved_{{ trigger.event.data.entity_id }}"
    # Automatically dismiss the resolution notification after 1 hour
    - delay:
        hours: 1
    - service: persistent_notification.dismiss
      data:
        notification_id: "heating_failure_resolved_{{ trigger.event.data.entity_id }}"

Tip Notes

  1. Persistent notifications remain displayed until the user closes them or they are dismissed by an automation.
  2. Using notification_id allows you to update or dismiss a specific notification.
  3. You can adapt these automations to send notifications on mobile, Telegram, or any other notification service.
  4. This feature only works with VTherms using the TPI algorithm (over_switch, over_valve, or over_climate with valve regulation).