You put a spot price into Home Assistant, pointed the Energy dashboard at it, and the number came out wrong. Not slightly wrong — wrong enough that you went looking for the mistake in your own templates.
The mistake is usually not in the templates. It is that the price you fetched and the price you pay are two different numbers, and nothing in the chain tells you which one you are holding.
"The Energy Dashboard in Home Assistant, while powerful, presents a challenge" — arva, Home Assistant forum thread 682847
That is the understated opening of a thread whose author eventually wrote his own integration. This article is about the step before that: which price source covers your zone, what it actually gives you, and what it asks in return.
Spot or all-in: get this one right and most of the rest follows
Every source is one of two kinds, and the hub needs to know which:
- A spot price is the start of a calculation, not the end. It is the wholesale price for the period. What you pay is that, times a factor (1.0 unless your contract scales the exchange price), plus your supplier's markup per kilowatt-hour, plus the grid fee, plus taxes and levies, and then VAT on the lot — every component entered without VAT, because VAT is applied once, to the sum. Every money field is per kilowatt-hour, in the main unit of your currency: a markup of 2.5 cents goes in as
0.025, not as2.5. The hub converts what the public sources quote per megawatt-hour itself; what you type, it takes as given. Enter a figure that already includes VAT and it is taxed twice, which is the single most common way a spot setup comes out high. An all-in price is never taxed again. Feed a spot price straight into a cost figure and it will come out too low — until you add the parts, at which point the arithmetic is yours to maintain. - An all-in price already contains them. It is what your supplier bills for that period, taxes and all. Add your own markup on top of it and the figure comes out too high.
Both failures look the same from the outside: a cost that does not match the bill. The non-kWh parts are the half people forget, and they are not small:
"+1 for this. In the UK this is pretty much standard too" — thefunkygibbon, thread 330609
That thread is about standing charges — a daily amount that has nothing to do with how much you used. It has been asked for since 2021.
On the hub the kind is a property of the source. Pick a spot source and your contract's factor, markup, fees, taxes and VAT are fields you fill in once; pick an all-in source and the price is taken as it arrives. Either way the hub prices each 15-minute period with the price of that period, and keeps the price next to the energy, so the figure can be traced later instead of re-derived.
⚠️ Why this is worth getting right the first time. The hub stores which price it applied, period by period — but a price already applied is history, not a formula to re-run. Home Assistant has the same property, and people meet it the hard way:
"I'm pretty sure there's no way to backdate changes in HA." — tinkergnome, thread 585379
The six public sources
| Source | Kind | Resolution | Areas | Currency |
|---|---|---|---|---|
| Energy-Charts (Fraunhofer ISE) | spot | 15 minutes | AT, BE, CH, CZ, DE-LU, DK1, DK2, FR, HU, IT-North, NL, NO2, PL, SE4, SI | EUR |
| Nord Pool (unofficial data portal) | spot | 15 minutes | SE1–4, NO1–5, DK1–2, FI, EE, LV, LT | the area's: SEK, NOK, DKK or EUR |
| Elpriset just nu (SE) | spot | 15 minutes | SE1–4 | SEK |
| Hva koster strømmen (NO) | spot | 1 hour | NO1–5 | NOK |
| EnergyZero (NL) | all-in | 15 minutes | NL | EUR |
| Octopus Agile (UK) | all-in | 30 minutes | the 14 GSP regions, A–P | GBP |
None of them needs a token or an account.
An all-in source carries that supplier's own retail price. If your supplier is a different one, its number is not yours — push your own price from Home Assistant instead, which is covered further down.
Resolution is not the billing step. A 30-minute or hourly price applies to each 15-minute period inside it — four periods simply share one price — so costs are still computed per 15-minute period. And a 15-minute source does not force 15-minute billing: whether you are billed per period or at the hour's mean is a property of your contract, set separately.
⚠️ Currency is never converted. The hub will not turn SEK into EUR. A zone whose currency differs from your plan's is refused when you save it, and a source in another currency is skipped rather than approximated. Set your plan's currency first, then pick a zone that matches.
What each one asks in return
Public does not mean unconditional. Each source carries the wording its own licence asks for — Bundesnetzagentur | SMARD.de / Energy-Charts (CC BY 4.0), for instance — and the hub displays it on the Prices page. That line is not decoration: it is the condition on which the data may be used at all. Energy-Charts is served only for the zones published under CC BY 4.0.
Who has to show it is decided by who shows the price. The hub carries the attribution and the terms link alongside every price, so whatever displays that price has what it needs. The hub's own app credits the source on the Prices page. The RBgrid panel in Home Assistant renders it too. If you build a dashboard of your own from the hub's data, showing it is yours to do — the text and the link are in the price payload for exactly that reason.
⚠️ Nord Pool is reached through an unofficial data portal, and the hub says so where it names the source. There is no service agreement behind it: it can change or stop without notice. Use it knowingly, and give it a backup where one exists — see the third step below; for FI, EE, LV and LT it is the only source in the list, so there the backup can only be a push from Home Assistant.
This is also the honest answer to "do you work with my supplier?" — the hub does not work with suppliers. It reads public price data for a market area and applies the contract you describe to it. A source in the list is a setting you chose, not a relationship anybody has.
If your zone is not in the list
Then the seventh source is you. Home Assistant — or any client — can push prices to the hub instead of the hub fetching them: up to 200 periods at a time, kept in the hub's own store. You mark whether what you push is spot or all-in, and from then on it is treated exactly like a provider of that kind.
That is the path for a supplier the hub has no source for, and for a price you compute yourself. In the ESPHome build Home Assistant is listed among the sources from the start; on the standalone firmware it appears once a push has arrived. Either way, dynamic prices are off until you turn them on, and the source is yours to pick — Home Assistant is one option in the list, not the one already chosen.
Four things about pushing are easier to know in advance than to discover:
- Spot or all-in is declared once, in the dynamic-price settings — not with each batch. Set it to match what you send, then forget it.
- You send a batch of periods, each with a start and an end. Your source's own step can be 15 minutes, 30 or an hour; the hub prices each of its own 15-minute periods from whichever entry covers it.
- Resending a period replaces it. Same start, new price, and the stored one is overwritten — so resending a corrected day is how you correct it.
- Hours you have not sent are not left unpriced. They fall through the usual chain: your backup source if you set one, otherwise your plan's zone rate. The log says which covered each period, so nothing goes missing silently — it is simply priced from somewhere else.
When a price does not arrive
A day-ahead market publishes tomorrow once a day. That publication can be late, the fetch can fail, your zone can be missing from a response. The hub does not give up on a late day: it keeps asking — every fifteen minutes in the early window, then hourly for as long as the day is still missing — so a publication that lands late in the evening is picked up within about an hour, and the periods are repriced from the source instead of staying on the plan. For each 15-minute period the hub resolves exactly one price, in this order:
| source | what it means | |
|---|---|---|
| 1 | Primary | the provider you chose, for your zone |
| 2 | Backup | optional, must be a different provider; used only for periods the primary doesn't cover |
| 3 | Your plan | the zone rate in effect for that period |
Nothing is blended: one period, one price, one source — and the source is stored with the period, so a figure you read next week can still be traced to where its price came from.
Whether a backup is available to you at all comes first. Twelve of the market areas above are covered by two of these sources or more; fifteen are covered by exactly one, and there the only second source is a price you push from Home Assistant. Find your zone before reading the rest of this paragraph as advice.
Where a backup exists, it is worth the five minutes. Without one, the plan steps in. That is correct behaviour — your energy is still counted and still costed — but it is a different price, and your costs for that stretch will not match the market.
A backup of the other kind is allowed, and it changes what you must fill in. Each period is priced by the class of the source that actually covered it, not by the primary's class — so an all-in primary with a spot backup needs your contract's components filled in anyway, or the backup's periods come out as bare spot, which is to say too low. Filling them in costs an all-in user nothing: an all-in source ignores those fields. The only rules are that the backup is a different provider and that both quote your plan's currency.
⚠️ And a backup keeps a market price in place, of its own kind, which is not always the same number. In NL, for instance, a spot backup behind an all-in primary prices those periods as spot plus your contract's components, not as your supplier's all-in figure. The hub's log says which source every period used, so a quiet substitution is distinguishable from a quiet failure — and from a day priced on a different basis.
Choosing, in the order that saves work
- Set your plan's currency first. It constrains which zones you can even save, so doing it afterwards means redoing the rest.
- Find your zone in the table, and read the Kind column. That one word decides whether you fill in your contract's components or leave them alone.
- Pick a backup — if your zone has a second source. Twelve areas are covered twice over: SE1–4 and NO1–5 (Nord Pool alongside the national source), DK1–2 and NL (Energy-Charts alongside a second), and SE4 and NO2 three times. The rest are covered once. For DE-LU, FR, AT, BE, CH, CZ, HU, IT-North, PL, SI, FI, EE, LV, LT and the UK regions there is no second provider in this list, so what follows the primary is your plan's zone rate — unless you push a price from Home Assistant, which is a source in its own right.
- Check the first full day against your supplier's own figures, not against the wholesale chart. Two different gaps mean two different things: a disagreement of roughly the tax-and-VAT fraction means the kind is set wrong, which is the common case — while a gap of roughly your standing charge means nothing is wrong at all. The hub costs energy, per kilowatt-hour. A daily or monthly fixed amount — vastrecht, Grundpreis, netbeheer, a standing charge — is not in its figure, so the month will differ from the bill by exactly that, and no setting changes it.
What this doesn't do
- It is not a supplier relationship. The sources are public price data for market areas; the contract is what you describe in the plan.
- It does not convert currency. A mismatch is refused at the point you save it, which is the better place to find out.
- It does not switch anything on or off when the price moves. Cheap windows are a signal; what to do with one is your automation's decision.
- It does not re-price the past. A period keeps the price that was applied to it, with its source. Fixing a setting changes what happens next.
Where to read more
- Where your price comes from — the full reference: every field, every failure reason, and what each one means for you.
- Market prices — the short version, if you are still deciding whether you want this at all.
- Prices in the app — the Prices page, the per-period table and the applied-price log.
- How cost is calculated — the chain from a measured kilowatt-hour to money.
- Tariffs and plans — zones, fees, taxes and VAT, which is where a spot source's other half lives.