Price-Aware Home Assistant Automations for EVs, Water Heaters and Appliances

Build price-aware Home Assistant schedules for EV charging, hot water and appliances, with safe fallbacks, tariff calculations and tested YAML examples.

Quick Summary (TL;DR)

Price-aware Home Assistant automations should move flexible electricity use into genuinely cheaper periods without sacrificing safety, comfort or deadlines. The most reliable starting point is simple: use the device’s approved scheduling interface, confirm the actual import tariff, set a latest-finish time, measure what happened, and give the household an explicit manual override. A cheap-looking interval does not justify leaving an EV undercharged, bypassing a cylinder thermostat, or remotely starting an appliance that cannot safely support it.

For EVs, the strongest setup combines a charger- or vehicle-supported start schedule with a realistic wall-energy target and departure deadline. For stored hot water, favour the cylinder or heat pump’s approved control path and preserve over-temperature, hygiene and backup-heating provisions. For dishwashers and washing machines, verify whether the appliance supports a manufacturer-approved delayed or remote start; a basic energy-monitoring plug cannot create that capability.

This guide compares fixed overnight, time-of-use, dynamic-price and solar-surplus strategies; explains priorities and failure modes; supplies monitoring-first Home Assistant YAML; and shows how to calculate savings with import prices, export value and measured energy. All example tariffs, powers and costs are illustrative, not live quotes. Confirm features against the exact firmware, model, region and installer documentation before enabling any control.

A simple baseline typically beats a complex optimiser when you have one flexible load and a predictable cheap window. More elaborate schedules help when multiple loads compete for a limited supply, prices fluctuate materially, or you have a battery and solar generation. In all cases, the original equipment must retain its protective functions and each actuator must be verified in commissioning.

What makes an automation genuinely price-aware?

An automation is not price-aware merely because it runs at night. It must understand the difference between the current and alternative time windows, whether the load can be moved, and what happens if the cheaper period is missed. The decision is a small scheduling problem: assign a bounded quantity of energy to feasible future intervals, subject to power limits and a latest completion time. A fixed economy tariff makes this relatively straightforward; variable and market-linked rates need a trusted time series and repeated validity checks.

A practical installation has three different layers. Observation provides trustworthy metering, tariffs, device readiness, capacity and timestamps. Decision selects a window or power target based on a cost rule and deadline. Execution asks a supported controller to act, observes whether the command actually succeeded and abandons optimisation if a safety-critical condition or data dependency fails. Treating all three layers as one “if price low, turn switch on” rule hides most of the real engineering risks.

QuestionEV chargerHot-water cylinderWashing machine / dishwasher
Required resultBattery receives sufficient energy by departureUsable water and compliant temperature routineCycle completed before needed
Time flexibilityOften hours, limited by vehicle presenceDepends on storage and heat lossOnly when loaded and supported for deferred start
Approved command pathManufacturer-supported charger/vehicle API or timerApproved immersion diverter, heat-pump or cylinder controllerVendor delayed/remote-start mechanism
Critical independent controlsElectrical load management, protective functionsThermostat, thermal cut-out, hygiene regimeAppliance interlocks and manufacturer safety logic
Measured confirmationWall kWh, current, charge state if exposedThermal/electrical data and tank sensorActual running/completed cycle or metered consumption
Common errorAssume vehicle SOC exists or power matches nameplateTreat mains smart plugAliExpress price as a certified immersion switchPower-cycle a machine to simulate pressing Start

Choose a tariff model before writing any schedules

For a fixed-rate tariff, there may be little financial advantage in shifting a load at all; solar self-consumption or peak-network constraints can still matter. A peak/off-peak tariff offers recurring windows, but local times and day types must match your actual contract. A dynamic tariff varies by published settlement interval—often 30 or 15 minutes depending on supplier and market. Those intervals are not a promise that the same price will be available tomorrow, and a wholesale-market integration may omit supplier margin, network charges, levies or tax.

Model the marginal cost of one additional imported kilowatt-hour, not the household’s entire average bill divided by kWh. The standing charge generally does not change if the car charges at 02:00 instead of 19:00; it belongs in total bill reconciliation but not in the marginal savings calculation. If an electric load consumes solar that would otherwise be exported, the relevant opportunity cost may be the lost export payment rather than zero. For grid-charged batteries, round-trip losses and incremental battery use matter as well.

Tariff inputCorrect unitA valid useTypical trap
Import retail rate£/kWh or €/kWhCost of consuming one additional imported kWhMixing pence/kWh with pounds/kWh
Export paymentCurrency/kWhOpportunity value of using PV locallyAssuming all exported solar earns the same value
Settlement start/endTimezone-aware timestampsApply the rate to the proper consumption intervalAssuming every calendar day has 24 one-hour slots
Standing chargeCurrency/dayBill reconciliation and tariff comparisonClaiming it is saved by shifting 3 kWh
Load energykWhSum price × energy across valid slotsMultiplying watts by pence/kWh
Load feasibilitykW and minutesVerify completion before deadlineAssuming vehicle always accepts rated current

A conservative forecast-driven controller should label every price as known and valid, known but old, or unavailable. “Unavailable” is not £0.00/kWh. If tomorrow’s dynamic tariff has not arrived, do not fill it with free energy. Instead retain the approved device timer, enforce the household deadline and notify the user that cost optimisation is suspended. The companion guide Home Assistant electricity tariff sensors covers rates, entities, Utility Meter and interval alignment in more detail.

Hardware and interfaces: buy capabilities, not just a cloud logo

The most important buying question is not whether an app displays live watts: it is whether the device exposes an authorised, stable control path for the intended operation. A device can expose beautiful statistics and still offer no supported start/stop API. Conversely, a charger may implement safe local schedules without exposing a rich Home Assistant entity. Integration depth varies by model, region and software revision, and some functions rely on a vendor account or WAN connection.

