Add floor temperature sensor (and logic) to the Generic thermostat

For floor heating (electrical, water) it is said the surface of the floor should not exceed certain maximal temperature (about 29 C) for human feet comfort. It is also mandatory (in some countries?) to install these floor temperature sensors under the floor surface while installing the floor heating. The hardware thermostats then work with them and ensure that the floor surface temperature is never exceeded.

Currently the generic thermostat switches the heating on and off only by one temperature sensor target_sensor and this is mostly the sensor of the room air temperature. So it turns on the heater until the room air temperature reaches the target_temp (considering given tolerances). If you have for example powerful electrical floor heating the temperature of the floor surface might quickly exceed the maximal value before the heating is turned off by reaching the target temperature in the air. That is undesirable.

I propose to add another sensor to the generic thermostat configuration that would receive the value of the floor temperature sensor. The Generic thermostat then would turn the heater off if the floor temperature exceeded the maximal value even if the temperature of the target_sensor had not yet reached the target_temp value. After the floor temperature dropped down below the maximal value again the heater would be turned on again (if room air still needed heating).

The maximal floor temperature should be configurable.

This whole added functionality should also by somehow reflected in the Generic thermostat card in Lovelace in order to see what exactly is happening - that the thermostat currently has switched off the heater not because the target temperature has been already reached but because it is waiting for cooling down the floor surface. The set floor maximal temperature should be also depicted on the temperature circle on the card.

Seems like a bit of a fringe use case. You could probably achieve this using automations to turn off the heater when floor temperature goes above a certain temperature. Or you could use a template sensor to set target_sensor to something absurdly high if the floor temp goes above 29, and feed this into the generic thermostat.

sensor:
  - platform: template
    sensors:
      target_sensor:
        friendly_name: "Target Sensor"
        unit_of_measurement: "degrees"
        value_template: >
          {% if states("sensor.floor_temp_sensor") > 29 %}
          999
          {% else %}
          {{ states("sensor.air_temp_sensor") }}
          {% endif %}

Hm, both ways you propose look doable. However, they seem to me more like workarounds. For the first one: I actually would not want to see in Lovelace that the climate entity is turned off - because it should not be. It should be turned on and only postpone turning the heater on until the floor cools down (a turned off climate entity will never automatically heat again - a postponed climate entity eventually will). The second one seems to me a bit weird, not kind of a proper system solution. Nevertheless, both your solutions are certainly workable but just not kind of clean ones by my opinion. I would like to have this behavior under one hood - incorporated in the Generic thermostat. The real thermostats do exactly that - they watch both the air and the floor temperatures and act accordingly. I don’t know how in other countries but here every thermostat controlling the floor heating must do this so it doesn’t seem as rare to me.

1 Like

Im from Norway, and a lot of old buildings, and almost every single new home have either water or electrical underfloor heating. If its concrete its all god: no upper limit for temperature. If its wood(and almost everyone uses wood as top floor layer) the maximum allowed temperature is 27-29°C(hardware-dependent) to ensure the wood doesent dry out and crimp.

I would love a native max floor temperatur integration in generic thermostat

1 Like

Was just looking for exactly this functionality, it seems that Dual Smart Thermostat can support this.