[Custom Integration] Home Performance - Analyze your home's thermal performance and insulation quality

Hey everyone! :wave:

I’ve been working on a custom integration called Home Performance that analyzes your home’s thermal performance using your existing sensors.

What it does

  • :bar_chart: Calculates your room’s K coefficient (thermal loss)
  • :dart: Gives you an insulation rating (A to G)
  • :zap: Tracks daily energy consumption
  • :window: Detects open windows in real-time
  • :flower_playing_cards: Includes a built-in Lovelace card

Why I built it

After buying a 1930s house, I wanted to know if my insulation work was actually paying off. I had all this data from my smart plugs and temperature sensors, but no way to measure real thermal performance.

Screenshots

Installation

Available via HACS as a custom repository:
https://github.com/Hugofromfrance/home_performance

Feedback and contributions welcome!

GitHub

12 Likes

What an awesome idea!

1 Like

Looks very interesting, but before I dive in and try to figure out if it works for me, I have a question:

In your documentation section ‘Required Parameters (per zone)’ on GitHub you list ‘Heater Power’ (in Watts).

I have a 2-zone AC/Furnace forced air setup that runs on electricity for the cooling and gas for heating.
Is that a setup that would work here, and - if so - how do I set it up for the heating part of it?

1 Like

@chairstacker
Thanks for your interest! :pray:

Your setup can work, but with some limitations since Home Performance was primarily designed for electric heating with smart plugs.

What will work :white_check_mark:

  • K coefficient calculation per zone (thermal loss measurement)
  • Insulation rating per zone (A to G scale)
  • Open window detection (based on rapid temperature drop)
  • Heating time tracking (via your thermostat’s climate entity)

Limitations :warning:

  • Energy measurement: Since you have a gas furnace, we can only estimate energy based on declared power × heating time. We can’t measure actual gas consumption unless you have a smart gas meter.
  • Accuracy: Less precise than electric heating with a power sensor, but still useful for thermal insights.

Setup for your 2-zone system

Since you have one furnace heating two zones, you have two options:

Option A: Single “House” zone (simpler)

  • Create 1 zone called “House”
  • Use your furnace’s full power rating
  • Get accurate total energy estimation

Option B: Separate zones (more detailed)

  • Create 2 zones (one per area)
  • Divide the furnace power between zones (e.g., 50% each)
  • Get per-room K coefficient and insulation rating
  • Energy per zone will be approximated

Heater Power setting

Convert your furnace BTU/h rating to Watts:

  • Formula: BTU/h × 0.293 = Watts
  • Example: 60,000 BTU/h ≈ 17,600W (or ~8,800W per zone if using Option B)

What you need

  1. Temperature sensors in each zone (or one for Option A)
  2. Outdoor temperature sensor
  3. Climate entity from your thermostat (Nest, Ecobee, Honeywell, etc.)
  4. No power sensor needed - we’ll estimate energy from heating time

Honest take

You’ll get valuable insulation insights (K coefficient, rating) which is the main goal of this integration. The energy estimation will be less accurate than with electric heating, but still useful for comparing zones and tracking trends.

If you try it, I’d love to hear your feedback! I’m open to improving gas/furnace support if there’s interest from the community.

Let me know if you have more questions!

1 Like

Thanks for the detailed answer - highly appreciated!

I actually have 2 AC units and 2 furnaces/gas burners, i.e. one each for each zone, but - unfortunately - I don’t have a smart gas meter (I tried to make my gas meter smart in different ways, but so far, I failed miserably).

I have a smart plug for each of the blower fans so I can track runtime in detail, and I know that one furnace is a 60,000 BTU/h unit and the other one is an 80,000 BTU/h unit.
So, I think I can probably make some progress there, although the actual zones overlap a bit, i.e. I have two small registers of one zone inside the otherwise enclosed area of the other zone :hushed:

@chairstacker Oh, that’s actually much better than I thought! :tada:

With separate furnaces for each zone AND smart plugs on the blowers, you’re in great shape. The blower only runs when the furnace is active, so that’s basically perfect for tracking heating time.

For your setup, I’d configure it like this:

Zone 1: Set heater power to ~17,600W (that’s your 60k BTU/h converted) and use your blower’s smart plug switch as the heating entity.

Zone 2: Same idea but ~23,400W for the 80k BTU/h furnace.

Quick note: use the furnace’s thermal output (the BTU rating converted to Watts), not what the blower fan actually draws electrically. The fan itself probably only uses 300-500W, but your furnace is producing 17,600W worth of heat - that’s what matters for the K coefficient calculation.

As for the overlapping registers - honestly, I wouldn’t worry too much about it. A bit of heat bleeding between zones won’t break the analysis. The K coefficient captures the overall thermal behavior of each area, and you’ll still get meaningful insights into your insulation quality.