Device classUseful capabilityMinimum evidence before buyingWhat not to infer
EV wallboxSchedule control, enable/pause, adjustable current when supportedExact model firmware, HA integration actions, API rate limits, local fallbackOCPP support guarantees every smart-charging feature
EV via manufacturer cloudCar charge target and statusRate limits, authentication, availability, charge-state refreshDisplayed SOC always reflects battery immediately
Approved PV diverterImmersion power modulation and thermal safety coordinationCompatible heater rating, metering, wiring and temperature protectionAny solid-state relay replicates a certified controller
Heat-pump DHW schedulerDHW target/time window with native protectionsManufacturer API, compressor protection, backup heat and hygiene configurationGeneric relay can manage compressor safely
Smart appliance with remote startManufacturer-approved scheduled or remote cycleFeature supported by that exact appliance and door/start conditionsA switched socket can simulate a remote Start button
Energy monitorReliable kWh and net import/export readingsCT placement, direction, accuracy and uptimePower sensor alone can authoritatively control plant
Home Assistant hostLocal rules, helpers, history and notificationsReliable storage, time sync, backup and supported integrationLocal HA automatically removes cloud dependencies

For a new installation, pay attention to offline behaviour. Will the EV charger continue a locally stored cheap-rate schedule with internet disconnected? Will the water-heating controller keep its thermostat and schedule without Home Assistant? Can the washer finish its programme if the Wi-Fi drops? Ask these questions before purchasing gateway hardware or chasing a more complex energy-management stack. You can often get more resilience from a suitable charger with native scheduling than from a cloud-only device linked through six automations.

For electrical equipment, local regulations, protective devices, cable ratings, phase balancing and manufacturer instructions take precedence over software. Home Assistant should never defeat an EVSE’s dynamic load-balancing protection, a heat source’s high-limit thermostat or appliance interlocks. Immersion heaters are commonly high-current, fixed-wired loads: control must use appropriate, professionally installed equipment, not an unverified general-purpose plug. That distinction is especially relevant when comparing Wi-Fi relays and approved immersion controllers.

Start with an automation architecture that has one scheduling owner

A robust design names the owner of each decision. The wallbox can own electrical current limits and safety. A native charger timer or Home Assistant can own the charging schedule, but not both independently. The cylinder controller owns temperature protections and any required pasteurisation or hygiene cycle. Home Assistant can ask for a DHW window only where the manufacturer supports it. The washing machine retains its door, motor and programme logic. One source of truth for scheduling prevents a cascade of contradictory start/stop commands.

LayerExample input/outputOwnerResponse to failure
Tariff feedInterval price in £/kWhSupplier or trusted integrationMark stale; fall back to approved schedule
Site measurementImport/export kW and cumulative kWhCorrectly installed energy meterAliExpress priceStop optimisation that depends on surplus
ReadinessVehicle plugged in, tank requires heat, appliance armedDevice/native controllerDo not attempt start when not ready
Price decisionCheap-window suggestion and latest startHA automation or optimiserDeadline-first conservative schedule
ExecutionSupported API call or preconfigured timerDevice/controllerDo not bypass protection; report failure
Completion proofDelivered kWh, temperature or cycle endedMeasured or vendor stateAlert and leave user in control
Manual overridePause optimisation or finish nowHousehold dashboardOverrides remain effective until intentionally reset

Build a dashboard with three plain-language states per load: Ready, Waiting for cheaper period and Running, plus Disabled/Needs attention. Show why the automation made its decision: the expected effective price, deadline, energy remaining, planned run time, last valid data timestamp and active override. An opaque “optimisation active” binary sensor is less useful than one sentence explaining why the EV has not started.

Calculate the EV charging deadline before optimising price

Imagine an EV that must gain 24 kWh of battery energy by 07:30. At a 7.0 kW AC wallbox and assumed 90% energy transfer efficiency, it needs approximately 26.7 kWh at the wall. A realistic charge time is 26.7 ÷ 7.0 = 3.81 hours, before pauses, taper, cold-weather conditioning or current limits. If the car arrives at 19:00, the usable window is 12.5 hours; the schedule can favour cheaper slots as long as it preserves a sufficient margin before departure.

These numbers are examples, not a universal charger efficiency claim. Actual AC charging power can vary with onboard charger, minimum current, supply voltage, single- versus three-phase wiring, battery management and simultaneous house load. If the charger offers a supported measured-energy target, prefer it over a guessed SOC conversion. If vehicle SOC is unavailable, treat delivered wall energy as the measured quantity and keep a wider buffer. Avoid presenting “battery fully ready” based solely on a wall energy estimate.

EV calculationIllustrative valueMethod or constraint
Required battery energy24.0 kWhOwner-set energy target
Assumed transfer efficiency90%Scenario assumption; measure for your setup
Wall energy target26.7 kWh24.0 / 0.90
Available AC power7.0 kWActual charge power, not marketing maximum
Ideal charging duration3.81 h26.7 / 7.0
Planning allowance0.75 hExample buffer for intermittent limitations
Planned latest start02:56 for 07:30 target07:30 minus 3.81 h minus 0.75 h
Fail-safe responseStart earlier when target is at riskUse charger-approved deadline/ready-by option

A cheap interval beginning at 03:00 may be too late even if it has the lowest price. The correct optimiser weighs the marginal saving against missing the departure target; an owner may reasonably choose to pay a little more to guarantee readiness. If the household changes departure time, the schedule must be rebuilt and the car’s existing charge target respected. Vehicle charging should remain possible manually even when tariff APIs are unavailable.

Worked EV example: choose feasible cheap intervals, not just the single cheapest number

Assume a simplified 4-hour charge requirement and four available one-hour windows, each able to deliver 7 kWh at the wall. Let the hypothetical import rates be 12p, 14p, 30p and 9p/kWh over four eligible hours. The cost is the sum of each interval’s charge energy multiplied by that interval’s rate; for the four slots that is 7 × (£0.12 + £0.14 + £0.30 + £0.09) = £4.55. If one more eligible hour at 10p existed, replacing the 30p hour would save 7 × (£0.30 − £0.10) = £1.40. No savings are realised if the device fails to start, the rate is actually wholesale-only, or the replacement slot falls after departure.

For quarter-hour settlement periods, compute capacity for each interval as kW × 0.25 h. A 7 kW charger can ideally deliver 1.75 kWh in a 15-minute slot. The optimiser must account for partly used slots, connection time, ramping, available current and minimum power of the EVSE. A quarter-hour with a negative price may look attractive, but the EVSE may be unable to start and stop cleanly at that cadence; repeated toggles can also conflict with car sleep/wake behaviour and device-specific rate limits.

