How to regulate climate temperature in sunroom (airco configuration)?

I’ve got a bit of a broad question. It’s something I’ve been struggling with ever since we installed our airconditioning unit, and was wondering how others have tackled this.

Our situation:
We’ve got a sunroom/conservatory which is fully insulated (triple glazed windows with a solar coating), has floor heating, a motorized roof shade and curtains against bright sun and heat. We’ve installed an airconditioning unit because, despite all the insulating measures, it can get quite hot (no surprise there, this is mainly because of all the glass of course).

And, of course, all is completely smart and automated within our Home Assistant configuration. If the temperature rises above a certain threshold, the airconditioning starts cooling. If the ideal temperature is reached, it stops cooling. If it’s sunny outside and either the luminosity in that area is high enough and/or the outside temperature is over a certain threshold, the solar roof extends and the curtains close to ward off the heat.

The smart/controllable products in the sunroom:

  • Curtains
    Not black-out curtains, but a bit see-through. Tahoma/Somfy, RTS protocol - no input if they’re open or closed
  • Shades on the roof
    Made smart through a module on the switch, so no input if they’re open or closed
  • Airconditioning unit
    Mitsubishi Heavy Industries SRK20-50ZS-W Single-Split (R32) wall module, fully controllable. Has a temperature sensor, but often measures too high due the warmth of the unit itself and the sun shining directly on the (black-colored) unit
  • Floor heating
    Magnum flooring (Tuya). Can’t cool, can only heat, and the only way to ‘activate’ or stop it, is to change the target temperature. Has a temperature sensor, almost as accurate as the Shelly one
  • Shelly temperature sensor
    Most accurate sensor in there

The issue:
However, I can’t get the temperature reading correct. Since it’s a sunroom, the temperature really isn’t as constant as in the rest of our house (that is to say, in plain-old brick-walled rooms with regular windows). It doesn’t help that the walls are painted black, haha. How the temperature feels is radically different depending on the day and factors, so one day 22 degrees feels cosy, but on another it feels cold. I think this has mainly to do with a few factors: if the airconditioning is running (and thus, blowing cold wind, how fast and in your direction or not), the temperature inside, the temperature outside, if the sun is shining directly on the sunroom or if it’s in the shade, if the curtains + shades are closed or not.

But, I’m finding it difficult to determine a good feel temperature sensor that also feels correct. I’ve made a rather simple one that’s included in my template.yaml file, but it doesn’t work better than the actual temperature of the sunroom itself.

- sensor:
    - name: "Gevoelstemperatuur Serre"
      unique_id: gevoelstemperatuur_serre
      unit_of_measurement: "°C"
      icon: mdi:thermometer
      device_class: temperature
      state: >
        {% set T_raw = states('sensor.serre_temperature')|float(0) %}
        {% set T = T_raw if T_raw != 0 else states('sensor.gemiddelde_serretemperatuur')|float(0) %}
        {% set RH = states('sensor.thermostaat_serre_humidity')|float(50) %}
        {% set airco_state = states('climate.airco_serre') %}
        {% if airco_state == 'off' %}
          {% set v = 0.05 %}
        {% else %}
          {% set fan_mode = state_attr('climate.airco_serre', 'fan_mode') or 'auto' %}
          {% set v = {
            '1 Lowest': 0.2,
            '2 Low': 0.3,
            '3 High': 0.4,
            '4 Highest': 0.5
          }.get(fan_mode, 0.3) %}
        {% endif %}
        {% set e = (RH / 100) * 6.105 * (2.71828 ** (17.27 * T / (237.7 + T))) %}
        {{ (T + 0.33 * e - 0.70 * v - 4.00) | round(1) }}

Because I don’t have a (temperature) sensor that equals to the actual feel temperature, sometimes the airconditioning starts up and makes the sunroom quite cold and not comfortable to sit in, whereas other times it doesn’t start up (because the threshold isn’t reached) and it’s a bit too warm/sweaty in the room.

The question:
I realize this is a bit nitpicky / splitting hairs because basing the climate on the actual (Shelly) temperature works 80% of the time, but still, perfecting the automation would be amazing.

So I was wondering: has anyone thought of a better way to regulate the temperature in these kind of rooms?

Not in a sunroom specifically, but the front of my apartment has a lot of glass and takes direct sunlight after about 1:00 PM every day.

I use 3 temperature sensors and a humidity sensor:

  • One temp sensor fairly close (5 feet) from the AC
  • Humidity sensor close to the AC.
  • One temp sensor on the other side of the room.
  • One outside temp sensor.

All sensors are shaded to prevent direct sunlight from impacting them.

