[BLUEPRINT] Adaptive Climate Control - ASHRAE 55 Implementation with Energy Optimization

Thanks for sharing this blueprint — it was the spark that made me build a virtual MRT (Mean Radiant Temperature) sensor to better reflect perceived room temperature.

In my setup, just using air temperature wasn’t telling the whole comfort story. MRT captures how warm/cold the room feels due to surfaces and solar effects. I wrapped this into a blueprint that:

  • computes MRT and optional operative temperature,
  • supports KNX exposure (DPT 9.001) if you want it on the bus,
  • prefers dedicated weather sensors (PirateWeather for me) but falls back to the weather entity (Started with met.no) and finally a heuristic,
  • optionally uses a global radiation sensor (W/m², OpenMeteo for me) for better solar coupling.

If anyone like to try it, you’ll find the blueprint attached here: [Blueprint] Virtual MRT v0.1.10 — Mean Radiant Temperature & Operative Temperature - #2 by Ecronika. I’d love feedback—especially from °F users—to confirm the unit conversions behave as expected in non-metric setups.

Happy tuning, and thanks again for the inspiration!

1 Like

Have you figured this out?

no, its a feature request to the blueprint.

TL;DR: Is this blueprint supposed to keep the thermostat’s target set to the calculated base_adaptive_comfort_temp value when the space is “occupied”? If so, how can I tweak that value?

Let me first apologize to the world for being an American that grew up with Fahrenheit and so many other terrible units of measurement. I blame our forefathers. Please look past that. I tried to convert to °C as often as possible for my target audience.

@msinhore @SuprBadass I’ve implemented the Fahrenheit fork of this earlier this week. You may have seen a couple of issues I posted on the repo. After tweaking those things, I think the automation is “working” as it was meant to be. But if it is, then it is not working how I expected it to… so I wanted to post here to see if my expectations are too high and if there are any suggested methods of reaching my goals.

The automation is keeping the house in the low 70’s°F (21-22°C), which feels too hot, especially given mild outdoor temperatures 69°F (20.56°C). I have it set to Category III (3) mode and expected the “wider comfort band” to allow for the temperature to swing towards the lower limit in the winter and the higher limit in the summer.

I was sweating overnight… it wanted to heat my house to 71°F–72°F (21.67-22.22°C)… it was probably in the 50’s (10-15°C) outside. I’d rather a 67°F (19.44°C) target in that case… that would be plenty warm.
But come summer (meaning, ANYTHING OTHER THAN WINTER in Texas) when I flip the switch to COOL mode, I don’t want it 67°F (19.44°C) in my house… well, I’d love that; but I can’t afford that. :wink: That’s the benefit of using an adaptive algorithm like this.

I either need to:

  1. Find a way to tweak this automation to NOT set my thermostat’s target to the base_adaptive_comfort_temp but instead allow it to drift within the comfort_tolerance “band”. I guess that would mean setting the thermostat’s target temp at the comfort_temp_min when in HEAT mode or set to comfort_temp_max when in COOL mode. I’m sure there’s something wrong with that logic, too.
    OR
  2. tweak the algorithm to decide that the base_adaptive_comfort_temp should be ~67–68°F (19.44–20.00°C) in my example above. I’m afraid to start messing with equations I don’t understand, though. It might work today; but in a week or two when Texas Winter is over (ok, maybe a month or two) and I turn on COOL mode, will my tweaked equation still be ideal? If it’s 96°F (35.56°C) outside, I’d want the inside to be about 78°F (25.56°C), as an example… The rest of the family might like 74–76°F (23.33–24.44°C) though. :wink:

AI is “helping” me interpret the blueprint, and it output this second opinion request for me earlier today. I’ll be lazy and just paste it below since it does a pretty good job of summarizing my bitching. :wink:

Current Calculation Example

Given:

  • Outdoor temp: 69°F = 20.56°C
  • Category III: ±4°C tolerance
  • Occupancy: ON

Calculation:

  1. Base adaptive comfort temp = 18.9 + (0.255 × 20.56) = 18.9 + 5.24 = 24.14°C = 75.45°F
  2. Comfort zone min = 24.14 - 4.0 = 20.14°C = 68.25°F
  3. Comfort zone max = 24.14 + 4.0 = 28.14°C = 82.65°F

Since indoor temp (75.236°F) is within the comfort zone (68.6°F - 81.2°F), the target is the adaptive comfort temp = 74.9°F (rounded).

User’s Concerns

  1. House feels too hot - Low 70s Fahrenheit feels uncomfortable, especially with mild outdoor temps
  2. Heat shouldn’t be on - With outdoor temp at 69°F, questioning why heat is needed at all
  3. Category III behavior - Expected Category III to allow more temperature drift (down to 68°F), but system is targeting 74.9°F

Key Questions for Review

  1. Is the ASHRAE 55 calculation correct?

    • Formula: 18.9 + 0.255 * outdoor_temp (Celsius)
    • For 69°F (20.56°C): 18.9 + (0.255 × 20.56) = 24.14°C = 75.45°F
    • Is this the correct ASHRAE 55 formula?
  2. Is Category III being applied correctly?

    • Category III should allow ±4°C tolerance
    • Comfort zone: 20.14°C - 28.14°C (68.25°F - 82.65°F)
    • But target is still the neutral temp (74.9°F) when inside the band
    • Is this expected behavior?
  3. Target temperature logic when inside comfort zone:

    • When indoor_temp is within comfort_temp_min to comfort_temp_max, target = adaptive_comfort_temp (neutral)
    • This means even with Category III, it targets the neutral temp (74.9°F) rather than allowing drift
    • Is this correct ASHRAE 55 behavior, or should it allow drift within the band?

I’m a week into using Home Assistant, and I’m on 2026.1.3 running on a 2GB Raspberry Pi 4B. I’ve been playing with this blueprint for the past few days. My HVAC system is Ecobee (two thermostats), triggered through SmartThings given that it seems Home Assistant can no longer directly integrate directly. My weather data comes from my personal weather station, and room occupancy comes from Ecobee room sensors. I use helpers to average the temperature around the home for the different areas I’m monitoring. I use two separate instances of the blueprint - one for each side of the house - and have two separate learning and delay variables.

Things I’ve noticed:

  1. The blueprint syntax for triggers is out of date: trigger/platform vs triggers/trigger. I don’t know if this is one of the causes of the issues I discuss below.

  2. The blueprint does not seem to gather current state when it restarts after you make a parameter change. For example, my doors are open when I change a parameter: The blueprint runs as if everything is closed, so the heating turns on until after I trigger a door open/close event.

  3. I could not get the pause logic to work at all when using a helper that contains a ‘door’ binary_sensor that amalgamates all the doors I want to track. The state will only change from off to on, and vice versa, if all of the states are either on or off. Couple this with 1) regarding state, and nothing triggers even if the doors are open when the blueprint starts.

  4. Despite running two separate variables for learning persistence, I’ve noticed that the blueprint appears to be writing identical values to both variables at the same time. I expected changes I make to one side of the house to not be reflected in the other; meaning that I would have thought one thermostat would work differently than the other based on the manual overrides I make.

If anyone has any comments or advice for me, I’d appreciate it. All in, I think this blueprint is very well thought out.

I’m replying to myself. I fixed the dual sensor issue after learning a bit of yaml. I have had to edit the base blueprint to send the learning sensor id as a parameter to the set_variable trigger. I duplicated the listener for set_variable (et al.) and created two sensors, one for each zone of my house. Using the sensor id passed in the event, I used the trigger logic to only process messages for the specific sensor, and now the automation maintains two separate sets of parameters for the zones. It was a learning experience. The pause logic is still a bit suspect, so I added logic into the pause handler to ensure the Ecobee is turned off in both zones. The automation itself is running beautifully now, and I’m already convinced this will save me a bunch of money. I hope these rambling updates help somebody along the way.