Price scheduling rulePotential benefitNon-negotiable constraintFailure signal
Fixed cheap windowPredictable cost, little softwareReady-by deadlineEV has not started when expected
Cheapest-N intervalsLower import cost in variable tariffEnergy requirement and slot timingInsufficient remaining capacity
Solar surplus firstUse PV when its value beats importCorrect export price and meteringImports rise because supposed surplus was wrong
PV + cheap grid fallbackMore robust completionLimit charge source conflictsEV remains unfinished by morning
Departure-first emergencyProtect vehicle readinessManufacturer-approved controlDeparture still missed or API unresponsive

Home Assistant example 1: a monitoring-only charging cost and feasibility sensor

The following YAML demonstrates calculation without actuating a charger. Replace example entities with your validated imported retail-price sensor, supported EV wall-power limit and owner-selected energy requirement. The input helper values are examples; create them in Settings → Devices & services → Helpers if you use the UI. The template deliberately reports an unavailable value when the price input is unavailable rather than silently treating bad data as cheap electricity.

# Example configuration.yaml; customise IDs and units.
input_number:
  ev_wall_energy_needed:
    name: EV wall energy needed
    min: 0
    max: 100
    step: 0.5
    unit_of_measurement: kWh
  ev_available_power_kw:
    name: EV available wall charging power
    min: 1
    max: 22
    step: 0.5
    unit_of_measurement: kW

template:
  - sensor:
      - name: "EV charging hours needed"
        unique_id: ev_charging_hours_needed_demo
        unit_of_measurement: h
        availability: >
          {{ states('input_number.ev_available_power_kw') | float(0) > 0 }}
        state: >
          {% set e = states('input_number.ev_wall_energy_needed') | float(0) %}
          {% set p = states('input_number.ev_available_power_kw') | float(0) %}
          {{ (e / p) | round(2) if p > 0 else none }}
      - name: "EV charging cost at current price"
        unique_id: ev_charging_cost_current_demo
        unit_of_measurement: GBP
        availability: >
          {{ is_number(states('sensor.retail_import_price_gbp_kwh')) }}
        state: >
          {% set e = states('input_number.ev_wall_energy_needed') | float(0) %}
          {% set rate = states('sensor.retail_import_price_gbp_kwh') | float(0) %}
          {{ (e * rate) | round(2) }}

This example calculates an all-at-current-rate estimate, not a forecast charge bill. The estimate will be misleading if the charge spans several changing prices, if the sensor includes VAT inconsistently, or if required battery energy was entered as if it were wall kWh. It is useful precisely because it exposes those assumptions. Before adopting a predictive scheduler, first make sure the measured energy and tariff sensors match the utility bill.

Example 2: a manual override helper and a safe notification-only cheap-price rule

A user override must beat cost optimisation. One practical approach is a toggle helper called input_boolean.price_automation_enabled, restored to off after restart until the homeowner confirms that scheduled control is appropriate. You can make a second “charge now” override in the device’s approved interface. The YAML below merely sends a persistent notification for the owner to review; it does not start an appliance, charger or heater. It therefore demonstrates price-trigger and manual-control logic without suggesting a universal actuator.

input_boolean:
  price_automation_enabled:
    name: Price scheduling enabled
    initial: false

automation:
  - id: price_aware_low_rate_notice
    alias: Price-aware low rate notice (no switching)
    mode: single
    triggers:
      - trigger: numeric_state
        entity_id: sensor.retail_import_price_gbp_kwh
        below: 0.12
      - trigger: time_pattern
        minutes: "/15"
    conditions:
      - condition: state
        entity_id: input_boolean.price_automation_enabled
        state: "on"
      - condition: template
        value_template: >
          {{ is_number(states('sensor.retail_import_price_gbp_kwh'))
             and states('sensor.retail_import_price_gbp_kwh') | float(999) < 0.12 }}
    actions:
      - action: persistent_notification.create
        data:
          title: "Low electricity price"
          notification_id: "price_aware_low_rate"
          message: >
            Retail import price is currently
            {{ states('sensor.retail_import_price_gbp_kwh') }} GBP/kWh.
            Verify the appliance is ready and its approved controls
            before starting a flexible load.

The repeated 15-minute trigger is not an instruction to switch at every 15-minute boundary; it only refreshes the alert when the rate is already cheap and the helper is enabled. The numeric_state trigger reacts when the threshold is crossed, so pairing it with a periodic trigger avoids missing the cheap condition after a restart. If the sensor becomes unavailable, the explicit numeric validity checks prevent a bogus £0 rate from triggering the alert. Where possible, also check a separate last successful tariff update or effective-period timestamp supplied by the integration, because a numeric value can be old but still parse as a number.

Why repeated commands and minimum on/off times matter

A naive controller watches an import/export sensor and switches whenever its power crosses zero. In a house where clouds repeatedly pass over the panels, that can trigger dozens of on/off requests in an hour. A large immersion heater may chatter through contactors, a compressor may be subject to anti-short-cycle restrictions, and an EV may repeatedly wake up or stop. Some devices have their own dwell timers; Home Assistant should not rely on discovering these by accident.

Use distinct start and stop thresholds (hysteresis), a minimum continuous period, a limit on commands per hour, and a lockout after hardware faults. For a heat pump, prefer the manufacturer’s heating/DHW programme and weather compensation; avoid directly controlling compressor power or safety-critical pumps. For an EV, rely on the wallbox’s built-in current and load-management protections and respect its minimum operating current and ramp limits. If the vendor API rejects an action, show it as rejected rather than assuming the last command succeeded.

Control guardIllustrative configurationPurposeWarning
Price hysteresisStart below 12p, stop above 17pAvoid switching around one noisy thresholdPrice alone should not stop a device mid-critical cycle
Surplus stabilitySustained positive export 2–5 minutesReduce cloud-induced togglingSeconds-to-minutes values depend on actual controller
Minimum on-timeEquipment-approved valueReduce cyclingNever override manufacturer safety timing
Command rate limitDevice API documented limitAvoid vendor bans and conflicting jobsLimits change by model/API
Ready-by bufferExtra planning time beyond minimum runMeet practical deadlineBattery and EV charging rate vary
Max simultaneously active loadsRespect whole-home available capacityAvoid overloadNot a substitute for certified protective hardware
Manual stopRetained until owner resumes controlPreserve household agencyDo not silently auto-reset on refresh