I use the humidity to calculate the dew point and then average the dew point and both internal sensors.

  • The dew point is useful because high humidity makes even moderate temperatures feel uncomfortable **.
  • Having a distant internal temperature means that the AC stays on a bit more aggressively to begin with (until the air circulates).
  • Then the close sensor tends to dominate because the AC has more impact on it.

The average is what turns the AC on and off.

The external temp sensor currently just notifies me that I should open windows instead of relying on AC (when the outside temperature is favorable).
I also have contact sensors on windows and doors so the AC won’t run if the windows/doors are open - but I will get a notification to tell me to open or close them if necessary/advantageous.

** - Running an AC also drops the humidity, so an initial heavy AC run can make the room feel much more bearable even if the AC isn’t coming in that much later on.

TL;DR - I think I have it pretty well tuned now - I can just leave the automation on all day and it will come in when needed.

1 Like

Would you be willing to share your automation conditions? Or have you calculated a ‘feel temperature’ sensor/template?

I do all the math in sensors:

Average the two internal temp sensors.
Note: the factor is 0.51 instead of 0.5 since these sensor read a little low.

- sensor:
  - unique_id: inside_temperature_calibrated
    device_class: temperature
    unit_of_measurement: °C
    state: >
      {{ ( states("sensor.ac_temperature") | float + states("sensor.room_temperature") | float) * 0.51 }}

Calculate the Dew Point inside the room (formula found on Wikipedia):

- sensor:
  - unique_id: inside_dewpoint
    device_class: temperature
    unit_of_measurement: °C
    state: >
      {% set rh = states("sensor.ac_humidity") | float %}
      {% set temp = states("sensor.inside_temperature_calibrated") | float %}
      {% set b = 17.625 %}
      {% set c = 243.04 %}
      {% set pc = ((rh / 100.0) | log) + (temp * b) / (temp + c) %}
      {{ (c * pc) / (b - pc)}}

I use an input number to set the bias factor - however I have left it at 0.5 so effectively it just creates a simple average:

input_number:
  cooling_temp_factor:
    name: Cooling Temp Factor
    min: 0
    max: 1
    step: 0.01

Average between the internal temperature and the Dew Point, for a while I was using a 60% / 40% split, but now it’s just a 50/50 split.

- sensor:
  - unique_id: cooling_average
    device_class: temperature
    unit_of_measurement: °C
    state: >
      {% set dew = states("sensor.inside_dewpoint") | float %}
      {% set temp = states("sensor.inside_temperature_calibrated") | float %}
      {% set f = states("input_number.cooling_temp_factor") | float %}
      {{ ( (1.0 - f) * dew) + f * temp }}

Use a generic thermostat to control the AC:

- platform: generic_thermostat
  unique_id: room_thermostat_cool
  heater: switch.ac_request_cool
  target_sensor: sensor.cooling_average
  ac_mode: true
  cold_tolerance: 0.2
  hot_tolerance: 0.2

The generic thermostats target temp is set to 19°C which results in the room temp being held between 21°C and 24°C (depending upon room humidity).

If you still want the heat index (ie feels like temp) here is a sensor of mine:

      - default_entity_id: sensor.sunroom_heat_index
        name: "Sunroom Heat Index"
        unit_of_measurement: '°F'
        state: >
          {% set T = states('sensor.sunroom_temperature') | float(0) %}
          {% set RH = states('sensor.sunroom_humidity') | float(0) %}
          {% set HI_full = ((-42.379) + (2.04901523*T) + (10.14333127*RH) - (0.22475541*T*RH) - (0.00683783*T*T) - (0.05481717*RH*RH) + (0.00122874*T*T*RH) + (0.00085282*T*RH*RH) - (0.00000199*T*T*RH*RH)) | round (2) %}
          {% set adj1 =  (((13-RH)/4)*((17-(T-95.0)|abs)/17)|sqrt(0)) | round (2) %}
          {% set adj2 = ((((RH-85)/10) * ((87-T)/5)))| round (2) %}
          {% set HI_simple = (0.5 * (T + 61.0 + ((T-68.0)*1.2) + (RH*0.094))) |round (2) %}
          {% if ((HI_simple + T)/2) >= 80 %}
            {% if RH < 13 and (T > 80 and T < 112) %}
              {{ (HI_full - adj1) | round (1) }}
            {% elif RH > 85 and (T > 80 and T < 87 ) %}
              {{ (HI_full + adj2) | round (1) }}
            {% else %}
              {{HI_full | round (1)}}
            {%endif%}
          {% else %}
            {{HI_simple | round (1)}}
          {% endif %}

NOTE that all temps are in °F