Nightly phantom-load audit that finds the 38 W you forgot about
At 03:00 the house is quiet, so the automation reads every metering plug and ranks standby draw. A first run found 38 W of permanent load — 333 kWh a year — from a games console, a printer and an old set-top box.
# HearthNodes recipe 19 - phantom load audit
alias: "Energy - nightly phantom load audit"
id: hn_energy_phantom_audit
description: "03:00 standby survey of every metering plug, ranked, weekly digest"
mode: single
max_exceeded: silent
trigger:
- platform: time
at: "03:00:00"
variables:
metering_plugs: "{{ states.switch | selectattr('entity_id','search','_plug_') | map(attribute='entity_id') | list }}"
reporting: >-
{{ metering_plugs | selectattr('state','ne','unavailable') | list | count }}
report_ratio: "{{ (reporting | int(0) / metering_plugs | count * 100) | round(0) }}"
condition:
- condition: state
entity_id: binary_sensor.house_occupied
state: "off"
- condition: numeric_state
entity_id: sensor.outdoor_temperature
above: 5
- condition: template
value_template: "{{ report_ratio | int(0) >= 80 }}"
action:
- service: script.rank_standby_loads
data:
devices: "{{ metering_plugs }}"
min_watts: 3
- service: input_number.set_value
target:
entity_id: input_number.house_baseline_watts
data:
value: >-
{{ expand(metering_plugs) | map(attribute='attributes.power_w')
| map('float', 0) | sum | round(1) }}
- service: notify.mobile_app_primary
data:
title: "Standby audit"
message: >-
Total {{ states('input_number.house_baseline_watts') }} W.
Meter residual {{ states('sensor.meter_unaccounted_watts') }} W.
Top: {{ states('sensor.standby_worst_offender') }}
# Fewer than 80 percent of plugs reporting -> the audit is skipped rather than
# run on partial data, and the notification says so. Loads on the protected list
# (alarm, smoke, medical, sump, fridge) are never given a cutoff suggestion.
Trigger · time
time
Every night at 03:00, when the household's baseline consumption is at its most stable.
Step-by-step
- sensor.*_powerRead every metering plug's instantaneous power and rank by value; anything drawing more than 3 W while its appliance is off is a candidate.
read all · rank descending - sensor.house_baselineKeep a 7-day rolling median so a single unusual night does not become the reference.
record · 7-day rolling median - notify.mobile_appSend one weekly digest with the top five standby loads converted to kWh and currency per year, because watts are abstract and money is not.
weekly digest · top 5 offenders with kWh/year - switch.*_socketFor each confirmed offender, offer a timed cutoff that the household can accept with one press rather than editing an automation.
offer a scheduled cutoff for confirmed offenders
Measure at 03:00, not at bedtime
At 23:00 the dishwasher may still be running and someone may still be watching television. 03:00 is the hour when a household's consumption is closest to its true standby floor. If your household is genuinely active at 03:00, pick a different quiet hour and keep it consistent — the comparison matters more than the specific time.
Reconcile the plugs against the main meter
If the plugs sum to 45 W but the main meter says 130 W, you have 85 W of un-metered load — a doorbell transformer, a garage opener, an old alarm panel. The residual is where the surprising findings usually live, and it costs nothing to compute.
Report watts as money per year
38 W sounds trivial and is 333 kWh a year. Express every finding as an annual cost at your actual tariff; that is the number that makes someone walk over and unplug the set-top box. Include the tariff you used so the arithmetic can be checked.
Hardware
| Model | Protocol | Link | Role in this chain |
|---|---|---|---|
| Metering plugs with 0.1 W resolution | zigbee |
wireless | Resolution matters: a 1 W resolution plug cannot distinguish a 0.4 W phantom from zero, and most of the interesting findings are between 0.5 W and 5 W. |
| Whole-house energy meter | zigbee |
wired | Provides the total that the individual plugs are reconciled against; the gap is the un-metered load. |
| Home/away presence (aggregate) | zigbee |
wireless | Only the aggregate home/away boolean is used, so the audit cannot infer who is in which room at night. |
When it fails
If fewer than 80 % of plugs report, the audit is skipped rather than run on partial data — a partial audit produces a wrong baseline that then poisons the weekly comparison for a month. The notification states plainly that the audit did not run and why.