Solar surplus control: power measurements and export opportunity cost

Solar surplus is not simply “PV power minus EV power”. A safe load scheduler needs net import/export at the grid connection and the capacity of each protected circuit. In a property with a home battery, increased EV load can cause the battery to discharge even when the original dashboard showed export. If the intention is to avoid battery depletion, use supported inverter or charger behaviour to preserve the reserve, and verify it using measured battery flows. The site meter should remain the primary reference for total export rather than adding overlapping component meters that double count energy.

Consider 2.8 kW measured export, a 2.4 kW approved immersion diverter and a battery that may absorb additional solar. The instantaneous gross surplus is not necessarily 2.8 kW available for a new load after all control changes; the battery management system may change its operating mode. Even where there is genuine export, diverting 1 kWh from a 5p/kWh export agreement to an immersion heater has a 5p opportunity cost. Buying that kWh overnight for 8p implies a theoretical 3p/kWh advantage to using surplus, before diverter losses, alternative heat-pump efficiency and storage losses.

If a heat pump can deliver hot water at a suitable seasonal COP of 2.5, one kWh of electrical input produces approximately 2.5 kWh of heat under the chosen measurement boundary. An immersion heater produces roughly 1 kWh of heat per kWh electrical input. A direct comparison of 5p solar export value and 8p grid price is therefore insufficient. For 2.5 kWh of useful heat, the heat pump would hypothetically need 1.0 kWh of 8p grid electricity, while an immersion element would consume 2.5 kWh of 5p foregone export worth 12.5p. This simplified case favours the heat pump at 8p, assuming that COP and those tariff conditions actually apply. Real cylinder losses, compressor starts and DHW modes modify the result.

Heating choice for 2.5 kWh useful heatElectrical inputMarginal energy valueIllustrative cost
Immersion from exportable PV2.5 kWh5p/kWh export forgone12.5p
Heat pump from 8p overnight grid, COP 2.51.0 kWh8p/kWh import8.0p
Immersion from 8p overnight grid2.5 kWh8p/kWh import20.0p
Heat pump from PV, COP 2.51.0 kWh5p/kWh export forgone5.0p

These calculations use deliberately simple, illustrative values. A heat pump’s real COP in domestic-hot-water mode can be lower than its space-heating COP, and a PV diverter may have minimum-power behaviour. The correct choice depends on the water-temperature target, manufacturer-approved modes, hourly export value and system energy balance. Read solar surplus automation for hot water for hardware boundaries and solar surplus EV charging for charger control architectures.

Hot-water cylinder scheduling: energy capacity, comfort and hygiene

A cylinder stores thermal energy, not electricity. Nominal cylinder volume does not equal a perfectly mixed volume at a uniform useful temperature. A rough energy estimate for water is 0.001163 kWh per litre per kelvin. Raising 180 litres of water by 20°C therefore requires about 180 × 20 × 0.001163 = 4.19 kWh of useful heat, excluding standing losses, stratification and heat-source inefficiencies. Heating it with a 3 kW resistance element ideally needs approximately 1.4 hours; a heat pump with 2 kW delivered thermal output ideally needs about 2.1 hours. The heat pump’s electrical draw would be less than thermal output by the applicable COP, but its recovery duration might differ.

The controller should maintain a minimum usable reserve or approved reheating schedule even when prices are high. The cylinder thermostat, independent over-temperature cut-out, expansion/pressure protection and any manufacturer-required hygiene programme must remain active regardless of Home Assistant status. Public-health guidance on Legionella varies with installation type, vulnerability, jurisdiction and manufacturer. Do not replace a required heating and storage-temperature regime with an arbitrary “once a week to 60°C” internet rule. An installer or responsible competent person should assess the actual system, including scalding risk and any thermostatic mixing valves.

Home Assistant is valuable for observing hot-water performance: record electricity during each recovery, water temperature at an appropriate sensor location, time since the last successful heat cycle and any authorised DHW mode flag. A single sensor halfway up a stratified cylinder does not necessarily measure safe storage conditions throughout. Where an approved controller exposes a request for additional heating, Home Assistant may request it during cheap hours while leaving all safety limits intact; that interface is product-specific and cannot be replaced with a generic wiring recipe.

Hot-water control issueMonitoring evidenceSafe design response
Occupants run out of waterUse/temperature drop before usual shower timeMove approved DHW window earlier or increase available stored heat
Overheating riskIndependent thermostat/high-limit faultController protection must remain hardwired and autonomous
Legionella controlManufacturer hygiene routine and actual achieved temperaturesFollow documented scheme and competent professional advice
Cold snap raises heat demandLonger recovery time, changed COPAllow deadline margin; do not overrule heat source interlocks
Solar PV unexpectedly lowSite export does not reach planned surplusUse an approved backup schedule
HA server unavailableMissing schedule requests and logsNative hot-water programme remains functional
Price feed staleNo fresh valid rate seriesComplete essential hot-water reheating anyway

Appliances are different: a smart plug does not provide remote-start logic

A dishwasher, washer or tumble dryer is not equivalent to an EV charger. Many appliances must be physically loaded, their door closed, programme selected and remote-start permission enabled on the panel. Some permit delayed start on the device; some vendor-connected models permit remote activation subject to safety conditions; others cannot legally or reliably be started remotely. The absence of remote-start control is a genuine product limitation, not a Home Assistant configuration problem.

Never assume cutting and restoring mains power will make an appliance begin a programme. Some models resume after an outage, others cancel or enter an error state, and others should not be unattended for safety reasons. Do not defeat lid/door interlocks, manually short control contacts, or adapt a generic mains plug to loads beyond its rating. Heating appliances, especially tumble dryers, add fire-risk considerations. Follow manufacturer guidance about unattended operation, cleaning, ventilation and filters before planning any autonomous start.

For models offering a documented delayed-start feature, the simplest arrangement is often to load the appliance, set a native completion deadline and let its own controller manage the cycle. Home Assistant can alert the owner when prices are favourable and record measured consumption; an approved manufacturer integration can sometimes issue or adjust a remote-start command when the device is armed. The automation should detect “not ready” and avoid silently claiming savings from a cycle that never ran.

