Skip to content

Seblin01/wolta-homeassistant

Repository files navigation

Wolta for Home Assistant

HACS Custom GitHub release License: MIT Validate

Grade how well your home battery is optimised against day-ahead electricity prices (Nord Pool / ENTSO-E), directly in Home Assistant. Wolta analyses your 15-minute battery and grid data and scores how much of your battery's achievable value your operation actually captured. The optimisation grade and measured battery value work across all supported European price zones. Full battery economics (IRR, payback and whole-plant savings) are currently available for Swedish price zones (SE1–SE4).

What it does

After setup the integration automatically:

  1. Uploads 15-minute energy statistics from your HA sensors to Wolta.
  2. Triggers periodic recomputes on the Wolta backend.
  3. Exposes the results as Home Assistant sensors.

Sensors

Entity names are translated (English and Swedish bundled; other languages fall back to English), and HA generates entity IDs from the translated names at install time. Default IDs on an English-language instance:

Entity Unit Description
sensor.wolta_optimisation_grade % Holistic optimisation score (0–100): the share of the battery's theoretically perfect total value your actual operation captured. Appears as a preliminary score after about 7 days of data (server v0.43.0+) and matures at 30 days — the attributes preliminary and n_days tell you which; a preliminary score can swing from day to day. All price zones.
sensor.wolta_battery_value_per_year SEK / EUR The battery's own annual value — the incremental saving vs. the same plant without a battery. Measured from your actual flows (the same number wolta.se shows as "You captured") once the grade is mature (30 days); before that it falls back to the modelled battery share — a short window multiplied up to a year is not an honest measured figure. Attribute source tells you which (measured/modelled); plant_total_sek carries the plant total. All price zones. Solar's value is not included — it belongs to the solar investment.
sensor.wolta_plant_savings_per_year SEK / EUR Total annual saving of the whole plant (solar + battery), i.e. what a combined solar-plus-battery investment earns. Attributes battery_sek/solar_sek give the split. SE zones only.
sensor.wolta_internal_rate_of_return_irr % IRR of the battery investment: the battery-only savings stream against the battery's purchase price (incremental cash-flow principle). Can be negative — that means the battery alone does not carry its cost. SE zones only.
sensor.wolta_payback_time yr Payback of the battery investment from the battery-only savings stream. unknown when the stream never repays the cost within the projection horizon. SE zones only.
sensor.wolta_actual_savings_this_year SEK / EUR Actual battery revenue this year. SE zones only.
sensor.wolta_data_status timestamp Last data point uploaded (diagnostic). Always available.
sensor.wolta_status enum Computation status: done / computing / waiting_for_data / error (displayed translated). Always available.

A Recompute button lets you trigger an immediate recompute outside the automatic schedule.

Economy sensors that require the decision engine (plant savings, IRR, payback, actual savings) are only available for Swedish price zones (SE1–SE4). The grade and the measured battery value work for all supported zones.

Why battery value ≠ plant savings