I’m actually pretty curious to see how it works with your setup! Let me know if you run into any issues or have questions during configuration.

I started working on it and ran into a few issues:

  1. I cannot set the Heater Power to more than 10,000W - seems to be a system limit
  2. My Heating entity is actually a binary sensor - which is not on the list of entities (domains?) I can use for this entry; the furnace constantly pulls about 4-6W for all it’s internal electronics, so I have a threshold sensor the turns a binary_sensor on when the plug dras more than 15W and the blower fan is actually running.

@chairstacker

Thanks for the detailed feedback! You’ve actually found two limitations I hadn’t considered:

1. The 10,000W limit - Yeah, that’s definitely too low for US furnaces. I designed this with European electric radiators in mind (typically 500-3000W), didn’t think about 60-80k BTU/h furnaces!

2. Binary sensor support - Currently only climate, switch, and input_boolean are accepted. Your threshold approach is actually really smart for detecting when the blower is actually running vs idle.

Workaround for now

You could bridge your binary_sensor to an input_boolean with a simple automation:

input_boolean:
  furnace_zone1_heating:
    name: "Furnace Zone 1 Heating"
automation:
  - alias: "Sync furnace threshold to input_boolean"
    trigger:
      - platform: state
        entity_id: binary_sensor.your_threshold_sensor
    action:
      - service: "input_boolean.turn_{{ trigger.to_state.state }}"
        target:
          entity_id: input_boolean.furnace_zone1_heating

Then use input_boolean.furnace_zone1_heating as your heating entity.

For the power limit

As a temporary workaround, you could enter 10,000W and mentally note that your K coefficient will be proportionally off. Not ideal, I know!

Going forward

Would you mind opening an issue on GitHub for these? I’d like to properly fix both:

  • Increase max power limit (maybe 50,000W)
  • Add binary_sensor support

:point_right: GitHub · Where software is built

Really appreciate you testing this with a non-European setup - it’s helping me understand what needs to be improved! :pray:

This is a really neat idea, thanks you for contributing. Using it in The Netherlands will be a challenge for most people: the most common setup is a gas heated boiler with an OpenTherm variable burner, and either a cental thermostat and TRV’s (where tvr’s open but do not heat if the main thermostat is off) or a full blown zone system where any TRV can request heat from the boiler.

I’m thinking about wether I can do some estimate on gas consumption, boiler activity level, radiator size and TRV activity. Is there some way I can supply a power entity to climate entities to use a real time power estimate information for the calculations?

@Edwin_D
You’re touching on something that’s genuinely more complex than electric heating!

With hot water radiators, the actual power output depends on water flow rate, inlet/outlet temperature difference, and TRV position - it’s not a fixed value like a 1500W electric heater. So any power estimation will be approximate.

Realistic approach for power

Honestly, I’d suggest keeping it simple:

  1. Look up your radiator’s nominal power (usually on a label, or calculate from dimensions)
  2. Use maybe 60-70% of that as your average power, since radiators rarely run at full capacity
  3. Accept that energy estimates will be approximate

Heating detection

You’ll need to combine both signals to detect real heating:

template:
  - binary_sensor:
      - name: "Living Room Actually Heating"
        state: >
          {{ is_state('climate.boiler', 'heat') 
             and states('number.trv_living_room') | float(0) > 10 }}

This way you only count heating time when the boiler is running AND your zone’s TRV is actually open.

Then you’d use this binary_sensor as your heating entity… except Home Performance currently only accepts climate, switch, or input_boolean. So you’d need one more step - bridge it to an input_boolean:

input_boolean:
  living_room_heating:
    name: "Living Room Heating"
automation:
  - alias: "Sync heating detection"
    trigger:
      - platform: state
        entity_id: binary_sensor.living_room_actually_heating
    action:
      - service: "input_boolean.turn_{{ trigger.to_state.state }}"
        target:
          entity_id: input_boolean.living_room_heating### What still works well

Even with approximate power values:

  • K coefficient will reflect your room’s thermal behavior
  • Insulation comparison between rooms remains valid
  • Trends over time will be meaningful
  • Open window detection works regardless

Honest take

Home Performance was designed with electric heating in mind. Gas/hot water setups can work, but require more setup and the energy side will be less precise. The insulation analysis should still be valuable though!

If you try it, I’d love your feedback - it would help me understand if better OpenTherm support is worth adding.

I think I can use the climate entities, for my case they actually show correct heating status when the boiler is active. My problem is only that the amount of energy going to it is complex. So from what I can tell, I only need to tell the integration how much energy is used for heating.

I can probably do that by estimating the amount of energy used by the boiler and apply a divisor based on TRVs that are active and their respective radiator capacity. The question is, can I tell the integration what I calculated in terms of energy delivered to a TRV.

Yes, absolutely! Home Performance accepts an external energy sensor in the configuration.