Appliance stateMeaningAppropriate price-aware action
Off / door openNot armed for a programmeNo remote-start command; notify user if useful
Loaded and native delay timer setManufacturer has accepted future startDo not compete with the appliance timer
Remote start enabled (vendor documented)Supported command path may existUse only the documented vendor integration
RunningCycle currently under wayAvoid interruption purely to save pennies
CompletedProgramme endedMeasure actual energy and record completion
Unavailable/cloud offlineCannot confirm readiness or statusUse native programme; stop remote assumptions

Prioritise devices when cheap windows overlap

Three flexible loads can compete for the same low-price hour. A wallbox limited to 7 kW, a 3 kW immersion element and a 2 kW appliance could imply 12 kW of concurrent demand, before the rest of the household. Actual electrical limits depend on phase allocation, diversity, import capacity and protective hardware. Home Assistant may sequence loads to reduce the peak but must not act as the sole overload-protection mechanism. Manufacturer-certified charger load management and correctly designed circuits remain responsible for electrical safety.

Use a priority ladder based on consequences. First satisfy safety-critical and essential comfort requirements. Next respect fixed deadlines such as EV departure or mandatory hot-water availability. Then optimise optional flexible loads, potentially favouring appliances with shorter cycle duration. If a dynamic price spike occurs after charging has started, only pause equipment where safe and supported. A half-finished dishwasher or unnecessary heat-pump stop is not equivalent to deferring an EV that still has many spare hours before departure.

PriorityExample constraintScheduling principleOwner override
1 — equipment protectionsSupply and temperature limitsNever traded against tariff priceCannot disable via automation
2 — essential completionHot water by morning; EV by departureStart early enough with marginFinish now
3 — household restrictionsQuiet hours, occupants and safe operating windowsExclude prohibited intervalsAllow/disallow by deliberate setting
4 — priceRetail cost and export opportunityMinimise cost within valid windowsDisable optimisation
5 — convenienceNotifications, dashboard visibilityReport intent and resultManual scheduling

A practical six-hour schedule: EV, cylinder and dishwasher

Imagine a home on a fictional electricity tariff from midnight to 06:00 with one notably expensive interval. The EV needs 14 kWh at the wall and accepts 7 kW, an approved cylinder controller needs 3 kWh electricity at 3 kW, and the dishwasher needs 1.2 kWh over a vendor-managed 90-minute programme. The main supply arrangement is assumed to permit EV charging plus one smaller load only after a qualified installer has confirmed the available capacity. This is a scheduling illustration, not a specification for electrical protection.

WindowImport pricePossible scheduled loadReason
00:00–01:0010p/kWhCylinder approved DHW window (3 kWh)Hot water ready early
01:00–02:008p/kWhEV (7 kWh)Low-price supported charging
02:00–03:007p/kWhEV (7 kWh)EV reaches energy target
03:00–04:0028p/kWhNo optional new loadHigh price, all deadlines still feasible
04:00–05:309p/kWhDishwasher native delayed-start cycleCompletes before morning
05:30–06:0012p/kWhReserved margin; no scheduled loadRecovery buffer

At those illustrative rates the EV cost is 7×£0.08 + 7×£0.07 = £1.05. The cylinder costs 3×£0.10 = £0.30. The dishwasher’s 1.2 kWh is simplistically valued at 9p/kWh, or £0.108, though a real cycle draws energy non-uniformly and may cross price boundaries. Combined estimated cost is about £1.46. Compare this with a feasible baseline using the same delivered energy, not a fictitious baseline that runs everything at the most expensive hour. Metering and actual interval allocation should replace assumed appliance energy in the final savings report.

The schedule may also be less expensive if loads overlap safely or if PV is available after sunrise. But supply constraints, departure deadlines, manufacturer schedules and network limits are not flexible assumptions. The right response to insufficient capacity is to adjust the schedule or commissioning design, not to relax electrical limits in an automation.

Time-of-use tariffs versus genuinely dynamic price optimisation

A static cheap window—say 00:30 to 05:30—requires no cloud forecast if the supplier contract guarantees that rate. It may be implemented more reliably in the charger or appliance itself. In contrast, a dynamic tariff can have several separate low-rate intervals and unpredictable daytime spikes. Home Assistant can schedule from the published interval array if the supplier’s data is current and the corresponding command API supports it. Price publication times, effective start and timezones are supplier-specific; build checks around the provider you actually use.

A simple native Home Assistant policy might say: if the vehicle has at least five spare hours before departure, prefer the cheapest eligible rate interval; otherwise schedule the charge immediately enough to guarantee the target. An optimiser such as EMHASS can solve several competing constraints mathematically, but its inputs remain estimates. For one EV on a two-rate tariff, that complexity often brings very little benefit. Compare with our EV charging on dynamic tariffs guide for more detailed deadline and price-interval methods.

Home Assistant example 3: fixed off-peak reminder with a strict time window

The next automation is intentionally a reminder for an owner who already has a native-device timer, not an unauthorised switch command. It only notifies during a known rate window and confirms that the scheduling helper is enabled. The quoted times are fictional; change them to match the electricity contract and account for weekends and holidays where applicable. The device timer should still be verified to finish on time.

automation:
  - id: off_peak_check_reminder
    alias: Confirm off-peak appliance schedule
    mode: single
    triggers:
      - trigger: time
        at: "00:35:00"
    conditions:
      - condition: state
        entity_id: input_boolean.price_automation_enabled
        state: "on"
      - condition: time
        after: "00:30:00"
        before: "05:30:00"
    actions:
      - action: persistent_notification.create
        data:
          title: "Check native off-peak schedule"
          notification_id: "off_peak_schedule"
          message: >
            Your example cheap-rate period is active. Verify the EV,
            water-heating controller or appliance has an approved
            schedule and will finish before its deadline.

Because the automation only triggers at one fixed time, a Home Assistant restart after 00:35 can cause that day’s reminder to be missed. This is not a serious problem for a non-critical notification, but for actual charge deadlines use an independent device schedule and a repeated reconciliation trigger. A trigger being true is not a continuously monitored condition: Home Assistant evaluates the automation when the trigger fires. Its documentation explicitly distinguishes these behaviours.

