Repository navigation
Releases
v0.9.6 — Whole-house load on the flow strip
The Live tab's HOME node showed sensor.solis_s6_eh1p_household_load_power, which the inverter only computes from the load it services through its own CTs — battery and grid. The AC-coupled solar inverter backfeeds the house AC bus downstream of those CTs, so that sensor never sees the load solar covers (the same blind spot documented in v0.9.1 for the energy figures).
Measured live on 2026-09-10 over a minute: solar ~167 W, grid ~20 W, battery discharge ~223 W, but household_load_power ~170 W — a steady ~235 W short of the sources, almost exactly the solar figure, and not sampling jitter. So the power-flow strip never balanced.
New sensor.true_house_load sums every metered flow into the AC bus — solar + grid net (signed) + battery discharge − battery charge, clamped at 0 — and the HOME node now reads it. The only residual left against it is battery DC→AC conversion loss and inverter self-consumption, ~7% of discharge. The raw Solis figure stays on the History tab's energy "Home load" row.
Backend change: adds the true_house_load template sensor to tariff_period_breakdown.yaml — re-copy the package to the host and restart HA, then HACS-redownload the panel.
module_url is ?v=0.9.6.
v0.9.5 — Single-bucket charts
With one day of per-tariff meter data, the grid-import and battery-cycled charts drew that single bucket as a block spanning the whole plot — it read as a rendering fault rather than as one day's data. Since the per-tariff meters start life with exactly one bucket, that was the normal first-day view.
Bars are now capped at 46px. The net-saving chart was unaffected, having a month of statistics behind it, which is why only two of the three charts showed the fault.
Includes v0.9.4's dynamic rate benchmark. module_url is ?v=0.9.5. Update HACS first, then copy the package.
v0.9.4 — Benchmark reads the rate helper
The effective-rate hint read vs €0.3578 day rate with the rate written into the JS. Rates moved into input_number helpers precisely so a price change is four edits and no code — and this line would have quietly contradicted them at the next change, on the one tile whose job is to be compared against it.
It now reads input_number.rate_day, and drops the comparison rather than inventing one if the helper is missing:
EFFECTIVE RATE
0.1833 €/kWh
yesterday, all-in · day rate €0.3578
module_url is ?v=0.9.4. Update HACS first, then copy the package.
v0.9.3 — Recover from a cached 404
The panel failed with "Unable to load custom panel". The file was present and valid — ?v=0.9.2 returned 404 while ?cb=<random> returned the correct 54798-byte file from the same path. The CDN had cached a miss.
It happens when the package is copied before HACS has downloaded the release: HA requests a URL that does not exist yet, the 404 is cached, and the panel keeps failing after the file arrives because that URL is pinned to the miss. A browser refresh cannot clear it, and neither can a restart.
module_url moves to ?v=0.9.3, a value never requested, which recovers it.
Deploy order now matters and is documented: update HACS first, then copy the package.
No panel code changed from v0.9.2.
v0.9.2 — Refuse figures from a partial day
Typography. 0.1833 €/kWh rendered entirely at 23px monospace, so the unit competed with the figure. Figure and unit are now separate, unit at 0.55em and muted. Currency stays part of the figure, being a prefix.
Correctness. The yesterday guards only checked the meters held something. Measured today they held 1.18 kWh against the inverter's 16 kWh — created at 13:47 the day before, so they saw a third of the day. Every yesterday figure was wrong, and the effective rate was inflated to €0.1833 by dividing a full day's cost by a third of a day's energy. The drift sensor was reporting −14.82 kWh and nothing acted on it.
Guards now compare the meters against the inverter's own daily total and refuse anything more than 10% adrift, or 1 kWh on a very low-import day. A genuine zero-import day still reports.
Twelve sensors share the guard, which is right: if the meters missed a third of the day, everything derived from them is wrong.
Expect yesterday to show dashes until the first full metered day completes. That is correct, not broken.
module_url is ?v=0.9.2.
v0.9.1 — Honest household consumption
Analysing a 10-day holiday, with nobody home, showed the inverter's household_load_power is wrong in both directions:
- It counts battery charging as household load. At 02:00 it reported 1536 W while the battery drew 4937 W — inflating the metered daily figure by ~1.7 kWh on every charging day.
- It cannot see the AC-coupled solar, which is on a separate inverter, so through the middle of the day it reports load net of solar. The raw profile bottomed out at 13:00 at 58 W — not less use, just solar covering it.
Both errors fed self_sufficiency_today and the effective unit rate, which divided cost by that figure.
New house_energy_today/_yesterday derive consumption from metered flows instead — what the battery and solar delivered, plus what the grid delivered that did not go into the battery. The ratios and the energy table's Home load now use them. The lifetime column keeps the inverter total, which reads high, because there is no clean alternative.
Reference figures from that holiday: base load 273 W, total 8.24 kWh/day, against 13.9 kWh/day the ten days before.
module_url is ?v=0.9.1.
v0.9.0 — Financial rebuilt around bars
Three same-weight tables of right-aligned figures could not show the thing that matters: that €1.59 went into the battery to bring €1.67 back. Rows now carry a proportional bar as well as a number.
- How the saving is made — each contribution scaled against the largest, green for what came back, red for what went in, net emphasised beneath a rule.
- By tariff period — diverging bars around a centre line. Spend runs left, return runs right, so the arbitrage reads at a glance where four columns of near-identical figures did not.
Duplication removed. "Solar value" and "Avoided by solar" were the same number under two names, and battery charge cost appeared in both blocks. The Saving and Arbitrage columns differed only by solar, so three of four rows printed the same figure twice.
Negative amounts were rendering as €-1.59. The sign now sits outside the symbol and uses a true minus (−), which aligns with tabular figures where a hyphen does not.
module_url is ?v=0.9.0.
v0.8.1 — Rate in the live row
The rate was a 68px banner above the readings. It is now the first reading in the row — Day · Solar · Grid · Battery · Home — with both its label and figure tinted to the tariff band's colour, and the day's bands as a slim bar beneath the whole row.
It reads as one of the live figures now, which is what it is: something the system is doing right now, not a headline. That also leaves the lifetime saving as the only large figure on the tab, which is the right ranking.
Five across on wide screens, two on a phone.
module_url is ?v=0.8.1.
v0.8.0 — Frontend review
Rendered all three tabs against live state and audited them.
Duplication. 19 items appeared on both Live and Financial — the entire Performance block. Adding it to Live never removed it from Financial, so neither tab had a clear job. Performance is now Live's alone; Financial leads with the money chain. Live answers how is it doing, Financial where did the money go.
Prominence was inverted. The type scale ran rate 68px / tiles 23px — so total saved since install, the number the system exists to produce, rendered at exactly the size of "Peak import 0.0%", while the tariff rate that changes four times a day was three times larger. The lead tile now spans the row at 44px in the saving colour.
Direction glyphs. Power flow directions keep their word — an arrow alone is ambiguous between a grid node and a battery node — but gain ↓ ↑ ▲ ▼, so the caption is scanned rather than read.
Icons stay absent, deliberately. The backend defines 47 mdi icons, but those are for HA's own UI. This design is typographic; an icon row would read as decoration rather than information.
module_url is ?v=0.8.0.
v0.7.0 — History ranges up to 2 years
Long-term statistics are never purged — 5-minute rows compact into hourly ones kept indefinitely — so a two-year view needs no config change and no growing database.
History gains 30 days / 90 days / 1 year / 2 years. Aggregation follows the range, because 730 daily bars is unreadable on a phone:
| range | buckets |
|---|---|
| 30 days | daily — 30 bars |
| 90 days | weekly — 13 bars |
| 1 year | weekly — 52 bars |
| 2 years | monthly — 24 bars |
Axis labels follow suit, so month buckets read Sep 26 rather than 1 Sep.
The saving chart deliberately does not follow the range. It stays daily and never reaches back more than 90 days, because cost is only comparable within a rate regime — rates changed on 20/07/2026 and will change again, and a two-year saving chart would silently mix figures computed at different prices. Energy in kWh has no such problem. The cap is stated on the chart, not just enforced in code.
module_url is ?v=0.7.0.