Reference Configurations#

Type: Reference β€” lookup of config blueprints for common system archetypes. Pick the closest match and adapt.

These are anonymized, abstract templates. They are not real users’ systems. Each block is a starting point β€” the parameter values reflect typical hardware in the archetype, but you must verify against your own equipment. See Configuration for the full parameter reference.

Note

Integer hours only. operating_hours_of_each_deferrable_load accepts whole integers (see issue #373). The blueprints below round all hour values up to the nearest integer. If your loads need finer control, reduce optimization_time_step (e.g. to 15 minutes) so the same wall-clock duration spans more timesteps.

1. Single-family home β€” PV + battery + heat pump + EV + dynamic tariff#

The most common modern setup: ~150 mΒ² home, 8–12 kWp PV, 10–15 kWh battery, air-source heat pump with underfloor heating, one EV, Tibber/aWATTar/Octopus dynamic pricing.

# Static config (Add-on options or config_emhass.yaml)
set_use_pv: true
solar_forecast_kwp: 10
optimization_time_step: 30
# Note: prediction_horizon is a runtime parameter (passed in the MPC payload),
# not a static config field. With this 30-min step a 24 h horizon is 48 timesteps.

set_use_battery: true
battery_nominal_energy_capacity: 12000     # Wh (= 12 kWh)
battery_charge_power_max: 5000             # W
battery_discharge_power_max: 5000          # W
battery_minimum_state_of_charge: 0.2
battery_maximum_state_of_charge: 0.9
battery_target_state_of_charge: 0.5

nominal_power_of_deferrable_loads:
  - 3000        # water heater (regular deferrable)
  - 11000       # EV charger
  - 0           # heat pump (controlled via thermal_battery, set 0 here)

operating_hours_of_each_deferrable_load:
  - 4
  - 0           # EV: overridden at runtime
  - 0           # heat pump: thermal_battery handles it

# def_load_config β€” passed at runtime (template in heat_pump_walkthrough.md)

Cross-link: Heat-pump walkthrough for the full MPC payload assembly. Daily cost depends strongly on local tariff spread, PV size, weather, and house thermal characteristics β€” measure your own baseline before claiming savings.

2. PV-only β€” no battery, heat pump, static tariff#

A simpler setup: 6–10 kWp PV, no battery, an air-source heat pump for water heating, fixed-rate import (no dynamic prices). EMHASS still helps schedule the heat pump and other deferrable loads against PV surplus.

set_use_pv: true
solar_forecast_kwp: 8
optimization_time_step: 30

set_use_battery: false

nominal_power_of_deferrable_loads:
  - 3000        # water heater (heat-pump-driven, treat as regular deferrable)
  - 1500        # dishwasher

operating_hours_of_each_deferrable_load:
  - 4
  - 2           # rounded up from typical 1.5 h cycle

# Static prices (no dynamic tariff)
load_cost_forecast_method: list
prod_price_forecast_method: list
# Pass [0.30] * 48 and [0.08] * 48 at runtime, or set in config if truly static.

Most savings come from shifting deferrable loads into PV-surplus hours. Cost reduction is bounded by the share of the daily load that is actually shiftable.

3. Off-grid heavy β€” large PV + battery, no grid import#

Cabin / off-grid setup: 15+ kWp PV, 30+ kWh battery, no grid connection (or grid connection with hard limits). Cost minimization is irrelevant β€” the goal is don’t run out of charge.

set_use_pv: true
solar_forecast_kwp: 20

set_use_battery: true
battery_nominal_energy_capacity: 30000     # Wh (= 30 kWh)
battery_charge_power_max: 10000            # W
battery_discharge_power_max: 10000         # W
battery_minimum_state_of_charge: 0.2       # lower floor β€” off-grid prefers more usable range
battery_maximum_state_of_charge: 0.95
battery_target_state_of_charge: 0.7        # always end day with reserve

# No grid: cost function reflects PV-curtailment penalty + load-shed penalty
costfun: self-consumption

For true off-grid use, modeling load shedding (turning loads off when SOC drops) is currently outside EMHASS’s optimization model and must be handled in HA automations. The costfun: self-consumption mode minimises grid interaction without explicit load-shedding constraints.

4. Apartment with dynamic tariff β€” no PV, no battery#

Renter setup: no rooftop access, no battery space. Just deferrable-load shifting against Tibber/aWATTar prices.

set_use_pv: false
set_use_battery: false

nominal_power_of_deferrable_loads:
  - 2200        # washing machine
  - 2000        # dishwasher
  - 1800        # heat-pump tumble dryer

operating_hours_of_each_deferrable_load:
  - 2           # washing machine (rounded up from typical 1.5 h cycle)
  - 2           # dishwasher (rounded up from typical 1.5 h cycle)
  - 1           # tumble dryer

Savings depend on the daily price spread of your dynamic tariff and the share of total energy that runs through shiftable loads. For typical 0.10–0.25 EUR/kWh spreads, deferrable-only setups produce visible but modest savings β€” the marginal value scales linearly with the spread.

5. Heat-pump-focused β€” PV + heat pump, no battery, no EV#

Mid-renovation home: PV installed but no battery yet, heat pump replaced gas, no EV. Most flexibility lives in the thermal battery (slab) rather than an electrochemical battery.

set_use_pv: true
solar_forecast_kwp: 10
optimization_time_step: 30

set_use_battery: false

nominal_power_of_deferrable_loads:
  - 0           # heat pump via thermal_battery

# def_load_config with thermal_battery β€” see heat_pump_walkthrough.md

The thermal slab serves as the storage. Expect strong dependence on thermal_inertia_time_constant and accurate outdoor_temperature_forecast.

Cross-link: Heat-pump walkthrough, Reference: thermal_battery.

6. Multi-EV β€” PV + battery + 2 EVs#

Two-EV household: each EV has independent departure time and required-energy. Both modeled as separate deferrable slots.

set_use_pv: true
solar_forecast_kwp: 12

set_use_battery: true
battery_nominal_energy_capacity: 10000     # Wh (= 10 kWh)

nominal_power_of_deferrable_loads:
  - 3000        # water heater
  - 11000       # EV 1 (3-phase 16 A)
  - 7400        # EV 2 (1-phase 32 A)

operating_hours_of_each_deferrable_load:
  - 4
  - 0           # runtime override
  - 0           # runtime override

end_timesteps_of_each_deferrable_load:
  - 48
  - 0           # runtime override (per EV departure)
  - 0           # runtime override (per EV departure)

Pass per-EV def_total_hours[1], def_total_hours[2], end_timesteps[1], end_timesteps[2] from each EV’s source at runtime. See EV walkthrough for the template pattern; replicate per EV.

See also#