Home Assistant example 4: record a valid price boundary without remote switching

Logging the moment a tariff threshold is crossed is useful when testing a price strategy. The snippet below uses a template condition to ignore invalid price states and logs an event rather than commanding hardware. It also demonstrates repeated evaluation rather than depending only on a crossing event. A production controller should additionally compare price feed timestamps and validate that the rate applies to the current settlement interval.

automation:
  - id: price_boundary_audit
    alias: Log effective cheap-rate intervals
    mode: single
    triggers:
      - trigger: time_pattern
        minutes: "/15"
    actions:
      - choose:
          - conditions:
              - condition: template
                value_template: >
                  {{ is_number(states('sensor.retail_import_price_gbp_kwh'))
                     and states('sensor.retail_import_price_gbp_kwh') | float(999) <= 0.10 }}
            sequence:
              - action: logbook.log
                data:
                  name: Price scheduling
                  message: >
                    Example low-price interval detected at
                    {{ now().isoformat() }}.
                  entity_id: input_boolean.price_automation_enabled

In the actual Home Assistant installation, test entity names using Developer Tools → States, check the automation trace and ensure the price sensor delivers retail £/kWh rather than p/kWh. A threshold of 0.10 in a pounds-denominated sensor means ten pence per kWh; the same numeric constant in a pence sensor would mean one tenth of a penny. Unit errors can be more costly than any theoretical scheduling improvement.

Working with a supported device controller: the actuator is deliberately product-specific

Home Assistant examples on the internet often show switch.turn_on pointed at a fictional switch.ev_charger and imply the result is generic. It is not. On one charger the entity may mean “allow charging”, on another it may mean mains power, and some chargers expose no such switch. Equivalent differences exist between a hot-water controller’s boost action, a heat pump’s DHW setpoint and a heater contactor. Confusing them can damage equipment or defeat a locally configured schedule.

After completing the read-only phase, implement actuation in the device’s own integration or an installer-approved interface with an explicit contract: the exact action name, allowed state transitions, maximum requests, what happens after restart, which safety functions remain independent, and what a rejected command looks like. Keep a single owner of the intended schedule. Build logging around the entity that reports actual operation instead of assuming success merely because the action call returned without an exception.

Actuation questionGood evidenceWhen to stop and investigate
Is the command supported?Official model-specific control/API documentationOnly an unofficial guessed entity appears
Will it survive disconnection?Native stored timer or documented offline behaviourCloud call is necessary every few minutes
Can the device refuse?Explicit response or status transitionAutomation interprets silence as successful start
Does safety remain local?Certified electrical/hot-water controls unaffectedHA relay bypasses a thermostat or load protection
Can manual operation take over?Visible disable/finish-now functionSoftware immediately reverses the owner
Can the operation be measured?Metered kWh or real cycle statusSavings depend only on planned state
Who handles a missed deadline?Device timer/fallback and owner notificationAutomation simply waits for another cheap period

Input data integrity: price timestamps, solar meters and unavailable values

Tariff-aware automation is only as reliable as its inputs. All hourly or quarter-hourly readings should be associated with an explicit start time and duration. The clock changes during daylight-saving transitions make “24 hourly values per day” an unsafe assumption for a local billing day: it may contain 23 or 25 hourly periods, or a corresponding different number of quarter-hour intervals. Prefer timezone-aware timestamps over comparing string-formatted clock hours, particularly when carrying a charge plan through a DST change.

Verify that grid import is a measured cumulative kWh stream, not an integral of a noisy instantaneous reading without sufficient sampling. Confirm import and export directions against the utility meter and bill. Detect source unavailability, zero timestamps, unknown entities and implausibly large values. Where tariffs are supplier-specific, request an all-in import price if one is supplied; when only the spot-market component is available, add documented contract charges using correct units and taxes or label the estimate as wholesale-only.

Validation testPass conditionFailure action
Price numericFinite, correct unit and credible rangeDo not optimise; keep fallback schedule
Price timestampInterval effective now and feed not staleUse known fixed rate or alert
Time series completenessAll required slots before deadline existUse conservative earlier schedule
Grid energy readingMonotonic where expected; correct import/export polaritySuspend energy-based claims
Power readingFresh and plausible compared with capacityDo not calculate surplus-driven start
Device readyVendor status supports this actionNotify; do not energise
Manual overrideOff means off until user changes itNever auto-re-enable after an error
Fallback completionKnown deadline still feasiblePrioritise readiness over savings

How to assess actual savings instead of projected savings

For each flexible device, compare two feasible schedules under the same realised tariff and service requirement. The first is the original fixed timer or normal household routine. The second is the new price-aware policy, with the same amount of useful output—EV wall energy, delivered hot water or completed programme—and any conversion losses. Evaluate imported electricity at the rate for each interval and exported electricity at the applicable export rate. This avoids rewarding a controller that merely consumed less energy because the EV was undercharged or a hot-water cylinder ended cold.

For a single load, a simplified period cost is sum(imported_kWh_interval × import_price_interval) − sum(exported_kWh_interval × export_value_interval). When comparing two policies, subtract total net energy value and account for additional device or battery use if material. Treat battery cycle degradation or inconvenience separately rather than presenting a falsely precise fraction of a penny. Retain the utility bill as the reconciliation reference; monitoring can reasonably disagree with billing because of CT accuracy, interval offsets, measurement boundaries or tariff adjustments.

MeasurementBaseline schedulePrice-aware scheduleEvidence required
EV energy delivered26.5 kWh26.7 kWhComparable wall energy and vehicle readiness
Cost of EV import£5.83 illustrative£3.20 illustrativeActual interval prices and grid import
Hot-water availabilityReady at 07:00Ready at 07:00Temperature/recovery proof
Appliance cycleCompleted by 08:00Completed by 08:00Actual programme-complete state
Missed / overridden runsCountedCountedOwner intervention log
Connection and API failuresRecordedRecordedAvailability / rejection events

In the illustrative EV comparison, £5.83 − £3.20 = £2.63 per comparable charge. If such conditions occurred 80 times a year, the ideal arithmetic is £210.40 annually, but only if both schedules deliver the same required charge, the rate differential actually recurs and no hidden costs or losses offset it. A single dramatic cheap-day result should not become a guaranteed annual saving in a buying guide. Track at least several billing cycles where practical and identify seasonal differences.

