Home Assistant · The repository goes public at launch

Energy management that explains every decision.

Steward of the House plans your battery, water heater, heat pump and EV charging against electricity prices, solar forecasts and your grid tariff, inside Home Assistant. The plan is shown before it is allowed to act, and every step is explained in plain words.

Steward of the House is the service and the product. EMS Steward is the integration you install in Home Assistant.

1,460
automated tests in the codebase
57
releases so far
2
languages: Swedish and English, German in part
2
reference houses to follow live
Choose a level
A day with StewardA real plan, live from Villa A

A real plan from one of our reference houses

The plan for 26 September 2026 in one of the reference houses, exported straight from the integration: 175 quarter-hours from midnight to the following evening, of which the chart shows the first day's 96. The price is the household's buy price including VAT, tax and grid fee. No brochure pictures, just the plan as it was.
Villa A right now, in cross-section
The plan's own reasoning

Discharging at 590 W now: the house would buy at 1.45 SEK/kWh, the next charge is planned for 12:15 at 0.94.

From the reasoning text in the export from one of the reference houses, 26 September 2026, as written by the integration.
What the plan does, in words
    • 07:30 to 10:00: the battery feeds the house through the morning's expensive hours, at prices between SEK 1.43 and 1.72 per kWh.
    • 12:15 to 14:30 and one quarter-hour at 15:00: the cheapest hours of the day, the price bottoms out at SEK 0.76 per kWh. The battery charges from the grid at full power, and the water heater runs at the same time.
    • 16:45 to midnight: the battery carries the evening, when the price mostly stays above SEK 1.50 per kWh and peaks at 2.21.
    • No export is planned this day: the sell price is too low for exporting stored electricity to pay off.

    The line is the electricity price, quarter-hour by quarter-hour. The bars show when the battery fills and when it empties. Steward fills the battery and heats the water in the middle of the day when electricity is cheapest, and lets the battery run the house in the morning and evening when electricity is expensive.

    This is a real plan from one of our reference houses, not an illustration. The price per quarter-hour comes from Nord Pool with tax, grid fee and VAT added. Steward has placed the discharging in the expensive morning and evening hours and the charging in the cheapest hours around midday, where the water heater also got its run. The plan is recomputed every five minutes as prices and forecasts update, so what you see is the snapshot from this day.

    Rows from sensor.ems_planned_mode via the ems.get_plan service: 175 quarter-hour intervals with start, action, buy and sell price, planned battery power split into charging from solar and grid and discharging to house and grid, house load, solar forecast and the load decisions for the heater. The actions this day were self in 89 intervals, discharge in 70 and charge in 16. The MILP strategy plans battery power as a continuous value, which is why partial levels such as 590 W and 1,108 W appear instead of full power only. The buy price is the cost model's: spot plus markup, certificates, grid transfer and energy tax, times VAT. No EV was connected, so no charging intervals were planned.

    How it works

    Eight steps, from electricity price to measured result

    Steward does the same thing every day: reads prices and forecasts, computes the cheapest plan for the coming day, explains it, steers the hardware if you have let it, and measures afterwards what it gave.

    1. Prices in

    Steward fetches tomorrow's electricity prices. It adds tax, grid fee and VAT itself, so it works with what electricity actually costs you, not just the exchange price.

    Steward reads the electricity price at 15-minute or hourly resolution from the Nordpool integration or Home Assistant's built-in Nord Pool, from OMIE, Tibber or your own sensor, and the cost model turns the spot price into the buy and sell price the household actually pays and earns.

    Supported price layouts: Nordpool (HACS), Home Assistant's core Nord Pool, OMIE (HACS), Tibber, and any sensor publishing rows with a start time and a price. For Sweden the cost model builds the buy price from spot, supplier markup, certificates, grid transfer fee, energy tax and VAT. For Portugal the supplier plans Simples, Bi-horária and Tri-horária with daily or weekly cycle and OMIE-indexed pricing are supported. Prices are used at whatever resolution the price entity delivers, 15 minutes or hourly.

    2. Forecasts in

    Steward looks at how much sun is expected tomorrow and how much electricity the house usually uses at different times. It learns the house's habits from the last two weeks.

    The solar forecast comes from Forecast.Solar or Solcast, the temperature forecast hour by hour from a weather entity, and the house load from a hybrid model: a formula for the house's properties blended with a profile learned from the last two weeks of metering.

    The solar forecast is read from Forecast.Solar (core), ha-forecast-solar or Solcast. If only daily totals exist, an hourly curve is synthesised and a Repairs issue says so. The temperature forecast is fetched hourly through weather.get_forecasts from any weather entity. The house load forecast is a hybrid: a formula from heated area, heat loss, COP and base load, blended with the average actual consumption per hour of the day over the last two weeks, weekdays and weekends apart. The learned profile needs long-term statistics (state_class measurement) on the consumption sensor.

    3. Tariff and limits

    Many grid companies charge extra for the hours when the house draws the most electricity. Steward knows this and makes sure the car, the battery and the hot water do not run at the same time. It also plans so that the house should stay under what the fuses can take, but it is not a fuse itself.

    The power tariff is modelled so that only a new monthly peak costs anything, and only its share of the monthly fee (a third if three peaks are billed), and the main fuse or contracted power becomes an import cap for the plan.

    Six Swedish power tariff models are supported, billed on the N highest hours, by default three hours on different days, and aware of the tariff's time windows. The power term prices only a new peak above what the month already bills, at 1/N of the monthly rate, so the plan never pays for peaks already taken. The main fuse (Sweden) or potência contratada (Portugal) bounds the plan and trims a forced charge live to what the cap leaves after the house's measured import, but it is not an enforced limit on the house itself. An optional grid limit entity in the inverter's integration receives the plan's import cap; it can never block an export.

    4. The plan is computed

    Every five minutes Steward works out the cheapest plan for the coming day: when to charge the battery, when to heat the water, when to charge the car. All at once, so the loads do not collide.

    Every five minutes the selected strategy solves a 36-hour horizon. With the milp strategy a mathematical optimizer (HiGHS) solves battery, hot water, EV, heat pump and peaks in one and the same problem, with battery wear priced at SEK 0.12 per kWh.

    Five strategies are built in: max savings, max self-sufficiency, peak shaving, hybrid and milp. The milp strategy is an exact optimizer (HiGHS through the Python package highspy, the integration's only dependency) that co-plans battery power, water heater, EV charging, heat pump, grid peaks and the contracted power cap in one problem. Battery power is planned as a continuous value, so partial charge and discharge levels appear. The horizon is 36 hours by default (12 to 72), and the plan is re-solved every five minutes (1 to 15). Wear is priced at SEK 0.12 per kWh and direction.

    Separate buy and sell dials and a pre-charge reserve, a soft SoC floor ahead of an expensive block, are priced by solving the horizon once more without them, so the owner sees what a setting costs. A typical horizon solves well under a second on a laptop and in a few seconds on a Raspberry Pi, outside the event loop and with a 10 s time limit. If HiGHS returns no usable solution a greedy solver takes over: the plan is valid but not optimal.

    5. The plan is explained

    Steward tells you why it does what it does, in plain words. You can read what it intends for the battery, the water and the car before anything happens.

    The plan becomes a timeline in Home Assistant and an explanation built from 97 reasoning codes in Swedish or English, shown in Steward's dashboard.

    The reasoning text states the engine, the horizon, the wear and round trip, what each moved dial did, the reserve blocks and their cost, the peaks, the loads and the EV regime: 97 codes translated into Swedish and English. The ems.get_plan service and the diagnostics download return the full problem and solution as JSON, so a plan can be read instead of guessed at. A new install gets a Steward dashboard in the sidebar, built from what the plant has, in Swedish or English after the user language, with the currency from the cost model and 12 h charts on a phone. German covers every entity (names, states and attributes), four of the 97 reasons and four of fifteen Repairs issues (a missing control entity, stale telemetry with and without a battery, an EV charger out of reach); the wizard and Configure fall back to English. The dashboard's explanation follows the viewer's language in Home Assistant: the explanations attribute on sensor.ems_planned_mode carries the reasons in Swedish, English and German, and a German profile gets the German sentence where there is one and the English one otherwise.

    6. Control, once you allow it

    At first Steward controls nothing, it only shows the plan. When you have seen that it makes sense you switch control on, one thing at a time. If something fails, everything is left in a safe normal state.

    When you switch read only off, Steward sends a single value to the battery: how many watts it should charge or discharge right now. If you also switch load control on, the decisions are passed on to the water heater, heat pump and charger, and only when a decision changes.

    Shadow mode is the default: switch.ems_read_only is on from the start and blocks every write. Load control is its own switch, switch.ems_load_automation, off for a new install. Four gates must be open before a bound load moves: platforms loaded, read only off, load control on and the inverter integration's own master switch, where it has one, which Steward never reads or writes.

    What Steward writes to the battery is a signed power setpoint, through the inverter's integration in Home Assistant: plus is charge, minus is discharge, 0 hands the inverter to its own self-consumption. All writes go through one module, actuator_io.py. Load writes are deduplicated and an unchanged command is re-sent at the earliest after an hour, so a manual change at the device is not undone within five minutes.

    Without a plan, with read only on, on unload or on stop, neutral is written: heater on, charging allowed, heat pump normal, never everything off. The heat pump is never switched off, blocked is a bounded setback of the target temperature. The water heater is never without power for more than a few hours, and a Repairs issue warns if it has been held off for a day. The charging current is the owner's: Steward clamps and mirrors it but hands it back untouched when it steps aside. Nothing is written before the entity platforms are loaded, so a restart never sends a command before the switches are restored.

    7. The day is graded

    Every hour Steward compares what happened with what it expected. That shows whether the sun or the house deviated from the forecast.

    Each elapsed hour is graded against the plan frozen at midnight, so you can see whether the sun and the house deviated from the forecast.

    A plan deviation sensor grades each elapsed hour of the day against the plan frozen at midnight, and forecast surprise is reported separately, never as savings. Fifteen Repairs issues watch the operation: a missing control entity, battery commands not reaching the inverter, an inverter refusing, stale telemetry, missing prices, a water heater unpowered for a day and more. Stale telemetry hands the hub to itself and skips the write until the readings are fresh. The codebase holds 1,460 test functions in 141 files, including a golden tick trace that records three ticks on three plants and must stay identical across every change.

    8. The result is measured

    Steward works out by itself what it earned, every day and every month, and deducts the wear on the battery. The figures live in Home Assistant, not in a brochure.

    Three meters show what Steward earned: today's and the month's savings against what the inverter's own self-consumption would have cost, and the month's value of battery flows and load shifting, wear deducted.

    sensor.ems_savings_today and sensor.ems_monthly_savings_vs_baseline compare with what the inverter's own self-consumption would have cost on the same measured solar and load: the baseline replays the day through a battery model with the inverter's rule, starting from the day's first measured state of charge, and credits energy left in the battery at midnight at the day's mean buy price. sensor.ems_monthly_savings values battery flows and load shifting directly, deducts wear per kWh and only counts load shifting for loads Steward actually mirrored. The ems.backtest service replays the house's recorded history through every strategy with the plant's own dials and reports the realised cost per strategy next to a passive battery. The backtest has perfect foresight and does not re-schedule loads, so it compares battery strategies and nothing else.

    The assistant

    Ask Steward in text or by voice, and change how the car charges

    In Home Assistant's assistant you can ask Steward what it is doing and why, and ask it to change some of its settings, for example to charge the car now, stop charging or follow the plan again. That works without AI. An AI can be added for freer questions, but the plan is still computed by Steward's optimiser, not by the AI.

    You can type or talk to Steward in Home Assistant, in Swedish, English or German. Ask when the car will charge and you get a short answer. Say Charge the car now and the car starts charging at once, whatever electricity costs. Say Let EMS decide the car charging again and the charging follows Steward's plan again. The answers come from Steward itself, inside the house, with no AI. If you like, you can add an AI that understands freer questions. Before it changes anything through Steward, it asks you. It does not work out the plan; Steward does that itself.

    Steward answers in Home Assistant's assistant, typed or spoken, in Swedish, English and German. Steward's fixed phrases answer at once and locally, with no AI and no key: When will the car charge?, Charge the car now, Stop charging the car and Let EMS decide the car charging again, and more phrases about the battery, the electricity price, away mode and pausing. A phrase that changes something does it at once and says what it did. Charge the car now charges for as many hours as you have set, whatever the price, and the phrases come before any AI, so they work the same with or without AI. What neither the phrases nor Home Assistant's own commands answer can go to an AI agent, if you choose one: Google Gemini or Anthropic's Claude with your own key, or a local model with Ollama (prepared, not yet tried in a house). The agent gets Steward's tools to read everything from the plan and the prices to the car and the heat pump, and to change the car's charging, away mode, the battery's levels and control. A change through the tools only happens once you have said yes in your next message, within two minutes. The agent does not compute the plan: it explains it and passes your wishes on to the same settings and switches you would otherwise change yourself, and the optimiser plans by them. The phrases answer without anything leaving the house. With Gemini or Claude, what you ask the agent goes to Google or Anthropic. Speech is a choice of its own, local or in a cloud.

    The fixed phrases are recognised in Home Assistant's assistant on the first plant and answered by Home Assistant's built-in agent, locally and without a cloud, with many wordings per phrase in all three languages. They come before any conversation agent, an AI included, except for the answer to a question the agent just asked, and before Home Assistant's own commands for the same words. The answers are at most three sentences, written to be read aloud, with times such as 14:00 or tomorrow at 02:00 and the units in words: kilowatt, kilowatt-hours, percent, kronor per kilowatt-hour. A phrase that changes something runs at once through the same paths as the entities, so it is validated, restored after a restart and followed up by the plan as when you flip the switch yourself, and the answer says what the change does not reach: a car that is not plugged in, the fuse guard holding the charger, a paused EMS where only the setting changes. Charge the car now charges for the hours number.ems_ev_override_hours says, whatever the price. Asked as a question, Charge the car now?, it only answers, and Charge the car alone tells you about the car. With load control off the car is not Steward's to plan, and the answers say the charger follows your own choice. No phrase hands control back to Steward: Resume EMS says to turn off switch.ems_read_only, while Pause EMS runs at once.

    A conversation agent with the Assist API turned on gets Steward's tools with nothing more to set up: ems__GetStatus, ems__ExplainPlan, ems__GetBatteryPlan, ems__GetPrices, ems__GetSavings, ems__GetSolarForecast, ems__GetCar, ems__GetHeatPump, ems__GetFuseGuard, ems__GetFlexLoads and ems__GetProblems to read, and ems__ChargeCar, ems__SetAwayMode, ems__SetBatteryBand and ems__SetControl to change, each only where the house has a use for it. A change never acts on the call that asks for it: the tool answers what it will do and acts only when called again with confirmed from your next message, by the same user, agent and device, within two minutes. The Assist API also gives the agent Home Assistant's own tools for the devices exposed to Assist, and the charge-now switch and the load switches are exposed from the start, so an AI can switch them without Steward's confirmation. To have every change by an AI confirmed, stop exposing them under Settings, Voice assistants, Expose. Under Configure, Assistant you choose Answer and change (default), Answer only or Off for the phrases, and Read and change (default), Read only or Off for the tools.

    Under Configure, AI assistant and voice (Home Assistant 2026.9 or newer) you choose what answers the rest. Built-in assistant only: no AI, no cost, nothing leaves the house. Local AI with Ollama, prepared but not yet tried in a house: a model that can use tools on a computer of your own, and the questions stay on your network. Google Gemini with your own API key, on Google's free tier with its limits or at Google's prices. Claude with your own API key, paid per use at Anthropic's prices with no free tier; a claude.ai subscription cannot be used for it. Steward drives Home Assistant's own Google Gemini, Anthropic and Ollama integrations and adds the agent EMS assistant, whose instruction says to answer in the language spoken, say units in words, take every number and everything about later from Steward's tools, invent nothing and ask before a change that needs a yes. What goes to Google or Anthropic is what you ask the agent, what was said earlier in the same conversation, including what the phrases already answered, Steward's answers to the agent, and the names, areas and states of the exposed devices. With Gemini two reserve models take over when the model is overloaded or the key's quota is spent, and Claude gets a reserve agent on another model family.

    Speech goes through a voice assistant named EMS, with Home Assistant Cloud (a subscription; what you say and the answers are processed in its cloud), Google Gemini (what you say and every answer read aloud go to Google, also when another engine answers), Whisper and Piper locally on Home Assistant OS (about 1 GB to download, 3 GB of free space, 0.5 to 1 GB of memory) or Off, text only. None of this changes how the plan is computed: the optimiser solves it as before, and the assistant reads it and changes the same settings you can change yourself.

    A conversation about the car
    Example
    1. You

      When will the car charge?

    2. Fixed phrase, answered locally

      The car is not charging right now. The next charge is planned tomorrow between 01:00 and 05:00, about 18.5 kilowatt-hours. It is at 42 percent and the target is 80 percent.

    3. You

      Charge the car now

    4. Fixed phrase, acts at once

      The car charges now until 21:30, whatever the price.

    5. What the phrases do not recognise goes on to the AI agent, if you have chosen one
    6. You

      Actually, can the car wait until electricity is cheaper tonight?

    7. AI agent, asks first

      I will hand the car's charging back to EMS's plan. Shall I do that?

    8. You

      Yes.

    9. AI agent, after your yes

      EMS plans the car's charging again.

    An example with made-up times and values. The phrases and answers are the integration's own and say EMS, after the integration EMS Steward. The AI agent chooses its own words; here it passes on what Steward's tools answer.
    What makes Steward different

    Eight points where we differ, and a few where others are better

    We compared Steward with sixteen other energy management systems, from Swedish vendors' clouds to open projects such as EMHASS and evcc. This is the summary. The full table with a source for every cell is on the comparison page.

    Point Steward of the House Typical vendor solution Open alternatives
    Brand agnosticYes: loads of every brand with a Home Assistant integration, otherwise we build one. Inverter and battery the same way, through the inverter's integration in Home Assistant.Mostly own inverter and battery only. Enequi and CheckWatt support several brands through their own gateway.Yes: EMHASS, evcc, OpenEMS. Predbat through templates for around thirty brands.
    Open sourceYes, Apache 2.0. The repositories are not yet public.No, no source code published.Yes (MIT, EPL). Predbat: public source, own licence.
    Runs at home, data stays at homeYes, entirely in Home Assistant. One anonymous daily report that can be switched off.Cloud or hybrid: the plan is usually computed in the vendor's cloud.Yes.
    Exact optimization, not rules of thumbExact MILP with HiGHS, greedy solver as fallback.Called AI by the vendor, method not published.EMHASS: MILP (HiGHS). OpenEMS: genetic algorithm. evcc: rules and price limits. Predbat: simulation in time order.
    Battery, hot water, heat pump and EV in the same planYes, in one problem. Works without a battery.Battery yes. Other loads mostly through relays, time windows or PV surplus.EMHASS: yes, deferrable loads in the same MILP. evcc: mainly EV. OpenEMS: partly.
    Swedish power tariff and power capSix models, the N highest hours with time windows, only new peaks cost.Ferroamp and Enequi target the capacity charge, Sigenergy, Emaldo and CheckWatt shave peaks. None documents an average of the month's N highest hours.Fixed power limit (OpenEMS, evcc). EMHASS prices the highest peak per period.
    Explains every decision97 reasoning codes in Swedish and English (four of them also in German), plus the whole plan as JSON.Graphs in the app. Sigenergy and SolarEdge show explanations in the app per the vendor.The plan is shown as slots (Predbat, evcc, OpenEMS). No plain-language explanation documented.
    Shadow mode first, measurement afterRead only on from the start. Savings measured against a computed baseline, wear deducted.Shadow mode not published. Savings shown in the app, method usually not published.Predbat: shadow mode and baseline. Others: not documented.

    The vendor column summarises the eleven commercial systems in the comparison. The open alternatives column covers EMHASS, evcc and OpenEMS plus Predbat, whose source is public but whose licence is not open. The wording of the cells follows the reviewed comparison. See the full comparison with sources.

    Brand agnostic

    Steward does not care what brand your appliances are. Water heater, heat pump and charger are steered through Home Assistant, so every brand with an integration there works, and where one is missing we build it, also for heat pumps 15 to 20 years old. The inverter and the battery are steered the same way, through the inverter's own integration in Home Assistant, so you can replace the battery without replacing the control. Every integration available in Home Assistant works, and where they are not good enough we build our own.

    Steward does not know any brands. It plans against prices, solar forecasts and the grid tariff. Loads are steered as ordinary Home Assistant entities, so every water heater, heat pump and charger with a Home Assistant integration works. Where no integration exists we build software and hardware that often talks directly to the heat pump's controller, locally and without a cloud, also for pumps 15 to 20 years old; CTC and the Nibe F-series are two examples. The inverter and the battery are steered the same way, through the inverter's integration in Home Assistant: every integration available there works, and where the existing ones are not good enough we build our own, exactly as for heat pumps, chargers and appliances. A system that only works with one maker's hardware ties you down when you later want to swap or add a charger or a heat pump.

    Loads are bound as ordinary Home Assistant entities: switch, input_boolean and light for heater and charger, select or climate for the heat pump, number for charging current. So every brand with a Home Assistant integration works. Where no integration exists we continuously build both software and hardware: in many cases real communication, usually serial, with the heat pump's controller rather than a relay alone, locally without a cloud, for heat pumps 15 to 20 years old as well as modern ones. Our own public integrations include CTC and the Nibe F-series, and in the field CTEK and Chargeamps chargers are bound. The inverter and the battery are steered through the inverter's integration in Home Assistant, in the same way as heat pumps, chargers and appliances: Steward writes a signed power setpoint in watts, an optional grid limit entity receives the plan's import cap, and every integration available in Home Assistant is used. Where the existing ones are not good enough we build our own. Among the commercial systems in the comparison, Enequi (17 inverter brands through its own gateway) and CheckWatt (about 20 brands) support several makers; the others require their own inverter and battery.

    Open source

    The code is free and will be open for anyone to read. Right now, during the launch, you can read it on request. The software keeps working even if we were to disappear.

    EMS Steward is licensed under the Apache License 2.0. Open source means anyone can read how decisions are made, find bugs and keep using the software even if the company behind it disappears. It also lets others check that savings are counted honestly. The repositories are not yet public, so during the launch access is given on request. No subscription, no fee for the software itself.

    The integration is 21,293 lines of Python in custom_components/ems with 1,460 test functions. The licence is Apache License 2.0. None of the commercial systems publishes source code, and Ferroamp notes that enabling third-party control affects the ability to control the system with FerroAI. Among the open projects, EMHASS and evcc are MIT licensed, OpenEMS is EPL 2.0 and AGPL 3, and Predbat has its own licence with public source, free for personal use. Steward's repositories are not yet public and the integration is not in the HACS default store; that is what the launch is about.

    Runs at home, data stays at home

    Everything is computed in your own Home Assistant. No cloud service that can shut down, start charging or see your consumption.

    The optimization runs in your Home Assistant, so control keeps working during cloud outages and your consumption and price data need not leave the house, apart from the anonymous daily totals in the report that you can switch off. Cloud services can change terms, start charging or shut down. The only thing that leaves the house on its own is that anonymous report, one per day, and you can switch it off. If you choose a cloud AI or cloud speech for the assistant yourself, what you ask goes there, see the section on the assistant.

    The solve runs in Home Assistant's executor, never in the event loop. The anonymous report holds version, HA version, country, position rounded to about 11 km, inverter integration,battery size and daily totals, never a name, an address or an entity name. Opting out also erases what was sent. Among the commercial systems, Ferroamp, Emaldo and CheckWatt compute the plan in the cloud, NIBE fetches the prices through the cloud but schedules in the heat pump, and Enequi, SolarEdge, Sigenergy and Huawei describe hybrid setups where a controller sits at home but forecasts and optimization live with the vendor. Local operation we share with EMHASS, evcc, OpenEMS and Home Assistant itself; we build on that tradition rather than having invented it.

    Exact optimization, not rules of thumb

    Steward computes the cheapest plan for the whole day at once, with mathematics that can be checked. It does not guess and it does not call it AI.

    An exact optimizer (MILP) computes the cheapest plan for the whole horizon under all constraints at once, while rules and heuristics react to one thing at a time. A vendor saying AI tells you nothing about how good the plan is if the method is unpublished. Steward's method is documented in the code and the documentation, which are shared on request until the repositories are public.

    The milp strategy formulates battery power, the heater's run hours, the EV's energy before departure, the heat pump's energy target, grid peaks and the import cap as a mixed integer problem and solves it with HiGHS. Battery power is continuous. The buy and sell dials and the pre-charge reserve are priced by solving the horizon once more without them. If HiGHS fails, a greedy reference solver takes over. Among the open projects EMHASS also uses MILP with HiGHS, OpenEMS a genetic algorithm, evcc rules and price limits, and Predbat a simulation that optimises windows in time order. The commercial systems describe their methods as AI without publishing the algorithm; we therefore write method not published, not rule-based.

    Battery, hot water, heat pump and EV in the same plan

    The battery, the hot water, the heat pump and the car all want the cheap hours. Steward plans them together so they do not collide and push up an expensive power peak.

    Battery, water heater, heat pump and EV compete for the same cheap hours and the same fuse. Planned separately they can collide and create an expensive power peak. Steward plans them in one and the same problem, so each load gets its right slot. A house without a battery still gets load and solar scheduling.

    The heater is modelled as run hours, not as a tank. The heat pump is an energy target with rolling minimums, never switched off, blocked is a bounded setback of the target temperature. The EV charges to a target SoC before a departure time that is opt-in through switch.ems_ev_use_departure, otherwise in the cheapest intervals, and without a car on the cable no charging is planned. Away mode drops heating to frost guard and keeps the battery in a gentle band while arbitrage keeps earning. Among the commercial systems most plan the battery on price but steer other loads through relays, time windows or PV surplus; Tibber states price-based heat pump control; Huawei and Enequi list the heat pump as a controllable load without publishing whether it is planned against price. Tibber states it has no water heater control. EMHASS plans deferrable loads in the same MILP and is the closest open relative.

    Swedish power tariff and power cap

    Grid companies increasingly charge for the hours when the house draws the most. Steward accounts for that, so a cheap hour does not become an expensive hour on the grid bill.

    Swedish grid companies increasingly bill your highest hourly average power per month, often the top three and often only at certain hours. A system that only sees the spot price can lower the energy bill but raise the grid fee. Steward supports six Swedish power tariff models and lets only a new monthly peak cost anything.

    Six Swedish power tariff models billed on the N highest hours, default three on different days, aware of the tariff's time windows. Only a new peak above what the month already bills costs anything, at 1/N of the monthly rate. For Portugal potência contratada is the import cap, for Sweden the main fuse. In the comparison Ferroamp and Enequi target the capacity charge and Sigenergy, Emaldo and CheckWatt shave peaks, but none documents an average of the month's N highest hours; EMHASS prices the single highest import peak per period, OpenEMS and evcc have fixed power limits. As far as we could find, no one else documents window-aware billing on the N highest hours across several tariff models. The reference houses we report figures from have no power tariff, so the value of this is not part of our measured figures.

    Explains every decision

    Steward says in plain words why the battery is charging right now. Then you can judge whether it is sensible, instead of guessing whether an odd curve is a bug.

    If the system can say in plain words why the battery is charging right now, you can judge whether the decision is sensible and trust it. Steward explains the plan with 97 reasons in Swedish or English in the dashboard, and the whole problem and solution can be fetched as JSON.

    The reasoning codes cover the engine, the horizon, wear and round trip, each moved dial, the reserve blocks with their cost, the peaks, the loads and the EV regime. ems.get_plan returns problem and solution as JSON. The reasons exist in Swedish and English; in German four of the 97 codes exist, and a German profile gets the rest in English. Among the others, Sigenergy has an app view that explains each action and SolarEdge has announced an assistant that tells you what it did, both per the vendor. Predbat, evcc and OpenEMS show the plan's slots with prices. Which languages the vendors' explanations come in we have not checked.

    Shadow mode first, measurement after

    Steward starts by only showing what it would have done. When you trust it you switch control on. Then it measures by itself what it earns, and deducts the wear on the battery.

    In shadow mode the system computes and shows its plan but touches nothing in the house. You follow it for a few days before letting it take over. A saving is only real if it is compared with what the house would have cost without control on the same day at the same prices, so Steward measures against a computed baseline for the inverter's own self-consumption and deducts battery wear. Percentages from a brochure say nothing about your house.

    switch.ems_read_only is on from the start and switch.ems_load_automation is off. That state, read only on and load control off, is pure shadow mode. The hourly grade is set against the plan frozen at midnight. The saving against baseline is computed by replaying the day through a battery model with the inverter's own rule, from the day's first measured state of charge, with energy left at midnight credited at the day's mean buy price. The baseline is a model, not a parallel measurement. Among the others only Predbat has a documented shadow mode (monitor plus read-only) and a comparison against a simulated day without control. Sigenergy states that the app shows the AI mode's savings against self-consumption mode and Huawei shows a saving in the app, both without a published method; no vendor publishes how the baseline is computed.

    What others do better

    Other systems are easier to buy: hardware, control and warranty from one place, and one installer to call. Some also pay you for lending the battery to the grid. Steward does not.

    Sigenergy, Huawei, Sungrow, SolarEdge, Emaldo and Tibber sell turnkey packages where hardware, control and warranty come from the same vendor, with one installer to call. CheckWatt, Tibber Grid Rewards, Enequi and Emaldo pay for frequency regulation or balancing, which Steward does not. Ferroamp's FerroAI is free today and needs nothing beyond Ferroamp's own system. NIBE's Smart Price Adaption needs no installation at all. Steward requires Home Assistant, an integration for your inverter and that you open the gates yourself.

    Steward's limitations in plain words:

    • Only Sweden, Germany and Portugal are supported today as electricity market and tariff models.
    • Installation is technical: HACS, entities to bind, the inverter's integration and four gates to open in order.
    • No frequency regulation or ancillary services.
    • Home Assistant's water_heater domain and heat pumps through a number offset are not written today.
    • With two plants in one Home Assistant the dashboard shows only the first.
    • The repository publishes no aggregated savings figures; what exists is the meters' definitions and the field values we report below.
    Results from the reference houses

    What the reference houses actually showed

    Here we show statistics from the reference houses, and two of them can be followed live on this site. Villa A and Villa B are in price area SE3, both with a battery, an EV and controllable heating or hot water, without a power tariff. All amounts are computed by Steward's own meters on the buy price the cost model builds for Sweden, including VAT; Villa A's price is also checked against an invoice. Nobody independent has reviewed the amounts. We state what each measure means and how short the period is, and we promise no annual saving.

    In the reference house Villa A, the house paid SEK 142 less over twenty days in September 2026 than the software computes the inverter's own automation would have cost, roughly SEK 7 per calendar day. The comparison is a calculation made afterwards by the software itself, not a measurement with two inverters, and September was a month with small price spreads.

    It sounds like little, and it is little. Winter may give more or less, we have not measured it yet. The example calculation in the simulator below shows what a whole year could look like, with every assumption written out. The statistics here come from the reference houses, and two of them can be followed live on this site.

    Here we show statistics from the reference houses, and two of them, Villa A and Villa B, can be followed live on this site. We measure two different things, and they must not be mixed up.

    The value of shifted energy. Steward's own meter computes what the energy it moved was worth: the difference between the price the energy was bought or stored at and the price it replaced, with battery wear deducted. In Villa A, with a 25.5 kWh battery, an EV and a water heater, that came to SEK 951 in July and SEK 1,363 in August 2026, and SEK 357 up to 26 September. Villa B, with a 17.8 kWh battery, a heat pump and an EV, gave SEK 330 over the same September days. This measure includes what a plain inverter with its own self-consumption would also have done. It is not a reduction of the electricity bill and not what Steward adds over a plain inverter.

    The difference against the inverter's own automation. Since 7 September Steward also computes what the house would have cost had the inverter's own self-consumption been in control, on the same measured solar and load. Against that computed baseline Villa A paid SEK 142 less and Villa B SEK 77 less from 7 to 26 September 2026, roughly SEK 7 and SEK 4 per calendar day respectively. This is the measure that answers what Steward adds, but the baseline is a model, the period is three weeks in a month with small price spreads, and single days came out a few öre worse than the baseline.

    July and August 2026 had larger intraday price spreads than September, which explains part of the difference between the months. The houses have different batteries and loads, so the figures cannot be added or compared directly.

    Three meters, one simulation, two of the reference houses. The statistics here come from the reference houses, and two of them, Villa A and Villa B, can be followed live on this site. Below, every figure stands with its measure and its objection.

    The measure value of shifted energy (sensor.ems_monthly_savings) values the shifted energy itself: the price it was bought or stored at against the price it replaced, load shifting valued against the day's mean price, wear of SEK 0.12 per kWh and direction deducted, and only loads Steward actually mirrored count. Villa A: SEK 951 in July, SEK 1,363 in August, SEK 357 from 1 to 26 September 2026. Villa B: SEK 330 from 1 to 26 September. The measure is not the increment over plain self-consumption control.

    The measure against a computed baseline (sensor.ems_monthly_savings_vs_baseline and sensor.ems_savings_today) replays each day through a battery model with the inverter's own rule, starting from the measured state of charge at the day's first quarter, and credits energy left in the battery at midnight at the day's mean buy price. Villa A, 7 to 26 September: SEK 142 over 20 calendar days, daily values for 17 of the days between minus SEK 0.52 and SEK 20.92, mean SEK 7.36. Villa B, same period: SEK 77, daily values for 17 days between minus SEK 0.20 and SEK 17.02, mean SEK 4.58, that is SEK 3.9 per calendar day or SEK 4.6 per day with a daily value. The measure has only existed since 7 September, the baseline is a model and not a measured parallel run, and the best daily value is not an average day.

    The backtest (the ems.backtest service) replays 71 hours of the house's own measured data through three of our own reference strategies with the same state of charge at the start. Villa A, 16 to 18 September: optimized plan SEK 39.46, hybrid control SEK 51.75, battery unused SEK 69.93, actually paid with Steward SEK 42.59. Villa B, 14 to 17 September: SEK 34.03, SEK 40.84, SEK 49.11, actually paid SEK 27.55. The actual outcome differs from the plan in both directions because forecasts are never exact. An unused battery is not a house without Steward, it is the simplest reference, and the strategies are our own, not other vendors' products. The difference between the actual outcome and the unused battery must not be read as a measured saving. The backtest has perfect foresight and does not re-schedule loads.

    Conditions. Villa A has a 3×25 A fuse subscription without a power tariff, a buy price of (spot + 6.87 + 36.00 + 20.80) × 1.25 öre per kWh including VAT and a sell price of spot + 1.30 öre per kWh, checked against invoices from August 2026. The 60 öre per kWh tax reduction for sold electricity ended on 1 January 2026, and our figures are measured after that.

    About a year. We state no annual saving, neither as a promise nor as a headline estimate, because we have only measured July, August and most of September 2026 in Villa A and September 2026 in Villa B. Scaling up the value of shifted energy would be wrong, because that measure includes what a plain inverter would also have done and therefore does not measure what Steward adds. Scaling up the measure against the baseline would be arithmetic on three weeks, not a measurement of a year, and the two measures cannot serve as floor and ceiling for each other because they measure different things. The season decides: winter usually has larger price spreads but almost no solar to store, and no winter month is measured. Power tariffs, which many grid companies introduce in 2026 and 2027, add a value that is not in our figures at all. The house matters more than the control: Villa A and Villa B differ by a factor of roughly 1.5 to 2 on the same days. Example calculation, not a promise: for a house like Villa A, with a 20 to 25 kWh battery, an EV and a controllable heater in SE3 without a power tariff, the September values against the baseline stretched over a year are in the order of SEK 2,000 to 3,000 per year over plain self-consumption control; the assumptions behind that are in the simulator below. We set no upper figure, and we will replace the example with measurements once we have measured a whole winter.

    Villa A, month by month
    Value of shifted energy per Steward's own meter, SEK
    The measure values the shifted energy itself and includes what a plain inverter would also have done. It is not a reduction of the electricity bill. September is incomplete and had small price spreads.
    The figures, one at a time
    Villa A, July 2026: value of load shifting and battery flows, as computed by Steward's own meter
    SEK 951

    What the energy Steward moved was worth, as computed by Steward's own meter: the difference between the price the energy was bought or stored at and the price it replaced, net of the configured battery wear cost. Load shifting is valued against the day's average price. The sum for the whole of July.

    Caveat

    The measure values the shifted energy itself. It is not the increment over a plain self-consumption inverter and it is not a reduction of the electricity bill. The figure is computed by the product itself and has not been reviewed by anyone independent. A single month in one house with a 25.5 kWh battery, an EV and a water heater.

    Villa A, August 2026: value of load shifting and battery flows, as computed by Steward's own meter
    SEK 1,363

    Same measure as July: what the shifted energy was worth at the prices it moved between, as computed by Steward's own meter. The sum for the whole of August.

    Caveat

    July and August 2026 had larger intraday price spreads than September, which explains part of the difference between the months. The measure is not the increment over plain self-consumption control and not a reduction of the electricity bill.

    Villa A, 1 to 26 September 2026: value of load shifting and battery flows, as computed by Steward's own meter
    SEK 357

    Same measure as July and August, but only up to and including 26 September.

    Caveat

    Incomplete month. September 2026 had small intraday price spreads, so there was less to gain from moving energy. The measure is not the increment over plain self-consumption control.

    Villa A, 7 to 26 September 2026: against a computed baseline for the inverter's own self-consumption
    SEK 142 over 20 calendar days, about SEK 7 per day

    The difference between what the house actually paid and what the inverter's own self-consumption would have cost on the same measured solar and load. The baseline is a calculation: Steward replays each day through a battery model with the inverter's rule, starting from the measured state of charge at the day's first quarter, and credits energy left in the battery at midnight at the day's mean buy price. Daily values exist for 17 of the 20 days and ranged from minus SEK 0.52 to SEK 20.92, mean SEK 7.36.

    Caveat

    This is the measure that answers what Steward adds over a plain inverter, but the baseline is a model and not a measured parallel run. The measure has only existed since 7 September: 20 calendar days in a month with small price spreads, of which 17 have a daily value. Single days were slightly worse than the baseline. The figure is computed by the product itself.

    Villa B, 1 to 26 September 2026: value of load shifting and battery flows, as computed by Steward's own meter
    SEK 330

    What the energy Steward moved was worth at the prices it moved between, as computed by Steward's own meter, up to and including 26 September. Villa B has a 17.8 kWh battery, a heat pump and an EV.

    Caveat

    Incomplete month with small price spreads. The measure is not the increment over plain self-consumption control and not a reduction of the electricity bill. No earlier months are measured for Villa B.

    Villa B, 7 to 26 September 2026: against a computed baseline for the inverter's own self-consumption
    SEK 77 over 20 calendar days, about SEK 4 per day (SEK 4.6 per day for the 17 days with a daily value)

    The difference between actual cost and what the inverter's own self-consumption would have cost on the same measured solar and load, where the baseline is a calculation in the same way as for Villa A. Daily values exist for 17 of the 20 days and ranged from minus SEK 0.20 to SEK 17.02, mean SEK 4.58.

    Caveat

    Only measured since 7 September, in a month with small price spreads, and the baseline is a model. Per calendar day it is SEK 3.9, per day with a daily value SEK 4.6. Smaller battery and different loads than Villa A, so the figures cannot be added or compared directly.

    The figures, one at a time
    Villa A, July 2026: value of load shifting and battery flows, as computed by Steward's own meter
    SEK 951

    What it means: What the energy Steward moved was worth, as computed by Steward's own meter: the difference between the price the energy was bought or stored at and the price it replaced, net of the configured battery wear cost. Load shifting is valued against the day's average price. The sum for the whole of July.

    Caveat: The measure values the shifted energy itself. It is not the increment over a plain self-consumption inverter and it is not a reduction of the electricity bill. The figure is computed by the product itself and has not been reviewed by anyone independent. A single month in one house with a 25.5 kWh battery, an EV and a water heater.

    Villa A, August 2026: value of load shifting and battery flows, as computed by Steward's own meter
    SEK 1,363

    What it means: Same measure as July: what the shifted energy was worth at the prices it moved between, as computed by Steward's own meter. The sum for the whole of August.

    Caveat: July and August 2026 had larger intraday price spreads than September, which explains part of the difference between the months. The measure is not the increment over plain self-consumption control and not a reduction of the electricity bill.

    Villa A, 1 to 26 September 2026: value of load shifting and battery flows, as computed by Steward's own meter
    SEK 357

    What it means: Same measure as July and August, but only up to and including 26 September.

    Caveat: Incomplete month. September 2026 had small intraday price spreads, so there was less to gain from moving energy. The measure is not the increment over plain self-consumption control.

    Villa A, 7 to 26 September 2026: against a computed baseline for the inverter's own self-consumption
    SEK 142 over 20 calendar days, about SEK 7 per day

    What it means: The difference between what the house actually paid and what the inverter's own self-consumption would have cost on the same measured solar and load. The baseline is a calculation: Steward replays each day through a battery model with the inverter's rule, starting from the measured state of charge at the day's first quarter, and credits energy left in the battery at midnight at the day's mean buy price. Daily values exist for 17 of the 20 days and ranged from minus SEK 0.52 to SEK 20.92, mean SEK 7.36.

    Caveat: This is the measure that answers what Steward adds over a plain inverter, but the baseline is a model and not a measured parallel run. The measure has only existed since 7 September: 20 calendar days in a month with small price spreads, of which 17 have a daily value. Single days were slightly worse than the baseline. The figure is computed by the product itself.

    Villa A, simulation 16 to 18 September 2026: electricity cost per strategy over 71 hours
    Optimized plan SEK 39, hybrid control SEK 52, battery unused SEK 70. Actually paid with Steward: SEK 43

    What it means: The same 71 hours, the same measured solar, load and prices and the same battery state of charge at the start, recalculated afterwards with three different strategies in Steward's own simulation model. The optimized plan (MILP) would have cost SEK 39.46, a simpler hybrid strategy SEK 51.75 and an unused battery SEK 69.93. The house actually paid SEK 42.59 under Steward's control.

    Caveat: A three-day window on the house's own data. It compares our own reference strategies with each other, not with another vendor's product. The unused battery is the simplest reference, not a house without Steward and not what a competitor would have done. The actual outcome differs from the plan because forecasts are never exact. The difference between the actual outcome and the unused battery must not be presented as a measured saving.

    Villa B, 1 to 26 September 2026: value of load shifting and battery flows, as computed by Steward's own meter
    SEK 330

    What it means: What the energy Steward moved was worth at the prices it moved between, as computed by Steward's own meter, up to and including 26 September. Villa B has a 17.8 kWh battery, a heat pump and an EV.

    Caveat: Incomplete month with small price spreads. The measure is not the increment over plain self-consumption control and not a reduction of the electricity bill. No earlier months are measured for Villa B.

    Villa B, 7 to 26 September 2026: against a computed baseline for the inverter's own self-consumption
    SEK 77 over 20 calendar days, about SEK 4 per day (SEK 4.6 per day for the 17 days with a daily value)

    What it means: The difference between actual cost and what the inverter's own self-consumption would have cost on the same measured solar and load, where the baseline is a calculation in the same way as for Villa A. Daily values exist for 17 of the 20 days and ranged from minus SEK 0.20 to SEK 17.02, mean SEK 4.58.

    Caveat: Only measured since 7 September, in a month with small price spreads, and the baseline is a model. Per calendar day it is SEK 3.9, per day with a daily value SEK 4.6. Smaller battery and different loads than Villa A, so the figures cannot be added or compared directly.

    Villa B, simulation 14 to 17 September 2026: electricity cost per strategy over 71 hours
    Optimized plan SEK 34, hybrid control SEK 41, battery unused SEK 49. Actually paid with Steward: SEK 28

    What it means: The same 71 hours on Villa B's own data recalculated afterwards with three strategies in Steward's own simulation model. The optimized plan would have cost SEK 34.03, the hybrid strategy SEK 40.84 and an unused battery SEK 49.11. The house actually paid SEK 27.55.

    Caveat: Three days, the house's own data, our own reference strategies compared with each other. The actual outcome came in below the simulated plan, which shows the simulation is a model of the days and not an answer key. The difference goes both ways. An unused battery is not a house without Steward.

    Best and worst day in September 2026, against the computed baseline for the inverter's own self-consumption
    Villa A: from minus SEK 0.52 to SEK 20.92 per day. Villa B: from minus SEK 0.20 to SEK 17.02 per day

    What it means: The range of the daily value over the 17 days per house that have a daily value. A good day is a day with a large spread between cheap and expensive hours. A negative day is one where the control ended up a few öre worse than the computed self-consumption.

    Caveat: Seventeen days in a month with small price spreads. The best daily value is not representative of an average day, and the worst shows the control is not flawless every day. The baseline is a model.

    Source: The sensors sensor.ems_monthly_savings, sensor.ems_monthly_savings_vs_baseline and sensor.ems_savings_today in Villa A's and Villa B's Home Assistant, read on 26 September 2026, and the ems.backtest service. The baseline's definition is in custom_components/ems/ledger.py.

    You can follow Villa A live in the section A real plan from one of our reference houses. The next reference house will be connected later.

    Simulator
    Example calculation, not a promise

    An example calculation for your house, not a promise

    Describe your house and the page computes what an optimizer could add over a household that already has good habits: the car charges at night, the battery sits in plain self-consumption mode. The calculation rests on actual hourly prices for 2025 and 2026 and runs entirely in your browser. Every assumption can be changed.

    Enter how much electricity the house uses, whether you have solar, a battery and an EV, and where in the country you live. You get a figure per year with a range. The figure is an example, not a promise. What matters most is how large the gap is between cheap and expensive electricity where you live.

    The calculation splits the gain into four parts: the battery buying cheap and feeding the house when it is dear, solar stored for the evening instead of sold, loads moved to cheap hours (heater, EV, a small share of the heat pump) and shaved power peaks if you have a power tariff. Then it deducts what a household with good habits already gets: night charging of the car, a battery in self-consumption mode and a simple timer. What remains is the optimizer's increment, with a band of 0.6 to 1.3 times. Battery wear is deducted and shown separately. Prices come from Nord Pool's hourly prices for 2025 and January to September 2026, reduced to a price level and a price gap per area and month.

    The model runs month by month. The buy price is (spot × month factor + markup 6 öre + energy tax 36 öre + grid transfer 28 öre) × 1.25, and only the spot part moves with the hour, so all load shifting is computed on spread × VAT, never on tax or grid fee. The spread is the daily mean of the four dearest minus the four cheapest hours, computed from elprisetjustnu.se hourly data: 36 öre in SE1 and SE2, 74 öre in SE3, 100 öre in SE4, with a monthly profile. The battery's gain per delivered kWh is spread × 1.25 minus energy lost at full price minus wear of SEK 0.12 in both directions; volume is capped by 90 % of capacity, by what the house uses in dear hours and by four hours at rated power, and only months with a positive gain count. The 88 % round-trip efficiency is a paper value; on a real house with Ferroamp and Pylontech we have measured 81 %. Stored solar is valued at buy price minus sell price divided by efficiency, minus the same wear, where the sell price is spot plus 5 öre grid benefit. Load shifting: heater 17 % of the house's electricity, 80 % shiftable; EV 2 kWh per 10 km divided by 0.90; heat pump 10 % of heating shiftable; gain = energy × 45 % of the spread × VAT. The power tariff follows Ellevio's former model: average of the month's three highest peaks, night counts half, SEK 65 per kW per month excluding VAT. Deductions for good habits: night charging captures 30 % of the spread, self-consumption mode 80 % of the solar gain, a timer 30 % of the battery gain. Every parameter and its source is listed under Assumptions.

    A day in a reference house: solar, battery, grid and loads in motion

    Compare with the reference houses above: there Steward computed roughly SEK 7 and SEK 4 per calendar day against a computed baseline over three weeks in September 2026. The calculation here is a model of a whole year, the reference houses are three weeks. Neither is a promise.

    Compare with the reference houses above: there Steward computed roughly SEK 7 and SEK 4 per calendar day against a computed baseline over three weeks in September 2026. The calculation here is a model of a whole year, the reference houses are three weeks. Neither is a promise.

    Keep in mind
    1. This is an example calculation, not a promise. It rests on hourly prices for 2025 and January to September 2026. A year with small price gaps gives less, a year with a winter like that of 2026 gives more.
    2. The gap between dear and cheap hours decides everything. In SE1 and SE2 it was so small in 2025 that a battery rarely earned more than its losses and wear. The model therefore only counts the months where a cycle actually pays.
    3. Battery wear is deducted: SEK 0.12 per kWh in each direction, the same value EMS Steward itself uses. The amount is shown separately so you can see what running the battery costs.
    4. The 88 % round-trip efficiency is a paper figure. On a real house with Ferroamp and Pylontech we have measured 81 % AC to AC. Set 0.81 for a cautious estimate.
    5. The number shown is what the optimizer adds over a household with good habits: the car already charges at night, the battery is already in self-consumption mode and the heater may already have a timer. The gross before the deduction is shown under the result, so you see both numbers.
    6. The power tariff is uncertain. Ellevio dropped theirs in June 2026 and Vattenfall Eldistribution paused theirs after the government's March 2026 decision. Only switch it on if your grid bill has a charge in SEK per kW.
    7. Grid fee, energy tax and VAT do not follow the hourly price in the model. If your grid company has a time-of-use tariff (for example Vattenfall's 76.5 versus 30.5 öre) the gain from shifting load is larger than shown.
    8. The house profile is a template: 60 % heating for heat pump houses, 40 % of daily electricity in daytime, 17 % hot water. A house with floor heating, a pool or a home office differs.
    9. Sold solar is valued at spot plus 5 öre. The 60 öre tax reduction ended 1 January 2026, which makes self-consumption worth more than before.
    10. A smaller main fuse, retailer markups, electricity certificates and grid services (frequency regulation) are not part of the calculation.
    11. Every parameter can be changed on the page. Set your own values and see how sensitive the result is.

    Keep in mind

    1. This is an example calculation, not a promise. It rests on hourly prices for 2025 and January to September 2026. A year with small price gaps gives less, a year with a winter like that of 2026 gives more.
    2. The gap between dear and cheap hours decides everything. In SE1 and SE2 it was so small in 2025 that a battery rarely earned more than its losses and wear. The model therefore only counts the months where a cycle actually pays.
    3. Battery wear is deducted: SEK 0.12 per kWh in each direction, the same value EMS Steward itself uses. The amount is shown separately so you can see what running the battery costs.
    4. The 88 % round-trip efficiency is a paper figure. On a real house with Ferroamp and Pylontech we have measured 81 % AC to AC. Set 0.81 for a cautious estimate.
    5. The number shown is what the optimizer adds over a household with good habits: the car already charges at night, the battery is already in self-consumption mode and the heater may already have a timer. The gross before the deduction is shown under the result, so you see both numbers.
    6. The power tariff is uncertain. Ellevio dropped theirs in June 2026 and Vattenfall Eldistribution paused theirs after the government's March 2026 decision. Only switch it on if your grid bill has a charge in SEK per kW.
    7. Grid fee, energy tax and VAT do not follow the hourly price in the model. If your grid company has a time-of-use tariff (for example Vattenfall's 76.5 versus 30.5 öre) the gain from shifting load is larger than shown.
    8. The house profile is a template: 60 % heating for heat pump houses, 40 % of daily electricity in daytime, 17 % hot water. A house with floor heating, a pool or a home office differs.
    9. Sold solar is valued at spot plus 5 öre. The 60 öre tax reduction ended 1 January 2026, which makes self-consumption worth more than before.
    10. A smaller main fuse, retailer markups, electricity certificates and grid services (frequency regulation) are not part of the calculation.
    11. Every parameter can be changed on the page. Set your own values and see how sensitive the result is.
    Installation & service

    Two ways in: do it yourself or let us do it

    EMS Steward is free and open. What costs is the work of getting Home Assistant, the hardware and the control to fit together in your house. You can do that yourself, or we do it.

    If you are used to Home Assistant you can install Steward yourself, for free. If you are not, we come to your house, set everything up and show you how it works. Either way Steward starts by only showing its plan, so you have time to see that it makes sense before it is allowed to act.

    Do it yourself: install EMS Steward through HACS as a custom repository, run the wizard that finds price, forecast, meter and inverter, and open the gates one at a time once the plan has looked right for a few days. Installation is technical: entities to bind, the inverter's integration to connect and four gates to open in the right order. We install: we set up Home Assistant if there is none, connect meter, inverter, charger and heater, configure Steward for your electricity contract and grid tariff, run shadow mode together with you and hand over with a walkthrough. The price is quoted because it depends on what the house already has.

    The full requirements are in the list below. Loads are steered as Home Assistant entities, so every water heater, heat pump and charger with a Home Assistant integration works; where none exists we build it. The inverter and the battery are steered the same way, through the inverter's integration in Home Assistant: every integration available there works, and where the existing ones are not good enough we build our own, so ask us about your inverter. The integration's own master switch, where it has one, is never touched by Steward. The wizard offers Simple, which finds price, forecast, meter and inverter and asks once, or Advanced with every step; everything is editable later under Configure. The rollout order we use ourselves: a day in read only, a post-deploy check, then read only off, load control on and the inverter integration's gate last. With two plants in one Home Assistant the dashboard shows only the first. During the launch the repository is not public; write to us if you want access with your GitHub account.

    How Steward talks to the house: readings in, commands out

    01HACS · Apache 2.0

    Do it yourself

    Add the repository as a custom repository in HACS, install EMS Steward, run the wizard and watch the plan for a few days before you let it control anything. The beolink/ha-ems repository is not yet public: it opens when the launch is complete, and until then you get access by writing to us. Our own integrations, for CTC and the Nibe F-series among others, are already public.

    Freeopen source, Apache 2.0, repository public at launch
    What you need
    • Home Assistant 2024.7.0 or newer.
    • HACS for installation as a custom repository (the repository must be visible to your GitHub account), or manual copy of custom_components/ems.
    • A price entity with 15-minute or hourly prices: Nordpool (HACS) or core Nord Pool for Sweden, OMIE (HACS) for Portugal, or Tibber and other sensors with a start time and a price.
    • A solar forecast: Forecast.Solar (core), ha-forecast-solar or Solcast. A house without panels leaves it empty.
    • Inverter or meter telemetry: SoC, battery, grid and solar power, and consumption. Long-term statistics (state_class measurement) are needed for the learned profile.
    • For battery control: the inverter's integration in Home Assistant, any available one. Where the existing ones are not good enough we build our own: ask us about your inverter.
    • ApexCharts Card from HACS (2.1.0 or newer) for the dashboard's plan charts.
    • The Python package highspy is installed automatically from the manifest.
    • Optional: a weather entity for the hourly temperature forecast and an indoor sensor recorded for a future model.
    • For load control: load entities in the domains switch, input_boolean, light (heater, charger), select, input_select, climate (heat pump) and number, input_number (charging current). Every brand with a Home Assistant integration works; where none exists we build it.
    02Home visit · Configuration · Handover

    We install and connect

    We come to your house, get Home Assistant, the hardware and Steward to work together, run shadow mode with you and hand over when the plan holds up.

    Price: quoteddepends on what the house already has
    How it goes
    1. Home AssistantIf Home Assistant is already there we build on it. Otherwise we set one up, on your own hardware in your house.
    2. The hardwareWe go through what the house has: inverter and battery, electricity meter, charger, water heater, heat pump. Loads of every brand with a Home Assistant integration are steered directly; where none exists we build software or hardware, often with direct communication with the heat pump's controller, locally without a cloud, also for heat pumps 15 to 20 years old. Inverter and battery are steered the same way, through the inverter's integration in Home Assistant; we tell you in advance what applies to your inverter.
    3. The connection to the housePrices, solar forecast, meter and loads are bound to Steward. Electricity contract, grid tariff and main fuse go into the cost model so the plan works with what you actually pay.
    4. HandoverSteward runs in shadow mode for a few days. We look at the plan together, open the gates one at a time and go through the dashboard, the reasons and the meters so you can follow up yourself.
    Contact us about installation

    We sell no hardware. Any compensation from a manufacturer or reseller is disclosed openly in the quote. If the house needs new equipment we say what, and you buy it where you like.

    Questions and answers

    What we are asked most often

    Do I need a battery?

    No. With solar panels only, Steward still moves hot water and car charging to the cheap hours. With nothing at all to control it just shows its plan, so you can see what it would have done.

    No. A PV-only house gets load and solar scheduling. A house with nothing bound still plans and shows its decisions on the Steward entities.

    No. A PV-only house gets load and solar scheduling. A house with nothing bound still plans and shows its decisions on the Steward entities: sensor.ems_planned_mode with its timeline attribute, sensor.ems_planned_battery_setpoint and sensor.ems_plan_deviation. The battery is optional in the wizard, and its capacity can be entered by hand when the inverter does not report it.

    Does Steward start steering my house right after installation?

    No. At first Steward only watches and shows what it would have done. You release control yourself, one step at a time, once you have seen the plan make sense for a few days.

    No. Read only is on from the start and blocks every write. Load control is also off for a new install. You watch the plan for a few days and open the gates one at a time.

    No. Read only is on from the start and blocks every write: switch.ems_read_only (Inverter read only) is on and switch.ems_load_automation (Load control) is off for a new install. You watch the plan for a few days and open the gates one at a time: read only off, load control on, and per load the switches switch.ems_water_heater and switch.ems_ev_charging. The inverter integration's own master switch, where it has one, is never touched by Steward.

    What happens if prices are missing or something fails?

    Then Steward does nothing silly. The heater stays on, the car may charge and the heat pump runs as usual, just as if Steward were not there. Home Assistant shows you a notice about what is missing.

    The loads are left in neutral: heater on, charging allowed, heat pump normal. Never everything off. A Repairs issue in Home Assistant says what is missing.

    The loads are left in neutral: heater on, charging allowed, heat pump normal. Never everything off. A Repairs issue in Home Assistant says what is missing. Fifteen Repairs issues are defined, among them a missing price entity, stale telemetry (telemetry age limit) and a missing control entity. When Steward steps aside, on read only, unload or a Home Assistant stop, it hands control back to the inverter.

    Which brands work?

    Water heater, heat pump and charger are steered by Steward through Home Assistant, so every brand with an integration there works. Where one is missing we build it, also for heat pumps 15 to 20 years old. The inverter and the battery are steered the same way, through the inverter's own integration in Home Assistant. Every integration available there works, and where they are not good enough we build our own; ask us about your brand.

    Loads are bound as ordinary Home Assistant entities (switch, select, climate, number), so every brand with a Home Assistant integration works. Where no integration exists we build software and hardware, often with direct communication with the heat pump's controller, locally without a cloud; CTC and the Nibe F-series are two examples. The inverter and the battery are steered the same way, through the inverter's integration in Home Assistant: every integration available there works, and where the existing ones are not good enough we build our own, exactly as for heat pumps, chargers and appliances.

    Loads are bound in the domains switch, input_boolean, light, select, input_select, climate, number and input_number, so every brand with a Home Assistant integration works. Where no integration exists we continuously build both software and hardware, in many cases with real communication, usually serial, with the heat pump's controller rather than a relay alone, locally without a cloud, for heat pumps 15 to 20 years old as well as modern ones; public examples are our integrations for CTC and the Nibe F-series. The inverter and the battery are steered through the inverter's integration in Home Assistant, in the same way as the loads: Steward writes a signed power setpoint in watts through the integration, every integration available in Home Assistant is used, and where the existing ones are not good enough we build our own; ask us about your inverter. The repository of the integration itself (beolink/ha-ems) is not yet public; ask for access during the launch.

    Which price integrations are supported?

    Steward takes the electricity price from the price integration you already have in Home Assistant, for example Nordpool or Tibber. It then works out itself what the power costs you with tax, grid fee and VAT.

    Nordpool (HACS) and core Nord Pool for Sweden, OMIE for Portugal, Tibber, and any sensor publishing rows with a start time and a price. Steward adds markup, transfer fee, tax and VAT itself.

    Nordpool (HACS) and core Nord Pool for Sweden, OMIE for Portugal, Tibber, and any sensor publishing rows with a start time and a price, per quarter hour or per hour. Steward adds markup, transfer fee, tax and VAT itself; they are parameters of the cost model that start from the market's defaults, and the resulting price is shown in sensor.ems_current_buy_price.

    How does Steward know how much my house consumes?

    Steward learns how your house usually uses electricity from the last two weeks. It keeps weekdays and weekends apart, so the Tuesday morning shower and the Sunday dinner land at the right time in the plan.

    Through a hybrid model: a formula from heated area, heat loss and base load, blended with a profile learned from the last two weeks of metering, weekdays and weekends apart.

    Through a hybrid model: a formula from heated area, heat loss and base load, blended with a profile learned from the last two weeks of metering, weekdays and weekends apart. The formula's parameters are set in the wizard; the profile is built from long-term statistics (state_class measurement) on the bound consumption sensor, mirrored in sensor.ems_consumption_power. Without history only the formula is used.

    Does Steward handle power tariffs?

    Yes. Many grid companies charge extra for the hours when you use the most electricity at once. Steward keeps track of the month's peak and avoids creating a new one, for example by not charging the car and running the heater at the same time.

    Yes. Six Swedish models are supported, and the fee is billed on the average of the N highest hours on different days. Only a new monthly peak costs anything in the plan.

    Yes. Six Swedish models are supported, and the fee is billed on the average of the N highest hours on different days (default 3). Only a new monthly peak costs anything in the plan: the level billed so far this month is shown in sensor.ems_monthly_peak, and only a peak above it gets a cost in the optimization. The main fuse (optional) bounds the plan as an import cap, not as a limit enforced in the house.

    How do I see what Steward earned?

    Steward shows in money what it saved today and this month. The comparison is against how the inverter itself would have run the battery on the same sun and the same consumption, so the figure is an estimate, not a receipt.

    Three sensors: today's and the month's savings against what the inverter's own self-consumption would have cost on the same solar and load, and the month's value of battery flows and load shifting with wear deducted.

    Three sensors: sensor.ems_savings_today and sensor.ems_monthly_savings_vs_baseline measure the day and the month against what the inverter's own self-consumption would have cost on the same measured solar and load, and sensor.ems_monthly_savings values the month's battery flows and load shifting directly, with wear deducted. All three are monetary meters with a last_reset, so the long-term statistics read the start of a day or a month as a reset and not as a loss.

    Does Steward wear out the battery?

    Steward assumes that every charge and discharge costs a little of the battery's life. So it only cycles when the price difference is large enough to pay off even with the wear counted in.

    Wear is priced at SEK 0.12 per kWh and direction by default, so the optimizer only cycles when the price spread covers losses and wear. The savings meter deducts the same amount.

    Wear is priced at SEK 0.12 per kWh and direction by default, so the optimizer only cycles when the price spread covers losses and wear. The savings meter deducts the same amount. The parameter is battery_wear (Battery cycle cost) in the configuration, derived from the pack price over its cycle life. The milp strategy charges itself the amount; the heuristic strategies use the round-trip efficiency instead. The battery's allowed band is set with number.ems_min_soc and number.ems_max_soc.

    Which strategy should I pick?

    Start with the one called hybrid. After a couple of weeks Steward can replay the past days with the other strategies and show which one would have saved the most in your house.

    Start with hybrid. Run the ems.backtest service after a couple of weeks and let the numbers tell you whether milp earns more on your house. In the reference houses Villa A and Villa B it did.

    Start with hybrid. Run the ems.backtest service after a couple of weeks and let the numbers tell you whether milp earns more on your house. In the reference houses Villa A and Villa B it did. The strategy is switched in select.ems_strategy; there are five, and the dials a strategy does not read are hidden on the device page: number.ems_trading_aggressiveness for the heuristics, number.ems_buy_aggressiveness, number.ems_sell_aggressiveness and number.ems_precharge_reserve for milp.

    Can I understand why Steward does what it does?

    Yes. Every decision in the plan has an explanation in plain words, for example that the battery is charging now because the evening will be expensive. You see the explanations in the Home Assistant dashboard.

    Yes. The plan is explained with 97 reasons in Swedish or English in the dashboard, and the ems.get_plan service returns the whole problem and solution as JSON.

    Yes. The plan is explained with 97 reasons in Swedish or English in the dashboard, and the ems.get_plan service returns the whole problem and solution as JSON. Four of the 97 reasons exist in German; a German profile gets the rest in English. The timeline lives in the timeline attribute of sensor.ems_planned_mode, which the dashboard charts are drawn from, and sensor.ems_plan_deviation shows how the outcome deviates from the plan.

    Does Steward send data anywhere?

    Only a small anonymous report once a day, for example which version you run and how much electricity the house used yesterday. Never a name, an address or what your devices are called, and you can switch it off entirely. If you add a cloud AI or cloud speech to the assistant yourself, what you ask goes to that service.

    One anonymous report per day with version, country, approximate position, inverter integration,battery size and daily totals. Never a name, an address or an entity name. Switching it off erases what was already sent. Beyond that only what you choose yourself: with Gemini or Claude for the assistant, what you ask goes to Google or Anthropic, and with cloud speech, what you say goes there.

    One anonymous report per day with version, Home Assistant version, country, position rounded to about 11 km, inverter integration,whether the site is read only, the battery's size and power, the main fuse and yesterday's totals for production, consumption, purchase, export and battery use, plus the day's average spot price. Never a name, an address, a serial number or an entity name, and the IP address is not stored. Switching it off under Settings, Devices and services, EMS Steward, Configure, Anonymous statistics erases what was already sent. Beyond that, only what you choose for the assistant leaves the house: with Google Gemini or Claude, what you ask the agent, what was said earlier in the conversation and the names, areas and states of the exposed devices, and with speech in Home Assistant Cloud or at Google, what you say. With the built-in assistant alone, a local AI and local speech, none of it leaves the house.

    More questions? Write to kontakt@easyhouseenergy.se.

    Our stance

    We show the plan before it is allowed to act, we measure instead of estimate, and we write every objection next to every figure. Never a saving we cannot show the origin of.

    EMS Steward is the integration, open source under the Apache License 2.0. The figures on this page are computed by the product itself in the reference houses and have not been reviewed by anyone independent.

    Updated September 2026