So if you create a template sensor that calculates energy delivered to each zone (using your boiler energy × proportional radiator capacity logic), you can use it directly as the “External energy counter” when configuring each zone.

Just make sure your template sensor has:

  • device_class: energy
  • state_class: total_increasing
  • Output in kWh (cumulative)

Tip: You might want to wrap it in a Utility Meter for automatic daily reset:

utility_meter:
  living_room_daily_energy:
    source: sensor.living_room_energy_calculated
    cycle: daily

Then use that utility meter sensor as your external energy counter in Home Performance.

Let me know how it goes!

1 Like

I will let you know. It might take a while to find the time to figure it all out.

Very interesting project!
I’ll give a try.

I’m using an heat pump. My climate entity is always ON. Does it matter?
In “Heater power” what should i set ?
I’m having a sensor for my heat pump consumtion, i set up as the “Power sensor”, is it ok ?
My heat pump is always consuming ~50w but it’s not for heating (just the operation of the pumps)

@stban1983
Thanks for your interest! :tada:

Quick answers:

  1. Climate always ON → No problem! When you configure a Power sensor, the integration ignores the climate state and uses only power consumption to detect heating.

  2. Heater Power → Enter your heat pump’s nominal heating capacity (not electrical). Example: if rated “5kW heating”, enter 5000.

  3. Power sensor:white_check_mark: Yes, that’s exactly what you need!

:warning: The 50W idle issue

The current threshold is power > 50W = heating active. Since your pump idles at ~50W, this could cause false positives.

What’s your power consumption when actually heating?

  • If heating uses 200W+ → Should work fine (clear difference from 50W idle)
  • If close to 50W → You may need a template sensor to filter out idle consumption

Let me know your typical heating power, and I can help you configure it! :+1:

1 Like

Looks like we both started working on the GitHub issues :hushed:

Feel free to close the one I just opened.

I created a power sensor yesterday that converts the BTU/h to W and adds the power value of the blower fan to it - I could use this to avoid the limitations (with the max 10,000W for the heater power and the not-yet supported binary_sensor) I’ve encountered, correct?

Also:
What’s your suggestion re. zones with different heating settings that are heated within the same forced air zone?

Background:
I have multiple rooms where I ‘regulate the temperature’ by adjusting how far open the registers are, e.g. offices have the registers opened more than the bedrooms, bathrooms are somewhere in between.
I have temperature sensors in multiple rooms (but only one option in the zone setup per zone) and could add a rough estimate of how much air goes to each sub-zone (offices 50%, bedrooms 30%, bathrooms 20%).
I could then set up these areas as their own zones with power sensors reflecting 20%, 30%, 50% and their own temperature sensors.

Or am I making this all too complicated?

@chairstacker

1. Power Sensor (BTU→W) as Workaround :white_check_mark:

Yes, this is a smart workaround! If your power sensor outputs the actual heating power in Watts:

  • The 10,000W limit for heater_power becomes less critical - you can enter an approximate value (e.g., 10000) since the actual energy calculation will use your power sensor
  • The binary_sensor limitation is bypassed - the integration detects heating when power > 50W

One note: Make sure your power sensor returns 0W (or < 50W) when heating is OFF, otherwise it will count as continuous heating.


2. Sub-zones with Proportional Power Sensors :thinking:

Your idea is creative and could work!

Template sensor example:

template:
  - sensor:
      - name: "Office Heating Power"
        unit_of_measurement: "W"
        state: "{{ (states('sensor.furnace_power') | float(0)) * 0.50 }}"

Pros:

  • :white_check_mark: Individual K coefficient per room
  • :white_check_mark: Compare insulation quality between rooms
  • :white_check_mark: Identify which rooms are energy hogs

Cons:

  • :warning: Air distribution % are estimates (real airflow varies)
  • :warning: K values will be relative, not absolute
  • :warning: Comparing to other Home Performance users won’t be meaningful

3. My Recommendation

Go for it! It’s not “too complicated” - it’s actually a clever adaptation for forced-air systems.

The K coefficients you get will be relative comparisons between your rooms, which is still very valuable:

  • “The office loses 30% more heat than the bedroom” = actionable insight
  • “The bathroom K improved after adding weatherstripping” = measurable result

Just remember that your K values won’t be directly comparable to someone with electric radiators, but internal comparisons within your home will be valid and useful.

Let me know how it goes! :dart:

I’ll be working on both the 10,000W limit and binary_sensor support this weekend - stay tuned! :wrench:

1 Like

Great idea to have built this. Can this be used with systems that also perform cooling?

1 Like

Thanks! Great question — yes, the core concept works for cooling too, since the K coefficient measures thermal loss regardless of heat flow direction.

A reliable approach would be to calculate K using nighttime data only (no solar gains), and account for the COP if known.

It’s definitely on my radar for a future version — I’ll keep you posted!

1 Like