Is a dedicated optimiser such as EMHASS worth adding?

For a homeowner who simply charges an EV every night between 00:30 and 05:30 and does not have a battery, a native charger timer may already solve the problem. For a house with a dynamic retail tariff, PV, battery, two EVs and hot water, there may be multiple simultaneous decisions and constraints. An optimiser can help create a cost-minimising plan, but only if each controllable device can accept the relevant commands and the model reflects true physical limitations.

EMHASS and similar tools do not automatically become electrical safety controllers. They calculate intended schedules and power targets; a separate approved execution layer must implement them, with minimum run times, limits, manual overrides and validity checks. No optimiser can guarantee that a manufacturer cloud service remains available or that a washing machine accepts remote start. For a deeper platform comparison see the related guide on Home Assistant versus evcc and inverter applications when it becomes available on esp32AliExpress price.co.uk; for now the key principle is to establish a trustworthy native-rule baseline before adding a solver.

Household situationRecommended first approachWhen complexity could pay
One EV with fixed cheap-rate tariffCharger/vehicle-native scheduleRarely necessary unless special constraints
EV with dynamic prices and fixed departureSupported tariff-aware HA schedule plus charger fallbackPrice spread and feasible hour count vary significantly
Solar PV and immersion diverterApproved diverter or manufacturer controllerVariable export value and several flexible demands
PV + home battery + two EVsMetering and clear priority schemeCompeting deadlines and dynamic intervals
A few smart appliancesBuilt-in delayed-start and notificationsVendor remote start is robust and supported
Heat pump and mixed heating zonesManufacturer weather-compensated controlsValidated ability to shift demand without COP penalty

Troubleshooting: an automation that looks correct but does the wrong thing

SymptomLikely explanationDiagnosisCorrection
Price shows 0 while feed unavailableTemplate defaulted to zeroInspect raw entity and availabilityMark state unavailable; avoid using 0 fallback
EV did not finish before departureWrong wall kWh, power or latest startCompare wall meter with expected durationIncrease margin; use native departure guarantee
EV and hot water both start on cheap tariffIndependent automations own load scheduleCheck automation traces and supply headroomCentralise scheduling and preserve hardware protections
Dashboard says appliance started but it did notAction sent, but vendor rejected remote startCompare command response with real programme stateRequire explicit armed state and completion feedback
Cycle repeats every few minutesPrice/surplus threshold without hysteresisCount command events and state changesEquipment-approved dwell time and distinct thresholds
Hot water colder after optimisationShifted too far or underestimated recoveryTemperature profile and reheating durationRestore native conservative hot-water schedule
Unexpected grid import during solar modeBattery or other load changed dispatchSite meter and battery flow historyUse correct import boundary and priority
Schedule misfires on clock changeNaive local hour timestampsCompare UTC timestamps and tariff effective slotsUse timezone-aware interval alignment
Automation remains silent after restartTrigger crossing was missedTrace trigger and last runReconciliation periodic trigger or device fallback
Bill savings do not match dashboardWholesale vs retail, fees or inaccurate meterCompare invoice and interval cost modelUse contractual rates and correct boundaries

The Home Assistant trigger documentation warns that state and template triggers represent change events and not continuous enforcement. A periodic reconciliation mechanism helps after restarts, but timer completion events that occur while Home Assistant is down are not necessarily replayed on start-up. The Timer integration documentation explicitly notes that a restored timer can expire during downtime without firing the missed finish automation. Never make a critical deadline depend on such an event alone.

Failure modes: what should happen during outages?

Test four failures separately: internet outage, Home Assistant restart, energy-meter failure and vendor device unavailability. They should not all be handled by the same “try again” loop. A cloud-only car interface may need internet to change its target; a charger with a built-in schedule may continue independently. A cylinder must remain thermally protected even if all automation equipment has lost power. A washer that is already running should normally complete through its own programme rather than be interrupted by a stale price command.

In a house with battery storage, reserve control and export settings remain responsibilities of the inverter and its certified BMS. Home Assistant should not assume that reading the battery SoC authorises overriding inverter modes. When an EV charger supports dynamic load balancing, it should retain independent site-current protection even if HA’s energy sensor is stale. Any integration that lacks documented failure behaviour should start in monitoring-only mode until the risk is understood.

FailureEV responseHot-water responseAppliance response
Internet downNative charger timer remains available where supportedNative tank/hot-water schedule operatesNative delayed start and cycle only
HA restartedRe-check target and deadline; avoid duplicate commandsDo not override protected controllerNo forced power cut to resume
Tariff series missingChoose known safe/normal completion scheduleMeet required heating schedule regardless of priceNotify and use appliance delay timer
Energy meterAliExpress price staleDo not infer PV surplus or spare import capacityDo not claim surplus; use approved controllerNo energy-based remote start
Vendor cloud unavailableManual or local approved chargingIndependent thermostat/hygiene protectionNo remote-start command until supported
Household overrideUser decision remains activeUser can request approved boostOwner chooses native programme

Commissioning a price-aware installation: the 20-point checklist

  • Document electricity contract: capture correct import rate, export rate, standing charge and tax treatment.
  • Verify supplier interval definition: 15-minute/30-minute/hourly and daylight-saving time handling.
  • Match units: pounds versus pence, kilowatts versus kilowatt-hours, UTC versus local timestamps.
  • Check source freshness: record publication time and valid-to timestamp for each tariff series.
  • Prove meter polarity: compare grid import/export and PV generation with physical meter readings.
  • Record electrical limits: have a competent installer confirm usable supply and phase allocation.
  • Identify approved control path: exact supported charger, heating controller and appliance API/model.
  • Preserve independent protections: EVSE load management, heater high limit and appliance interlocks.
  • Assign a single scheduling owner: avoid fighting between HA, inverter, car and wallbox timers.
  • Define the useful-output requirement: EV wall energy, hot-water readiness and appliance completion.
  • Define deadlines: actual departure, occupancy and safe running windows.
  • Set a buffer: take realistic charge rate, recovery time, network failures and price uncertainty into account.
  • Provide manual override: finish now, disable price control and inspect the planned reason.
  • Test restart behaviour: restart HA while a cheap window is active and while a load is running.
  • Test WAN outage: confirm the native equipment can still finish the important task.
  • Test sensor failure: ensure an unavailable rate or meter does not become a false zero.
  • Validate command feedback: record real device starts, stops, kWh and completion—not just action calls.
  • Test DST and midnight: verify interval indexing and local date changes.
  • Compare a real baseline: equal energy/service against the same tariff schedule.
  • Back up configuration: preserve YAML, automation traces, API versions and rollback instructions.