Before v0.5.0 the battery-value sensor showed the whole plant's saving (solar + battery), which overstated the battery. A battery's value is the incremental value versus running the same plant without it — standard methodology in battery-retrofit economics (NREL solar-plus-storage analyses, Solcellskollen's Swedish calculations) and investment appraisal (incremental cash-flow principle). If you want the big number, it is still there: sensor.wolta_plant_savings_per_year, correctly labelled.

Requirements

  • Home Assistant 2025.12.0 or newer
  • A battery storage system with energy sensors already configured in Home Assistant's Energy dashboard
  • Grid import and export sensors (required); solar production sensor (optional)

Installation via HACS

One-click (opens HACS on your instance with this repository preloaded):

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

Or add it manually:

  1. In Home Assistant, open HACS (install it first if needed).
  2. Open the three-dot menu (top right) → Custom repositories.
  3. Paste https://github.com/Seblin01/wolta-homeassistant, choose category Integration, and select Add.
  4. Search for Wolta in HACS and select Download.
  5. Restart Home Assistant.
  6. Go to SettingsDevices & ServicesAdd Integration and search for Wolta.

Once Wolta is accepted into the HACS default store, you can find it by searching Wolta in HACS directly, without adding a custom repository.

Manual installation

  1. Copy custom_components/wolta/ into your HA config/custom_components/ directory.
  2. Restart Home Assistant.
  3. Add the integration via SettingsDevices & Services.

Setup flow

No account or API token is required. Setup starts with a choice:

  • Create a new profile — Home Assistant provisions a Wolta profile automatically (the flow below).

  • Link an existing wolta.se profile — already used wolta.se? Paste your personal profile link (the one with ?profile=…) or just the token. Your plant parameters are read from the server, the profile is adopted for integration use (backend v0.19.0+), and the plant step is skipped; Home Assistant takes over data uploads from there (overlapping periods are overwritten with sensor data). The profile must include a battery — solar-only profiles are rejected.

    If the plant already streams its data to wolta.se through another connection (the Sonnen webhook or a Reduxi bridge), the flow offers view-only mode instead: you get all the sensors and the recompute button, but no sensor selection and no uploads — the plant's own connection keeps owning the data, and removing the entry never deletes anything on wolta.se. If the saved token ever stops working, re-authentication simply asks for a fresh token (create one on the plant page on wolta.se while signed in).

Step 1 – Energy sensors

  • Map your HA energy sensors for battery charge, battery discharge, grid import and grid export. The integration prefills these from the HA Energy dashboard if it is configured.
  • Solar production is optional.

Step 2 – Zone & battery (create path)

  • Select your Nordpool/ENTSO-E price zone (e.g. SE3). The dropdown is preselected from your Home Assistant country and, for Sweden, latitude.
  • Enter your battery's usable capacity (kWh) and peak power (kW). Usable means what the battery actually delivers to the house on a full discharge (the AC/meter side) — this is lower than the nameplate rating, and lower than the energy your battery app shows at 100 % SoC (that's the DC/cell figure), because the inverter loses energy converting to and from the battery. Use the meter-side value, not nameplate, so the grade compares you fairly against a perfect controller on your own hardware. Both are required and must be greater than zero. (After a couple of months of history, Wolta measures this for you and can offer the value as a Repair — see Troubleshooting.)
  • Set the round-trip efficiency (default 0.9), measured on the AC side — not the DC/cell figure. With a few months of battery history in Home Assistant, the field is prefilled with your plant's measured AC round-trip efficiency, and the purchase date is suggested from the first recorded data point.
  • Optionally add economy details: battery purchase price and purchase date (used for IRR, payback and this year's actual savings), and your own tariff — grid fee, electricity supplier markup and an export premium/discount (öre/kWh for SEK zones, euro cents/kWh for other zones; the export figure may be negative). Leave any tariff field blank to use your country's standard tariff.
  • Optionally set a reserve floor (%) — the share of usable capacity your control system never discharges below (e.g. a backup reserve). Enter usable capacity above; the reserve is subtracted here, don't subtract it twice.

If your history shows more energy leaving the battery than entering it, the Battery charge/discharge reversed toggle is preselected (linked profiles get a separate confirmation step) — see Troubleshooting.

Step 3 – Privacy (create path)

  • Opt in to anonymised data sharing (off by default) if you want to contribute to the Wolta benchmark.
  • Confirm to create the profile and complete setup.

Shared profile with wolta.se

The integration and wolta.se show the same profile. The server is the source of truth: change a value in the Configure dialog and it shows up on wolta.se; change it on wolta.se and Home Assistant picks it up within about five minutes (a lightweight side-poll watches the profile and refreshes the results as soon as something changed) — the Configure form always opens with the current server values. Last write wins.

Because a linked profile belongs to your wolta.se usage, removing the integration never deletes a linked profile (profiles created by the integration keep the documented delete-on-remove behaviour, see Privacy). A purged/deleted profile triggers re-authentication, which creates a fresh HA-owned profile from the cached settings.

Adjusting values afterwards

Open the integration's Configure dialog (Settings → Devices & Services → Wolta → Configure) to adjust values without removing the integration. The form is grouped into Battery, Economy and Tariffs sections:

  • Battery capacity (kWh), power (kW) and round-trip efficiency — changing these triggers a server-side regrade of your optimisation score.
  • Nameplate capacity (kWh) and nameplate power (kW) — optional manufacturer-rated figures. The grade itself always uses the usable/deliverable values above; the rated figures let wolta.se compare per-kWh prices fairly in the expansion calculator and explain measured-vs-rated differences. Clearing a field removes the value.
  • Battery purchase price and purchase date — used for IRR, payback and this year's actual savings. Clearing a field removes the value.
  • Your own tariff — grid fee, electricity supplier markup and an export premium/discount (öre/kWh for SEK zones, euro cents/kWh for other zones; the export figure may be negative). Clearing a field reverts it to your country's standard tariff.
  • Reserve floor (%) — the share of usable capacity your control system never discharges below. Clearing the field removes the reserve.
  • Battery charge/discharge reversed — a toggle that swaps the battery charge and discharge streams on upload. See Troubleshooting below.

Only changed fields are sent to Wolta. After saving, a recompute is triggered automatically. The optimisation grade updates first; the economy figures (IRR, payback, actual savings) are recomputed in the background and follow a few minutes later. Throughout, the sensors keep their previous values instead of dropping to unavailable (v0.7.1+).

Changing energy sensors: use the Reconfigure option (Settings → Devices & Services → Wolta → three-dot menu → Reconfigure) to pick new sensors. The full history is re-uploaded from the new sensors and the grade recomputed — no need to remove the integration.

Troubleshooting

Optimisation grade is strongly negative or looks inverted. This almost always means the battery charge and discharge streams are mapped the wrong way round — some battery integrations and energy meters report the two directions in a way Wolta reads reversed, which makes it look as though the battery charges when power is expensive and discharges when it is cheap. Open the Configure dialog and turn on Battery charge/discharge reversed. Wolta swaps the two streams, re-reads your history and recomputes the grade automatically — you don't need to change any of your Home Assistant sensors. If the grade still looks wrong afterwards, please open an issue.

Payback time shows unknown. The sensor has no payback year to report because the battery doesn't reach break-even — typically a small or expensive battery whose modelled internal rate of return (IRR) is negative. This is a real result, not an error; the IRR sensor shows the (negative) return. Increasing the battery capacity or lowering the entered purchase price moves it towards a payback.

The grade sensor has a capacity_hint attribute (v0.8.0+). The backend sets it when the battery capacity you entered is clearly higher than the usable capacity your measured data shows — a nameplate-vs-usable mix-up. The grade compares you against a perfect dispatch on the capacity you entered, so an oversized entry unfairly lowers the score. Open Configure and set the battery capacity to the attribute's suggested_kwh (or your own better estimate of usable capacity); the grade is recomputed automatically. No hint means no mismatch was detected.

Measured-parameter repairs appear (v0.12.0+). Once there are a couple of months of history, Wolta measures the grade-affecting battery parameters at the meter and, if one clearly disagrees with what you configured, raises a fixable repair. They only appear when the measurement is mature and confident (≥60 days and a real gap), and the measured values are all-time figures, so they're stable across seasons. If you simply haven't fully charged or discharged in the period, ignore and dismiss them.

  • Usable capacity — the AC/meter-side usable capacity (not the DC/cell figure your battery app shows). Confirming sets the battery capacity and clears any reserve floor: the measurement already reflects only the window you actually cycle, so the reserve must not be subtracted again.
  • Peak power — the most power the battery has charged/discharged at the meter. This is a lower bound (your control may never have demanded full power), so the repair opens an editable field pre-filled with the measured value and asks you to set the battery's real maximum (its inverter limit). Too low a value flatters the grade; too high unfairly lowers it — confirm or raise the figure.
  • Round-trip efficiency — the measured AC energy-out ÷ energy-in. A true measurement, so it's a one-click adopt; corrects a stale efficiency set from thin history at setup.

Full results on wolta.se

The Wolta device page has a Visit link that opens your complete results on wolta.se (grade breakdown, economy drill-downs, history) using your profile token. Note: anyone with access to your Home Assistant can follow the link.

Privacy

Your 15-minute energy data is stored on Wolta's servers to power the analysis. No personal data (name, address, account) is sent or required.

Deleting the integration removes your data server-side — for profiles the integration created. Removing the config entry in Home Assistant then triggers a right-to-erasure request to the Wolta backend. Linked profiles are exempt: removing the integration only disconnects Home Assistant; your wolta.se profile and history stay. Delete those from wolta.se itself.

Anonymised corpus sharing is opt-in and defaults to off. See wolta.se/om for the full privacy policy.

Links

Example dashboard

A ready-made Lovelace view for the Wolta sensors is available in dashboards/wolta.yaml (English entity IDs and labels — the default for most instances). A Swedish variant with Swedish entity IDs and labels is available in dashboards/wolta.sv.yaml.

Using the dashboard

  1. Open dashboards/wolta.yaml and copy the entire contents.
  2. In Home Assistant go to Settings → Dashboards.
  3. Create a new dashboard (type: Lovelace) and choose Edit manually.
  4. Paste the YAML content and save.

Verify entity IDs

Entity names follow your Home Assistant language (English and Swedish translations are bundled; other languages fall back to English). HA generates entity IDs from the translated names at install time. The dashboard YAML uses the English defaults; on a Swedish HA instance, replace them as follows:

English ID (used in the YAML) Swedish instance ID
sensor.wolta_optimisation_grade sensor.wolta_optimeringsbetyg
sensor.wolta_battery_value_per_year sensor.wolta_batterivarde_per_ar
sensor.wolta_internal_rate_of_return_irr sensor.wolta_intern_avkastning_irr
sensor.wolta_payback_time sensor.wolta_aterbetalningstid
sensor.wolta_actual_savings_this_year sensor.wolta_facit_i_ar
sensor.wolta_data_status sensor.wolta_datastatus
sensor.wolta_status sensor.wolta_status
button.wolta_recompute button.wolta_rakna_om

If your entities differ (other language, integrations installed before v0.4.3, or a _2 suffix when installed more than once): go to Settings → Devices & Services → Wolta to see the exact IDs, and adjust the dashboard YAML accordingly.

Notes

The dashboard ends with a markdown card linking to your full results on wolta.se. The link is resolved dynamically from the device's configuration_url (v0.4.1+), so no manual token pasting is needed.

Economy sensors (battery value, IRR, payback, actual savings) are only available for Swedish price zones (SE1–SE4). They show unavailable for other zones.

All sensors show unavailable until the first recompute run completes, which requires at least 30 days of uploaded data.

During a recompute (e.g. after changing values), sensors keep their last known values instead of flickering to unavailable; retained attributes carry a computing: true flag and sensor.wolta_status shows Computing (computing) until the new results land (v0.4.2+). The grade is recomputed first and the economy figures (IRR, payback, actual savings) follow a few minutes later; they hold their previous value in the meantime rather than going unavailable (v0.7.1+).

License

MIT – see LICENSE.

About

Home Assistant integration for Wolta: grade your home battery's optimisation against Nord Pool / ENTSO-E day-ahead electricity prices, with battery economics (IRR, payback).

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages