Home Assistant integration for The Energy Detective TED5000 whole-house energy monitors — including the solar / net-metering package and Spyder submetering (up to 32 individual circuits).
Everything is local polling of the gateway's own XML API. No cloud, no Footprints software, no YAML.
Why not the built-in
ted5000integration? Home Assistant ships a legacyted5000sensor platform that polls/api/LiveData.xml. Later TED5000 gateway firmware does not serve that endpoint (it returns404), so the built-in integration simply cannot work on those units — which is what sent me here. This integration uses the endpoints those gateways actually expose, and reads far more from them.
- Whole-house flows — net, consumption and solar production, each with live power, energy today, energy this month, and cost
- Solar aware — production sensors appear automatically when the gateway reports generation; values are exposed as positive figures
- Per-circuit submetering — every wired Spyder group becomes its own
device with power and energy sensors, using the names you configured in
TED (e.g.
Oven,Dryer,AC,FRIDGE/R,POOL L1) - Per-MTU sensors — power, voltage, power factor, apparent power
- Billing — utility rate, projected bill for the month, days left in the billing period, meter read day
- Energy dashboard ready — energy sensors are
total_increasingkWh, so grid consumption, solar production and individual devices all plug straight in - Phantom (standby) load tracking — records the quiet-hours floor each night, averages it over N days, and prices it per month, so a creeping baseline is visible instead of buried in the daily total
- Config flow, options (polling interval, per-circuit energy sensors, phantom window and averaging days), diagnostics
Easiest: click the blue My Home Assistant badge at the top of this page — it opens your own Home Assistant and pre-fills this repository as a HACS custom repository. Then Download and restart.
Manually: HACS → ⋮ → Custom repositories → https://github.com/igorek24/ted5000-home-assistant,
type Integration → Download → restart Home Assistant.
Copy custom_components/ted5000_pro into config/custom_components/ and restart.
Settings → Devices & Services → Add Integration → TED5000 Pro → enter the gateway's IP address (the network box, not the display). Username/password are only needed if you enabled security in Footprints.
The integration reads your MTU and Spyder layout from the gateway, so
circuits arrive already named — and groups that aren't wired to a CT
(UseCT = 0) are skipped instead of cluttering HA with dead sensors.
| Option | Default | Meaning |
|---|---|---|
| Polling interval (seconds) | 10 |
The gateway updates about once a second; 10 s is a good balance. 5–300 allowed. |
| Per-circuit energy sensors | on | Creates energy today / energy this month for each circuit. Turn off if you only want live power. |
| Phantom days to average | 7 |
How many nights the phantom average covers (1–90). |
| Phantom window start / end | 01:00 / 05:00 |
The quiet hours used to measure the standby floor. A window that crosses midnight (e.g. 23:00–05:00) is treated as one night. |
Gateway device
| Entity | Notes |
|---|---|
sensor.ted5000_net_power / _consumption_power / _solar_power |
Live watts |
sensor.ted5000_*_energy_today / _energy_this_month |
kWh, total_increasing |
sensor.ted5000_*_cost_today / _cost_this_month |
Dollars |
sensor.ted5000_projected_bill_this_month |
The gateway's own projection |
sensor.ted5000_utility_rate |
$/kWh from your TED rate settings |
sensor.ted5000_days_left_in_billing_period |
With meter_read_day attribute |
sensor.ted5000_line_voltage |
Leg voltage (line-to-neutral, ~120 V) |
sensor.ted5000_line_to_line_voltage |
Line-to-line (~240 V), derived from the leg voltage |
Per MTU (e.g. Grid, Solar): power, leg voltage, line-to-line voltage, power factor, apparent power (disabled by default).
A TED MTU reports a single voltage, which on a US split-phase service is
one leg (line-to-neutral, ~120 V) — that is all the gateway's API exposes,
and it is what the Footprints UI reads too. This integration also publishes
a line-to-line figure (~240 V) derived from it: doubled when the reading
looks like a leg (< 150 V), or passed through when the MTU is wired across
both legs and already reads ~240 V. Derived sensors carry a
derived_from_leg_voltage attribute so it is obvious which is measured.
Per circuit (one device per Spyder group): power, energy today, energy this month.
Three sensors quantify what the house draws when nothing is meant to be running:
| Entity | Meaning |
|---|---|
sensor.ted5000_phantom_load |
The lowest consumption seen during tonight's quiet window (live while the window is open, otherwise the last completed night) |
sensor.ted5000_phantom_load_average_7d |
Mean of the last N nights, with each night listed in the nightly attribute, plus lowest, highest and vs_average_pct |
sensor.ted5000_phantom_load_monthly_cost |
What that average costs per month at your current rate |
History survives restarts, and the averaging window is a rolling buffer, so the average always reflects the most recent N nights. A useful alert:
automation:
- alias: "Phantom load is creeping up"
trigger:
- platform: numeric_state
entity_id: sensor.ted5000_phantom_load
value_template: "{{ state_attr('sensor.ted5000_phantom_load_average_7d','vs_average_pct') }}"
above: 25
action:
- action: notify.mobile_app
data:
message: >
Standby load is {{ states('sensor.ted5000_phantom_load') }} W,
{{ state_attr('sensor.ted5000_phantom_load_average_7d','vs_average_pct') }}%
above the 7-day average - something may have been left on.Settings → Dashboards → Energy:
- Grid consumption →
sensor.ted5000_consumption_energy_this_month - Return to grid (if you export) →
sensor.ted5000_solar_energy_this_month - Solar production →
sensor.ted5000_solar_energy_this_month - Individual devices → any per-circuit
energy this monthsensor
Month-to-date sensors are the better choice here: they reset once a month
on your meter read day, which total_increasing handles cleanly.
automation:
- alias: "Notify when the dryer finishes"
trigger:
- platform: numeric_state
entity_id: sensor.dryer_power
below: 50
for: "00:05:00"
condition:
- condition: numeric_state
entity_id: sensor.dryer_energy_today
above: 0.5
action:
- action: notify.mobile_app
data: { message: "Dryer is done." }
- alias: "Run the pool pump on surplus solar"
trigger:
- platform: numeric_state
entity_id: sensor.ted5000_net_power
below: -1000 # exporting more than 1 kW
for: "00:10:00"
action:
- action: switch.turn_on
target: { entity_id: switch.pool_pump }| Endpoint | Used for |
|---|---|
SystemSettings.xml |
MTU list, Spyder groups, circuit names, UseCT wiring mask |
SystemOverview.xml |
Per-MTU power, KVA, power factor, voltage |
SpyderData.xml |
Per-circuit now / today / month-to-date |
DashData.xml?T&D&M |
Totals: T=0 energy, T=1 cost; D=0 net, D=1 consumption, D=2 production |
Rate.xml |
Rate, billing period, meter read day |
Units from the gateway are scaled here: voltage is decivolts, power factor is per-mille, energy is Wh, cost is cents, and the rate is 1/100000 dollars per kWh.
- Cannot connect — browse to
http://<gateway-ip>/api/SystemOverview.xml. You should get XML. If you get a login prompt, add the credentials in the config flow. - No solar sensors — they only appear if the gateway reports generation
(
DashDatawithD=2). Check your TED solar/net-metering configuration. - A circuit is missing — groups with no CT assigned are skipped by design. Assign the CT in Footprints and reload the integration.
- Debug logging:
logger: logs: custom_components.ted5000_pro: debug - Diagnostics: integration entry → ⋮ → Download diagnostics.
Unofficial and unaffiliated. "The Energy Detective", "TED", "TED5000" and "Spyder" are trademarks of their respective owner, used here only to identify the hardware this integration works with. No vendor logo or brand artwork is included — the icon is original artwork for this project.