A commissioning trial should begin in shadow mode: calculate the proposed schedule and send notifications only, while devices remain on their known-safe native schedules. Compare whether the proposed plan would have been feasible and cheaper. Next, enable one supported device at a time, with installer-approved settings and explicit rollback. Only expand control when the observed results prove reliability. This staged approach often exposes wrong price units or unreachable device APIs before they can create missed EV charging or unpleasant morning showers.

Frequently asked questions

Can Home Assistant automatically charge my EV at the cheapest time?

Yes, where the charger or vehicle exposes a supported scheduling interface and the tariff feed is reliable. Start by calculating the required wall energy and latest feasible charging window. Retain the charger’s native deadline or approved fallback; a cheap-rate threshold by itself is insufficient.

Do I need a dynamic electricity tariff to benefit?

No. A recurring off-peak rate can be scheduled with a charger-native timer. Dynamic rates offer more opportunities to choose intervals, but also increase the need to validate price data, timestamps and missed-deadline behaviour.

Does Nord Pool provide the retail price I actually pay?

Not necessarily. Nord Pool data are wholesale market prices; your supplier may add margin, fees, tax and other charges, or offer a contract not directly tied to the spot series. Use your contract’s effective import rate for monetary comparisons.

Can I use a smart plug to start a dishwasher overnight?

Only if the appliance manufacturer explicitly supports the desired operation and the switching arrangement is electrically and operationally appropriate. Cutting and restoring power is not a generic or recommended substitute for a documented remote-start feature.

Can Home Assistant safely control a 3 kW immersion heater?

It can request heating through a manufacturer-approved, correctly rated installed controller. It must not replace or bypass high-limit protection, suitable switching equipment or hot-water safety provisions. Ask a qualified installer to specify the electrical arrangement.

What happens if the internet goes down during a cheap period?

A locally stored device schedule may continue; a cloud-only remote-control path may not. Design critical deadlines around the manufacturer’s own supported operation, and make Home Assistant price optimisation optional rather than the only route to hot water or EV charging.

What does a negative electricity price mean for appliances?

It can mean the market energy component is negative, but it does not necessarily mean your final retail cost is negative. Check all contract adders, import charges, export rules and whether the negative value is valid for that settlement period.

Should I always use the cheapest 15-minute intervals?

Not if frequent starting and stopping harms comfort, equipment operation, completion likelihood or API reliability. A realistic schedule incorporates continuous-run restrictions, deadlines, minimum device power and command-rate limits.

How can I stop price automation temporarily?

Use a clearly named input_boolean helper or native device control. An explicit manual override should persist until the owner intentionally re-enables optimisation; do not let a periodic update immediately reverse the user.

What if a car is charging but the reported battery percentage is stale?

Prefer metered wall energy for cost and delivery calculations, use the latest validated car state only when current, and leave a wider time margin. Do not claim the car will be ready based on an old SOC reading.

Should I prefer a heat pump or immersion element for solar hot water?

Compare useful heat delivered per electrical kWh, export opportunity cost, the heat pump’s actual domestic-hot-water COP, recovery time and manufacturer constraints. The cheapest grid or solar source for one kWh of electricity is not automatically the cheapest source of one kWh of hot water.

How do I avoid using the home battery to charge the EV unintentionally?

Measure site import/export and battery flow, and use approved inverter or charger operating modes. A surplus sensor alone cannot guarantee battery discharge will not rise when a new load starts.

Can EMHASS replace these Home Assistant rules?

It can optimise a schedule when the constraints and inputs are correctly modelled. It does not independently provide certified electrical protection or create unsupported device APIs. Keep the same execution safety, freshness checks, manual overrides and completion monitoring.

How much money can I realistically save?

Measure avoided cost against an equal-service baseline. The result depends on annual flexible kWh, contract price spreads, exported solar value, device losses, missed/overridden runs and any subscriptions. Do not extrapolate a single cheap day into guaranteed annual savings.

Why did my automation fail on the daylight-saving change?

It may have indexed local clock hours instead of timezone-aware tariff intervals, causing duplicated or missing apparent times. Use explicit effective timestamps and validate boundary behaviour on the 23- and 25-hour days.

How do I prove a schedule actually happened?

Record commands, vendor acknowledgement, measured electricity, actual start/stop times and the completed outcome. Compare the resulting cost with the supplier bill. A scheduled state is not the same as delivered service.

Verdict: cheapest is only useful if the task finishes safely

The best price-aware Home Assistant automation is not the one with the most templates or the lowest theoretical bill. It is the one that reliably finishes the required job, respects independent device protections, survives stale sensors and outages, and produces measurable net savings. Use charger-native timers for predictable off-peak EV charging; use approved hot-water controls for cylinder scheduling; and use manufacturer-approved delayed start for appliances. Let Home Assistant coordinate prices, deadlines and evidence while keeping the equipment’s own safety logic authoritative.

Build one load at a time: first verify price and metering, then run a read-only shadow schedule, finally enable supported control with manual overrides and a clear fallback. Compare the actual interval-weighted cost to a feasible baseline, including export opportunity value where applicable. If those measurements show no meaningful gain, simpler automation is the better engineering choice.

Sources, further reading and related esp32.co.uk guides

Editorial note: Product interfaces, local-control capabilities, tariffs and Home Assistant action schemas may change. The YAML examples are educational, monitoring/notification-only patterns that require entity substitution and testing in the installed Home Assistant version. The article deliberately avoids giving universal mains wiring or bypass instructions; a qualified professional should approve fixed electrical and hot-water control installations.

CONTINUE EXPLORING / SMART HOME & ESPHOME

Read next

Practical guides related to this article.

Explore the topic →
HARDWARE DECISION GUIDEChoosing Home Assistant hardware?

Compare practical options before you choose hardware.

Compare options →